From 6fb50593dcc4a4dc3f3e54ff7ac9a2531233c21b Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:19:56 -0700 Subject: [PATCH 001/321] add overridesHelper.ts --- src/test/utils/overridesHelper.ts | 87 +++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/test/utils/overridesHelper.ts diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts new file mode 100644 index 00000000000..c2255b705f0 --- /dev/null +++ b/src/test/utils/overridesHelper.ts @@ -0,0 +1,87 @@ +import { Weather, WeatherType } from "#app/data/weather"; +import { Biome } from "#app/enums/biome"; +import * as GameMode from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; +import Overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; +import { vi } from "vitest"; + +/** + * Helper to handle overrides in tests + */ +export class OverridesHelper { + private readonly game: GameManager; + + constructor(game: GameManager) { + this.game = game; + } + + /** + * Override the starting biome + * @warning Any event listeners that are attached to [NewArenaEvent](events\battle-scene.ts) may need to be handled down the line + * @param biome the biome to set + */ + startingBiome(biome: Biome): this { + this.game.scene.newArena(biome); + this.log(`Starting biome set to ${Biome[biome]} (=${biome})!`); + return this; + } + + /** + * Override the starting wave (index) + * @param wave the wave (index) to set. Classic: `1`-`200` + * @returns spy instance + */ + startingWave(wave: number): this { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); + this.log(`Starting wave set to ${wave}!`); + return this; + } + + /** + * Override each wave to have or not have standard trainer battles + * @returns spy instance + * @param disable - true + */ + disableTrainerWaves(disable: boolean): this { + const realFn = getGameMode; + vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { + const mode = realFn(gameMode); + mode.hasTrainers = !disable; + return mode; + }); + this.log(`Standard trainer waves are ${disable ? "disabled" : "enabled"}!`); + return this; + } + + /** + * Override the weather (type) + * @param type weather type to set + * @returns spy instance + */ + weather(type: WeatherType): this { + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); + this.log(`Weather set to ${Weather[type]} (=${type})!`); + return this; + } + + /** + * Override the seed + * @param seed the seed to set + * @returns spy instance + */ + seed(seed: string): this { + vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { + this.game.scene.waveSeed = seed; + Phaser.Math.RND.sow([seed]); + this.game.scene.rngCounter = 0; + }); + this.game.scene.resetSeed(); + this.log(`Seed set to "${seed}"!`); + return this; + } + + private log(...params: any[]) { + console.log("Overrides:", ...params); + } +} From c514aff854eccc071976e3b93d71f5fe6eefdb1e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:20:53 -0700 Subject: [PATCH 002/321] attach overrides helper to gameManager --- src/test/utils/gameManager.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index ac18daaaada..d491e007940 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -34,6 +34,7 @@ import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; +import { OverridesHelper } from "./overridesHelper"; /** * Class to manage the game state and transitions between phases. @@ -44,6 +45,7 @@ export default class GameManager { public phaseInterceptor: PhaseInterceptor; public textInterceptor: TextInterceptor; public inputsHandler: InputsHandler; + public readonly override: OverridesHelper; /** * Creates an instance of GameManager. @@ -59,6 +61,7 @@ export default class GameManager { this.phaseInterceptor = new PhaseInterceptor(this.scene); this.textInterceptor = new TextInterceptor(this.scene); this.gameWrapper.setScene(this.scene); + this.override = new OverridesHelper(this); } /** From b2fbc4d6b64d2ec74b4b78703adde8798e615b3c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:25:10 -0700 Subject: [PATCH 003/321] make pokemonSprite.test ignore hidden files (e.g. .DS_Store) --- src/test/sprites/pokemonSprite.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index 5c1db85fa6f..52b20017715 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/src/test/sprites/pokemonSprite.test.ts @@ -38,7 +38,7 @@ describe("check if every variant's sprite are correctly set", () => { const errors = []; const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath); + const files = fs.readdirSync(dirpath).filter(filename => !filename.startsWith(".")); for (const filename of files) { const filePath = `${dirpath}${filename}`; const trimmedFilePath = `${trimmedDirpath}${filename}`; From bc1c267071be1a430c46a75c9c2eae268ba4ca48 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:25:31 -0700 Subject: [PATCH 004/321] use game.override.startingWave --- src/test/abilities/battle_bond.test.ts | 2 +- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/intimidate.test.ts | 24 +++++++++++----------- src/test/abilities/power_construct.test.ts | 2 +- src/test/abilities/schooling.test.ts | 2 +- src/test/abilities/shields_down.test.ts | 2 +- src/test/abilities/zen_mode.test.ts | 2 +- src/test/abilities/zero_to_hero.test.ts | 2 +- src/test/achievements/achievement.test.ts | 2 +- src/test/battle/battle.test.ts | 14 ++++++------- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 18 ++++++++-------- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/spikes.test.ts | 6 +++--- src/test/moves/tackle.test.ts | 2 +- src/test/ui/transfer-item.test.ts | 2 +- 18 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 1ebefb99f32..8166f9bfe66 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -39,7 +39,7 @@ describe("Abilities - BATTLE BOND", () => { async () => { const baseForm = 1, ashForm = 2; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.GRENINJA]: ashForm, }); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 0a542780ebc..f0d10e4691d 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -39,7 +39,7 @@ describe("Abilities - DISGUISE", () => { async () => { const baseForm = 0, bustedForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.MIMIKYU]: bustedForm, }); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 1b00ef748eb..ccf8ddef3c6 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -202,7 +202,7 @@ describe("Abilities - Ice Face", () => { }); it("reverts to Ice Face on arena reset", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 2ff909def2e..944af180af1 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); @@ -68,7 +68,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("single - boss should only trigger once then switch", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override.startingWave(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", @@ -97,7 +97,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("single - trainer should only trigger once with switch", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", @@ -127,7 +127,7 @@ describe("Abilities - Intimidate", () => { it("double - trainer should only trigger once per pokemon", async () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", @@ -153,7 +153,7 @@ describe("Abilities - Intimidate", () => { it("double - wild: should only trigger once per pokemon", async () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", @@ -179,7 +179,7 @@ describe("Abilities - Intimidate", () => { it("double - boss: should only trigger once per pokemon", async () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override.startingWave(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", @@ -204,7 +204,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("single - wild next wave opp triger once, us: none", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); + game.override.startingWave(2); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AERIAL_ACE]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; @@ -230,7 +230,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("single - wild next turn - no retrigger on next turn", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); + game.override.startingWave(2); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; @@ -256,7 +256,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once and each time he switch", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -295,7 +295,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once whatever turn we are", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -333,7 +333,7 @@ describe("Abilities - Intimidate", () => { it("double - wild vs only 1 on player side", async () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); await game.runToSummon([Species.MIGHTYENA]); // Get rid of any modifiers that may alter power @@ -351,7 +351,7 @@ describe("Abilities - Intimidate", () => { it("double - wild vs only 1 alive on player side", async () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); await game.runToTitle(); game.onNextPrompt("TitlePhase", Mode.TITLE, () => { diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 48c92c0e2d1..ce40bb49613 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -39,7 +39,7 @@ describe("Abilities - POWER CONSTRUCT", () => { async () => { const baseForm = 2, completeForm = 4; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.ZYGARDE]: completeForm, }); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index aac8a3e793f..df9c4e6f065 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -39,7 +39,7 @@ describe("Abilities - SCHOOLING", () => { async () => { const soloForm = 0, schoolForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.WISHIWASHI]: schoolForm, }); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index 881a3f4911f..a310148f041 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -39,7 +39,7 @@ describe("Abilities - SHIELDS DOWN", () => { async () => { const meteorForm = 0, coreForm = 7; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.MINIOR]: coreForm, }); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index dae01b7aa89..7b8474170e9 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -153,7 +153,7 @@ describe("Abilities - ZEN MODE", () => { async () => { const baseForm = 0, zenForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.DARMANITAN]: zenForm, }); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index 6e82f151f15..24187626f3d 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -39,7 +39,7 @@ describe("Abilities - ZERO TO HERO", () => { async () => { const baseForm = 0, heroForm = 1; - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + game.override.startingWave(4); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.PALAFIN]: heroForm, }); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index f5a7416e809..207293d1973 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -106,10 +106,10 @@ describe("RibbonAchv", () => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.startingWave(0); scene = game.scene; }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 436b3227791..a185844e599 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -93,7 +93,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); @@ -113,7 +113,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); @@ -233,7 +233,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -247,7 +247,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -266,7 +266,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([ @@ -295,7 +295,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); @@ -313,7 +313,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 063ac2b5210..e65a6867919 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -29,7 +29,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index cc1d2057b9b..0a2b5d4106a 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -36,7 +36,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs1 boss", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override.startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -47,7 +47,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs2 boss", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override.startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -58,7 +58,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs2 trainer", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -69,7 +69,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs1 trainer", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -80,7 +80,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs1 rival", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + game.override.startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -91,7 +91,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs2 rival", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + game.override.startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -102,7 +102,7 @@ describe("Test Battle Phase", () => { it("startBattle 1vs1 trainer", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.BLASTOISE, ]); @@ -112,7 +112,7 @@ describe("Test Battle Phase", () => { it("startBattle 2vs2 trainer", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -123,7 +123,7 @@ describe("Test Battle Phase", () => { it("startBattle 4vs2 trainer", async() => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index a59d6e8f535..b92979c56ed 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -105,7 +105,7 @@ describe("Moves - Ceaseless Edge", () => { "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", async () => { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); await game.startBattle([ Species.ILLUMISE ]); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index aab1b210f68..94e45b045ee 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -32,7 +32,7 @@ describe("Moves - Dynamax Cannon", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(200); // Note that, for Waves 1-10, the level cap is 10 - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); + game.override.startingWave(1); vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index 44f365ea689..a4fc1a4baeb 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -33,7 +33,7 @@ describe("Moves - Spikes", () => { vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + game.override.startingWave(3); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); }); @@ -86,7 +86,7 @@ describe("Moves - Spikes", () => { }, 20000); it("trainer - wild - force switch opponent - should take damage", async() => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); // player set spikes on the field and do splash for 3 turns // opponent do splash for 4 turns // nobody should take damage @@ -104,7 +104,7 @@ describe("Moves - Spikes", () => { }, 20000); it("trainer - wild - force switch by himself opponent - should take damage", async() => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + game.override.startingWave(5); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); // turn 1: player set spikes, opponent do splash diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index f4b335d9576..e36713fd086 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -34,7 +34,7 @@ describe("Moves - Tackle", () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + game.override.startingWave(97); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index c20fa51aff9..ba0dce8d8b5 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -35,7 +35,7 @@ describe("UI - Transfer Items", () => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); + game.override.startingWave(1); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ { name: "BERRY", count: 1, type: BerryType.SITRUS }, { name: "BERRY", count: 2, type: BerryType.APICOT }, From e33888e5f5843c78981df5bda611348fdb8ac742 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:32:04 -0700 Subject: [PATCH 005/321] use game.override.weather() --- src/test/abilities/sand_veil.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index ea75027101a..6adf8432914 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Sand Veil", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + game.override.weather(WeatherType.SANDSTORM); }); test( diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index 85a9e334c45..7c4536713a3 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -28,7 +28,7 @@ describe("Weather - Fog", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.FOG); + game.override.weather(WeatherType.FOG); vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index dad8d277b7f..ead142c0792 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -42,7 +42,7 @@ describe("Moves - Aurora Veil", () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + game.override.weather(WeatherType.HAIL); }); it("reduces damage of physical attacks by half in a single battle", async() => { From 3788631846813ee4b7204a04cd9094d2bdc2c15a Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:36:46 -0700 Subject: [PATCH 006/321] add game.override.battleType --- src/test/utils/overridesHelper.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index c2255b705f0..4fe605b4cac 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -30,7 +30,7 @@ export class OverridesHelper { /** * Override the starting wave (index) * @param wave the wave (index) to set. Classic: `1`-`200` - * @returns spy instance + * @returns this */ startingWave(wave: number): this { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); @@ -40,8 +40,8 @@ export class OverridesHelper { /** * Override each wave to have or not have standard trainer battles - * @returns spy instance - * @param disable - true + * @returns this + * @param disable true */ disableTrainerWaves(disable: boolean): this { const realFn = getGameMode; @@ -57,7 +57,7 @@ export class OverridesHelper { /** * Override the weather (type) * @param type weather type to set - * @returns spy instance + * @returns this */ weather(type: WeatherType): this { vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); @@ -68,7 +68,7 @@ export class OverridesHelper { /** * Override the seed * @param seed the seed to set - * @returns spy instance + * @returns this */ seed(seed: string): this { vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { @@ -81,6 +81,17 @@ export class OverridesHelper { return this; } + /** + * Override the battle type (single or double) + * @param battleType battle type to set + * @returns this + */ + battleType(battleType: "single" | "double"): this { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(battleType); + this.log(`Battle type set to ${battleType} only!`); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From e52d89ba40969365120d8a787f2a08c5a34f9948 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:48:48 -0700 Subject: [PATCH 007/321] apply game.override.battleType --- src/test/abilities/ability_timing.test.ts | 2 +- src/test/abilities/aura_break.test.ts | 2 +- src/test/abilities/battery.test.ts | 2 +- src/test/abilities/battle_bond.test.ts | 2 +- src/test/abilities/costar.test.ts | 2 +- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/dry_skin.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/intimidate.test.ts | 12 +++--- src/test/abilities/intrepid_sword.test.ts | 2 +- src/test/abilities/libero.test.ts | 2 +- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 6 +-- src/test/abilities/power_construct.test.ts | 2 +- src/test/abilities/power_spot.test.ts | 2 +- src/test/abilities/protean.test.ts | 2 +- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sand_veil.test.ts | 5 ++- src/test/abilities/sap_sipper.test.ts | 2 +- src/test/abilities/schooling.test.ts | 2 +- src/test/abilities/screen_cleaner.test.ts | 2 +- src/test/abilities/serene_grace.test.ts | 2 +- src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 2 +- src/test/abilities/shields_down.test.ts | 2 +- src/test/abilities/steely_spirit.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 2 +- src/test/abilities/wind_rider.test.ts | 2 +- src/test/abilities/wonder_skin.test.ts | 2 +- src/test/abilities/zen_mode.test.ts | 2 +- src/test/abilities/zero_to_hero.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 5 ++- src/test/arena/weather_strong_winds.test.ts | 2 +- src/test/battle/battle-order.test.ts | 8 ++-- src/test/battle/battle.test.ts | 21 +++++----- src/test/battle/error-handling.test.ts | 5 ++- src/test/battle/special_battle.test.ts | 45 ++++++++++++--------- src/test/evolution.test.ts | 2 +- src/test/items/eviolite.test.ts | 2 +- src/test/items/exp_booster.test.ts | 2 +- src/test/items/grip_claw.test.ts | 2 +- src/test/items/leek.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/items/light_ball.test.ts | 2 +- src/test/items/metal_powder.test.ts | 2 +- src/test/items/quick_powder.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/items/thick_club.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/localization/terrain.test.ts | 13 +++--- src/test/moves/astonish.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 6 +-- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 4 +- src/test/moves/follow_me.test.ts | 2 +- src/test/moves/gastro_acid.test.ts | 4 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/growth.test.ts | 2 +- src/test/moves/hard_press.test.ts | 2 +- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/light_screen.test.ts | 4 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 4 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 2 +- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/reflect.test.ts | 4 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/spit_up.test.ts | 2 +- src/test/moves/spotlight.test.ts | 2 +- src/test/moves/stockpile.test.ts | 2 +- src/test/moves/swallow.test.ts | 2 +- src/test/moves/tackle.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/tailwind.test.ts | 6 +-- src/test/moves/thousand_arrows.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 2 +- src/test/ui/transfer-item.test.ts | 2 +- 89 files changed, 155 insertions(+), 143 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index 84d4390652e..61f419e5fe5 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -26,7 +26,7 @@ describe("Ability Timing", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIDGEY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 28813b5206f..65b2b44448a 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 06f388371e9..62926b8c7dc 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Battery", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 8166f9bfe66..88f15d78762 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -28,7 +28,7 @@ describe("Abilities - BATTLE BOND", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BATTLE_BOND); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index f26c4f70758..7c791c3e140 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -27,7 +27,7 @@ describe("Abilities - COSTAR", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index f0d10e4691d..87ac53963fb 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -28,7 +28,7 @@ describe("Abilities - DISGUISE", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DISGUISE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 3d97c414862..dbfe1fe761a 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Dry Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index ccf8ddef3c6..e50c5dfd3d6 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Ice Face", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 944af180af1..709e60ea250 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -126,7 +126,7 @@ describe("Abilities - Intimidate", () => { }, 200000); it("double - trainer should only trigger once per pokemon", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); game.override.startingWave(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( @@ -152,7 +152,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("double - wild: should only trigger once per pokemon", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); game.override.startingWave(3); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( @@ -178,7 +178,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("double - boss: should only trigger once per pokemon", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); game.override.startingWave(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( @@ -332,7 +332,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("double - wild vs only 1 on player side", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); game.override.startingWave(3); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); await game.runToSummon([Species.MIGHTYENA]); @@ -350,7 +350,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("double - wild vs only 1 alive on player side", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); game.override.startingWave(3); await game.runToTitle(); diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index 1fae6555688..e803db2c049 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Intrepid Sword", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ZACIAN); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 015e6a44e24..3e8cbbfe387 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index f7b7fe22027..d1be9b7acbf 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Moxie", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.AERIAL_ACE; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index f29eafc72f6..609228de30f 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Parental Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); @@ -238,7 +238,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); @@ -612,7 +612,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves with Multi-Lens", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index ce40bb49613..cf2c4769ad9 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -28,7 +28,7 @@ describe("Abilities - POWER CONSTRUCT", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.POWER_CONSTRUCT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 1947cfc9c4f..ca4ae543871 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 6255a2bc2b2..2f973197444 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 9e6a39b86c9..3e9aab440fa 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Quick Draw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 6adf8432914..82055732c8c 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -29,14 +29,15 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEOWSCARADA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - game.override.weather(WeatherType.SANDSTORM); + game.override + .weather(WeatherType.SANDSTORM) + .battleType("double"); }); test( diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 9fa2001a6ad..600239ef907 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index df9c4e6f065..c39c9d6ce80 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -28,7 +28,7 @@ describe("Abilities - SCHOOLING", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCHOOLING); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 28253f9aaf6..efb14e8ef02 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Screen Cleaner", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); }); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 6530c3ebe15..d86c280eaab 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Serene Grace", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 46bd92f0d56..0bd352aa142 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Sheer Force", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 472ba90caf9..4efb864a880 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Shield Dust", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH]; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index a310148f041..ec13404b19c 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -28,7 +28,7 @@ describe("Abilities - SHIELDS DOWN", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELDS_DOWN); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index 3e9993a7465..b0c0721a4e3 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Steely Spirit", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 0cfa45ef843..0459732ba87 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Sturdy", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index e6025cb0a6a..f2fcc6f0cce 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Unseen Fist", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index e8c47e1420e..2cbd3fd2533 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Volt Absorb", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 84869bd54a8..d57a5f76b38 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Wind Power", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index d578c5a22dc..8b6fed67e97 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index cd23b2c359f..bdfde821382 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 7b8474170e9..9cd795d5d81 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -43,7 +43,7 @@ describe("Abilities - ZEN MODE", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index 24187626f3d..78cc87ad592 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -28,7 +28,7 @@ describe("Abilities - ZERO TO HERO", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZERO_TO_HERO); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index ae944758bc7..b26f846c5b5 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -29,7 +29,7 @@ describe("Arena - Gravity", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index 7c4536713a3..b2b277bcd79 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -28,8 +28,9 @@ describe("Weather - Fog", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.weather(WeatherType.FOG); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override + .weather(WeatherType.FOG) + .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index 906d6c71b0d..2225df80db5 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -27,7 +27,7 @@ describe("Weather - Strong Winds", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TAILLOW); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 0a6b9473ff1..130a71ff335 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -33,7 +33,7 @@ describe("Battle order", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); @@ -83,7 +83,7 @@ describe("Battle order", () => { }, 20000); it("double - both opponents faster than player 50/50 vs 150/150", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -125,7 +125,7 @@ describe("Battle order", () => { }, 20000); it("double - speed tie except 1 - 100/100 vs 100/150", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -166,7 +166,7 @@ describe("Battle order", () => { }, 20000); it("double - speed tie 100/150 vs 100/150", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index a185844e599..0e2a2a6275e 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -93,11 +93,12 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - game.override.startingWave(3); + game.override + .startingWave(3) + .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); @@ -117,7 +118,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); @@ -204,7 +205,7 @@ describe("Test Battle Phase", () => { }, 20000); it("2vs1", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -217,7 +218,7 @@ describe("Test Battle Phase", () => { }, 20000); it("1vs1", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -229,7 +230,7 @@ describe("Test Battle Phase", () => { }, 20000); it("2vs2", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -243,7 +244,7 @@ describe("Test Battle Phase", () => { }, 20000); it("4vs2", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -260,7 +261,7 @@ describe("Test Battle Phase", () => { it("kill opponent pokemon", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -289,7 +290,7 @@ describe("Test Battle Phase", () => { it("to next turn", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -307,7 +308,7 @@ describe("Test Battle Phase", () => { it("to next wave with pokemon killed, single", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index e65a6867919..5ea0bd7fac0 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -23,13 +23,14 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override + .battleType("single") + .startingWave(3); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 0a2b5d4106a..f958488c2db 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -35,8 +35,9 @@ describe("Test Battle Phase", () => { }); it("startBattle 2vs1 boss", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - game.override.startingWave(10); + game.override + .battleType("single") + .startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -46,8 +47,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 boss", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - game.override.startingWave(10); + game.override + .battleType("double") + .startingWave(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -57,8 +59,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - game.override.startingWave(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -68,8 +71,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs1 trainer", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - game.override.startingWave(5); + game.override + .battleType("single") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -79,8 +83,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs1 rival", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - game.override.startingWave(8); + game.override + .battleType("single") + .startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -90,8 +95,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 rival", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - game.override.startingWave(8); + game.override + .battleType("double") + .startingWave(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -101,8 +107,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 1vs1 trainer", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - game.override.startingWave(5); + game.override + .battleType("single") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, ]); @@ -111,8 +118,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - game.override.startingWave(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -122,8 +130,9 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 4vs2 trainer", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - game.override.startingWave(5); + game.override + .battleType("double") + .startingWave(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 945e8363231..ad02c168fbc 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -24,7 +24,7 @@ describe("Evolution", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 5cdcf2256c3..2a0ee64a172 100644 --- a/src/test/items/eviolite.test.ts +++ b/src/test/items/eviolite.test.ts @@ -26,7 +26,7 @@ describe("Items - Eviolite", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("EVIOLITE activates in battle correctly", async() => { diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts index 866bd6f08b6..75e0892efc6 100644 --- a/src/test/items/exp_booster.test.ts +++ b/src/test/items/exp_booster.test.ts @@ -25,7 +25,7 @@ describe("EXP Modifier Items", () => { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("EXP booster items stack additively", async() => { diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 2aeb98253ab..bfab8fbb5ea 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -30,7 +30,7 @@ describe("Items - Grip Claw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index 2781de45c08..f120dede4a4 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -31,7 +31,7 @@ describe("Items - Leek", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("LEEK activates in battle correctly", async() => { diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index 1d564ae534c..b8b866a8a4d 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -25,7 +25,7 @@ describe("Items - Leftovers", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index e693307e229..ed6ed8a4934 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -26,7 +26,7 @@ describe("Items - Light Ball", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("LIGHT_BALL activates in battle correctly", async() => { diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 111bc6dfad1..f106b344f44 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -26,7 +26,7 @@ describe("Items - Metal Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("METAL_POWDER activates in battle correctly", async() => { diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index cddddb0eeea..0c71ec39ee4 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -26,7 +26,7 @@ describe("Items - Quick Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("QUICK_POWDER activates in battle correctly", async() => { diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index 8f54a880c41..6a7af5388e7 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -31,7 +31,7 @@ describe("Items - Scope Lens", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }, 20000); it("SCOPE_LENS activates in battle correctly", async() => { diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index a0a229a5d13..9cb608b7e89 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -26,7 +26,7 @@ describe("Items - Thick Club", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); it("THICK_CLUB activates in battle correctly", async() => { diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 45662ac29cf..80ca065940f 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -36,7 +36,7 @@ describe("Items - Toxic orb", () => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; const oppMoveToUse = Moves.TACKLE; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); diff --git a/src/test/localization/terrain.test.ts b/src/test/localization/terrain.test.ts index 08292bcdda7..6450d8574be 100644 --- a/src/test/localization/terrain.test.ts +++ b/src/test/localization/terrain.test.ts @@ -1,11 +1,10 @@ -import { beforeAll, describe, beforeEach, afterEach, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; import { TerrainType, getTerrainName } from "#app/data/terrain"; -import { getTerrainStartMessage, getTerrainClearMessage, getTerrainBlockMessage } from "#app/data/weather"; +import { getTerrainBlockMessage, getTerrainClearMessage, getTerrainStartMessage } from "#app/data/weather"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#enums/species"; import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { mockI18next } from "../utils/testUtils"; describe("terrain", () => { @@ -21,7 +20,7 @@ describe("terrain", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); }); describe("NONE", () => { diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 4ce2f16715b..01173f468b6 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -28,7 +28,7 @@ describe("Moves - Astonish", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ASTONISH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BLASTOISE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index ead142c0792..c1052a1ef92 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -35,7 +35,7 @@ describe("Moves - Aurora Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -58,7 +58,7 @@ describe("Moves - Aurora Veil", () => { }); it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); @@ -86,7 +86,7 @@ describe("Moves - Aurora Veil", () => { }); it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index b92979c56ed..07a1a704940 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -32,7 +32,7 @@ describe("Moves - Ceaseless Edge", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index de9bd01fd5b..f15ea0e04b2 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -27,7 +27,7 @@ describe("Moves - Double Team", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_TEAM]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index a6044044aa4..0151d1b0627 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -34,7 +34,7 @@ describe("Moves - Dragon Rage", () => { beforeEach(async () => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 94e45b045ee..b10131c318e 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -33,7 +33,7 @@ describe("Moves - Dynamax Cannon", () => { // Note that, for Waves 1-10, the level cap is 10 game.override.startingWave(1); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index f91c01ebbe2..f0fff8e0615 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -29,7 +29,7 @@ describe("Moves - Fissure", () => { beforeEach(async () => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index c36a45790c7..923f6eff05d 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -32,7 +32,7 @@ describe("Moves - Flower Shield", () => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); @@ -57,7 +57,7 @@ describe("Moves - Flower Shield", () => { it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 738c9b6e837..bf427b6300a 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -32,7 +32,7 @@ describe("Moves - Follow Me", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index c8f6ab6cc6a..2c28b1b88b3 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -29,7 +29,7 @@ describe("Moves - Gastro Acid", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); @@ -72,7 +72,7 @@ describe("Moves - Gastro Acid", () => { }, TIMEOUT); it("fails if used on an enemy with an already-suppressed ability", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(null); + game.override.battleType(null); await game.startBattle(); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 8cc2dc73b72..67991f07870 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -26,7 +26,7 @@ describe("Moves - Glaive Rush", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 6068c114fc3..b646da5445e 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -34,7 +34,7 @@ describe("Moves - Growth", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 8800d66bd9a..ba323685cb0 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -29,7 +29,7 @@ describe("Moves - Hard Press", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MUNCHLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 2a6486c0de5..7df539fb5c0 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -29,7 +29,7 @@ describe("Moves - Hyper Beam", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 5269ec6d8ee..63ba9baa1f6 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -34,7 +34,7 @@ describe("Moves - Light Screen", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -57,7 +57,7 @@ describe("Moves - Light Screen", () => { }); it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 2b06867f0a7..b57fe9448dc 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -23,7 +23,7 @@ describe("Moves - Magnet Rise", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.MAGNET_RISE; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index c578a70bb9c..7d273b1c51b 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -31,7 +31,7 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); @@ -63,7 +63,7 @@ describe("Moves - Make It Rain", () => { it("should apply effects even if the target faints", async () => { vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 7548e9529d1..3d22872de69 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -164,7 +164,7 @@ function leaveOneEnemyPokemon(game: GameManager) { function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { const game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index af96c2dc872..2c1b3e429ed 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -28,7 +28,7 @@ describe("Moves - Octolock", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 282d33f85f9..a8d28529d9f 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -29,7 +29,7 @@ describe("Moves - Purify", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 3c315447b23..98a2572389e 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -31,7 +31,7 @@ describe("Moves - Rage Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 9b57b3cdee3..dfc6d884ce3 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -34,7 +34,7 @@ describe("Moves - Reflect", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -56,7 +56,7 @@ describe("Moves - Reflect", () => { }); it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 6d8828455e4..9d7bf73f19a 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -27,7 +27,7 @@ describe("Moves - Rollout", () => { beforeEach(() => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index 7f8495e1632..9411cf0ef35 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -27,7 +27,7 @@ describe("Moves - Roost", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index a4fc1a4baeb..fd52b6ae764 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -27,7 +27,7 @@ describe("Moves - Spikes", () => { beforeEach(() => { game = new GameManager(phaserGame); game.scene.battleStyle = 1; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index f136d8f1e2b..f0ac0caa9d7 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -27,7 +27,7 @@ describe("Moves - Spit Up", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 88d276d3d61..b627b959336 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -31,7 +31,7 @@ describe("Moves - Spotlight", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 1a23017c6b3..39730c812d4 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -27,7 +27,7 @@ describe("Moves - Stockpile", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 0dd4237c232..2b839ae2e86 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -26,7 +26,7 @@ describe("Moves - Swallow", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index e36713fd086..147de6b0e33 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -31,7 +31,7 @@ describe("Moves - Tackle", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TACKLE; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); game.override.startingWave(97); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 662746db4eb..6fba92c6174 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -33,7 +33,7 @@ describe("Moves - Tail whip", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TAIL_WHIP; - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index 535d0a1e525..a4c62f77275 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); @@ -55,7 +55,7 @@ describe("Abilities - Wind Rider", () => { }); it("lasts for 4 turns", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); await game.startBattle([Species.MAGIKARP]); @@ -78,7 +78,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not affect the opposing side", async () => { - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index 950e5228928..fdac2ade739 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -30,7 +30,7 @@ describe("Moves - Thousand Arrows", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 16312ce431a..6d436215db3 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -27,7 +27,7 @@ describe("Moves - Tidy Up", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index ba0dce8d8b5..6f3f16deddb 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -33,7 +33,7 @@ describe("UI - Transfer Items", () => { beforeEach(async () => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.startingWave(1); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ From 08e0531eae020f74ba42c7d57324a908759c3089 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:53:34 -0700 Subject: [PATCH 008/321] add OverridesHelper.enemySpecies() --- src/test/utils/overridesHelper.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 4fe605b4cac..5d9472deb70 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,5 +1,6 @@ import { Weather, WeatherType } from "#app/data/weather"; import { Biome } from "#app/enums/biome"; +import { Species } from "#app/enums/species.js"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import Overrides from "#app/overrides"; @@ -92,6 +93,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) species + * @param species the (pokemon) species to set + * @returns this + */ + enemySpecies(species: Species): this { + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(species); + this.log(`Enemy Pokemon species set to ${Species[species]} (=${species})!`); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From 6674fe4984a119752c35ee170eb263f820fcd0c4 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:57:37 -0700 Subject: [PATCH 009/321] allow `number` for OverridesHelper.enemySpecies() --- src/test/utils/overridesHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 5d9472deb70..bdc92a47714 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -98,7 +98,7 @@ export class OverridesHelper { * @param species the (pokemon) species to set * @returns this */ - enemySpecies(species: Species): this { + enemySpecies(species: Species | number): this { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(species); this.log(`Enemy Pokemon species set to ${Species[species]} (=${species})!`); return this; From 141c3f5a6ad50f43949455492e9958440dbfa19c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 14:57:47 -0700 Subject: [PATCH 010/321] apply game.override.enemySpecies() --- src/test/abilities/ability_timing.test.ts | 2 +- src/test/abilities/aura_break.test.ts | 2 +- src/test/abilities/battery.test.ts | 2 +- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/dry_skin.test.ts | 2 +- src/test/abilities/hustle.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 6 +++--- src/test/abilities/intimidate.test.ts | 2 +- src/test/abilities/intrepid_sword.test.ts | 2 +- src/test/abilities/libero.test.ts | 6 +++--- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 4 ++-- src/test/abilities/power_spot.test.ts | 2 +- src/test/abilities/protean.test.ts | 6 +++--- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sand_veil.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 12 ++++++------ src/test/abilities/screen_cleaner.test.ts | 2 +- src/test/abilities/serene_grace.test.ts | 2 +- src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 2 +- src/test/abilities/steely_spirit.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 8 ++++---- src/test/abilities/wind_rider.test.ts | 10 +++++----- src/test/abilities/wonder_skin.test.ts | 2 +- src/test/abilities/zen_mode.test.ts | 2 +- src/test/achievements/achievement.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/arena/weather_strong_winds.test.ts | 4 ++-- src/test/battle/battle-order.test.ts | 2 +- src/test/battle/battle.test.ts | 18 +++++++++--------- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 2 +- src/test/evolution.test.ts | 2 +- src/test/items/grip_claw.test.ts | 2 +- src/test/items/leek.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/astonish.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 8 ++++---- src/test/moves/follow_me.test.ts | 2 +- src/test/moves/gastro_acid.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/growth.test.ts | 2 +- src/test/moves/hard_press.test.ts | 2 +- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/light_screen.test.ts | 2 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 2 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 2 +- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/reflect.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 4 ++-- src/test/moves/spit_up.test.ts | 2 +- src/test/moves/spotlight.test.ts | 2 +- src/test/moves/stockpile.test.ts | 2 +- src/test/moves/swallow.test.ts | 2 +- src/test/moves/tackle.test.ts | 4 ++-- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/thousand_arrows.test.ts | 6 +++--- src/test/moves/tidy_up.test.ts | 2 +- src/test/ui/transfer-item.test.ts | 2 +- 77 files changed, 112 insertions(+), 112 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index 61f419e5fe5..894bb7c7e6b 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -28,7 +28,7 @@ describe("Ability Timing", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIDGEY); + game.override.enemySpecies(Species.PIDGEY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 65b2b44448a..2b3ebc5d6fb 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Aura Break", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); }); it("reverses the effect of fairy aura", async () => { diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 62926b8c7dc..9347ba754e5 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Battery", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 87ac53963fb..ee9160a8e4f 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -74,7 +74,7 @@ describe("Abilities - DISGUISE", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.MIMIKYU]: baseForm, }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index dbfe1fe761a..4d3502567d9 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Dry Skin", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); + game.override.enemySpecies(Species.CHARMANDER); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); }); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index 853dd9bc904..2de86b54973 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Hustle", () => { vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index e50c5dfd3d6..f696d9943dc 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Ice Face", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); + game.override.enemySpecies(Species.EISCUE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); @@ -158,7 +158,7 @@ describe("Abilities - Ice Face", () => { }); it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle([Species.EISCUE]); @@ -204,7 +204,7 @@ describe("Abilities - Ice Face", () => { it("reverts to Ice Face on arena reset", async () => { game.override.startingWave(4); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.EISCUE]: noiceForm, }); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 709e60ea250..fbcd858415a 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index e803db2c049..878c5dbb0dc 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Intrepid Sword", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ZACIAN); + game.override.enemySpecies(Species.ZACIAN); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); }); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 3e8cbbfe387..bde6d74f74f 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Protean", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); @@ -226,7 +226,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -320,7 +320,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index d1be9b7acbf..50c0b58b900 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Moxie", () => { game = new GameManager(phaserGame); const moveToUse = Moves.AERIAL_ACE; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 609228de30f..c6e7cc4c95a 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Parental Bond", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -76,7 +76,7 @@ describe("Abilities - Parental Bond", () => { "ability should apply secondary effects to both strikes", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.enemySpecies(Species.AMOONGUSS); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index ca4ae543871..a9db0c3bea1 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Power Spot", () => { game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 2f973197444..a47777a01c1 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Protean", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); @@ -226,7 +226,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -320,7 +320,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GASTLY); + game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 3e9aab440fa..d6a4ef8038f 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Quick Draw", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.TACKLE)); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 82055732c8c..dbdc9699600 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEOWSCARADA); + game.override.enemySpecies(Species.MEOWSCARADA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 600239ef907..bc19531e46f 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); + game.override.enemySpecies(Species.DUSKULL); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -61,7 +61,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -80,7 +80,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -100,7 +100,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -122,7 +122,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); await game.startBattle(); @@ -147,7 +147,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index efb14e8ef02..864f088bdcf 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Screen Cleaner", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); }); it("removes Aurora Veil", async () => { diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index d86c280eaab..e8d1f242041 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Serene Grace", () => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + game.override.enemySpecies(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 0bd352aa142..f6477783f6c 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Sheer Force", () => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + game.override.enemySpecies(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 4efb864a880..186c5c3c6ad 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Shield Dust", () => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH]; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + game.override.enemySpecies(Species.ONIX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index b0c0721a4e3..374aef0ce2f 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Steely Spirit", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 0459732ba87..d4c4ee66761 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Sturdy", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ARON); + game.override.enemySpecies(Species.ARON); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); }); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index f2fcc6f0cce..6760b1098ba 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Unseen Fist", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 2cbd3fd2533..881d745eed6 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Volt Absorb", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); + game.override.enemySpecies(Species.DUSKULL); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); await game.startBattle(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index d57a5f76b38..b7539f0188b 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Wind Power", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + game.override.enemySpecies(Species.SHIFTRY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); @@ -48,7 +48,7 @@ describe("Abilities - Wind Power", () => { it("it becomes charged when Tailwind takes effect on its side", async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); @@ -62,7 +62,7 @@ describe("Abilities - Wind Power", () => { }); it("does not become charged when Tailwind takes effect on opposing side", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); await game.startBattle([Species.SHIFTRY]); @@ -81,7 +81,7 @@ describe("Abilities - Wind Power", () => { }); it("does not interact with Sandstorm", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 8b6fed67e97..ec09b39c539 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + game.override.enemySpecies(Species.SHIFTRY); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); @@ -50,7 +50,7 @@ describe("Abilities - Wind Rider", () => { it("Attack is increased by one stage when Tailwind is present on its side", async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); @@ -66,7 +66,7 @@ describe("Abilities - Wind Rider", () => { it("does not increase Attack when Tailwind is present on opposing side", async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -84,7 +84,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not increase Attack when Tailwind is present on opposing side", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -102,7 +102,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not interact with Sandstorm", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index bdfde821382..a38ec41fa2d 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Wonder Skin", () => { game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 9cd795d5d81..1119b4cdb90 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -44,7 +44,7 @@ describe("Abilities - ZEN MODE", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index 207293d1973..162c8c81ee3 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -104,11 +104,11 @@ describe("RibbonAchv", () => { beforeEach(() => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.enemySpecies(0); game.override.startingWave(0); scene = game.scene; }); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index b26f846c5b5..0e5b7b992a7 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -33,7 +33,7 @@ describe("Arena - Gravity", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); }); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index b2b277bcd79..b11d3728f10 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -34,7 +34,7 @@ describe("Weather - Fog", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); }); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index 2225df80db5..245b1bcf74a 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -29,13 +29,13 @@ describe("Weather - Strong Winds", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TAILLOW); + game.override.enemySpecies(Species.TAILLOW); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); }); it("electric type move is not very effective on Rayquaza", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RAYQUAZA); + game.override.enemySpecies(Species.RAYQUAZA); await game.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon(); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 130a71ff335..55753951881 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -34,7 +34,7 @@ describe("Battle order", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.enemySpecies(Species.MEWTWO); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 0e2a2a6275e..f2dc328ac47 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -91,7 +91,7 @@ describe("Test Battle Phase", () => { it("do attack wave 3 - single battle - regular - OHKO", async() => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override .startingWave(3) @@ -112,7 +112,7 @@ describe("Test Battle Phase", () => { it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); @@ -206,7 +206,7 @@ describe("Test Battle Phase", () => { it("2vs1", async() => { game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + game.override.enemySpecies(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ @@ -219,7 +219,7 @@ describe("Test Battle Phase", () => { it("1vs1", async() => { game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + game.override.enemySpecies(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ @@ -231,7 +231,7 @@ describe("Test Battle Phase", () => { it("2vs2", async() => { game.override.battleType("double"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + game.override.enemySpecies(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); @@ -245,7 +245,7 @@ describe("Test Battle Phase", () => { it("4vs2", async() => { game.override.battleType("double"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + game.override.enemySpecies(Species.MIGHTYENA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); @@ -263,7 +263,7 @@ describe("Test Battle Phase", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); @@ -292,7 +292,7 @@ describe("Test Battle Phase", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); @@ -310,7 +310,7 @@ describe("Test Battle Phase", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 5ea0bd7fac0..c7bb45e8180 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -27,7 +27,7 @@ describe("Test Battle Phase", () => { .battleType("single") .startingWave(3); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index f958488c2db..34bdac1f306 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -26,7 +26,7 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index ad02c168fbc..60e3392b281 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -26,7 +26,7 @@ describe("Evolution", () => { game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(60); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index bfab8fbb5ea..defa55ca5f1 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -33,7 +33,7 @@ describe("Items - Grip Claw", () => { game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index f120dede4a4..a6268a397a8 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -27,7 +27,7 @@ describe("Items - Leek", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index b8b866a8a4d..5cea7be42ba 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -29,7 +29,7 @@ describe("Items - Leftovers", () => { vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LEFTOVERS", count: 1}]); diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index 6a7af5388e7..9ba5b96ed07 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -27,7 +27,7 @@ describe("Items - Scope Lens", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 80ca065940f..132d939be9f 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -37,7 +37,7 @@ describe("Items - Toxic orb", () => { const moveToUse = Moves.GROWTH; const oppMoveToUse = Moves.TACKLE; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 01173f468b6..9a6d2df5e0b 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -30,7 +30,7 @@ describe("Moves - Astonish", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ASTONISH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BLASTOISE); + game.override.enemySpecies(Species.BLASTOISE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index c1052a1ef92..3922d86a74d 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -39,7 +39,7 @@ describe("Moves - Aurora Veil", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.weather(WeatherType.HAIL); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 07a1a704940..f6766ee2441 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -33,7 +33,7 @@ describe("Moves - Ceaseless Edge", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index f15ea0e04b2..da623b7ba92 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -31,7 +31,7 @@ describe("Moves - Double Team", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_TEAM]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 0151d1b0627..ae6768e6688 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -43,7 +43,7 @@ describe("Moves - Dragon Rage", () => { vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index b10131c318e..94900747662 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -36,7 +36,7 @@ describe("Moves - Dynamax Cannon", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(dynamaxCannon, "calculateBattlePower"); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index f0fff8e0615..b6bb37363e7 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -37,7 +37,7 @@ describe("Moves - Fissure", () => { vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index 923f6eff05d..7eb495672ae 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -38,7 +38,7 @@ describe("Moves - Flower Shield", () => { }); it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + game.override.enemySpecies(Species.CHERRIM); await game.startBattle([Species.MAGIKARP]); const cherrim = game.scene.getEnemyPokemon(); @@ -55,7 +55,7 @@ describe("Moves - Flower Shield", () => { }); it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); game.override.battleType("double"); @@ -80,7 +80,7 @@ describe("Moves - Flower Shield", () => { * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} */ it("does not increase defense of a pokemon in semi-vulnerable state", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); + game.override.enemySpecies(Species.PARAS); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); @@ -101,7 +101,7 @@ describe("Moves - Flower Shield", () => { }); it("does nothing if there are no Grass-type pokemon on the field", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon(); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index bf427b6300a..9d2dc016872 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -34,7 +34,7 @@ describe("Moves - Follow Me", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 2c28b1b88b3..1c4028a351f 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -34,7 +34,7 @@ describe("Moves - Gastro Acid", () => { vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + game.override.enemySpecies(Species.BIDOOF); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); }); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 67991f07870..4ed85fa74e8 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -28,7 +28,7 @@ describe("Moves - Glaive Rush", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.GLAIVE_RUSH)); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.KLINK); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index b646da5445e..9a057fbc03b 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -35,7 +35,7 @@ describe("Moves - Growth", () => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index ba323685cb0..1e607bc20fb 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -31,7 +31,7 @@ describe("Moves - Hard Press", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MUNCHLAX); + game.override.enemySpecies(Species.MUNCHLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 7df539fb5c0..480522ace4d 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -31,7 +31,7 @@ describe("Moves - Hyper Beam", () => { game.override.battleType("single"); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 63ba9baa1f6..60220b71a1c 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -38,7 +38,7 @@ describe("Moves - Light Screen", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index b57fe9448dc..ddfa068fe4b 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -25,7 +25,7 @@ describe("Moves - Magnet Rise", () => { const moveToUse = Moves.MAGNET_RISE; game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index 7d273b1c51b..d44fd252ba1 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -33,7 +33,7 @@ describe("Moves - Make It Rain", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 3d22872de69..268d582156b 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -171,7 +171,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(40); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EEVEE); + game.override.enemySpecies(Species.EEVEE); return game; } diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 2c1b3e429ed..ada806fd4d0 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -30,7 +30,7 @@ describe("Moves - Octolock", () => { game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index a8d28529d9f..551ecddbb64 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -35,7 +35,7 @@ describe("Moves - Purify", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 98a2572389e..779be067a95 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -33,7 +33,7 @@ describe("Moves - Rage Powder", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index dfc6d884ce3..2d4d791b902 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -38,7 +38,7 @@ describe("Moves - Reflect", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 9d7bf73f19a..a6a083ef92b 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -30,7 +30,7 @@ describe("Moves - Rollout", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + game.override.enemySpecies(Species.BIDOOF); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index 9411cf0ef35..b9255032cd4 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -28,7 +28,7 @@ describe("Moves - Roost", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); + game.override.enemySpecies(Species.STARAPTOR); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index fd52b6ae764..c198e347134 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -28,7 +28,7 @@ describe("Moves - Spikes", () => { game = new GameManager(phaserGame); game.scene.battleStyle = 1; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); @@ -106,7 +106,7 @@ describe("Moves - Spikes", () => { it("trainer - wild - force switch by himself opponent - should take damage", async() => { game.override.startingWave(5); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); + game.override.enemySpecies(0); // turn 1: player set spikes, opponent do splash // turn 2: player do splash, opponent switch pokemon // opponent pokemon should trigger spikes and lose HP diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index f0ac0caa9d7..fc83b0d4357 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -29,7 +29,7 @@ describe("Moves - Spit Up", () => { game.override.battleType("single"); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index b627b959336..8ec1cd38069 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -33,7 +33,7 @@ describe("Moves - Spotlight", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 39730c812d4..18e9cc366c4 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -29,7 +29,7 @@ describe("Moves - Stockpile", () => { game.override.battleType("single"); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 2b839ae2e86..37ce68527a2 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -28,7 +28,7 @@ describe("Moves - Swallow", () => { game.override.battleType("single"); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index 147de6b0e33..97da84b5d17 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -32,7 +32,7 @@ describe("Moves - Tackle", () => { game = new GameManager(phaserGame); const moveToUse = Moves.TACKLE; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); game.override.startingWave(97); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); @@ -42,7 +42,7 @@ describe("Moves - Tackle", () => { it("TACKLE against ghost", async() => { const moveToUse = Moves.TACKLE; - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GENGAR); + game.override.enemySpecies(Species.GENGAR); await game.startBattle([ Species.MIGHTYENA, ]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 6fba92c6174..6122badeba1 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -34,7 +34,7 @@ describe("Moves - Tail whip", () => { game = new GameManager(phaserGame); const moveToUse = Moves.TAIL_WHIP; game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index fdac2ade739..fb49195c2bd 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -31,7 +31,7 @@ describe("Moves - Thousand Arrows", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); + game.override.enemySpecies(Species.TOGETIC); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); @@ -61,7 +61,7 @@ describe("Moves - Thousand Arrows", () => { it( "move should hit and ground targets with Levitate", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); await game.startBattle([ Species.ILLUMISE ]); @@ -84,7 +84,7 @@ describe("Moves - Thousand Arrows", () => { it( "move should hit and ground targets under the effects of Magnet Rise", async () => { - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.enemySpecies(Species.SNORLAX); await game.startBattle([ Species.ILLUMISE ]); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 6d436215db3..c9e76ae5078 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -28,7 +28,7 @@ describe("Moves - Tidy Up", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 6f3f16deddb..b17d5c7544f 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -42,7 +42,7 @@ describe("UI - Transfer Items", () => { { name: "BERRY", count: 2, type: BerryType.LUM }, ]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); await game.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); From 7cd75b13b9513606afb9d5d44c2bb8bf6dbe27b5 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:01:59 -0700 Subject: [PATCH 011/321] add OverridesHelper.enemyAbility --- src/test/utils/overridesHelper.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index bdc92a47714..f1273c26f38 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,4 +1,5 @@ import { Weather, WeatherType } from "#app/data/weather"; +import { Abilities } from "#app/enums/abilities.js"; import { Biome } from "#app/enums/biome"; import { Species } from "#app/enums/species.js"; import * as GameMode from "#app/game-mode"; @@ -56,8 +57,8 @@ export class OverridesHelper { } /** - * Override the weather (type) - * @param type weather type to set + * Override the {@linkcode WeatherType | weather (type)} + * @param type {@linkcode WeatherType | weather type} to set * @returns this */ weather(type: WeatherType): this { @@ -94,8 +95,8 @@ export class OverridesHelper { } /** - * Override the enemy (pokemon) species - * @param species the (pokemon) species to set + * Override the enemy (pokemon) {@linkcode Species | species} + * @param species the (pokemon) {@linkcode Species | species} to set * @returns this */ enemySpecies(species: Species | number): this { @@ -104,6 +105,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) {@linkcode Abilities | ability} + * @param ability the (pokemon) {@linkcode Abilities | ability} to set + * @returns this + */ + enemyAbility(ability: Abilities): this { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(ability); + this.log(`Enemy Pokemon species set to ${Abilities[ability]} (=${ability})!`); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From d14799f37afb67466067de74c1be79bbb590f189 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:05:32 -0700 Subject: [PATCH 012/321] apply game.override.enemyAbility --- src/test/abilities/ability_timing.test.ts | 2 +- src/test/abilities/aura_break.test.ts | 2 +- src/test/abilities/battery.test.ts | 2 +- src/test/abilities/costar.test.ts | 4 ++-- src/test/abilities/dry_skin.test.ts | 4 ++-- src/test/abilities/hustle.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/intimidate.test.ts | 2 +- src/test/abilities/intrepid_sword.test.ts | 2 +- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 4 ++-- src/test/abilities/power_spot.test.ts | 2 +- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sand_veil.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 12 ++++++------ src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 2 +- src/test/abilities/steely_spirit.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 2 +- src/test/abilities/wind_rider.test.ts | 2 +- src/test/abilities/wonder_skin.test.ts | 2 +- src/test/abilities/zen_mode.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/arena/weather_strong_winds.test.ts | 2 +- src/test/battle/battle-order.test.ts | 2 +- src/test/battle/battle.test.ts | 18 +++++++++--------- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 2 +- src/test/evolution.test.ts | 2 +- src/test/items/exp_booster.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/astonish.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 4 ++-- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 2 +- src/test/moves/gastro_acid.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/growth.test.ts | 2 +- src/test/moves/hard_press.test.ts | 2 +- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 2 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/spit_up.test.ts | 2 +- src/test/moves/stockpile.test.ts | 2 +- src/test/moves/swallow.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/thousand_arrows.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 2 +- 58 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index 894bb7c7e6b..ebc3f4d9bce 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -29,7 +29,7 @@ describe("Ability Timing", () => { game.override.battleType("single"); game.override.enemySpecies(Species.PIDGEY); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + game.override.enemyAbility(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 2b3ebc5d6fb..2de8a86309d 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Aura Break", () => { game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); }); diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 9347ba754e5..90dc8b62986 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Battery", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 7c791c3e140..282fda866ea 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -37,7 +37,7 @@ describe("Abilities - COSTAR", () => { test( "ability copies positive stat changes", async () => { - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); @@ -68,7 +68,7 @@ describe("Abilities - COSTAR", () => { test( "ability copies negative stat changes", async () => { - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + game.override.enemyAbility(Abilities.INTIMIDATE); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 4d3502567d9..25069e35604 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Dry Skin", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); + game.override.enemyAbility(Abilities.DRY_SKIN); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.enemySpecies(Species.CHARMANDER); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); @@ -94,7 +94,7 @@ describe("Abilities - Dry Skin", () => { expect(enemy.hp > 0); enemy.hp = initialHP; - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); // second turn game.doAttack(getMovePosition(game.scene, 0, Moves.FLAMETHROWER)); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index 2de86b54973..cea0bc10799 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Hustle", () => { vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); }); it("increases the user's Attack stat by 50%", async () => { diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index f696d9943dc..6930c0d1db8 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Ice Face", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.EISCUE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); + game.override.enemyAbility(Abilities.ICE_FACE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index fbcd858415a..b3edc0d0206 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Intimidate", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + game.override.enemyAbility(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); game.override.startingWave(3); diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index 878c5dbb0dc..fa988fcab39 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Intrepid Sword", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.ZACIAN); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); + game.override.enemyAbility(Abilities.INTREPID_SWORD); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); }); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index 50c0b58b900..a2a50f15488 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Moxie", () => { const moveToUse = Moves.AERIAL_ACE; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + game.override.enemyAbility(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index c6e7cc4c95a..991ccefd265 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Parental Bond", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -591,7 +591,7 @@ describe("Abilities - Parental Bond", () => { "ability should not cause user to hit into Storm Drain more than once", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STORM_DRAIN); + game.override.enemyAbility(Abilities.STORM_DRAIN); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index a9db0c3bea1..b63ad8522e4 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); }); it("raises the power of allies' special moves by 30%", async () => { diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index d6a4ef8038f..922725b6ea0 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Quick Draw", () => { vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.TACKLE)); vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index dbdc9699600..4077dca2b31 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Sand Veil", () => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); game.override.enemySpecies(Species.MEOWSCARADA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index bc19531e46f..ce961f107dd 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -41,7 +41,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -62,7 +62,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -81,7 +81,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -101,7 +101,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.enemyAbility(enemyAbility); await game.startBattle(); @@ -123,7 +123,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); await game.startBattle(); @@ -148,7 +148,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + game.override.enemyAbility(enemyAbility); await game.startBattle(); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index f6477783f6c..5e7eb11a3c3 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -160,7 +160,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force Disabling Specific Abilities", async() => { const moveToUse = Moves.CRUSH_CLAW; - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COLOR_CHANGE); + game.override.enemyAbility(Abilities.COLOR_CHANGE); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); await game.startBattle([ diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 186c5c3c6ad..c34ac94a6ed 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Shield Dust", () => { const movesToUse = [Moves.AIR_SLASH]; game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); + game.override.enemyAbility(Abilities.SHIELD_DUST); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index 374aef0ce2f..f4b24d2c21e 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Steely Spirit", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index d4c4ee66761..87a998e560d 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Sturdy", () => { game.override.enemySpecies(Species.ARON); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); + game.override.enemyAbility(Abilities.STURDY); }); test( diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 881d745eed6..3a586df897a 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -41,7 +41,7 @@ describe("Abilities - Volt Absorb", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); await game.startBattle(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index b7539f0188b..5eaf87f182f 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Wind Power", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + game.override.enemyAbility(Abilities.WIND_POWER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index ec09b39c539..084317f6e09 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Wind Rider", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + game.override.enemyAbility(Abilities.WIND_RIDER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index a38ec41fa2d..5528b879bdf 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); + game.override.enemyAbility(Abilities.WONDER_SKIN); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 1119b4cdb90..7b6f3e66aa1 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -45,7 +45,7 @@ describe("Abilities - ZEN MODE", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index 0e5b7b992a7..5058f8701b7 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -32,7 +32,7 @@ describe("Arena - Gravity", () => { game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); }); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index b11d3728f10..273e5c88b19 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -33,7 +33,7 @@ describe("Weather - Fog", () => { .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); }); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index 245b1bcf74a..f25be43c426 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -30,7 +30,7 @@ describe("Weather - Strong Winds", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); game.override.enemySpecies(Species.TAILLOW); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); + game.override.enemyAbility(Abilities.DELTA_STREAM); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); }); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 55753951881..7ffb363de9b 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -35,7 +35,7 @@ describe("Battle order", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.MEWTWO); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index f2dc328ac47..a8f17543cc4 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -97,7 +97,7 @@ describe("Test Battle Phase", () => { .startingWave(3) .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { @@ -116,7 +116,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); game.override.battleType("single"); await game.startBattle(); @@ -207,7 +207,7 @@ describe("Test Battle Phase", () => { it("2vs1", async() => { game.override.battleType("single"); game.override.enemySpecies(Species.MIGHTYENA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, @@ -220,7 +220,7 @@ describe("Test Battle Phase", () => { it("1vs1", async() => { game.override.battleType("single"); game.override.enemySpecies(Species.MIGHTYENA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, @@ -232,7 +232,7 @@ describe("Test Battle Phase", () => { it("2vs2", async() => { game.override.battleType("double"); game.override.enemySpecies(Species.MIGHTYENA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); await game.startBattle([ @@ -246,7 +246,7 @@ describe("Test Battle Phase", () => { it("4vs2", async() => { game.override.battleType("double"); game.override.enemySpecies(Species.MIGHTYENA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); await game.startBattle([ @@ -264,7 +264,7 @@ describe("Test Battle Phase", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); @@ -293,7 +293,7 @@ describe("Test Battle Phase", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); @@ -311,7 +311,7 @@ describe("Test Battle Phase", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index c7bb45e8180..75aad9a4ee3 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -28,7 +28,7 @@ describe("Test Battle Phase", () => { .startingWave(3); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 34bdac1f306..7b6330a9fe8 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -29,7 +29,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 60e3392b281..f2cf1023457 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -27,7 +27,7 @@ describe("Evolution", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(60); }); diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts index 75e0892efc6..3f0f2fd3424 100644 --- a/src/test/items/exp_booster.test.ts +++ b/src/test/items/exp_booster.test.ts @@ -23,7 +23,7 @@ describe("EXP Modifier Items", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.battleType("single"); }); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index 5cea7be42ba..d3d6a8860b2 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -30,7 +30,7 @@ describe("Items - Leftovers", () => { vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + game.override.enemyAbility(Abilities.UNNERVE); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LEFTOVERS", count: 1}]); }); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 132d939be9f..50bf108a008 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -39,7 +39,7 @@ describe("Items - Toxic orb", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 9a6d2df5e0b..9f6ea21ae93 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -31,7 +31,7 @@ describe("Moves - Astonish", () => { game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ASTONISH, Moves.SPLASH]); game.override.enemySpecies(Species.BLASTOISE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index f6766ee2441..3cd043cc390 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -34,7 +34,7 @@ describe("Moves - Ceaseless Edge", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); + game.override.enemyAbility(Abilities.RUN_AWAY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index da623b7ba92..13f8087d165 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -32,7 +32,7 @@ describe("Moves - Double Team", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index ae6768e6688..419fca98771 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -45,7 +45,7 @@ describe("Moves - Dragon Rage", () => { game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); @@ -111,7 +111,7 @@ describe("Moves - Dragon Rage", () => { }); it("ignores damage modification from abilities such as ice scales", async () => { - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_SCALES); + game.override.enemyAbility(Abilities.ICE_SCALES); game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index b6bb37363e7..f5c1218af74 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -54,7 +54,7 @@ describe("Moves - Fissure", () => { it("ignores damage modification from abilities such as fur coat", async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NO_GUARD); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); + game.override.enemyAbility(Abilities.FUR_COAT); game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); await game.phaseInterceptor.to(DamagePhase, true); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index 7eb495672ae..b51651aaf76 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -31,7 +31,7 @@ describe("Moves - Flower Shield", () => { beforeEach(() => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 1c4028a351f..4275ee64fdf 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -36,7 +36,7 @@ describe("Moves - Gastro Acid", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + game.override.enemyAbility(Abilities.WATER_ABSORB); }); it("suppresses effect of ability", async () => { diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 4ed85fa74e8..ea0e6032709 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -29,7 +29,7 @@ describe("Moves - Glaive Rush", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.GLAIVE_RUSH)); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.KLINK); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 9a057fbc03b..56f62ae60a1 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -36,7 +36,7 @@ describe("Moves - Growth", () => { const moveToUse = Moves.GROWTH; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + game.override.enemyAbility(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 1e607bc20fb..959b90cdde8 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -32,7 +32,7 @@ describe("Moves - Hard Press", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MUNCHLAX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 480522ace4d..54789b68fbf 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -32,7 +32,7 @@ describe("Moves - Hyper Beam", () => { game.override.battleType("single"); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM, Moves.TACKLE]); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index d44fd252ba1..ee4aef3e343 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -34,7 +34,7 @@ describe("Moves - Make It Rain", () => { game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 268d582156b..40eb2e7daa6 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -69,7 +69,7 @@ describe("Moves - Multi target", () => { async function checkTargetMultiplier(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldMultiplied: boolean, oppAbility?: Abilities) { // play an attack and check target count - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(oppAbility ? oppAbility : Abilities.BALL_FETCH); + game.override.enemyAbility(oppAbility ? oppAbility : Abilities.BALL_FETCH); await game.startBattle(); const playerPokemonRepr = game.scene.getPlayerField(); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index ada806fd4d0..8881170a9a3 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -32,7 +32,7 @@ describe("Moves - Octolock", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.OCTOLOCK, Moves.SPLASH]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index a6a083ef92b..93b07ce84fc 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -31,7 +31,7 @@ describe("Moves - Rollout", () => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); game.override.enemySpecies(Species.BIDOOF); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(SPLASH_ONLY); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index b9255032cd4..284937bd7db 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -29,7 +29,7 @@ describe("Moves - Roost", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.STARAPTOR); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index c198e347134..62ecfbc6312 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -29,7 +29,7 @@ describe("Moves - Spikes", () => { game.scene.battleStyle = 1; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index fc83b0d4357..cb40a3a1177 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -31,7 +31,7 @@ describe("Moves - Spit Up", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 18e9cc366c4..adc70aa99b2 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -31,7 +31,7 @@ describe("Moves - Stockpile", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STOCKPILE, Moves.SPLASH]); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 37ce68527a2..c6a6f485d11 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -30,7 +30,7 @@ describe("Moves - Swallow", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 6122badeba1..af5597d62ed 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -35,7 +35,7 @@ describe("Moves - Tail whip", () => { const moveToUse = Moves.TAIL_WHIP; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index fb49195c2bd..ca8609c7100 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -62,7 +62,7 @@ describe("Moves - Thousand Arrows", () => { "move should hit and ground targets with Levitate", async () => { game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + game.override.enemyAbility(Abilities.LEVITATE); await game.startBattle([ Species.ILLUMISE ]); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index c9e76ae5078..3d55c0a42a2 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -29,7 +29,7 @@ describe("Moves - Tidy Up", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); From f55bfc3681910d252f2d4224954ae698e01c8d06 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:11:05 -0700 Subject: [PATCH 013/321] add OverridesHelper.enemyMoveset() --- src/test/utils/overridesHelper.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index f1273c26f38..7571a4eb657 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,6 +1,7 @@ import { Weather, WeatherType } from "#app/data/weather"; import { Abilities } from "#app/enums/abilities.js"; import { Biome } from "#app/enums/biome"; +import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; @@ -112,7 +113,19 @@ export class OverridesHelper { */ enemyAbility(ability: Abilities): this { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(ability); - this.log(`Enemy Pokemon species set to ${Abilities[ability]} (=${ability})!`); + this.log(`Enemy Pokemon ability set to ${Abilities[ability]} (=${ability})!`); + return this; + } + + /** + * Override the enemy (pokemon) {@linkcode Moves | moves}set + * @param moveset the {@linkcode Moves | moves}set to set + * @returns this + */ + enemyMoveset(moveset: Moves[]): this { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; } From b0279f34f32ef784fd78078b101c341e4af836fe Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:18:14 -0700 Subject: [PATCH 014/321] apply game.override.enemyMoveset --- src/test/abilities/ability_timing.test.ts | 3 ++- src/test/abilities/aura_break.test.ts | 3 ++- src/test/abilities/battery.test.ts | 3 ++- src/test/abilities/battle_bond.test.ts | 2 +- src/test/abilities/costar.test.ts | 3 ++- src/test/abilities/disguise.test.ts | 4 ++-- src/test/abilities/dry_skin.test.ts | 5 +++-- src/test/abilities/hustle.test.ts | 3 ++- src/test/abilities/ice_face.test.ts | 8 ++++---- src/test/abilities/intimidate.test.ts | 6 +++--- src/test/abilities/libero.test.ts | 7 ++++--- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 7 ++++--- src/test/abilities/power_construct.test.ts | 2 +- src/test/abilities/power_spot.test.ts | 3 ++- src/test/abilities/protean.test.ts | 7 ++++--- src/test/abilities/quick_draw.test.ts | 4 ++-- src/test/abilities/sand_veil.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 12 ++++++------ src/test/abilities/schooling.test.ts | 2 +- src/test/abilities/screen_cleaner.test.ts | 6 +++--- src/test/abilities/serene_grace.test.ts | 2 +- src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 2 +- src/test/abilities/shields_down.test.ts | 2 +- src/test/abilities/steely_spirit.test.ts | 3 ++- src/test/abilities/unseen_fist.test.ts | 4 ++-- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 3 ++- src/test/abilities/wind_rider.test.ts | 3 ++- src/test/abilities/wonder_skin.test.ts | 3 ++- src/test/abilities/zen_mode.test.ts | 2 +- src/test/abilities/zero_to_hero.test.ts | 2 +- src/test/achievements/achievement.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/battle/battle.test.ts | 10 +++++----- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 2 +- src/test/items/grip_claw.test.ts | 2 +- src/test/items/leek.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/astonish.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 3 ++- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/fissure.test.ts | 3 ++- src/test/moves/flower_shield.test.ts | 5 +++-- src/test/moves/follow_me.test.ts | 6 +++--- src/test/moves/gastro_acid.test.ts | 3 ++- src/test/moves/glaive_rush.test.ts | 8 ++++---- src/test/moves/growth.test.ts | 2 +- src/test/moves/hard_press.test.ts | 3 ++- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/light_screen.test.ts | 2 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 3 ++- src/test/moves/multi_target.test.ts | 3 ++- src/test/moves/octolock.test.ts | 3 ++- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 6 +++--- src/test/moves/reflect.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/spit_up.test.ts | 3 ++- src/test/moves/spotlight.test.ts | 4 ++-- src/test/moves/stockpile.test.ts | 3 ++- src/test/moves/swallow.test.ts | 3 ++- src/test/moves/tackle.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/tailwind.test.ts | 3 ++- src/test/moves/thousand_arrows.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 13 +++++++------ src/test/ui/transfer-item.test.ts | 2 +- 79 files changed, 146 insertions(+), 119 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index ebc3f4d9bce..fb075594677 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -8,6 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import i18next, { initI18n } from "#app/plugins/i18n"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Ability Timing", () => { @@ -30,7 +31,7 @@ describe("Ability Timing", () => { game.override.enemySpecies(Species.PIDGEY); game.override.enemyAbility(Abilities.INTIMIDATE); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.ICE_BEAM]); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 2de8a86309d..ab4aa462bb4 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -8,6 +8,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { allMoves } from "#app/data/move.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; @@ -29,7 +30,7 @@ describe("Abilities - Aura Break", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); }); diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 90dc8b62986..be13bceff4d 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -8,6 +8,7 @@ import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Battery", () => { let phaserGame: Phaser.Game; @@ -31,7 +32,7 @@ describe("Abilities - Battery", () => { game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("raises the power of allies' special moves by 30%", async () => { diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 88f15d78762..4dad547f8c4 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -31,7 +31,7 @@ describe("Abilities - BATTLE BOND", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BATTLE_BOND); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 282fda866ea..63f4e634800 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -8,6 +8,7 @@ import { getMovePosition } from "../utils/gameManagerUtils"; import { Abilities } from "#app/enums/abilities.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -30,7 +31,7 @@ describe("Abilities - COSTAR", () => { game.override.battleType("double"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index ee9160a8e4f..258056f56d2 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -31,7 +31,7 @@ describe("Abilities - DISGUISE", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DISGUISE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( @@ -71,7 +71,7 @@ describe("Abilities - DISGUISE", () => { const baseForm = 0, bustedForm = 1; - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); + game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 25069e35604..ddcb8094b0b 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -7,6 +7,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Species } from "#app/enums/species.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Dry Skin", () => { let phaserGame: Phaser.Game; @@ -27,7 +28,7 @@ describe("Abilities - Dry Skin", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.enemyAbility(Abilities.DRY_SKIN); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.CHARMANDER); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); @@ -128,7 +129,7 @@ describe("Abilities - Dry Skin", () => { expect(enemy).not.toBe(undefined); enemy.hp = 1; - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index cea0bc10799..b2033f7ef5e 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -9,6 +9,7 @@ import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; import { Abilities } from "#app/enums/abilities.js"; import { Stat } from "#app/enums/stat.js"; import { allMoves } from "#app/data/move.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Hustle", () => { let phaserGame: Phaser.Game; @@ -31,7 +32,7 @@ describe("Abilities - Hustle", () => { vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 6930c0d1db8..4ffc6fd848c 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -110,7 +110,7 @@ describe("Abilities - Ice Face", () => { it("transforms to Ice Face when Hail or Snow starts", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); + game.override.enemyMoveset([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); await game.startBattle([Species.MAGIKARP]); @@ -131,7 +131,7 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); await game.startBattle([Species.EISCUE, Species.NINJASK]); @@ -159,7 +159,7 @@ 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); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle([Species.EISCUE]); @@ -178,7 +178,7 @@ describe("Abilities - Ice Face", () => { }); it("persists form change when switched out", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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.startBattle([Species.EISCUE, Species.MAGIKARP]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index b3edc0d0206..28ed00e30a5 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); game.override.startingWave(3); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("single - wild with switch", async () => { @@ -255,7 +255,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once and each time he switch", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); + game.override.enemyMoveset([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; @@ -294,7 +294,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once whatever turn we are", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index bde6d74f74f..ea7fe46bbfc 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -13,6 +13,7 @@ import { Weather, WeatherType } from "#app/data/weather.js"; import { Type } from "#app/data/type.js"; import { Biome } from "#enums/biome"; import { PlayerPokemon } from "#app/field/pokemon.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -36,7 +37,7 @@ describe("Abilities - Protean", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); test( @@ -184,7 +185,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move misses", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); @@ -207,7 +208,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move is protected against", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index a2a50f15488..daebf08e0b7 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Moxie", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("MOXIE", async() => { diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 991ccefd265..55c1b5dc6fe 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -11,6 +11,7 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { Type } from "#app/data/type.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { StatusEffect } from "#app/data/status-effect.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -35,7 +36,7 @@ describe("Abilities - Parental Bond", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); @@ -211,7 +212,7 @@ describe("Abilities - Parental Bond", () => { "ability should not apply multiplier to counter moves", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); @@ -569,7 +570,7 @@ describe("Abilities - Parental Bond", () => { "ability should not cause user to hit into King's Shield more than once", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); + game.override.enemyMoveset([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index cf2c4769ad9..6c775fdec1d 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -31,7 +31,7 @@ describe("Abilities - POWER CONSTRUCT", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.POWER_CONSTRUCT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index b63ad8522e4..f47f977046e 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -8,6 +8,7 @@ import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; import { Abilities } from "#app/enums/abilities.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Power Spot", () => { let phaserGame: Phaser.Game; @@ -29,7 +30,7 @@ describe("Abilities - Power Spot", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index a47777a01c1..c852b9b0f14 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -13,6 +13,7 @@ import { Weather, WeatherType } from "#app/data/weather.js"; import { Type } from "#app/data/type.js"; import { Biome } from "#enums/biome"; import { PlayerPokemon } from "#app/field/pokemon.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -36,7 +37,7 @@ describe("Abilities - Protean", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); test( @@ -184,7 +185,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move misses", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); @@ -207,7 +208,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move is protected against", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 922725b6ea0..cc4d1a5612a 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Quick Draw", () => { vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); }); @@ -78,7 +78,7 @@ describe("Abilities - Quick Draw", () => { ); test("does not increase priority", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); + game.override.enemyMoveset(Array(4).fill(Moves.EXTREME_SPEED)); await game.startBattle(); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 4077dca2b31..ddf9123d35b 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Sand Veil", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); game.override.enemySpecies(Species.MEOWSCARADA); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); + game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index ce961f107dd..970d830bf6d 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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(enemyAbility); @@ -60,7 +60,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -79,7 +79,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -99,7 +99,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -121,7 +121,7 @@ describe("Abilities - Sap Sipper", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.NONE); @@ -146,7 +146,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index c39c9d6ce80..0e341687f80 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -31,7 +31,7 @@ describe("Abilities - SCHOOLING", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCHOOLING); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 864f088bdcf..22114b737a9 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Screen Cleaner", () => { it("removes Aurora Veil", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); @@ -49,7 +49,7 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Light Screen", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); @@ -66,7 +66,7 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Reflect", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index e8d1f242041..1515feecdca 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Serene Grace", () => { game.override.enemySpecies(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Move chance without Serene Grace", async() => { diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 5e7eb11a3c3..d4665215e00 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Sheer Force", () => { game.override.enemySpecies(Species.ONIX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Sheer Force", async() => { diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index c34ac94a6ed..edf9555d8b6 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Shield Dust", () => { game.override.enemyAbility(Abilities.SHIELD_DUST); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Shield Dust", async() => { diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index ec13404b19c..a0790501096 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -31,7 +31,7 @@ describe("Abilities - SHIELDS DOWN", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELDS_DOWN); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index f4b24d2c21e..3b276b6ad4a 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -9,6 +9,7 @@ import { allMoves } from "#app/data/move.js"; import { allAbilities } from "#app/data/ability.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, SelectTargetPhase } from "#app/phases.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Steely Spirit", () => { let phaserGame: Phaser.Game; @@ -33,7 +34,7 @@ describe("Abilities - Steely Spirit", () => { game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index 6760b1098ba..d8005f2e948 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Unseen Fist", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); @@ -69,7 +69,7 @@ describe("Abilities - Unseen Fist", () => { async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([attackMove]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([protectMove, protectMove, protectMove, protectMove]); + game.override.enemyMoveset([protectMove, protectMove, protectMove, protectMove]); await game.startBattle(); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 3a586df897a..51ce6b8d2e1 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Volt Absorb", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 5eaf87f182f..7c7e2af72df 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -10,6 +10,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Power", () => { let phaserGame: Phaser.Game; @@ -31,7 +32,7 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_POWER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("it becomes charged when hit by wind moves", async () => { diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 084317f6e09..8be74c50f1c 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -10,6 +10,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattleStat } from "#app/data/battle-stat.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; @@ -31,7 +32,7 @@ describe("Abilities - Wind Rider", () => { game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_RIDER); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 5528b879bdf..89f8088ab59 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -9,6 +9,7 @@ import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { allMoves } from "#app/data/move.js"; import { allAbilities } from "#app/data/ability.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wonder Skin", () => { let phaserGame: Phaser.Game; @@ -31,7 +32,7 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.WONDER_SKIN); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("lowers accuracy of status moves to 50%", async () => { diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 7b6f3e66aa1..40e43d3130d 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -49,7 +49,7 @@ describe("Abilities - ZEN MODE", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index 78cc87ad592..a55d56543e2 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -31,7 +31,7 @@ describe("Abilities - ZERO TO HERO", () => { game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZERO_TO_HERO); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); test( diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index 162c8c81ee3..b59d6ef1e89 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -105,9 +105,9 @@ describe("RibbonAchv", () => { beforeEach(() => { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.enemyMoveset([]); game.override.enemySpecies(0); game.override.startingWave(0); scene = game.scene; diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index 5058f8701b7..3ce1507eae7 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -34,7 +34,7 @@ describe("Arena - Gravity", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); }); it("non-OHKO move accuracy is multiplied by 1.67", async () => { diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index 273e5c88b19..ec6cbba3d32 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -35,7 +35,7 @@ describe("Weather - Fog", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); }); it("move accuracy is multiplied by 90%", async () => { diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index a8f17543cc4..7c77cd9eaf3 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -98,7 +98,7 @@ describe("Test Battle Phase", () => { .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); @@ -117,7 +117,7 @@ describe("Test Battle Phase", () => { game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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.onNextPrompt("CommandPhase", Mode.COMMAND, () => { @@ -269,7 +269,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([ Species.DARMANITAN, Species.CHARIZARD, @@ -298,7 +298,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; game.doAttack(0); @@ -316,7 +316,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.doAttack(0); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 75aad9a4ee3..2c43edcfbc5 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -32,7 +32,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it.skip("to next turn", async() => { diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 7b6330a9fe8..5ebbb010d2f 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -31,7 +31,7 @@ describe("Test Battle Phase", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("startBattle 2vs1 boss", async() => { diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index defa55ca5f1..611d63195fc 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -35,7 +35,7 @@ describe("Items - Grip Claw", () => { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ {name: "BERRY", type: BerryType.SITRUS, count: 2}, {name: "BERRY", type: BerryType.LUM, count: 2} diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index a6268a397a8..e03caec36d9 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -28,7 +28,7 @@ describe("Items - Leek", () => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.battleType("single"); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index d3d6a8860b2..ee2ead08234 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -31,7 +31,7 @@ describe("Items - Leftovers", () => { vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.UNNERVE); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LEFTOVERS", count: 1}]); }); diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index 9ba5b96ed07..4ddb4177cd9 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -28,7 +28,7 @@ describe("Items - Scope Lens", () => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.battleType("single"); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 50bf108a008..0bd58a0cd74 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -42,7 +42,7 @@ describe("Items - Toxic orb", () => { game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); + game.override.enemyMoveset([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "TOXIC_ORB", }]); diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 9f6ea21ae93..16fe3013b22 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -32,7 +32,7 @@ describe("Moves - Astonish", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ASTONISH, Moves.SPLASH]); game.override.enemySpecies(Species.BLASTOISE); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 3922d86a74d..4d4d48994e8 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -40,7 +40,7 @@ describe("Moves - Aurora Veil", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.weather(WeatherType.HAIL); }); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 3cd043cc390..4d8fc6c79c5 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -39,7 +39,7 @@ describe("Moves - Ceaseless Edge", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); }); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index 13f8087d165..886f6d58085 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -33,7 +33,7 @@ describe("Moves - Double Team", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("increases the user's evasion by one stage.", async () => { diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 419fca98771..ca58d098b35 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -12,6 +12,7 @@ import { BattleStat } from "#app/data/battle-stat"; import { BattlerTagType } from "#enums/battler-tag-type"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Dragon Rage", () => { let phaserGame: Phaser.Game; @@ -44,7 +45,7 @@ describe("Moves - Dragon Rage", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 94900747662..96ffb461ea2 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -37,7 +37,7 @@ describe("Moves - Dynamax Cannon", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(dynamaxCannon, "calculateBattlePower"); }); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index f5c1218af74..b58ae553ebe 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -9,6 +9,7 @@ import { Abilities } from "#enums/abilities"; import { Species } from "#app/enums/species.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { BattleStat } from "#app/data/battle-stat"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Fissure", () => { let phaserGame: Phaser.Game; @@ -38,7 +39,7 @@ describe("Moves - Fissure", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index b51651aaf76..b27cdbbcf60 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -13,6 +13,7 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { Biome } from "#app/enums/biome.js"; import { Type } from "#app/data/type.js"; import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Flower Shield", () => { let phaserGame: Phaser.Game; @@ -34,7 +35,7 @@ describe("Moves - Flower Shield", () => { game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { @@ -81,7 +82,7 @@ describe("Moves - Flower Shield", () => { */ it("does not increase defense of a pokemon in semi-vulnerable state", async () => { game.override.enemySpecies(Species.PARAS); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); + game.override.enemyMoveset([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); await game.startBattle([Species.CHERRIM]); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 9d2dc016872..1e29805b760 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -38,7 +38,7 @@ describe("Moves - Follow Me", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -103,7 +103,7 @@ describe("Moves - Follow Me", () => { async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); @@ -137,7 +137,7 @@ describe("Moves - Follow Me", () => { "move effect should be bypassed by Snipe Shot", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 4275ee64fdf..d8288b46790 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -10,6 +10,7 @@ import { getMovePosition } from "../utils/gameManagerUtils"; import { MoveResult } from "#app/field/pokemon.js"; import { Stat } from "#app/data/pokemon-stat.js"; import { Species } from "#app/enums/species.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -35,7 +36,7 @@ describe("Moves - Gastro Acid", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.WATER_ABSORB); }); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index ea0e6032709..d2decd5e35b 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -30,7 +30,7 @@ describe("Moves - Glaive Rush", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.GLAIVE_RUSH)); + game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.KLINK); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); @@ -67,7 +67,7 @@ describe("Moves - Glaive Rush", () => { it("interacts properly with multi-lens", async() => { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 2}]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.AVALANCHE)); + game.override.enemyMoveset(Array(4).fill(Moves.AVALANCHE)); await game.startBattle(); const player = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); @@ -86,7 +86,7 @@ describe("Moves - Glaive Rush", () => { }, 20000); it("secondary effects only last until next move", async() => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); await game.startBattle(); const player = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); @@ -110,7 +110,7 @@ describe("Moves - Glaive Rush", () => { }, 20000); it("secondary effects are removed upon switching", async() => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); await game.startBattle([Species.KLINK, Species.FEEBAS]); const player = game.scene.getPlayerPokemon(); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 56f62ae60a1..f2324c94f88 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -40,7 +40,7 @@ describe("Moves - Growth", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("GROWTH", async() => { diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 959b90cdde8..8e6ebb5d404 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -10,6 +10,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { allMoves } from "#app/data/move.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Hard Press", () => { let phaserGame: Phaser.Game; @@ -33,7 +34,7 @@ describe("Moves - Hard Press", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); }); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 54789b68fbf..b6c6c08f089 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -33,7 +33,7 @@ describe("Moves - Hyper Beam", () => { vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM, Moves.TACKLE]); vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 60220b71a1c..e35a9a95c71 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -39,7 +39,7 @@ describe("Moves - Light Screen", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index ddfa068fe4b..9543ee7c91b 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -26,7 +26,7 @@ describe("Moves - Magnet Rise", () => { game.override.battleType("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index ee4aef3e343..1359c947c51 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -12,6 +12,7 @@ import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattleStat } from "#app/data/battle-stat.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -35,7 +36,7 @@ describe("Moves - Make It Rain", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 40eb2e7daa6..7db6e7ec5f9 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -8,6 +8,7 @@ import { Abilities } from "#app/enums/abilities.js"; import { Species } from "#app/enums/species.js"; import { getMovePosition } from "../utils/gameManagerUtils"; import { TurnEndPhase } from "#app/phases.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -167,7 +168,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(40); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 8881170a9a3..a8578153a42 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -9,6 +9,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TrappedTag } from "#app/data/battler-tags.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Octolock", () => { describe("integration tests", () => { @@ -31,7 +32,7 @@ describe("Moves - Octolock", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 551ecddbb64..05b3272521b 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -37,7 +37,7 @@ describe("Moves - Purify", () => { game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); test( diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 779be067a95..514b2e7f4b4 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -37,13 +37,13 @@ describe("Moves - Rage Powder", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( "move effect should be bypassed by Grass type", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); await game.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); @@ -77,7 +77,7 @@ describe("Moves - Rage Powder", () => { "move effect should be bypassed by Overcoat", async () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); // Test with two non-Grass type player Pokemon await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 2d4d791b902..fb279fa7689 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -39,7 +39,7 @@ describe("Moves - Reflect", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 93b07ce84fc..d3c80dcfc69 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -34,7 +34,7 @@ describe("Moves - Rollout", () => { game.override.enemyAbility(Abilities.NONE); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(SPLASH_ONLY); + game.override.enemyMoveset(SPLASH_ONLY); }); it("should double it's dmg on sequential uses but reset after 5", async () => { diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index 284937bd7db..47c0bcc6156 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -33,7 +33,7 @@ describe("Moves - Roost", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + game.override.enemyMoveset([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); }); test( diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index 62ecfbc6312..a66bcd28e1e 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -34,7 +34,7 @@ describe("Moves - Spikes", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); }); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index cb40a3a1177..4b58e9f73a0 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -11,6 +11,7 @@ import { StockpilingTag } from "#app/data/battler-tags.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { allMoves } from "#app/data/move.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Spit Up", () => { let phaserGame: Phaser.Game; @@ -30,7 +31,7 @@ describe("Moves - Spit Up", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 8ec1cd38069..4a61f28091e 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -37,7 +37,7 @@ describe("Moves - Spotlight", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -73,7 +73,7 @@ describe("Moves - Spotlight", () => { test( "move should cause other redirection moves to fail", async () => { - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index adc70aa99b2..760bbdf7381 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -10,6 +10,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StockpilingTag } from "#app/data/battler-tags.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Stockpile", () => { describe("integration tests", () => { @@ -30,7 +31,7 @@ describe("Moves - Stockpile", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index c6a6f485d11..70826c02c5d 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -10,6 +10,7 @@ import { Species } from "#enums/species"; import { StockpilingTag } from "#app/data/battler-tags.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Swallow", () => { let phaserGame: Phaser.Game; @@ -29,7 +30,7 @@ describe("Moves - Swallow", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index 97da84b5d17..877651d9089 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -36,7 +36,7 @@ describe("Moves - Tackle", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); game.override.startingWave(97); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); + game.override.enemyMoveset([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index af5597d62ed..5c9394dcabb 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -39,7 +39,7 @@ describe("Moves - Tail whip", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("TAIL_WHIP", async() => { diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index a4c62f77275..02924d429f3 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -11,6 +11,7 @@ import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Stat } from "#app/data/pokemon-stat.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; @@ -30,7 +31,7 @@ describe("Abilities - Wind Rider", () => { game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("doubles the Speed stat of the Pokemons on its side", async () => { diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index ca8609c7100..301bb89391d 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -35,7 +35,7 @@ describe("Moves - Thousand Arrows", () => { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); }); it( diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 3d55c0a42a2..d51f98e7974 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -9,6 +9,7 @@ import { Species } from "#enums/species"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { BattleStat } from "#app/data/battle-stat.js"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Tidy Up", () => { @@ -30,7 +31,7 @@ describe("Moves - Tidy Up", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); @@ -39,7 +40,7 @@ describe("Moves - Tidy Up", () => { it("spikes are cleared", async() => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); + game.override.enemyMoveset([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPIKES)); @@ -52,7 +53,7 @@ describe("Moves - Tidy Up", () => { it("stealth rocks are cleared", async() => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.STEALTH_ROCK)); @@ -65,7 +66,7 @@ describe("Moves - Tidy Up", () => { it("toxic spikes are cleared", async() => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); + game.override.enemyMoveset([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_SPIKES)); @@ -78,7 +79,7 @@ describe("Moves - Tidy Up", () => { it("sticky webs are cleared", async() => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); + game.override.enemyMoveset([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); await game.startBattle(); @@ -92,7 +93,7 @@ describe("Moves - Tidy Up", () => { it.skip("substitutes are cleared", async() => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); + game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.startBattle(); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index b17d5c7544f..06898a9182d 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -43,7 +43,7 @@ describe("UI - Transfer Items", () => { ]); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH]); await game.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); From f8e6230a14c96edc64090e6bf44fd330ad7cd0dc Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:19:16 -0700 Subject: [PATCH 015/321] add OverridesHelper.starterSpecies() --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 7571a4eb657..c9627f38c0b 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -41,6 +41,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) {@linkcode Species | species} + * @param species the (pokemon) {@linkcode Species | species} to set + * @returns this + */ + starterSpecies(species: Species | number): this { + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(species); + this.log(`Player Pokemon species set to ${Species[species]} (=${species})!`); + return this; + } + /** * Override each wave to have or not have standard trainer battles * @returns this From 5a173df24de7c30a09ec655f8d85eb2bf06c9445 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:24:07 -0700 Subject: [PATCH 016/321] apply game.override.starterSpecies --- src/test/abilities/dry_skin.test.ts | 2 +- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/achievements/achievement.test.ts | 2 +- src/test/battle/battle.test.ts | 10 +++++----- src/test/battle/error-handling.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/follow_me.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 4 ++-- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/spotlight.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 2 +- 17 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index ddcb8094b0b..dfe358d6628 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Dry Skin", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.CHARMANDER); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); + game.override.starterSpecies(Species.CHANDELURE); }); it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index cc4d1a5612a..44e5b12e21b 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Quick Draw", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + game.override.starterSpecies(Species.MAGIKARP); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 87a998e560d..b6ea7660a73 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Sturdy", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); + game.override.starterSpecies(Species.LUCARIO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index d8005f2e948..53f457f65c2 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Unseen Fist", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); + game.override.starterSpecies(Species.URSHIFU); game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index b59d6ef1e89..438e59f1263 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -103,10 +103,10 @@ describe("RibbonAchv", () => { }); beforeEach(() => { - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.starterSpecies(0); game.override.enemyMoveset([]); game.override.enemySpecies(0); game.override.startingWave(0); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 7c77cd9eaf3..7708e2a8fa9 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -90,7 +90,7 @@ describe("Test Battle Phase", () => { }, 20000); it("do attack wave 3 - single battle - regular - OHKO", async() => { - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override @@ -111,7 +111,7 @@ describe("Test Battle Phase", () => { }, 20000); it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); game.override.startingWave(3); @@ -262,7 +262,7 @@ describe("Test Battle Phase", () => { it("kill opponent pokemon", async() => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); @@ -291,7 +291,7 @@ describe("Test Battle Phase", () => { it("to next turn", async() => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); @@ -309,7 +309,7 @@ describe("Test Battle Phase", () => { it("to next wave with pokemon killed, single", async() => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 2c43edcfbc5..2e846730329 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -26,7 +26,7 @@ describe("Test Battle Phase", () => { game.override .battleType("single") .startingWave(3); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index ca58d098b35..3549e34a7ed 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -38,7 +38,7 @@ describe("Moves - Dragon Rage", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.starterSpecies(Species.SNORLAX); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index b58ae553ebe..cf0d6677952 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -33,7 +33,7 @@ describe("Moves - Fissure", () => { game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + game.override.starterSpecies(Species.SNORLAX); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FISSURE]); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 1e29805b760..ec556c5dd56 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -33,7 +33,7 @@ describe("Moves - Follow Me", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index d2decd5e35b..a16a7ae0eec 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -31,7 +31,7 @@ describe("Moves - Glaive Rush", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.KLINK); + game.override.starterSpecies(Species.KLINK); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); @@ -111,7 +111,7 @@ describe("Moves - Glaive Rush", () => { it("secondary effects are removed upon switching", async() => { game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); + game.override.starterSpecies(0); await game.startBattle([Species.KLINK, Species.FEEBAS]); const player = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 9543ee7c91b..a321499d11f 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -24,7 +24,7 @@ describe("Moves - Magnet Rise", () => { game = new GameManager(phaserGame); const moveToUse = Moves.MAGNET_RISE; game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); + 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]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 05b3272521b..81db23a1576 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -31,7 +31,7 @@ describe("Moves - Purify", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); + game.override.starterSpecies(Species.PYUKUMUKU); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 514b2e7f4b4..c0166619e07 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -32,7 +32,7 @@ describe("Moves - Rage Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index d3c80dcfc69..da9c8f079f9 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -28,7 +28,7 @@ describe("Moves - Rollout", () => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + game.override.starterSpecies(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); game.override.enemySpecies(Species.BIDOOF); game.override.enemyAbility(Abilities.NONE); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 4a61f28091e..e9a6d9f5210 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -32,7 +32,7 @@ describe("Moves - Spotlight", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index d51f98e7974..aed2b14f8ff 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -32,7 +32,7 @@ describe("Moves - Tidy Up", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); + game.override.starterSpecies(Species.FEEBAS); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); From b16a28d5b8df5fe720e197cdd9a72824207da0a4 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:26:21 -0700 Subject: [PATCH 017/321] add OverridesHelper.startingLevel() --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index c9627f38c0b..bcb550945a6 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -41,6 +41,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) starting level + * @param level the (pokemon) level to set + * @returns this + */ + startingLevel(level: Species | number): this { + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(level); + this.log(`Player Pokemon starting level set to ${level}!`); + return this; + } + /** * Override the player (pokemon) {@linkcode Species | species} * @param species the (pokemon) {@linkcode Species | species} to set From 5924e5c1b45900607ccd8c157098fc6064d5c34e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:29:19 -0700 Subject: [PATCH 018/321] apply game.override.startingLevel --- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/libero.test.ts | 2 +- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 2 +- src/test/abilities/protean.test.ts | 2 +- src/test/abilities/sand_veil.test.ts | 2 +- src/test/abilities/serene_grace.test.ts | 2 +- src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/abilities/zen_mode.test.ts | 2 +- src/test/achievements/achievement.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_strong_winds.test.ts | 2 +- src/test/battle/battle.test.ts | 10 +++++----- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 2 +- src/test/evolution.test.ts | 13 ++++++------- src/test/items/grip_claw.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/astonish.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/follow_me.test.ts | 2 +- src/test/moves/gastro_acid.test.ts | 2 +- src/test/moves/growth.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 2 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 2 +- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/spotlight.test.ts | 2 +- src/test/moves/tackle.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/thousand_arrows.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 2 +- src/test/ui/transfer-item.test.ts | 2 +- 44 files changed, 53 insertions(+), 54 deletions(-) diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 258056f56d2..04071e20538 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -72,7 +72,7 @@ describe("Abilities - DISGUISE", () => { bustedForm = 1; game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); + game.override.startingLevel(20); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 4ffc6fd848c..a5a2ff1f1ad 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -203,7 +203,7 @@ describe("Abilities - Ice Face", () => { it("reverts to Ice Face on arena reset", async () => { game.override.startingWave(4); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); + game.override.startingLevel(4); game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.EISCUE]: noiceForm, diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index ea7fe46bbfc..c7866f1ca3c 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Protean", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index daebf08e0b7..038657475f7 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Moxie", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 55c1b5dc6fe..7f96403e81c 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Parental Bond", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index c852b9b0f14..d6afd665930 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Protean", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index ddf9123d35b..e87398e05c2 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Sand Veil", () => { game.override.enemySpecies(Species.MEOWSCARADA); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override .weather(WeatherType.SANDSTORM) diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 1515feecdca..77a5629a7c5 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Serene Grace", () => { const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index d4665215e00..815f9bbf37c 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Sheer Force", () => { const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index edf9555d8b6..a9d5dbe3209 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Shield Dust", () => { game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); game.override.enemyAbility(Abilities.SHIELD_DUST); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index b6ea7660a73..18bf7d0e36a 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Sturdy", () => { game.override.battleType("single"); game.override.starterSpecies(Species.LUCARIO); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); game.override.enemySpecies(Species.ARON); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index 53f457f65c2..f955f7c4ed4 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Unseen Fist", () => { game.override.starterSpecies(Species.URSHIFU); game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 40e43d3130d..d7eab759de1 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -47,7 +47,7 @@ describe("Abilities - ZEN MODE", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index 438e59f1263..57c18c43708 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -103,9 +103,9 @@ describe("RibbonAchv", () => { }); beforeEach(() => { - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.startingLevel(0); game.override.starterSpecies(0); game.override.enemyMoveset([]); game.override.enemySpecies(0); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index 3ce1507eae7..8e171388b06 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -58,7 +58,7 @@ describe("Arena - Gravity", () => { }); it("OHKO move accuracy is not affected", async () => { - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.startingLevel(5); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); /** See Fissure {@link https://bulbapedia.bulbagarden.net/wiki/Fissure_(move)} */ diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index f25be43c426..cc85d7a0866 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -28,7 +28,7 @@ describe("Weather - Strong Winds", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + game.override.startingLevel(10); game.override.enemySpecies(Species.TAILLOW); game.override.enemyAbility(Abilities.DELTA_STREAM); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 7708e2a8fa9..130e2c338f2 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -92,7 +92,7 @@ describe("Test Battle Phase", () => { it("do attack wave 3 - single battle - regular - OHKO", async() => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override .startingWave(3) .battleType("single"); @@ -113,7 +113,7 @@ describe("Test Battle Phase", () => { it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.startingLevel(5); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); @@ -266,7 +266,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); @@ -295,7 +295,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); @@ -313,7 +313,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 2e846730329..4af376117f2 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -30,7 +30,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 5ebbb010d2f..28b59cd86b7 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -27,7 +27,7 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index f2cf1023457..70682666f32 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -1,10 +1,9 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import { Species } from "#app/enums/species.js"; -import { Abilities } from "#app/enums/abilities.js"; -import Overrides from "#app/overrides"; import { pokemonEvolutions } from "#app/data/pokemon-evolutions.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Species } from "#app/enums/species.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Evolution", () => { let phaserGame: Phaser.Game; @@ -29,7 +28,7 @@ describe("Evolution", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(60); + game.override.startingLevel(60); }); it("should keep hidden ability after evolving", async () => { diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 611d63195fc..6f975c242f7 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -40,7 +40,7 @@ describe("Items - Grip Claw", () => { {name: "BERRY", type: BerryType.SITRUS, count: 2}, {name: "BERRY", type: BerryType.LUM, count: 2} ]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.POPULATION_BOMB], "accuracy", "get").mockReturnValue(100); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 0bd58a0cd74..67d121f8855 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -40,7 +40,7 @@ describe("Items - Toxic orb", () => { game.override.enemySpecies(Species.RATTATA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 16fe3013b22..ac5ef3fde76 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -33,7 +33,7 @@ describe("Moves - Astonish", () => { game.override.enemySpecies(Species.BLASTOISE); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.ASTONISH], "chance", "get").mockReturnValue(100); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 4d8fc6c79c5..dafa1be3049 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -36,7 +36,7 @@ describe("Moves - Ceaseless Edge", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.RUN_AWAY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 3549e34a7ed..f6b24510db0 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -42,7 +42,7 @@ describe("Moves - Dragon Rage", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset(SPLASH_ONLY); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 96ffb461ea2..88251b74115 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -29,7 +29,7 @@ describe("Moves - Dynamax Cannon", () => { game = new GameManager(phaserGame); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ dynamaxCannon.id ]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(200); + game.override.startingLevel(200); // Note that, for Waves 1-10, the level cap is 10 game.override.startingWave(1); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index cf0d6677952..fc91c3aa80d 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -36,7 +36,7 @@ describe("Moves - Fissure", () => { game.override.starterSpecies(Species.SNORLAX); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FISSURE]); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset(SPLASH_ONLY); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index ec556c5dd56..44bede6ee76 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -35,7 +35,7 @@ describe("Moves - Follow Me", () => { game.override.battleType("double"); game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index d8288b46790..901904538c4 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -31,7 +31,7 @@ describe("Moves - Gastro Acid", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.startingLevel(1); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index f2324c94f88..2a3b863c0f1 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -38,7 +38,7 @@ describe("Moves - Growth", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.MOXIE); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index 1359c947c51..ca207a63c3f 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -37,7 +37,7 @@ describe("Moves - Make It Rain", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 7db6e7ec5f9..1627109559c 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -170,7 +170,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + game.override.startingLevel(50); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(40); game.override.enemySpecies(Species.EEVEE); return game; diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index a8578153a42..6884aeabc2e 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -35,7 +35,7 @@ describe("Moves - Octolock", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.OCTOLOCK, Moves.SPLASH]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); }); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 81db23a1576..0a5419f7288 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -32,7 +32,7 @@ describe("Moves - Purify", () => { game.override.battleType("single"); game.override.starterSpecies(Species.PYUKUMUKU); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + game.override.startingLevel(10); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index c0166619e07..bd28a65db33 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -34,7 +34,7 @@ describe("Moves - Rage Powder", () => { game.override.battleType("double"); game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index da9c8f079f9..c3da6b9c79d 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -32,7 +32,7 @@ describe("Moves - Rollout", () => { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); game.override.enemySpecies(Species.BIDOOF); game.override.enemyAbility(Abilities.NONE); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index 47c0bcc6156..e29056ff443 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -30,7 +30,7 @@ describe("Moves - Roost", () => { game.override.battleType("single"); game.override.enemySpecies(Species.STARAPTOR); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); game.override.enemyMoveset([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index a66bcd28e1e..b1104d7d7be 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -105,7 +105,7 @@ describe("Moves - Spikes", () => { it("trainer - wild - force switch by himself opponent - should take damage", async() => { game.override.startingWave(5); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); + game.override.startingLevel(5000); game.override.enemySpecies(0); // turn 1: player set spikes, opponent do splash // turn 2: player do splash, opponent switch pokemon diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index e9a6d9f5210..5790214ceb1 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -34,7 +34,7 @@ describe("Moves - Spotlight", () => { game.override.battleType("double"); game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index 877651d9089..7f58aa8e23b 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -33,7 +33,7 @@ describe("Moves - Tackle", () => { const moveToUse = Moves.TACKLE; game.override.battleType("single"); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.startingLevel(1); game.override.startingWave(97); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 5c9394dcabb..7bac64d282f 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -37,7 +37,7 @@ describe("Moves - Tail whip", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.INSOMNIA); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index 301bb89391d..e0121c6ece2 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -32,7 +32,7 @@ describe("Moves - Thousand Arrows", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.enemySpecies(Species.TOGETIC); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index aed2b14f8ff..ece454c2988 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -35,7 +35,7 @@ describe("Moves - Tidy Up", () => { game.override.starterSpecies(Species.FEEBAS); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + game.override.startingLevel(50); }); it("spikes are cleared", async() => { diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 06898a9182d..9007b1dabe2 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -34,7 +34,7 @@ describe("UI - Transfer Items", () => { beforeEach(async () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.startingWave(1); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ { name: "BERRY", count: 1, type: BerryType.SITRUS }, From 7732411c92ee4af5c9fb1746c63f2091e8728b70 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:31:16 -0700 Subject: [PATCH 019/321] add OverridesHelper.ability() --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index bcb550945a6..a888e257c44 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -63,6 +63,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) {@linkcode Abilities | ability} + * @param ability the (pokemon) {@linkcode Abilities | ability} to set + * @returns this + */ + ability(ability: Abilities): this { + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + this.log(`Player Pokemon ability set to ${Abilities[ability]} (=${ability})!`); + return this; + } + /** * Override each wave to have or not have standard trainer battles * @returns this From c7a3ae24ac5397aca97e01d23ed19cef81009591 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:35:20 -0700 Subject: [PATCH 020/321] apply game.override.ability --- src/test/abilities/ability_timing.test.ts | 2 +- src/test/abilities/aura_break.test.ts | 4 ++-- src/test/abilities/battle_bond.test.ts | 2 +- src/test/abilities/costar.test.ts | 2 +- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/dry_skin.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/intimidate.test.ts | 2 +- src/test/abilities/intrepid_sword.test.ts | 15 +++++++-------- src/test/abilities/libero.test.ts | 2 +- src/test/abilities/moxie.test.ts | 2 +- src/test/abilities/parental_bond.test.ts | 2 +- src/test/abilities/power_construct.test.ts | 2 +- src/test/abilities/protean.test.ts | 2 +- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 2 +- src/test/abilities/schooling.test.ts | 2 +- src/test/abilities/screen_cleaner.test.ts | 2 +- src/test/abilities/serene_grace.test.ts | 2 +- src/test/abilities/sheer_force.test.ts | 8 ++++---- src/test/abilities/shields_down.test.ts | 2 +- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 4 ++-- src/test/abilities/wind_rider.test.ts | 4 ++-- src/test/abilities/wonder_skin.test.ts | 4 ++-- src/test/abilities/zen_mode.test.ts | 2 +- src/test/abilities/zero_to_hero.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/battle/battle-order.test.ts | 2 +- src/test/battle/battle.test.ts | 14 +++++++------- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 2 +- src/test/items/exp_booster.test.ts | 2 +- src/test/items/grip_claw.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 2 +- src/test/moves/follow_me.test.ts | 2 +- src/test/moves/gastro_acid.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/growth.test.ts | 2 +- src/test/moves/hard_press.test.ts | 2 +- src/test/moves/light_screen.test.ts | 2 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/reflect.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 2 +- 56 files changed, 75 insertions(+), 76 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index fb075594677..b3f6c37b15c 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -33,7 +33,7 @@ describe("Ability Timing", () => { game.override.enemyAbility(Abilities.INTIMIDATE); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.ICE_BEAM]); }); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index ab4aa462bb4..20c15f679e8 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Aura Break", () => { const moveToCheck = allMoves[Moves.MOONBLAST]; const basePower = moveToCheck.power; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); + game.override.ability(Abilities.FAIRY_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); await game.startBattle([Species.PIKACHU]); @@ -53,7 +53,7 @@ describe("Abilities - Aura Break", () => { const moveToCheck = allMoves[Moves.DARK_PULSE]; const basePower = moveToCheck.power; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); + game.override.ability(Abilities.DARK_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); await game.startBattle([Species.PIKACHU]); diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 4dad547f8c4..094bdc9dd53 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -29,7 +29,7 @@ describe("Abilities - BATTLE BOND", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BATTLE_BOND); + game.override.ability(Abilities.BATTLE_BOND); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 63f4e634800..566f982fc08 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -29,7 +29,7 @@ describe("Abilities - COSTAR", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); + game.override.ability(Abilities.COSTAR); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 04071e20538..fd486f89c69 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -29,7 +29,7 @@ describe("Abilities - DISGUISE", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DISGUISE); + game.override.ability(Abilities.DISGUISE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index dfe358d6628..9cb92710285 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Dry Skin", () => { game.override.enemyAbility(Abilities.DRY_SKIN); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.CHARMANDER); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + game.override.ability(Abilities.UNNERVE); game.override.starterSpecies(Species.CHANDELURE); }); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index a5a2ff1f1ad..c0f91e8dff8 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -259,7 +259,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be copied", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TRACE); + game.override.ability(Abilities.TRACE); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 28ed00e30a5..5bba42bd6d8 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Intimidate", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.INTIMIDATE); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + game.override.ability(Abilities.INTIMIDATE); game.override.startingWave(3); game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index fa988fcab39..5292bcd7c82 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -1,13 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {Species} from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; import { CommandPhase, } from "#app/phases"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Intrepid Sword", () => { @@ -29,7 +28,7 @@ describe("Abilities - Intrepid Sword", () => { game.override.battleType("single"); game.override.enemySpecies(Species.ZACIAN); game.override.enemyAbility(Abilities.INTREPID_SWORD); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); + game.override.ability(Abilities.INTREPID_SWORD); }); it("INTREPID SWORD on player", async() => { diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index c7866f1ca3c..ce65614d0aa 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(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]); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index 038657475f7..0ad48bbaad9 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Moxie", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.MOXIE); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + game.override.ability(Abilities.MOXIE); game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 7f96403e81c..c6de23432e6 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Parental Bond", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); + game.override.ability(Abilities.PARENTAL_BOND); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(SPLASH_ONLY); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 6c775fdec1d..803be7e8147 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -29,7 +29,7 @@ describe("Abilities - POWER CONSTRUCT", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.POWER_CONSTRUCT); + game.override.ability(Abilities.POWER_CONSTRUCT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index d6afd665930..4889bc99b5c 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(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]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 44e5b12e21b..f94a8c55a6c 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Quick Draw", () => { game.override.battleType("single"); game.override.starterSpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); + game.override.ability(Abilities.QUICK_DRAW); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 970d830bf6d..4ffab7792d1 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -120,7 +120,7 @@ describe("Abilities - Sap Sipper", () => { const ability = Abilities.SAP_SIPPER; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + game.override.ability(ability); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.NONE); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index 0e341687f80..f3e95d987f2 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -29,7 +29,7 @@ describe("Abilities - SCHOOLING", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCHOOLING); + game.override.ability(Abilities.SCHOOLING); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 22114b737a9..04fc2e47f14 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Screen Cleaner", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); + game.override.ability(Abilities.SCREEN_CLEANER); game.override.enemySpecies(Species.SHUCKLE); }); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 77a5629a7c5..f46e1bbff62 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -76,7 +76,7 @@ describe("Abilities - Serene Grace", () => { it("Move chance with Serene Grace", async() => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SERENE_GRACE); + game.override.ability(Abilities.SERENE_GRACE); await game.startBattle([ Species.TOGEKISS ]); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 815f9bbf37c..e4df5920a04 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -43,7 +43,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force", async() => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -82,7 +82,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force with exceptions including binding moves", async() => { const moveToUse = Moves.BIND; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -121,7 +121,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force with moves with no secondary effect", async() => { const moveToUse = Moves.TACKLE; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -162,7 +162,7 @@ describe("Abilities - Sheer Force", () => { const moveToUse = Moves.CRUSH_CLAW; game.override.enemyAbility(Abilities.COLOR_CHANGE); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index a0790501096..4b3b49d0ff0 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -29,7 +29,7 @@ describe("Abilities - SHIELDS DOWN", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELDS_DOWN); + game.override.ability(Abilities.SHIELDS_DOWN); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 18bf7d0e36a..34f7c16d542 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -85,7 +85,7 @@ describe("Abilities - Sturdy", () => { test( "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + game.override.ability(Abilities.MOLD_BREAKER); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 51ce6b8d2e1..32e96c91fd0 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Volt Absorb", () => { const ability = Abilities.VOLT_ABSORB; vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + game.override.ability(ability); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); game.override.enemyAbility(Abilities.BALL_FETCH); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 7c7e2af72df..36109f81c33 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -48,7 +48,7 @@ describe("Abilities - Wind Power", () => { }); it("it becomes charged when Tailwind takes effect on its side", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + game.override.ability(Abilities.WIND_POWER); game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); @@ -64,7 +64,7 @@ describe("Abilities - Wind Power", () => { it("does not become charged when Tailwind takes effect on opposing side", async () => { game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + game.override.ability(Abilities.WIND_POWER); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 8be74c50f1c..a3d1ae44d44 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -50,7 +50,7 @@ describe("Abilities - Wind Rider", () => { }); it("Attack is increased by one stage when Tailwind is present on its side", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + game.override.ability(Abilities.WIND_RIDER); game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); @@ -66,7 +66,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not increase Attack when Tailwind is present on opposing side", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + game.override.ability(Abilities.WIND_RIDER); game.override.enemySpecies(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 89f8088ab59..c62a4eaed66 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Wonder Skin", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.WONDER_SKIN); game.override.enemyMoveset(SPLASH_ONLY); @@ -65,7 +65,7 @@ describe("Abilities - Wonder Skin", () => { it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { const moveToCheck = allMoves[Moves.CHARM]; - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + game.override.ability(ability); vi.spyOn(moveToCheck, "calculateBattleAccuracy"); await game.startBattle([Species.PIKACHU]); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index d7eab759de1..b620431d288 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -46,7 +46,7 @@ describe("Abilities - ZEN MODE", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(100); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index a55d56543e2..cb930382592 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -29,7 +29,7 @@ describe("Abilities - ZERO TO HERO", () => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZERO_TO_HERO); + game.override.ability(Abilities.ZERO_TO_HERO); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index 8e171388b06..916a4542924 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -31,7 +31,7 @@ describe("Arena - Gravity", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + game.override.ability(Abilities.UNNERVE); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index ec6cbba3d32..e0dcf8450d1 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -32,7 +32,7 @@ describe("Weather - Fog", () => { .weather(WeatherType.FOG) .battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 7ffb363de9b..77368d74d32 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -36,7 +36,7 @@ describe("Battle order", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MEWTWO); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 130e2c338f2..2eba8f3d93e 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -208,7 +208,7 @@ describe("Test Battle Phase", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -221,7 +221,7 @@ describe("Test Battle Phase", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, ]); @@ -233,7 +233,7 @@ describe("Test Battle Phase", () => { game.override.battleType("double"); game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, @@ -247,7 +247,7 @@ describe("Test Battle Phase", () => { game.override.battleType("double"); game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); await game.startBattle([ Species.BLASTOISE, @@ -265,7 +265,7 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); @@ -294,7 +294,7 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); @@ -312,7 +312,7 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 4af376117f2..6998972cd35 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -29,7 +29,7 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 28b59cd86b7..1d6ce09e70c 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -30,7 +30,7 @@ describe("Test Battle Phase", () => { game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts index 3f0f2fd3424..8e61d8decda 100644 --- a/src/test/items/exp_booster.test.ts +++ b/src/test/items/exp_booster.test.ts @@ -24,7 +24,7 @@ describe("EXP Modifier Items", () => { game = new GameManager(phaserGame); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.battleType("single"); }); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 6f975c242f7..951e34fae2c 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -34,7 +34,7 @@ describe("Items - Grip Claw", () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); game.override.enemySpecies(Species.SNORLAX); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); + game.override.ability(Abilities.KLUTZ); game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ {name: "BERRY", type: BerryType.SITRUS, count: 2}, diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 67d121f8855..f5ef6a62c60 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -38,7 +38,7 @@ describe("Items - Toxic orb", () => { const oppMoveToUse = Moves.TACKLE; game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 4d4d48994e8..5ca56c4d243 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -36,7 +36,7 @@ describe("Moves - Aurora Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index 886f6d58085..637f0f39fc6 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -30,7 +30,7 @@ describe("Moves - Double Team", () => { game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_TEAM]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + 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]); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index f6b24510db0..a1e8a18540e 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -40,7 +40,7 @@ describe("Moves - Dragon Rage", () => { game.override.starterSpecies(Species.SNORLAX); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.startingLevel(100); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index fc91c3aa80d..f67b275a8ba 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -54,7 +54,7 @@ describe("Moves - Fissure", () => { }); it("ignores damage modification from abilities such as fur coat", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NO_GUARD); + game.override.ability(Abilities.NO_GUARD); game.override.enemyAbility(Abilities.FUR_COAT); game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index b27cdbbcf60..95a2736aa32 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -31,7 +31,7 @@ describe("Moves - Flower Shield", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 44bede6ee76..bdc09605c0c 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -101,7 +101,7 @@ describe("Moves - Follow Me", () => { test( "move effect should be bypassed by Stalwart", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); + game.override.ability(Abilities.STALWART); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 901904538c4..161eab37183 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -33,7 +33,7 @@ describe("Moves - Gastro Acid", () => { game.override.battleType("double"); game.override.startingLevel(1); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); game.override.enemyMoveset(SPLASH_ONLY); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index a16a7ae0eec..15e81b489d6 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -32,7 +32,7 @@ describe("Moves - Glaive Rush", () => { game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); game.override.starterSpecies(Species.KLINK); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + game.override.ability(Abilities.UNNERVE); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 2a3b863c0f1..6b9abd8da59 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -37,7 +37,7 @@ describe("Moves - Growth", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.MOXIE); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 8e6ebb5d404..27c4af71004 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -31,7 +31,7 @@ describe("Moves - Hard Press", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index e35a9a95c71..c8543c2faed 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -35,7 +35,7 @@ describe("Moves - Light Screen", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 1627109559c..f60429909db 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -167,7 +167,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { const game = new GameManager(phaserGame); game.override.battleType("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.startingLevel(50); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 6884aeabc2e..061aaff5d48 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -37,7 +37,7 @@ describe("Moves - Octolock", () => { game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.OCTOLOCK, Moves.SPLASH]); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); }); it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => { diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index bd28a65db33..768d3580026 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -76,7 +76,7 @@ describe("Moves - Rage Powder", () => { test( "move effect should be bypassed by Overcoat", async () => { - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); + game.override.ability(Abilities.OVERCOAT); game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); // Test with two non-Grass type player Pokemon diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index fb279fa7689..35f9599c5f7 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -35,7 +35,7 @@ describe("Moves - Reflect", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index c3da6b9c79d..90a3fe065d8 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -29,7 +29,7 @@ describe("Moves - Rollout", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.battleType("single"); game.override.starterSpecies(Species.RATTATA); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); game.override.enemySpecies(Species.BIDOOF); game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index b1104d7d7be..4240c06d10a 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -31,7 +31,7 @@ describe("Moves - Spikes", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.ability(Abilities.HYDRATION); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 7bac64d282f..be1e8614c86 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -36,7 +36,7 @@ describe("Moves - Tail whip", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index ece454c2988..0fd17baac60 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -33,7 +33,7 @@ describe("Moves - Tidy Up", () => { game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); game.override.starterSpecies(Species.FEEBAS); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); game.override.startingLevel(50); }); From bb1e3f7d209a0c67a6a3134a41756cc0675a93ba Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:36:06 -0700 Subject: [PATCH 021/321] add OverridesHelper.moveset() --- src/test/utils/overridesHelper.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index a888e257c44..5767cac4914 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -74,6 +74,18 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) {@linkcode Moves | moves}set + * @param moveset the {@linkcode Moves | moves}set to set + * @returns this + */ + moveset(moveset: Moves[]): this { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); + return this; + } + /** * Override each wave to have or not have standard trainer battles * @returns this From 3242a084f1f77902df11c9b480c8bdb2ff5053e0 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:51:05 -0700 Subject: [PATCH 022/321] apply game.override.moveset --- src/test/abilities/ability_timing.test.ts | 11 +++-- src/test/abilities/aura_break.test.ts | 15 ++++--- src/test/abilities/battery.test.ts | 15 ++++--- src/test/abilities/battle_bond.test.ts | 2 +- src/test/abilities/costar.test.ts | 13 +++--- src/test/abilities/disguise.test.ts | 2 +- src/test/abilities/dry_skin.test.ts | 12 +++--- src/test/abilities/hustle.test.ts | 2 +- src/test/abilities/ice_face.test.ts | 12 +++--- src/test/abilities/intimidate.test.ts | 8 ++-- src/test/abilities/libero.test.ts | 30 +++++++------- src/test/abilities/moxie.test.ts | 19 ++++----- src/test/abilities/parental_bond.test.ts | 46 ++++++++++----------- src/test/abilities/power_construct.test.ts | 2 +- src/test/abilities/power_spot.test.ts | 17 ++++---- src/test/abilities/protean.test.ts | 30 +++++++------- src/test/abilities/quick_draw.test.ts | 2 +- src/test/abilities/sand_veil.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 12 +++--- src/test/abilities/schooling.test.ts | 2 +- src/test/abilities/screen_cleaner.test.ts | 15 ++++--- src/test/abilities/serene_grace.test.ts | 25 ++++++----- src/test/abilities/sheer_force.test.ts | 2 +- src/test/abilities/shield_dust.test.ts | 25 ++++++----- src/test/abilities/shields_down.test.ts | 2 +- src/test/abilities/steely_spirit.test.ts | 17 ++++---- src/test/abilities/sturdy.test.ts | 2 +- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/abilities/volt_absorb.test.ts | 2 +- src/test/abilities/wind_power.test.ts | 15 ++++--- src/test/abilities/wind_rider.test.ts | 15 ++++--- src/test/abilities/wonder_skin.test.ts | 17 ++++---- src/test/abilities/zen_mode.test.ts | 2 +- src/test/abilities/zero_to_hero.test.ts | 2 +- src/test/achievements/achievement.test.ts | 13 +++--- src/test/arena/arena_gravity.test.ts | 2 +- src/test/arena/weather_fog.test.ts | 21 +++++----- src/test/arena/weather_strong_winds.test.ts | 15 ++++--- src/test/battle/battle-order.test.ts | 19 ++++----- src/test/battle/battle.test.ts | 27 ++++++------ src/test/battle/error-handling.test.ts | 7 ++-- src/test/battle/special_battle.test.ts | 9 ++-- src/test/items/grip_claw.test.ts | 2 +- src/test/items/leek.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 2 +- src/test/moves/astonish.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/double_team.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 2 +- src/test/moves/follow_me.test.ts | 6 +-- src/test/moves/gastro_acid.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/growth.test.ts | 19 ++++----- src/test/moves/hard_press.test.ts | 15 ++++--- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/light_screen.test.ts | 2 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 2 +- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/octolock.test.ts | 15 ++++--- src/test/moves/purify.test.ts | 2 +- src/test/moves/rage_powder.test.ts | 2 +- src/test/moves/reflect.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- src/test/moves/spit_up.test.ts | 2 +- src/test/moves/spotlight.test.ts | 2 +- src/test/moves/stockpile.test.ts | 2 +- src/test/moves/swallow.test.ts | 2 +- src/test/moves/tackle.test.ts | 2 +- src/test/moves/tail_whip.test.ts | 17 ++++---- src/test/moves/tailwind.test.ts | 19 ++++----- src/test/moves/thousand_arrows.test.ts | 2 +- src/test/moves/tidy_up.test.ts | 25 ++++++----- src/test/ui/transfer-item.test.ts | 2 +- 82 files changed, 333 insertions(+), 359 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index b3f6c37b15c..0004479ed8c 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; import { CommandPhase, MessagePhase, TurnInitPhase } from "#app/phases"; +import i18next, { initI18n } from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import i18next, { initI18n } from "#app/plugins/i18n"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; @@ -34,7 +33,7 @@ describe("Ability Timing", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.ability(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.ICE_BEAM]); + game.override.moveset([Moves.SPLASH, Moves.ICE_BEAM]); }); it("should trigger after switch check", async() => { diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 20c15f679e8..918905fc00a 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { allMoves } from "#app/data/move.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Aura Break", () => { @@ -29,7 +28,7 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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(SPLASH_ONLY); game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index be13bceff4d..9c3248f39c0 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Battery", () => { @@ -31,7 +30,7 @@ describe("Abilities - Battery", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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(SPLASH_ONLY); }); diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 094bdc9dd53..2129bcd24e4 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -30,7 +30,7 @@ describe("Abilities - BATTLE BOND", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.BATTLE_BOND); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 566f982fc08..1d58d899565 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import Phaser from "phaser"; -import Overrides from "#app/overrides"; import { BattleStat } from "#app/data/battle-stat.js"; -import { CommandPhase, MessagePhase } from "#app/phases.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; import { Abilities } from "#app/enums/abilities.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; +import { CommandPhase, MessagePhase } from "#app/phases.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "../utils/gameManager"; +import { getMovePosition } from "../utils/gameManagerUtils"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -30,7 +29,7 @@ describe("Abilities - COSTAR", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.ability(Abilities.COSTAR); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); + game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index fd486f89c69..cdc5852e8c7 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -30,7 +30,7 @@ describe("Abilities - DISGUISE", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.DISGUISE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 9cb92710285..135acbf88f7 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Dry Skin", () => { }); it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); + game.override.moveset([Moves.SUNNY_DAY, Moves.SPLASH]); await game.startBattle(); @@ -56,7 +56,7 @@ describe("Abilities - Dry Skin", () => { }); it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); + game.override.moveset([Moves.RAIN_DANCE, Moves.SPLASH]); await game.startBattle(); @@ -79,7 +79,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing fire attacks do 25% more damage", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLAMETHROWER]); + game.override.moveset([Moves.FLAMETHROWER]); await game.startBattle(); @@ -106,7 +106,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + game.override.moveset([Moves.WATER_GUN]); await game.startBattle(); @@ -121,7 +121,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing water attacks do not heal if they were protected from", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + game.override.moveset([Moves.WATER_GUN]); await game.startBattle(); @@ -137,7 +137,7 @@ describe("Abilities - Dry Skin", () => { }); it("multi-strike water attacks only heal once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); + game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); await game.startBattle(); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index b2033f7ef5e..165169bb66e 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Hustle", () => { beforeEach(() => { game = new GameManager(phaserGame); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HUSTLE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); + game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index c0f91e8dff8..65d9fe1e489 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Ice Face", () => { game.override.battleType("single"); game.override.enemySpecies(Species.EISCUE); game.override.enemyAbility(Abilities.ICE_FACE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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 () => { @@ -54,7 +54,7 @@ describe("Abilities - Ice Face", () => { }); it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); + game.override.moveset([Moves.SURGING_STRIKES]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); await game.startBattle([Species.HITMONLEE]); @@ -109,7 +109,7 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when Hail or Snow starts", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); + game.override.moveset([Moves.QUICK_ATTACK]); game.override.enemyMoveset([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); await game.startBattle([Species.MAGIKARP]); @@ -132,7 +132,7 @@ 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]); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); + game.override.moveset([Moves.SNOWSCAPE]); await game.startBattle([Species.EISCUE, Species.NINJASK]); @@ -227,7 +227,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be suppressed", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID]); + game.override.moveset([Moves.GASTRO_ACID]); await game.startBattle([Species.MAGIKARP]); @@ -243,7 +243,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be swapped with another ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SKILL_SWAP]); + game.override.moveset([Moves.SKILL_SWAP]); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 5bba42bd6d8..c42af129227 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -205,7 +205,7 @@ describe("Abilities - Intimidate", () => { it("single - wild next wave opp triger once, us: none", async () => { game.override.startingWave(2); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AERIAL_ACE]); + game.override.moveset([Moves.AERIAL_ACE]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -231,7 +231,7 @@ describe("Abilities - Intimidate", () => { it("single - wild next turn - no retrigger on next turn", async () => { game.override.startingWave(2); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -254,7 +254,7 @@ describe("Abilities - Intimidate", () => { }, 20000); it("single - trainer should only trigger once and each time he switch", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); game.override.enemyMoveset([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); @@ -293,7 +293,7 @@ describe("Abilities - Intimidate", () => { }, 200000); it("single - trainer should only trigger once whatever turn we are", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index ce65614d0aa..cc69334b805 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -43,7 +43,7 @@ describe("Abilities - Protean", () => { test( "ability applies and changes a pokemon's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -61,7 +61,7 @@ describe("Abilities - Protean", () => { test.skip( "ability applies only once per switch in", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); @@ -101,7 +101,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move has a variable type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WEATHER_BALL]); + game.override.moveset([Moves.WEATHER_BALL]); await game.startBattle([Species.MAGIKARP]); @@ -124,7 +124,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the type has changed by another ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); @@ -147,7 +147,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move calls another move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.NATURE_POWER]); + game.override.moveset([Moves.NATURE_POWER]); await game.startBattle([Species.MAGIKARP]); @@ -166,7 +166,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is delayed / charging", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG]); + game.override.moveset([Moves.DIG]); await game.startBattle([Species.MAGIKARP]); @@ -184,7 +184,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move misses", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); @@ -207,7 +207,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is protected against", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); @@ -226,7 +226,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -245,7 +245,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon's type is the same as the move's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -264,7 +264,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon is terastallized", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -284,7 +284,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon uses struggle", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + game.override.moveset([Moves.STRUGGLE]); await game.startBattle([Species.MAGIKARP]); @@ -302,7 +302,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if the pokemon's move fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.MAGIKARP]); @@ -320,7 +320,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); + game.override.moveset([Moves.TRICK_OR_TREAT]); game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -339,7 +339,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly and the pokemon curses itself", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + game.override.moveset([Moves.CURSE]); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index 0ad48bbaad9..469a4e2947f 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, EnemyCommandPhase, VictoryPhase } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Moxie", () => { @@ -39,7 +38,7 @@ describe("Abilities - Moxie", () => { game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.MOXIE); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index c6de23432e6..334ab12d46e 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -44,7 +44,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should add second strike to attack move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); @@ -76,7 +76,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should apply secondary effects to both strikes", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); + game.override.moveset([Moves.POWER_UP_PUNCH]); game.override.enemySpecies(Species.AMOONGUSS); await game.startBattle([Species.CHARIZARD]); @@ -99,7 +99,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to Status moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BABY_DOLL_EYES]); + game.override.moveset([Moves.BABY_DOLL_EYES]); await game.startBattle([Species.CHARIZARD]); @@ -119,7 +119,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-hit moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_HIT]); + game.override.moveset([Moves.DOUBLE_HIT]); await game.startBattle([Species.CHARIZARD]); @@ -144,7 +144,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to self-sacrifice moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SELF_DESTRUCT]); + game.override.moveset([Moves.SELF_DESTRUCT]); await game.startBattle([Species.CHARIZARD]); @@ -165,7 +165,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to Rollout", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + game.override.moveset([Moves.ROLLOUT]); await game.startBattle([Species.CHARIZARD]); @@ -189,7 +189,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply multiplier to fixed-damage moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + game.override.moveset([Moves.DRAGON_RAGE]); await game.startBattle([Species.CHARIZARD]); @@ -211,7 +211,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply multiplier to counter moves", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); + game.override.moveset([Moves.COUNTER]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); @@ -240,7 +240,7 @@ describe("Abilities - Parental Bond", () => { "ability should not apply to multi-target moves", async () => { game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + game.override.moveset([Moves.EARTHQUAKE]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); @@ -265,7 +265,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should apply to multi-target moves when hitting only one target", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + game.override.moveset([Moves.EARTHQUAKE]); await game.startBattle([Species.CHARIZARD]); @@ -285,7 +285,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should only trigger post-target move effects once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MIND_BLOWN]); + game.override.moveset([Moves.MIND_BLOWN]); await game.startBattle([Species.PIDGEOT]); @@ -311,7 +311,7 @@ describe("Abilities - Parental Bond", () => { test( "Burn Up only removes type after second strike with this ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.CHARIZARD]); @@ -338,7 +338,7 @@ describe("Abilities - Parental Bond", () => { test( "Moves boosted by this ability and Multi-Lens should strike 4 times", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -360,7 +360,7 @@ describe("Abilities - Parental Bond", () => { test( "Super Fang boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUPER_FANG]); + game.override.moveset([Moves.SUPER_FANG]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -391,7 +391,7 @@ describe("Abilities - Parental Bond", () => { test( "Seismic Toss boosted by this ability and Multi-Lens should strike twice", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SEISMIC_TOSS]); + game.override.moveset([Moves.SEISMIC_TOSS]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -422,7 +422,7 @@ describe("Abilities - Parental Bond", () => { test( "Hyper Beam boosted by this ability should strike twice, then recharge", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM]); + game.override.moveset([Moves.HYPER_BEAM]); await game.startBattle([Species.CHARIZARD]); @@ -452,7 +452,7 @@ describe("Abilities - Parental Bond", () => { test( "Anchor Shot boosted by this ability should only trap the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ANCHOR_SHOT]); + game.override.moveset([Moves.ANCHOR_SHOT]); await game.startBattle([Species.CHARIZARD]); @@ -484,7 +484,7 @@ describe("Abilities - Parental Bond", () => { test( "Smack Down boosted by this ability should only ground the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SMACK_DOWN]); + game.override.moveset([Moves.SMACK_DOWN]); await game.startBattle([Species.CHARIZARD]); @@ -513,7 +513,7 @@ describe("Abilities - Parental Bond", () => { test( "U-turn boosted by this ability should strike twice before forcing a switch", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.U_TURN]); + game.override.moveset([Moves.U_TURN]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -539,7 +539,7 @@ describe("Abilities - Parental Bond", () => { test( "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WAKE_UP_SLAP]); + game.override.moveset([Moves.WAKE_UP_SLAP]); vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); await game.startBattle([Species.CHARIZARD]); @@ -569,7 +569,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not cause user to hit into King's Shield more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyMoveset([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); await game.startBattle([Species.CHARIZARD]); @@ -591,7 +591,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not cause user to hit into Storm Drain more than once", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + game.override.moveset([Moves.WATER_GUN]); game.override.enemyAbility(Abilities.STORM_DRAIN); await game.startBattle([Species.CHARIZARD]); @@ -614,7 +614,7 @@ describe("Abilities - Parental Bond", () => { "ability should not apply to multi-target moves with Multi-Lens", async () => { game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); + game.override.moveset([Moves.EARTHQUAKE, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 803be7e8147..4128cf7b5d2 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -30,7 +30,7 @@ describe("Abilities - POWER CONSTRUCT", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.POWER_CONSTRUCT); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index f47f977046e..018002fe541 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allMoves } from "#app/data/move.js"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Power Spot", () => { @@ -29,7 +28,7 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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(SPLASH_ONLY); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 4889bc99b5c..65858ec947d 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -43,7 +43,7 @@ describe("Abilities - Protean", () => { test( "ability applies and changes a pokemon's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -61,7 +61,7 @@ describe("Abilities - Protean", () => { test.skip( "ability applies only once per switch in", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); @@ -101,7 +101,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move has a variable type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WEATHER_BALL]); + game.override.moveset([Moves.WEATHER_BALL]); await game.startBattle([Species.MAGIKARP]); @@ -124,7 +124,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the type has changed by another ability", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); @@ -147,7 +147,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move calls another move", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.NATURE_POWER]); + game.override.moveset([Moves.NATURE_POWER]); await game.startBattle([Species.MAGIKARP]); @@ -166,7 +166,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is delayed / charging", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG]); + game.override.moveset([Moves.DIG]); await game.startBattle([Species.MAGIKARP]); @@ -184,7 +184,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move misses", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.MAGIKARP]); @@ -207,7 +207,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move is protected against", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); await game.startBattle([Species.MAGIKARP]); @@ -226,7 +226,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's move fails because of type immunity", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -245,7 +245,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon's type is the same as the move's type", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -264,7 +264,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon is terastallized", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MAGIKARP]); @@ -284,7 +284,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if pokemon uses struggle", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + game.override.moveset([Moves.STRUGGLE]); await game.startBattle([Species.MAGIKARP]); @@ -302,7 +302,7 @@ describe("Abilities - Protean", () => { test( "ability is not applied if the pokemon's move fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + game.override.moveset([Moves.BURN_UP]); await game.startBattle([Species.MAGIKARP]); @@ -320,7 +320,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TRICK_OR_TREAT]); + game.override.moveset([Moves.TRICK_OR_TREAT]); game.override.enemySpecies(Species.GASTLY); await game.startBattle([Species.MAGIKARP]); @@ -339,7 +339,7 @@ describe("Abilities - Protean", () => { test( "ability applies correctly and the pokemon curses itself", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + game.override.moveset([Moves.CURSE]); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index f94a8c55a6c..444b6bb2470 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Quick Draw", () => { game.override.starterSpecies(Species.MAGIKARP); game.override.ability(Abilities.QUICK_DRAW); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); + game.override.moveset([Moves.TACKLE, Moves.TAIL_WHIP]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index e87398e05c2..a43c554dfdd 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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]); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 4ffab7792d1..57848de61a7 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.LEAFAGE; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); game.override.enemyAbility(enemyAbility); @@ -59,7 +59,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.SPORE; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -78,7 +78,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.GRASSY_TERRAIN; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -98,7 +98,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.BULLET_SEED; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -119,7 +119,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.SPIKY_SHIELD; const ability = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.ability(ability); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); @@ -145,7 +145,7 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.METRONOME; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index f3e95d987f2..38d8cfd74f2 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -30,7 +30,7 @@ describe("Abilities - SCHOOLING", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.SCHOOLING); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 04fc2e47f14..2d2dc70b907 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Screen Cleaner", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Aurora Veil", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); + 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]); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index f46e1bbff62..13da444454e 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, MoveEffectPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Serene Grace", () => { @@ -37,7 +36,7 @@ describe("Abilities - Serene Grace", () => { game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); game.override.startingLevel(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + game.override.moveset(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index e4df5920a04..850a2d97c9f 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Sheer Force", () => { game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); game.override.startingLevel(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + game.override.moveset(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index a9d5dbe3209..35e4015e8bc 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Abilities } from "#enums/abilities"; -import {applyAbAttrs ,applyPreDefendAbAttrs,IgnoreMoveEffectsAbAttr,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, MoveEffectPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Shield Dust", () => { @@ -38,7 +37,7 @@ describe("Abilities - Shield Dust", () => { game.override.enemySpecies(Species.ONIX); game.override.enemyAbility(Abilities.SHIELD_DUST); game.override.startingLevel(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + game.override.moveset(movesToUse); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index 4b3b49d0ff0..1b5582d44a7 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -30,7 +30,7 @@ describe("Abilities - SHIELDS DOWN", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.SHIELDS_DOWN); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index 3b276b6ad4a..7ac78eb11fa 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { allMoves } from "#app/data/move.js"; import { allAbilities } from "#app/data/ability.js"; +import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, SelectTargetPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Steely Spirit", () => { @@ -33,7 +32,7 @@ describe("Abilities - Steely Spirit", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); + game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]); game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 34f7c16d542..33c3de2fb28 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -34,7 +34,7 @@ describe("Abilities - Sturdy", () => { game.override.starterSpecies(Species.LUCARIO); game.override.startingLevel(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); + game.override.moveset([Moves.CLOSE_COMBAT, Moves.FISSURE]); game.override.enemySpecies(Species.ARON); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index f955f7c4ed4..715236025be 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -68,7 +68,7 @@ describe("Abilities - Unseen Fist", () => { }); async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([attackMove]); + game.override.moveset([attackMove]); game.override.enemyMoveset([protectMove, protectMove, protectMove, protectMove]); await game.startBattle(); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 32e96c91fd0..b1bf638fc77 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Volt Absorb", () => { const moveToUse = Moves.CHARGE; const ability = Abilities.VOLT_ABSORB; - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.ability(ability); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 36109f81c33..cfdb2e745fe 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Power", () => { @@ -31,7 +30,7 @@ describe("Abilities - Wind Power", () => { game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_POWER); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index a3d1ae44d44..88da929fbf1 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Rider", () => { @@ -31,7 +30,7 @@ describe("Abilities - Wind Rider", () => { game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_RIDER); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index c62a4eaed66..bc964134e45 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allAbilities } from "#app/data/ability.js"; +import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { allMoves } from "#app/data/move.js"; -import { allAbilities } from "#app/data/ability.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wonder Skin", () => { @@ -28,7 +27,7 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index b620431d288..dfb96c7d336 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -48,7 +48,7 @@ describe("Abilities - ZEN MODE", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index cb930382592..29e07078dfc 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -30,7 +30,7 @@ describe("Abilities - ZERO TO HERO", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.ZERO_TO_HERO); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index 57c18c43708..83d24d1f0ee 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -1,11 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {MoneyAchv, Achv, AchvTier, RibbonAchv, DamageAchv, HealAchv, LevelAchv, ModifierAchv, achvs} from "#app/system/achv"; -import BattleScene from "../../battle-scene"; -import { IntegerHolder, NumberHolder } from "#app/utils.js"; import { TurnHeldItemTransferModifier } from "#app/modifier/modifier.js"; -import Phaser from "phaser"; +import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { IntegerHolder, NumberHolder } from "#app/utils.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import BattleScene from "../../battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { @@ -103,8 +102,8 @@ describe("RibbonAchv", () => { }); beforeEach(() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); + game.override.moveset([]); game.override.startingLevel(0); game.override.starterSpecies(0); game.override.enemyMoveset([]); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index 916a4542924..b96b3940245 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -30,7 +30,7 @@ describe("Arena - Gravity", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); + game.override.moveset([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); game.override.ability(Abilities.UNNERVE); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index e0dcf8450d1..9b0630f5c2b 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -1,16 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { - MoveEffectPhase, -} from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allMoves } from "#app/data/move.js"; import { WeatherType } from "#app/data/weather.js"; import { Abilities } from "#app/enums/abilities.js"; +import { + MoveEffectPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Weather - Fog", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Weather - Fog", () => { game.override .weather(WeatherType.FOG) .battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.ability(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index cc85d7a0866..6c977401f20 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move.js"; import { TurnStartPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { allMoves } from "#app/data/move.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Weather - Strong Winds", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Weather - Strong Winds", () => { game.override.startingLevel(10); game.override.enemySpecies(Species.TAILLOW); game.override.enemyAbility(Abilities.DELTA_STREAM); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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 () => { diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 77368d74d32..14ff1bcec0d 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, EnemyCommandPhase, SelectTargetPhase, TurnStartPhase } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {Stat} from "#app/data/pokemon-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; +import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import {Button} from "#enums/buttons"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Battle order", () => { @@ -37,7 +36,7 @@ describe("Battle order", () => { game.override.enemySpecies(Species.MEWTWO); game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); }); it("opponent faster than player 50 vs 150", async() => { diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 2eba8f3d93e..a91cd1e8352 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -1,9 +1,6 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {generateStarter, getMovePosition,} from "#app/test/utils/gameManagerUtils"; -import {Mode} from "#app/ui/ui"; -import {GameModes} from "#app/game-mode"; -import Overrides from "#app/overrides"; -import {Command} from "#app/ui/command-ui-handler"; +import { allSpecies } from "#app/data/pokemon-species"; +import { GameModes } from "#app/game-mode"; +import { getGameMode } from "#app/game-mode.js"; import { CommandPhase, DamagePhase, EncounterPhase, @@ -17,13 +14,15 @@ import { TurnInitPhase, VictoryPhase, } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; -import {allSpecies} from "#app/data/pokemon-species"; -import { getGameMode } from "#app/game-mode.js"; +import { generateStarter, getMovePosition, } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -96,7 +95,7 @@ describe("Test Battle Phase", () => { game.override .startingWave(3) .battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); @@ -115,7 +114,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(5); game.override.startingWave(3); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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.battleType("single"); @@ -268,7 +267,7 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([ Species.DARMANITAN, @@ -297,7 +296,7 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; @@ -315,7 +314,7 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index 6998972cd35..a823887b4f8 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,10 +1,9 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; -import Overrides from "#app/overrides"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Test Battle Phase", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 1d6ce09e70c..e4243ea1418 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -1,14 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import {Mode} from "#app/ui/ui"; -import Overrides from "#app/overrides"; import { CommandPhase, } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -28,7 +27,7 @@ describe("Test Battle Phase", () => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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]); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 951e34fae2c..edd9c34655c 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -31,7 +31,7 @@ describe("Items - Grip Claw", () => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); + game.override.moveset([ Moves.POPULATION_BOMB, Moves.SPLASH ]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); game.override.enemySpecies(Species.SNORLAX); game.override.ability(Abilities.KLUTZ); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index e03caec36d9..5dfd75d6cb5 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -36,7 +36,7 @@ describe("Items - Leek", () => { it("LEEK activates in battle correctly", async() => { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "LEEK" }]); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POUND ]); + game.override.moveset([ Moves.POUND ]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.FARFETCHD diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index ee2ead08234..7c89e1e299d 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -28,7 +28,7 @@ describe("Items - Leftovers", () => { game.override.battleType("single"); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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]); diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index 4ddb4177cd9..d0e556fab79 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -36,7 +36,7 @@ describe("Items - Scope Lens", () => { it("SCOPE_LENS activates in battle correctly", async() => { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SCOPE_LENS" }]); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POUND ]); + game.override.moveset([ Moves.POUND ]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.GASTLY diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index f5ef6a62c60..bdef05fec2f 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -41,7 +41,7 @@ describe("Items - Toxic orb", () => { game.override.ability(Abilities.INSOMNIA); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "TOXIC_ORB", diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index ac5ef3fde76..66bed1e5333 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -29,7 +29,7 @@ describe("Moves - Astonish", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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]); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 5ca56c4d243..4f5022db4ae 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -37,7 +37,7 @@ describe("Moves - Aurora Veil", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.ability(Abilities.NONE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index dafa1be3049..5998f67549c 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -38,7 +38,7 @@ describe("Moves - Ceaseless Edge", () => { vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); + game.override.moveset([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index 637f0f39fc6..2c42e1651ba 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -28,7 +28,7 @@ describe("Moves - Double Team", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_TEAM]); + game.override.moveset([Moves.DOUBLE_TEAM]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index a1e8a18540e..330b8ab22a4 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -39,7 +39,7 @@ describe("Moves - Dragon Rage", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.starterSpecies(Species.SNORLAX); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + game.override.moveset([Moves.DRAGON_RAGE]); game.override.ability(Abilities.BALL_FETCH); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.startingLevel(100); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 88251b74115..3e1ba2f609e 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -28,7 +28,7 @@ describe("Moves - Dynamax Cannon", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ dynamaxCannon.id ]); + game.override.moveset([ dynamaxCannon.id ]); game.override.startingLevel(200); // Note that, for Waves 1-10, the level cap is 10 diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index f67b275a8ba..cfc5c2b76f7 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -34,7 +34,7 @@ describe("Moves - Fissure", () => { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.starterSpecies(Species.SNORLAX); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FISSURE]); + game.override.moveset([Moves.FISSURE]); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); game.override.startingLevel(100); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index 95a2736aa32..fb6708726e5 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -34,7 +34,7 @@ describe("Moves - Flower Shield", () => { game.override.ability(Abilities.NONE); game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); + game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index bdc09605c0c..5ee4ee02ba2 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -37,7 +37,7 @@ describe("Moves - Follow Me", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); @@ -102,7 +102,7 @@ describe("Moves - Follow Me", () => { "move effect should be bypassed by Stalwart", async () => { game.override.ability(Abilities.STALWART); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); + game.override.moveset([ Moves.QUICK_ATTACK ]); game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); @@ -136,7 +136,7 @@ describe("Moves - Follow Me", () => { test( "move effect should be bypassed by Snipe Shot", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); + game.override.moveset([ Moves.SNIPE_SHOT ]); game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 161eab37183..35bb345c756 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -34,7 +34,7 @@ describe("Moves - Gastro Acid", () => { game.override.startingLevel(1); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.ability(Abilities.NONE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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(SPLASH_ONLY); game.override.enemyAbility(Abilities.WATER_ABSORB); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 15e81b489d6..42265568cc6 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -34,7 +34,7 @@ describe("Moves - Glaive Rush", () => { game.override.starterSpecies(Species.KLINK); game.override.ability(Abilities.UNNERVE); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); + game.override.moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); it("takes double damage from attacks", async() => { diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 6b9abd8da59..3d4a37fda73 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, EnemyCommandPhase, TurnInitPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Growth", () => { @@ -39,7 +38,7 @@ describe("Moves - Growth", () => { game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 27c4af71004..89f8e14169f 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { allMoves } from "#app/data/move.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Hard Press", () => { @@ -35,7 +34,7 @@ describe("Moves - Hard Press", () => { game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); + game.override.moveset([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); }); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index b6c6c08f089..4cd9d0600a8 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -35,7 +35,7 @@ describe("Moves - Hyper Beam", () => { game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM, Moves.TACKLE]); + game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]); vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); }); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index c8543c2faed..d06e0b7804f 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -36,7 +36,7 @@ describe("Moves - Light Screen", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.ability(Abilities.NONE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + game.override.moveset([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index a321499d11f..de87ae81a79 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -29,7 +29,7 @@ describe("Moves - Magnet Rise", () => { game.override.enemyMoveset([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index ca207a63c3f..7d431b60a27 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -33,7 +33,7 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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(SPLASH_ONLY); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index f60429909db..229732fe0ac 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -166,7 +166,7 @@ function leaveOneEnemyPokemon(game: GameManager) { function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { const game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); + game.override.moveset([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); game.override.ability(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 061aaff5d48..6d5f404d2f4 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -1,14 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat"; +import { TrappedTag } from "#app/data/battler-tags.js"; import { CommandPhase, MoveEndPhase, TurnInitPhase } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { TrappedTag } from "#app/data/battler-tags.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Octolock", () => { @@ -36,7 +35,7 @@ describe("Moves - Octolock", () => { game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.OCTOLOCK, Moves.SPLASH]); + game.override.moveset([Moves.OCTOLOCK, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 0a5419f7288..513f3f891ee 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -33,7 +33,7 @@ describe("Moves - Purify", () => { game.override.starterSpecies(Species.PYUKUMUKU); game.override.startingLevel(10); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + game.override.moveset([Moves.PURIFY, Moves.SIZZLY_SLIDE]); game.override.enemySpecies(Species.MAGIKARP); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 768d3580026..60c0897c102 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -36,7 +36,7 @@ describe("Moves - Rage Powder", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 35f9599c5f7..3ee78d3d6d1 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -36,7 +36,7 @@ describe("Moves - Reflect", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.ability(Abilities.NONE); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 90a3fe065d8..d2520c91180 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -38,7 +38,7 @@ describe("Moves - Rollout", () => { }); it("should double it's dmg on sequential uses but reset after 5", async () => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + game.override.moveset([Moves.ROLLOUT]); vi.spyOn(allMoves[Moves.ROLLOUT], "accuracy", "get").mockReturnValue(100); //always hit const variance = 5; diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index e29056ff443..3802cdbb6ee 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -32,7 +32,7 @@ describe("Moves - Roost", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); + game.override.moveset([ Moves.STOMPING_TANTRUM ]); game.override.enemyMoveset([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); }); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index 4240c06d10a..b2f711d406a 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -35,7 +35,7 @@ describe("Moves - Spikes", () => { vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); + game.override.moveset([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); }); it("single - wild - stay on field - no damage", async() => { diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index 4b58e9f73a0..9eb114847d2 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -35,7 +35,7 @@ describe("Moves - Spit Up", () => { game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); + game.override.moveset([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); }); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 5790214ceb1..63b66008235 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -36,7 +36,7 @@ describe("Moves - Spotlight", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 760bbdf7381..30e2bb9d642 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -35,7 +35,7 @@ describe("Moves - Stockpile", () => { game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STOCKPILE, Moves.SPLASH]); + game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); }); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 70826c02c5d..05ea6678d05 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -34,7 +34,7 @@ describe("Moves - Swallow", () => { game.override.enemyAbility(Abilities.NONE); vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); + game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); }); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index 7f58aa8e23b..e58b5d48c8f 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -35,7 +35,7 @@ describe("Moves - Tackle", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.startingLevel(1); game.override.startingWave(97); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index be1e8614c86..539829f4003 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -1,19 +1,18 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat"; import { CommandPhase, EnemyCommandPhase, TurnInitPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {BattleStat} from "#app/data/battle-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Tail whip", () => { @@ -38,7 +37,7 @@ describe("Moves - Tail whip", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index 02924d429f3..d2a90dd2ed5 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -1,16 +1,15 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { Stat } from "#app/data/pokemon-stat.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Wind Rider", () => { @@ -30,7 +29,7 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index e0121c6ece2..f4a9db08b8e 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -34,7 +34,7 @@ describe("Moves - Thousand Arrows", () => { game.override.enemySpecies(Species.TOGETIC); game.override.startingLevel(100); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); + game.override.moveset([ Moves.THOUSAND_ARROWS ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); }); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 0fd17baac60..b1292de0d27 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -1,14 +1,13 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { BattleStat } from "#app/data/battle-stat.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; @@ -34,12 +33,12 @@ describe("Moves - Tidy Up", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.starterSpecies(Species.FEEBAS); game.override.ability(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); + game.override.moveset([Moves.TIDY_UP]); game.override.startingLevel(50); }); it("spikes are cleared", async() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); + game.override.moveset([Moves.SPIKES, Moves.TIDY_UP]); game.override.enemyMoveset([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.startBattle(); @@ -52,7 +51,7 @@ describe("Moves - Tidy Up", () => { }, 20000); it("stealth rocks are cleared", async() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + 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.startBattle(); @@ -65,7 +64,7 @@ describe("Moves - Tidy Up", () => { }, 20000); it("toxic spikes are cleared", async() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + 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.startBattle(); @@ -78,7 +77,7 @@ describe("Moves - Tidy Up", () => { }, 20000); it("sticky webs are cleared", async() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); + 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.startBattle(); @@ -92,7 +91,7 @@ describe("Moves - Tidy Up", () => { }, 20000); it.skip("substitutes are cleared", async() => { - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); + game.override.moveset([Moves.SUBSTITUTE, Moves.TIDY_UP]); game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.startBattle(); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 9007b1dabe2..3a787fa462d 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -41,7 +41,7 @@ describe("UI - Transfer Items", () => { { name: "BERRY", count: 2, type: BerryType.APICOT }, { name: "BERRY", count: 2, type: BerryType.LUM }, ]); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); + game.override.moveset([Moves.DRAGON_CLAW]); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.SPLASH]); From 97376d5c70e54d9edb32da153793f96a6988e30f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 15:54:48 -0700 Subject: [PATCH 023/321] add OverridesHelper.starterForms --- src/test/utils/overridesHelper.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 5767cac4914..ad19547b992 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -63,6 +63,20 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemons) forms + * @param forms the (pokemon) forms to set + * @returns this + */ + starterForms(forms: Partial>): this { + vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue(forms); + const formsStr = Object.entries(forms) + .map(([speciesId, formIndex]) => `${Species[speciesId]}=${formIndex}`) + .join(", "); + this.log(`Player Pokemon form set to: ${formsStr}!`); + return this; + } + /** * Override the player (pokemon) {@linkcode Abilities | ability} * @param ability the (pokemon) {@linkcode Abilities | ability} to set From 4c15fd86b0cf6f566c3f037be038bc141a051d39 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:03:26 -0700 Subject: [PATCH 024/321] apply game.override.starterForms --- src/test/abilities/battle_bond.test.ts | 21 ++++++++++----------- src/test/abilities/disguise.test.ts | 4 ++-- src/test/abilities/ice_face.test.ts | 2 +- src/test/abilities/power_construct.test.ts | 17 ++++++++--------- src/test/abilities/schooling.test.ts | 17 ++++++++--------- src/test/abilities/shields_down.test.ts | 17 ++++++++--------- src/test/abilities/zen_mode.test.ts | 17 ++++++++--------- src/test/abilities/zero_to_hero.test.ts | 17 ++++++++--------- 8 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index 2129bcd24e4..ce41f9b6603 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -37,10 +36,10 @@ describe("Abilities - BATTLE BOND", () => { test( "check if fainted pokemon switches to base form on arena reset", async () => { - const baseForm = 1, - ashForm = 2; + const baseForm = 1; + const ashForm = 2; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.GRENINJA]: ashForm, }); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index cdc5852e8c7..6a2027a44d6 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -40,7 +40,7 @@ describe("Abilities - DISGUISE", () => { const baseForm = 0, bustedForm = 1; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.MIMIKYU]: bustedForm, }); @@ -75,7 +75,7 @@ describe("Abilities - DISGUISE", () => { game.override.startingLevel(20); vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.MIMIKYU]: baseForm, }); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 65d9fe1e489..b5dec492721 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -205,7 +205,7 @@ describe("Abilities - Ice Face", () => { game.override.startingWave(4); game.override.startingLevel(4); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.EISCUE]: noiceForm, }); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 4128cf7b5d2..769499c0e53 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -40,7 +39,7 @@ describe("Abilities - POWER CONSTRUCT", () => { const baseForm = 2, completeForm = 4; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.ZYGARDE]: completeForm, }); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index 38d8cfd74f2..7671534a549 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -40,7 +39,7 @@ describe("Abilities - SCHOOLING", () => { const soloForm = 0, schoolForm = 1; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.WISHIWASHI]: schoolForm, }); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index 1b5582d44a7..64904c80032 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -40,7 +39,7 @@ describe("Abilities - SHIELDS DOWN", () => { const meteorForm = 0, coreForm = 7; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.MINIOR]: coreForm, }); diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index dfb96c7d336..8f4c8b42af5 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -1,7 +1,6 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase"; import { CommandPhase, DamagePhase, @@ -14,15 +13,15 @@ import { TurnInitPhase, TurnStartPhase, } from "#app/phases"; -import { Mode } from "#app/ui/ui"; -import { Stat } from "#app/data/pokemon-stat"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; -import { QuietFormChangePhase } from "#app/form-change-phase"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -154,7 +153,7 @@ describe("Abilities - ZEN MODE", () => { const baseForm = 0, zenForm = 1; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.DARMANITAN]: zenForm, }); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index 29e07078dfc..409fb35a78c 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -40,7 +39,7 @@ describe("Abilities - ZERO TO HERO", () => { const baseForm = 0, heroForm = 1; game.override.startingWave(4); - vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + game.override.starterForms({ [Species.PALAFIN]: heroForm, }); From a9031a3215e4d6bc25803fbad459a4fb3ad8bd8c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:04:46 -0700 Subject: [PATCH 025/321] add OverridesHelper.enemyLevel --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index ad19547b992..42600318a0f 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -188,6 +188,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) level + * @param level the level to set + * @returns this + */ + enemyLevel(level: number): this { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(level); + this.log(`Enemy Pokemon level set to ${level}!`); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From 5350f3a9f55c500aed74e4f06923617b201ecfd7 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:10:38 -0700 Subject: [PATCH 026/321] apply game.override.enemyLevel --- src/test/abilities/disguise.test.ts | 17 ++++++++--------- src/test/abilities/hustle.test.ts | 4 ++-- src/test/abilities/ice_face.test.ts | 15 +++++++-------- src/test/abilities/parental_bond.test.ts | 2 +- src/test/abilities/quick_draw.test.ts | 17 ++++++++--------- src/test/abilities/sand_veil.test.ts | 17 ++++++++--------- src/test/abilities/sturdy.test.ts | 13 ++++++------- src/test/abilities/unseen_fist.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 19 +++++++++---------- src/test/items/grip_claw.test.ts | 2 +- src/test/moves/astonish.test.ts | 15 +++++++-------- src/test/moves/aurora_veil.test.ts | 2 +- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 16 ++++++++-------- src/test/moves/fissure.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 2 +- src/test/moves/follow_me.test.ts | 17 ++++++++--------- src/test/moves/gastro_acid.test.ts | 17 ++++++++--------- src/test/moves/light_screen.test.ts | 2 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 19 +++++++++---------- src/test/moves/multi_target.test.ts | 2 +- src/test/moves/purify.test.ts | 15 +++++++-------- src/test/moves/rage_powder.test.ts | 13 ++++++------- src/test/moves/reflect.test.ts | 2 +- src/test/moves/rollout.test.ts | 2 +- src/test/moves/roost.test.ts | 19 +++++++++---------- src/test/moves/spit_up.test.ts | 2 +- src/test/moves/spotlight.test.ts | 15 +++++++-------- src/test/moves/swallow.test.ts | 2 +- src/test/moves/thousand_arrows.test.ts | 15 +++++++-------- 32 files changed, 139 insertions(+), 154 deletions(-) diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 6a2027a44d6..3a6fd540d27 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; -import { TurnEndPhase } from "#app/phases.js"; -import { QuietFormChangePhase } from "#app/form-change-phase.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -73,7 +72,7 @@ describe("Abilities - DISGUISE", () => { game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); game.override.startingLevel(20); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); + game.override.enemyLevel(20); game.override.enemySpecies(Species.MAGIKARP); game.override.starterForms({ [Species.MIMIKYU]: baseForm, diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index 165169bb66e..c29787705fb 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Hustle", () => { game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.enemyLevel(5); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); @@ -81,7 +81,7 @@ describe("Abilities - Hustle", () => { it("does not affect OHKO moves", async () => { vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + game.override.enemyLevel(30); await game.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon(); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index b5dec492721..ed04aa8bac2 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -1,19 +1,18 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { QuietFormChangePhase } from "#app/form-change-phase"; import { MoveEffectPhase, MoveEndPhase, TurnEndPhase, TurnInitPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; -import { QuietFormChangePhase } from "#app/form-change-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Ice Face", () => { let phaserGame: Phaser.Game; @@ -55,7 +54,7 @@ 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]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.enemyLevel(1); await game.startBattle([Species.HITMONLEE]); game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 334ab12d46e..d74200edb11 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Parental Bond", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(SPLASH_ONLY); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); }); test( diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 444b6bb2470..e6177639bac 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,12 +1,11 @@ -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#enums/species"; -import { FaintPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; +import { FaintPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; describe("Abilities - Quick Draw", () => { @@ -31,7 +30,7 @@ describe("Abilities - Quick Draw", () => { game.override.ability(Abilities.QUICK_DRAW); game.override.moveset([Moves.TACKLE, Moves.TAIL_WHIP]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index a43c554dfdd..4394df3ce97 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -1,15 +1,14 @@ +import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { WeatherType } from "#app/data/weather.js"; +import { CommandPhase, MoveEffectPhase, MoveEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { CommandPhase, MoveEffectPhase, MoveEndPhase } from "#app/phases.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { WeatherType } from "#app/data/weather.js"; -import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability.js"; const TIMEOUT = 20 * 1000; @@ -34,7 +33,7 @@ describe("Abilities - Sand Veil", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override .weather(WeatherType.SANDSTORM) .battleType("double"); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 33c3de2fb28..9bfb3bd0085 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,16 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { EnemyPokemon } from "#app/field/pokemon.js"; import { DamagePhase, MoveEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon } from "#app/field/pokemon.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -37,7 +36,7 @@ describe("Abilities - Sturdy", () => { game.override.moveset([Moves.CLOSE_COMBAT, Moves.FISSURE]); game.override.enemySpecies(Species.ARON); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.enemyLevel(5); game.override.enemyAbility(Abilities.STURDY); }); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index 715236025be..e1e16584bd9 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Unseen Fist", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); }); test( diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index b96b3940245..f89846dd999 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -1,17 +1,16 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { MoveEffectPhase, TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { allMoves } from "#app/data/move.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { Abilities } from "#app/enums/abilities.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Arena - Gravity", () => { let phaserGame: Phaser.Game; @@ -59,7 +58,7 @@ describe("Arena - Gravity", () => { it("OHKO move accuracy is not affected", async () => { game.override.startingLevel(5); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.enemyLevel(5); /** See Fissure {@link https://bulbapedia.bulbagarden.net/wiki/Fissure_(move)} */ const moveToCheck = allMoves[Moves.FISSURE]; diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index edd9c34655c..fdf18454812 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -41,7 +41,7 @@ describe("Items - Grip Claw", () => { {name: "BERRY", type: BerryType.LUM, count: 2} ]); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); vi.spyOn(allMoves[Moves.POPULATION_BOMB], "accuracy", "get").mockReturnValue(100); }); diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index 66bed1e5333..c8c013026b3 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -1,14 +1,13 @@ +import { allMoves } from "#app/data/move.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { BerryPhase, CommandPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { BerryPhase, CommandPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { allMoves } from "#app/data/move.js"; const TIMEOUT = 20 * 1000; @@ -34,7 +33,7 @@ describe("Moves - Astonish", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); vi.spyOn(allMoves[Moves.ASTONISH], "chance", "get").mockReturnValue(100); }); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 4f5022db4ae..fe256bc1777 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -38,7 +38,7 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("single"); game.override.ability(Abilities.NONE); game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 5998f67549c..54a0a0da099 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -37,7 +37,7 @@ describe("Moves - Ceaseless Edge", () => { game.override.enemyAbility(Abilities.RUN_AWAY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.moveset([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 330b8ab22a4..e0873a215f8 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -48,7 +48,7 @@ describe("Moves - Dragon Rage", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.BALL_FETCH); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); await game.startBattle(); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 3e1ba2f609e..a0747f21ffe 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -43,7 +43,7 @@ describe("Moves - Dynamax Cannon", () => { }); it("should return 100 power against an enemy below level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.enemyLevel(1); await game.startBattle([ Species.ETERNATUS, ]); @@ -57,7 +57,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 100 power against an enemy at level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + game.override.enemyLevel(10); await game.startBattle([ Species.ETERNATUS, ]); @@ -71,7 +71,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 120 power against an enemy 1% above level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(101); + game.override.enemyLevel(101); await game.startBattle([ Species.ETERNATUS, ]); @@ -88,7 +88,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 140 power against an enemy 2% above level capp", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(102); + game.override.enemyLevel(102); await game.startBattle([ Species.ETERNATUS, ]); @@ -105,7 +105,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 160 power against an enemy 3% above level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(103); + game.override.enemyLevel(103); await game.startBattle([ Species.ETERNATUS, ]); @@ -122,7 +122,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 180 power against an enemy 4% above level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(104); + game.override.enemyLevel(104); await game.startBattle([ Species.ETERNATUS, ]); @@ -139,7 +139,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 200 power against an enemy 5% above level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(105); + game.override.enemyLevel(105); await game.startBattle([ Species.ETERNATUS, ]); @@ -156,7 +156,7 @@ describe("Moves - Dynamax Cannon", () => { }, 20000); it("should return 200 power against an enemy way above level cap", async() => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(999); + game.override.enemyLevel(999); await game.startBattle([ Species.ETERNATUS, ]); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index cfc5c2b76f7..b68f31a8823 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -41,7 +41,7 @@ describe("Moves - Fissure", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); await game.startBattle(); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index fb6708726e5..25394992b6d 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -83,7 +83,7 @@ describe("Moves - Flower Shield", () => { it("does not increase defense of a pokemon in semi-vulnerable state", async () => { game.override.enemySpecies(Species.PARAS); game.override.enemyMoveset([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + game.override.enemyLevel(50); await game.startBattle([Species.CHERRIM]); const paras = game.scene.getEnemyPokemon(); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index 5ee4ee02ba2..eb41bf55a02 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -1,18 +1,17 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat"; +import { Abilities } from "#app/enums/abilities.js"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; -import { Abilities } from "#app/enums/abilities.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -36,7 +35,7 @@ describe("Moves - Follow Me", () => { game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(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.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 35bb345c756..0ffa8d9180b 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { Abilities } from "#app/enums/abilities.js"; import { Moves } from "#app/enums/moves.js"; -import Overrides from "#app/overrides"; -import { Abilities } from "#app/enums/abilities.js"; -import { BattlerIndex } from "#app/battle.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveResult } from "#app/field/pokemon.js"; -import { Stat } from "#app/data/pokemon-stat.js"; import { Species } from "#app/enums/species.js"; +import { MoveResult } from "#app/field/pokemon.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "../utils/gameManager"; +import { getMovePosition } from "../utils/gameManagerUtils"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -32,7 +31,7 @@ describe("Moves - Gastro Acid", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.startingLevel(1); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + 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.enemySpecies(Species.BIDOOF); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index d06e0b7804f..18bae6993b8 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -37,7 +37,7 @@ describe("Moves - Light Screen", () => { game.override.battleType("single"); game.override.ability(Abilities.NONE); game.override.moveset([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index de87ae81a79..9986921e0d5 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -28,7 +28,7 @@ describe("Moves - Magnet Rise", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.enemyLevel(1); game.override.moveset([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index 7d431b60a27..83543c4e530 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,17 +1,16 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat.js"; import { CommandPhase, MoveEndPhase, StatChangePhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -38,7 +37,7 @@ describe("Moves - Make It Rain", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(SPLASH_ONLY); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); }); it("should only reduce Sp. Atk. once in a double battle", async () => { @@ -63,7 +62,7 @@ describe("Moves - Make It Rain", () => { }, TIMEOUT); it("should apply effects even if the target faints", async () => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + game.override.enemyLevel(1); // ensures the enemy will faint game.override.battleType("single"); await game.startBattle([Species.CHARIZARD]); @@ -83,7 +82,7 @@ describe("Moves - Make It Rain", () => { }, TIMEOUT); it("should reduce Sp. Atk. once after KOing two enemies", async () => { - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + game.override.enemyLevel(1); // ensures the enemy will faint await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 229732fe0ac..a67ee11eb31 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -171,7 +171,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { game.override.enemyMoveset(SPLASH_ONLY); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.startingLevel(50); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(40); + game.override.enemyLevel(40); game.override.enemySpecies(Species.EEVEE); return game; } diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 513f3f891ee..cbc107a3def 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -1,15 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; import { MoveEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; -import { Status, StatusEffect } from "#app/data/status-effect.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -36,7 +35,7 @@ describe("Moves - Purify", () => { game.override.moveset([Moves.PURIFY, Moves.SIZZLY_SLIDE]); game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + game.override.enemyLevel(10); game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 60c0897c102..bc533e1313e 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -1,17 +1,16 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattlerIndex } from "#app/battle.js"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -35,7 +34,7 @@ describe("Moves - Rage Powder", () => { game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(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.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 3ee78d3d6d1..7365ab01cd8 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -37,7 +37,7 @@ describe("Moves - Reflect", () => { game.override.battleType("single"); game.override.ability(Abilities.NONE); game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index d2520c91180..3e79005de61 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -33,7 +33,7 @@ describe("Moves - Rollout", () => { game.override.enemySpecies(Species.BIDOOF); game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.enemyMoveset(SPLASH_ONLY); }); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index 3802cdbb6ee..fe89a0a0a10 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -1,13 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#app/enums/species.js"; -import { Moves } from "#app/enums/moves.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { Abilities } from "#app/enums/abilities.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; @@ -31,7 +30,7 @@ describe("Moves - Roost", () => { game.override.enemySpecies(Species.STARAPTOR); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.moveset([ Moves.STOMPING_TANTRUM ]); game.override.enemyMoveset([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); }); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index 9eb114847d2..0d637f05355 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -33,7 +33,7 @@ describe("Moves - Spit Up", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.enemyLevel(2000); game.override.moveset([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 63b66008235..8170c42dfec 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -1,17 +1,16 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattlerIndex } from "#app/battle.js"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, SelectTargetPhase, TurnEndPhase, } from "#app/phases"; -import {Stat} from "#app/data/pokemon-stat"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; const TIMEOUT = 20 * 1000; @@ -35,7 +34,7 @@ describe("Moves - Spotlight", () => { game.override.starterSpecies(Species.AMOONGUSS); game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(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.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 05ea6678d05..28f6b73ee7d 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -32,7 +32,7 @@ describe("Moves - Swallow", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.enemyLevel(2000); game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index f4a9db08b8e..a7fbee3bebd 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -1,16 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { BerryPhase, MoveEffectPhase } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { Abilities } from "#app/enums/abilities.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; @@ -33,7 +32,7 @@ describe("Moves - Thousand Arrows", () => { game.override.battleType("single"); game.override.enemySpecies(Species.TOGETIC); game.override.startingLevel(100); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemyLevel(100); game.override.moveset([ Moves.THOUSAND_ARROWS ]); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); }); From e8859d2b62eb6ecb66d994366e6f9d17998e52e1 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:12:00 -0700 Subject: [PATCH 027/321] apply missing game.override.ability --- src/test/abilities/hustle.test.ts | 2 +- src/test/items/leftovers.test.ts | 2 +- src/test/moves/hyper_beam.test.ts | 19 +++++++++---------- src/test/moves/spit_up.test.ts | 19 +++++++++---------- src/test/moves/stockpile.test.ts | 2 +- src/test/moves/swallow.test.ts | 17 ++++++++--------- 6 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index c29787705fb..a99415d6954 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Hustle", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HUSTLE); + game.override.ability(Abilities.HUSTLE); game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index 7c89e1e299d..aff1596ad9e 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -27,7 +27,7 @@ describe("Items - Leftovers", () => { game = new GameManager(phaserGame); game.override.battleType("single"); vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + game.override.ability(Abilities.UNNERVE); game.override.moveset([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.UNNERVE); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 4cd9d0600a8..623b24dbb3c 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { Abilities } from "#app/enums/abilities.js"; -import { Species } from "#app/enums/species.js"; -import { Moves } from "#app/enums/moves.js"; import { allMoves } from "#app/data/move.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { BerryPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#app/enums/abilities.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { BerryPhase, TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; // 20 sec timeout for all tests @@ -30,7 +29,7 @@ describe("Moves - Hyper Beam", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index 0d637f05355..0fc01821838 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -1,16 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { MovePhase, TurnInitPhase } from "#app/phases"; import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { allMoves } from "#app/data/move.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { StockpilingTag } from "#app/data/battler-tags.js"; -import { MoveResult, TurnMove } from "#app/field/pokemon.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { allMoves } from "#app/data/move.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Spit Up", () => { @@ -36,7 +35,7 @@ describe("Moves - Spit Up", () => { game.override.enemyLevel(2000); game.override.moveset([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); }); describe("consumes all stockpile stacks to deal damage (scaling with stacks)", () => { diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 30e2bb9d642..9157cf247be 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -36,7 +36,7 @@ describe("Moves - Stockpile", () => { vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); }); it("Gains a stockpile stack and increases DEF and SPDEF by 1 on each use, fails at max stacks (3)", { timeout: 10000 }, async () => { diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 28f6b73ee7d..7c3d3ae1613 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -1,15 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { MovePhase, TurnInitPhase } from "#app/phases"; import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { StockpilingTag } from "#app/data/battler-tags.js"; -import { MoveResult, TurnMove } from "#app/field/pokemon.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Swallow", () => { @@ -35,7 +34,7 @@ describe("Moves - Swallow", () => { game.override.enemyLevel(2000); game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + game.override.ability(Abilities.NONE); }); describe("consumes all stockpile stacks to heal (scaling with stacks)", () => { From a025e30200329850fee8185915a6f9927c114ceb Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:12:56 -0700 Subject: [PATCH 028/321] apply missing game.override.startingLevel --- src/test/abilities/hustle.test.ts | 4 ++-- src/test/items/leftovers.test.ts | 2 +- src/test/moves/stockpile.test.ts | 17 ++++++++--------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index a99415d6954..5a9bfe88be6 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Hustle", () => { game = new GameManager(phaserGame); game.override.ability(Abilities.HUSTLE); game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + game.override.startingLevel(5); vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); game.override.enemyLevel(5); game.override.enemyMoveset(SPLASH_ONLY); @@ -80,7 +80,7 @@ describe("Abilities - Hustle", () => { }); it("does not affect OHKO moves", async () => { - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.startingLevel(100); game.override.enemyLevel(30); await game.startBattle([Species.PIKACHU]); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index aff1596ad9e..ad7cb6b07e6 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -26,7 +26,7 @@ describe("Items - Leftovers", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override.ability(Abilities.UNNERVE); game.override.moveset([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 9157cf247be..81bd65ce582 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -1,15 +1,14 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { CommandPhase, TurnInitPhase } from "#app/phases"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { BattleStat } from "#app/data/battle-stat"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { CommandPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { StockpilingTag } from "#app/data/battler-tags.js"; -import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Stockpile", () => { @@ -34,7 +33,7 @@ describe("Moves - Stockpile", () => { game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.NONE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + game.override.startingLevel(2000); game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); From a87aec4f279fa0b181aeda00e46a568d44f5864e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:15:06 -0700 Subject: [PATCH 029/321] add OverridesHelper.disableCrits() --- src/test/utils/overridesHelper.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 42600318a0f..caaef1a2c0e 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -101,18 +101,27 @@ export class OverridesHelper { } /** - * Override each wave to have or not have standard trainer battles + * Override each wave to not have standard trainer battles * @returns this - * @param disable true */ - disableTrainerWaves(disable: boolean): this { + disableTrainerWaves(): this { const realFn = getGameMode; vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { const mode = realFn(gameMode); - mode.hasTrainers = !disable; + mode.hasTrainers = false; return mode; }); - this.log(`Standard trainer waves are ${disable ? "disabled" : "enabled"}!`); + this.log("Standard trainer waves are disabled!"); + return this; + } + + /** + * Override each wave to not have critical hits + * @returns this + */ + disableCrits() { + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + this.log("Critical hits are disabled!"); return this; } From 6d14915f5f35159748d347ee07d553f20c886b0e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:18:47 -0700 Subject: [PATCH 030/321] apply game.override.disableCrits() --- src/test/abilities/dry_skin.test.ts | 13 ++++++------ src/test/abilities/hustle.test.ts | 19 +++++++++--------- src/test/abilities/parental_bond.test.ts | 2 +- src/test/abilities/sap_sipper.test.ts | 15 +++++++------- src/test/abilities/volt_absorb.test.ts | 13 ++++++------ src/test/items/leek.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/moves/aurora_veil.test.ts | 25 ++++++++++++------------ src/test/moves/double_team.test.ts | 17 ++++++++-------- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/dynamax_cannon.test.ts | 15 +++++++------- src/test/moves/fissure.test.ts | 2 +- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/light_screen.test.ts | 23 +++++++++++----------- src/test/moves/magnet_rise.test.ts | 13 ++++++------ src/test/moves/multi_target.test.ts | 13 ++++++------ src/test/moves/reflect.test.ts | 23 +++++++++++----------- src/test/moves/rollout.test.ts | 3 +-- src/test/moves/tackle.test.ts | 17 ++++++++-------- 19 files changed, 104 insertions(+), 117 deletions(-) diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 135acbf88f7..5434974c583 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,12 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; import { TurnEndPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Dry Skin", () => { @@ -26,7 +25,7 @@ describe("Abilities - Dry Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.enemyAbility(Abilities.DRY_SKIN); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.CHARMANDER); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index 5a9bfe88be6..6d78846071d 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; +import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { Stat } from "#app/enums/stat.js"; -import { allMoves } from "#app/data/move.js"; +import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Hustle", () => { @@ -30,7 +29,7 @@ describe("Abilities - Hustle", () => { game.override.ability(Abilities.HUSTLE); game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); game.override.startingLevel(5); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.enemyLevel(5); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemySpecies(Species.SHUCKLE); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index d74200edb11..843d8a8c3e8 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Parental Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.ability(Abilities.PARENTAL_BOND); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 57848de61a7..2ed1df05652 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -1,17 +1,16 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { TerrainType } from "#app/data/terrain.js"; import { MoveEndPhase, TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { TerrainType } from "#app/data/terrain.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { @@ -31,7 +30,7 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); }); it("raise attack 1 level and block effects when activated against a grass attack", async() => { diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index b1bf638fc77..419c3a612d5 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -1,16 +1,15 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; // See also: TypeImmunityAbAttr describe("Abilities - Volt Absorb", () => { @@ -30,7 +29,7 @@ describe("Abilities - Volt Absorb", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); }); it("does not activate when CHARGE is used", async () => { diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index 5dfd75d6cb5..bee60f3303b 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -29,7 +29,7 @@ describe("Items - Leek", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.battleType("single"); }); diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index d0e556fab79..b1c34b8d042 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -29,7 +29,7 @@ describe("Items - Scope Lens", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.battleType("single"); }, 20000); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index fe256bc1777..80da8087576 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { WeatherType } from "#app/data/weather.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { WeatherType } from "#app/data/weather.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Aurora Veil", () => { @@ -41,7 +40,7 @@ describe("Moves - Aurora Veil", () => { game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.weather(WeatherType.HAIL); }); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index 2c42e1651ba..55820ee957b 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Abilities } from "#app/enums/abilities.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Abilities } from "#app/enums/abilities.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Double Team", () => { let phaserGame: Phaser.Game; @@ -29,7 +28,7 @@ describe("Moves - Double Team", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.moveset([Moves.DOUBLE_TEAM]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index e0873a215f8..a9637248e68 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -36,7 +36,7 @@ describe("Moves - Dragon Rage", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.starterSpecies(Species.SNORLAX); game.override.moveset([Moves.DRAGON_RAGE]); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index a0747f21ffe..4c010484c78 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { MoveEffectPhase, DamagePhase, TurnStartPhase } from "#app/phases"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; +import { DamagePhase, MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { BattlerIndex } from "#app/battle"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Dynamax Cannon", () => { let phaserGame: Phaser.Game; @@ -34,7 +33,7 @@ describe("Moves - Dynamax Cannon", () => { // Note that, for Waves 1-10, the level cap is 10 game.override.startingWave(1); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index b68f31a8823..73713f93f14 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -31,7 +31,7 @@ describe("Moves - Fissure", () => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.starterSpecies(Species.SNORLAX); game.override.moveset([Moves.FISSURE]); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 42265568cc6..937573ded15 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -27,7 +27,7 @@ describe("Moves - Glaive Rush", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 18bae6993b8..52c1b85fa7a 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -1,19 +1,18 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Light Screen", () => { @@ -40,7 +39,7 @@ describe("Moves - Light Screen", () => { game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); }); it("reduces damage of special attacks by half in a single battle", async() => { diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 9986921e0d5..e5dfb94468e 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -1,10 +1,9 @@ -import {beforeAll, afterEach, beforeEach, describe, vi, it, expect} from "vitest"; -import Phaser from "phaser"; +import { CommandPhase, TurnEndPhase } from "#app/phases.js"; import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import {Moves} from "#enums/moves"; -import {Species} from "#enums/species"; -import {CommandPhase, TurnEndPhase} from "#app/phases.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Magnet Rise", () => { let phaserGame: Phaser.Game; @@ -27,7 +26,7 @@ describe("Moves - Magnet Rise", () => { 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]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.enemyLevel(1); game.override.moveset([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index a67ee11eb31..ca303bff84e 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Moves } from "#enums/moves"; import { getMoveTargets } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { Species } from "#app/enums/species.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; import { TurnEndPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -169,7 +168,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { game.override.moveset([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); game.override.ability(Abilities.BALL_FETCH); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.startingLevel(50); game.override.enemyLevel(40); game.override.enemySpecies(Species.EEVEE); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 7365ab01cd8..6fcd2268d12 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -1,19 +1,18 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Pokemon from "#app/field/pokemon.js"; import { TurnEndPhase, } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import Pokemon from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; -import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Reflect", () => { @@ -40,7 +39,7 @@ describe("Moves - Reflect", () => { game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); }); it("reduces damage of physical attacks by half in a single battle", async() => { diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 3e79005de61..73457c9dcce 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -1,5 +1,4 @@ import { allMoves } from "#app/data/move.js"; -import Overrides from "#app/overrides"; import { CommandPhase } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; @@ -26,7 +25,7 @@ describe("Moves - Rollout", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); game.override.battleType("single"); game.override.starterSpecies(Species.RATTATA); game.override.ability(Abilities.NONE); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index e58b5d48c8f..94eee4f20fa 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -1,17 +1,16 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, EnemyCommandPhase, TurnEndPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {Stat} from "#app/data/pokemon-stat"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Tackle", () => { @@ -37,7 +36,7 @@ describe("Moves - Tackle", () => { game.override.startingWave(97); game.override.moveset([moveToUse]); game.override.enemyMoveset([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.disableCrits(); }); it("TACKLE against ghost", async() => { From e0e37314ce4ebfb0336f2a5857547490f4c995b3 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:27:02 -0700 Subject: [PATCH 031/321] add OverridesHelper.enemyPassiveAbility --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index caaef1a2c0e..8f4e0f54834 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -185,6 +185,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) **passive** {@linkcode Abilities | ability} + * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set + * @returns this + */ + enemyPassiveAbility(passiveAbility: Abilities): this { + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); + this.log(`Enemy Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); + return this; + } + /** * Override the enemy (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set From dfdba05439a4db2cec11d8f11214873495815506 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:29:31 -0700 Subject: [PATCH 032/321] apply game.override.enemyPassiveAbility --- src/test/abilities/intimidate.test.ts | 8 ++++++-- src/test/moves/ceaseless_edge.test.ts | 2 +- src/test/moves/dragon_rage.test.ts | 2 +- src/test/moves/fissure.test.ts | 2 +- src/test/moves/spikes.test.ts | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index c42af129227..5537eee37a8 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -2,13 +2,17 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; import Overrides from "#app/overrides"; -import { CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, SelectStarterPhase, TurnInitPhase } from "#app/phases"; import { Mode } from "#app/ui/ui"; import { BattleStat } from "#app/data/battle-stat"; import { generateStarter, getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Status, StatusEffect } from "#app/data/status-effect"; import { GameModes, getGameMode } from "#app/game-mode"; +import { + CommandPhase, DamagePhase, EncounterPhase, + EnemyCommandPhase, SelectStarterPhase, + TurnInitPhase, +} from "#app/phases"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -32,7 +36,7 @@ describe("Abilities - Intimidate", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.INTIMIDATE); - vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyPassiveAbility(Abilities.HYDRATION); game.override.ability(Abilities.INTIMIDATE); game.override.startingWave(3); game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 54a0a0da099..7164a6f4720 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -35,7 +35,7 @@ describe("Moves - Ceaseless Edge", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.RUN_AWAY); - vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); + game.override.enemyPassiveAbility(Abilities.RUN_AWAY); game.override.startingLevel(100); game.override.enemyLevel(100); game.override.moveset([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index a9637248e68..0ad5776009d 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -47,7 +47,7 @@ describe("Moves - Dragon Rage", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset(SPLASH_ONLY); game.override.enemyAbility(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); await game.startBattle(); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 73713f93f14..9f6bfa81cf7 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -40,7 +40,7 @@ describe("Moves - Fissure", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyMoveset(SPLASH_ONLY); - vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); await game.startBattle(); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index b2f711d406a..b227132a1d5 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -30,7 +30,7 @@ describe("Moves - Spikes", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.HYDRATION); - vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.enemyPassiveAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); game.override.startingWave(3); From b72a1347b28ef6520b7372959dbdc576afc2ba26 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:30:28 -0700 Subject: [PATCH 033/321] add OverridesHelper.passiveAbility --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 8f4e0f54834..d6bb0169540 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -88,6 +88,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) **passive** {@linkcode Abilities | ability} + * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set + * @returns this + */ + passiveAbility(passiveAbility: Abilities): this { + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); + this.log(`Player Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); + return this; + } + /** * Override the player (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set From a7b26355b0b8e27091888c8948ed10b941015e8b Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:36:39 -0700 Subject: [PATCH 034/321] apply game.override.passiveAbility --- src/test/abilities/libero.test.ts | 23 +++++++++++------------ src/test/abilities/protean.test.ts | 23 +++++++++++------------ src/test/abilities/unseen_fist.test.ts | 13 ++++++------- src/test/moves/dragon_rage.test.ts | 23 +++++++++++------------ src/test/moves/fissure.test.ts | 19 +++++++++---------- src/test/moves/glaive_rush.test.ts | 2 +- src/test/moves/spikes.test.ts | 9 ++++----- 7 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index cc69334b805..58e67a6ebe6 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -1,18 +1,17 @@ +import { allMoves } from "#app/data/move.js"; +import { Type } from "#app/data/type.js"; +import { Weather, WeatherType } from "#app/data/weather.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { allMoves } from "#app/data/move.js"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Weather, WeatherType } from "#app/data/weather.js"; -import { Type } from "#app/data/type.js"; -import { Biome } from "#enums/biome"; -import { PlayerPokemon } from "#app/field/pokemon.js"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -125,7 +124,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the type has changed by another ability", async () => { game.override.moveset([Moves.TACKLE]); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); + game.override.passiveAbility(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 65858ec947d..d02c87662cf 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -1,18 +1,17 @@ +import { allMoves } from "#app/data/move.js"; +import { Type } from "#app/data/type.js"; +import { Weather, WeatherType } from "#app/data/weather.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import { allMoves } from "#app/data/move.js"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Weather, WeatherType } from "#app/data/weather.js"; -import { Type } from "#app/data/type.js"; -import { Biome } from "#enums/biome"; -import { PlayerPokemon } from "#app/field/pokemon.js"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -125,7 +124,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the type has changed by another ability", async () => { game.override.moveset([Moves.TACKLE]); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.REFRIGERATE); + game.override.passiveAbility(Abilities.REFRIGERATE); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index e1e16584bd9..2156c5eb588 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -1,12 +1,11 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { TurnEndPhase } from "#app/phases.js"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "../utils/gameManager"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { TurnEndPhase } from "#app/phases.js"; const TIMEOUT = 20 * 1000; @@ -49,7 +48,7 @@ describe("Abilities - Unseen Fist", () => { test( "ability does not apply if the source has Long Reach", () => { - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LONG_REACH); + game.override.passiveAbility(Abilities.LONG_REACH); testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); }, TIMEOUT ); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 0ad5776009d..b38a6f16513 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -1,17 +1,16 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { TurnEndPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { Abilities } from "#enums/abilities"; -import { Species } from "#app/enums/species.js"; -import { Type } from "#app/data/type"; import { BattleStat } from "#app/data/battle-stat"; -import { BattlerTagType } from "#enums/battler-tag-type"; +import { Type } from "#app/data/type"; +import { Species } from "#app/enums/species.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Dragon Rage", () => { @@ -41,7 +40,7 @@ describe("Moves - Dragon Rage", () => { game.override.starterSpecies(Species.SNORLAX); game.override.moveset([Moves.DRAGON_RAGE]); game.override.ability(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 9f6bfa81cf7..940c32e975a 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { DamagePhase, TurnEndPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat"; import { Species } from "#app/enums/species.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { BattleStat } from "#app/data/battle-stat"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Fissure", () => { @@ -35,7 +34,7 @@ describe("Moves - Fissure", () => { game.override.starterSpecies(Species.SNORLAX); game.override.moveset([Moves.FISSURE]); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 937573ded15..c6ead0ff372 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -33,7 +33,7 @@ describe("Moves - Glaive Rush", () => { game.override.enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)); game.override.starterSpecies(Species.KLINK); game.override.ability(Abilities.UNNERVE); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); + game.override.passiveAbility(Abilities.FUR_COAT); game.override.moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index b227132a1d5..a19c28b2c1e 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -1,13 +1,12 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; import { CommandPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Spikes", () => { @@ -32,7 +31,7 @@ describe("Moves - Spikes", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.enemyPassiveAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + game.override.passiveAbility(Abilities.HYDRATION); game.override.startingWave(3); game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); game.override.moveset([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); From 05a3142c135d27de3a40a243fb984926fe651666 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:38:56 -0700 Subject: [PATCH 035/321] add OverridesHelper.startingHeldItems --- src/test/utils/overridesHelper.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index d6bb0169540..00de71240b4 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -5,6 +5,7 @@ import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; +import { ModifierOverride } from "#app/modifier/modifier-type.js"; import Overrides from "#app/overrides"; import GameManager from "#test/utils/gameManager"; import { vi } from "vitest"; @@ -52,6 +53,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) starting held items + * @param items the items to hold + * @returns this + */ + startingHeldItems(items: ModifierOverride[]) { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); + this.log("Player Pokemon starting held items set to:", items); + return this; + } + /** * Override the player (pokemon) {@linkcode Species | species} * @param species the (pokemon) {@linkcode Species | species} to set From 4338f7b927591c9bbc4f5a1d33aeea6b74df2a29 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:43:48 -0700 Subject: [PATCH 036/321] apply game.override.startingHeldItems --- src/test/abilities/parental_bond.test.ts | 8 ++++---- src/test/abilities/sheer_force.test.ts | 25 ++++++++++++------------ src/test/items/eviolite.test.ts | 11 +++++------ src/test/items/exp_booster.test.ts | 9 ++++----- src/test/items/grip_claw.test.ts | 2 +- src/test/items/leek.test.ts | 17 ++++++++-------- src/test/items/leftovers.test.ts | 9 ++++----- src/test/items/light_ball.test.ts | 13 ++++++------ src/test/items/metal_powder.test.ts | 13 ++++++------ src/test/items/quick_powder.test.ts | 13 ++++++------ src/test/items/scope_lens.test.ts | 17 ++++++++-------- src/test/items/thick_club.test.ts | 13 ++++++------ src/test/items/toxic_orb.test.ts | 19 +++++++++--------- src/test/moves/ceaseless_edge.test.ts | 21 ++++++++++---------- src/test/moves/glaive_rush.test.ts | 13 ++++++------ src/test/ui/transfer-item.test.ts | 7 +++---- 16 files changed, 98 insertions(+), 112 deletions(-) diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 843d8a8c3e8..87f15ce480b 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -339,7 +339,7 @@ describe("Abilities - Parental Bond", () => { "Moves boosted by this ability and Multi-Lens should strike 4 times", async () => { game.override.moveset([Moves.TACKLE]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -361,7 +361,7 @@ describe("Abilities - Parental Bond", () => { "Super Fang boosted by this ability and Multi-Lens should strike twice", async () => { game.override.moveset([Moves.SUPER_FANG]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -392,7 +392,7 @@ describe("Abilities - Parental Bond", () => { "Seismic Toss boosted by this ability and Multi-Lens should strike twice", async () => { game.override.moveset([Moves.SEISMIC_TOSS]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD]); @@ -615,7 +615,7 @@ describe("Abilities - Parental Bond", () => { async () => { game.override.battleType("double"); game.override.moveset([Moves.EARTHQUAKE, Moves.SPLASH]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 850a2d97c9f..1e7657611a1 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,20 +1,19 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import {Abilities} from "#enums/abilities"; -import {applyAbAttrs ,applyPreAttackAbAttrs,applyPostDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr} from "#app/data/ability"; -import {Species} from "#enums/species"; +import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability"; +import { Stat } from "#app/data/pokemon-stat"; import { CommandPhase, MoveEffectPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {Stat} from "#app/data/pokemon-stat"; -import {Moves} from "#enums/moves"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Sheer Force", () => { @@ -161,7 +160,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force Disabling Specific Abilities", async() => { const moveToUse = Moves.CRUSH_CLAW; game.override.enemyAbility(Abilities.COLOR_CHANGE); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); + game.override.startingHeldItems([{name: "KINGS_ROCK", count: 1}]); game.override.ability(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 2a0ee64a172..5b18cc3a249 100644 --- a/src/test/items/eviolite.test.ts +++ b/src/test/items/eviolite.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; import { Stat } from "#app/data/pokemon-stat"; import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Eviolite", () => { let phaserGame: Phaser.Game; @@ -30,7 +29,7 @@ describe("Items - Eviolite", () => { }); it("EVIOLITE activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + game.override.startingHeldItems([{ name: "EVIOLITE" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PICHU diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts index 8e61d8decda..e80b12d7fc9 100644 --- a/src/test/items/exp_booster.test.ts +++ b/src/test/items/exp_booster.test.ts @@ -1,10 +1,9 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; import { Abilities } from "#app/enums/abilities.js"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier.js"; +import GameManager from "#app/test/utils/gameManager"; import * as Utils from "#app/utils"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("EXP Modifier Items", () => { let phaserGame: Phaser.Game; @@ -29,7 +28,7 @@ describe("EXP Modifier Items", () => { }); it("EXP booster items stack additively", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LUCKY_EGG"}, {name: "GOLDEN_EGG"}]); + game.override.startingHeldItems([{name: "LUCKY_EGG"}, {name: "GOLDEN_EGG"}]); await game.startBattle(); const partyMember = game.scene.getPlayerPokemon(); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index fdf18454812..b2c89065b91 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -32,7 +32,7 @@ describe("Items - Grip Claw", () => { game.override.battleType("double"); game.override.moveset([ Moves.POPULATION_BOMB, Moves.SPLASH ]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); + game.override.startingHeldItems([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); game.override.enemySpecies(Species.SNORLAX); game.override.ability(Abilities.KLUTZ); game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index bee60f3303b..73444a54c30 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; import { CritBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; -import { BattlerIndex } from "#app/battle"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Leek", () => { let phaserGame: Phaser.Game; @@ -35,7 +34,7 @@ describe("Items - Leek", () => { }); it("LEEK activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "LEEK" }]); + game.override.startingHeldItems([{ name: "LEEK" }]); game.override.moveset([ Moves.POUND ]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index ad7cb6b07e6..8c9195b07af 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -1,12 +1,11 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Items - Leftovers", () => { @@ -32,7 +31,7 @@ describe("Items - Leftovers", () => { game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.UNNERVE); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LEFTOVERS", count: 1}]); + game.override.startingHeldItems([{name: "LEFTOVERS", count: 1}]); }); it("leftovers works", async() => { diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index ed6ed8a4934..eb0c6cc044f 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Light Ball", () => { let phaserGame: Phaser.Game; @@ -30,7 +29,7 @@ describe("Items - Light Ball", () => { }); it("LIGHT_BALL activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PIKACHU diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index f106b344f44..937fd8feb62 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Metal Powder", () => { let phaserGame: Phaser.Game; @@ -30,7 +29,7 @@ describe("Items - Metal Powder", () => { }); it("METAL_POWDER activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index 0c71ec39ee4..e662b398cd4 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Quick Powder", () => { let phaserGame: Phaser.Game; @@ -30,7 +29,7 @@ describe("Items - Quick Powder", () => { }); it("QUICK_POWDER activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index b1c34b8d042..c9fb3ba52d3 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -1,14 +1,13 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; import { CritBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; -import { BattlerIndex } from "#app/battle"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Scope Lens", () => { let phaserGame: Phaser.Game; @@ -35,7 +34,7 @@ describe("Items - Scope Lens", () => { }, 20000); it("SCOPE_LENS activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SCOPE_LENS" }]); + game.override.startingHeldItems([{ name: "SCOPE_LENS" }]); game.override.moveset([ Moves.POUND ]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 9cb608b7e89..13714c441c0 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; -import * as Utils from "#app/utils"; import i18next from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Thick Club", () => { let phaserGame: Phaser.Game; @@ -30,7 +29,7 @@ describe("Items - Thick Club", () => { }); it("THICK_CLUB activates in battle correctly", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.CUBONE diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index bdef05fec2f..3ba32055fcd 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -1,21 +1,20 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { StatusEffect } from "#app/data/status-effect"; import { CommandPhase, EnemyCommandPhase, MessagePhase, TurnEndPhase, } from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {StatusEffect} from "#app/data/status-effect"; +import i18next, { initI18n } from "#app/plugins/i18n"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import i18next, { initI18n } from "#app/plugins/i18n"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Items - Toxic orb", () => { @@ -43,7 +42,7 @@ describe("Items - Toxic orb", () => { game.override.startingLevel(2000); game.override.moveset([moveToUse]); game.override.enemyMoveset([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ + game.override.startingHeldItems([{ name: "TOXIC_ORB", }]); }); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 7164a6f4720..ab3da3d51b8 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -1,18 +1,17 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { ArenaTagType } from "#app/enums/arena-tag-type"; -import { allMoves } from "#app/data/move"; -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { Abilities } from "#app/enums/abilities"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; const TIMEOUT = 20 * 1000; @@ -75,7 +74,7 @@ describe("Moves - Ceaseless Edge", () => { test( "move should hit twice with multi lens and apply two layers of spikes", async () => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); + game.override.startingHeldItems([{name: "MULTI_LENS"}]); await game.startBattle([ Species.ILLUMISE ]); const leadPokemon = game.scene.getPlayerPokemon(); @@ -104,7 +103,7 @@ describe("Moves - Ceaseless Edge", () => { test( "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", async () => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); + game.override.startingHeldItems([{name: "MULTI_LENS"}]); game.override.startingWave(5); await game.startBattle([ Species.ILLUMISE ]); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index c6ead0ff372..9548694183c 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -1,13 +1,12 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; import { DamagePhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Abilities } from "#app/enums/abilities.js"; -import { allMoves } from "#app/data/move.js"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Glaive Rush", () => { @@ -66,7 +65,7 @@ describe("Moves - Glaive Rush", () => { }, 20000); it("interacts properly with multi-lens", async() => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 2}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 2}]); game.override.enemyMoveset(Array(4).fill(Moves.AVALANCHE)); await game.startBattle(); const player = game.scene.getPlayerPokemon(); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 3a787fa462d..c00e40b8ebd 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -1,8 +1,7 @@ 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 { Button } from "#app/enums/buttons"; -import Overrides from "#app/overrides"; import { BattleEndPhase, SelectModifierPhase @@ -13,7 +12,7 @@ import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; import Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { getMovePosition } from "../utils/gameManagerUtils"; @@ -36,7 +35,7 @@ describe("UI - Transfer Items", () => { game.override.battleType("single"); game.override.startingLevel(100); game.override.startingWave(1); - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ + game.override.startingHeldItems([ { name: "BERRY", count: 1, type: BerryType.SITRUS }, { name: "BERRY", count: 2, type: BerryType.APICOT }, { name: "BERRY", count: 2, type: BerryType.LUM }, From fa8e9c38bc02856f17a4acef8f701a23e7f17716 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:45:58 -0700 Subject: [PATCH 037/321] add OverridesHelper.enemyStatusEffect() --- src/test/utils/overridesHelper.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 00de71240b4..689f6e86be6 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,3 +1,4 @@ +import { StatusEffect } from "#app/data/status-effect.js"; import { Weather, WeatherType } from "#app/data/weather"; import { Abilities } from "#app/enums/abilities.js"; import { Biome } from "#app/enums/biome"; @@ -242,6 +243,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) {@linkcode StatusEffect | status-effect} + * @param statusEffect the {@linkcode StatusEffect | status-effect} to set + * @returns + */ + enemyStatusEffect(statusEffect: StatusEffect): this { + vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); + this.log(`Enemy Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From a22db0df99f75a00e84eef67f22ab18c6cac11ed Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:47:50 -0700 Subject: [PATCH 038/321] apply game.override.enemyStatusEffect --- src/test/abilities/parental_bond.test.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 87f15ce480b..bc7be2fae96 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,16 +1,15 @@ +import { BattleStat } from "#app/data/battle-stat.js"; +import { StatusEffect } from "#app/data/status-effect.js"; +import { Type } from "#app/data/type.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; import { getMovePosition } from "../utils/gameManagerUtils"; -import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Type } from "#app/data/type.js"; -import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { StatusEffect } from "#app/data/status-effect.js"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -539,8 +538,7 @@ describe("Abilities - Parental Bond", () => { test( "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]); - vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + game.override.moveset([Moves.WAKE_UP_SLAP]).enemyStatusEffect(StatusEffect.SLEEP); await game.startBattle([Species.CHARIZARD]); From 8e09714904dc9d133a6b0348612742721bb6d160 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:48:49 -0700 Subject: [PATCH 039/321] add OverridesHelper.enemyHeldItems --- src/test/utils/overridesHelper.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 689f6e86be6..2858076e3b6 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -254,6 +254,17 @@ export class OverridesHelper { return this; } + /** + * Override the enemy (pokemon) held items + * @param items the items to hold + * @returns this + */ + enemyHeldItems(items: ModifierOverride[]) { + vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); + this.log("Enemy Pokemon held items set to:", items); + return this; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From 133af2fc325e9e64f3c41bb0cb0278f61684f63e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:50:33 -0700 Subject: [PATCH 040/321] apply game.override.enemyHeldItems --- src/test/items/grip_claw.test.ts | 47 +++++++++++++++++--------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index b2c89065b91..495bc5de223 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -1,15 +1,14 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phase from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; -import { BerryType } from "#app/enums/berry-type.js"; -import { Abilities } from "#app/enums/abilities.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; import { BattlerIndex } from "#app/battle.js"; import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BerryType } from "#app/enums/berry-type.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; +import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; +import GameManager from "#app/test/utils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; // 20 seconds @@ -30,18 +29,22 @@ describe("Items - Grip Claw", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("double"); - game.override.moveset([ Moves.POPULATION_BOMB, Moves.SPLASH ]); - game.override.startingHeldItems([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); - game.override.enemySpecies(Species.SNORLAX); - game.override.ability(Abilities.KLUTZ); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ - {name: "BERRY", type: BerryType.SITRUS, count: 2}, - {name: "BERRY", type: BerryType.LUM, count: 2} - ]); - game.override.startingLevel(100); - game.override.enemyLevel(100); + game.override + .battleType("double") + .moveset([Moves.POPULATION_BOMB, Moves.SPLASH]) + .startingHeldItems([ + { name: "GRIP_CLAW", count: 5 }, + { name: "MULTI_LENS", count: 3 }, + ]) + .enemySpecies(Species.SNORLAX) + .ability(Abilities.KLUTZ) + .enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]) + .enemyHeldItems([ + { name: "BERRY", type: BerryType.SITRUS, count: 2 }, + { name: "BERRY", type: BerryType.LUM, count: 2 }, + ]) + .startingLevel(100) + .enemyLevel(100); vi.spyOn(allMoves[Moves.POPULATION_BOMB], "accuracy", "get").mockReturnValue(100); }); From 0acefb1da82f842f56bf557fd878c24219466089 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:51:23 -0700 Subject: [PATCH 041/321] apply game.override.startingBiome --- src/test/moves/flower_shield.test.ts | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index 25394992b6d..b903196e15e 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -1,18 +1,17 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; -import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +import { Type } from "#app/data/type.js"; +import { Biome } from "#app/enums/biome.js"; import { TurnEndPhase, } from "#app/phases"; -import { Moves } from "#enums/moves"; +import GameManager from "#app/test/utils/gameManager"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { Biome } from "#app/enums/biome.js"; -import { Type } from "#app/data/type.js"; -import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Flower Shield", () => { @@ -56,9 +55,7 @@ describe("Moves - Flower Shield", () => { }); it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { - game.override.enemySpecies(Species.MAGIKARP); - vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); - game.override.battleType("double"); + game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS); await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); From 2f95c33bf59e0a0e6e0e2238118cb2cbe76a09b2 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 25 Jul 2024 16:54:59 -0700 Subject: [PATCH 042/321] fix flower_shield.test.ts Somehow the battleType override was gone --- src/test/moves/flower_shield.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index b903196e15e..82476ab5b90 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -55,7 +55,7 @@ describe("Moves - Flower Shield", () => { }); it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { - game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS); + game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS).battleType("double"); await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); From 1b5d7a8e54f9d86f1d372373ea4fce8102cf6be5 Mon Sep 17 00:00:00 2001 From: cam Date: Mon, 29 Jul 2024 16:43:24 -0400 Subject: [PATCH 043/321] [Fix][Sprite] 4083 Galarian Farfetch'd exp (#3216) Fixed cropped feet on exp for default & shiny. Rearranged spritesheet to fit new size. Both sritesheets have identical sprite framing. Both json are identical. --- public/images/pokemon/exp/4083.json | 2207 ++++++--------------- public/images/pokemon/exp/4083.png | Bin 4946 -> 4528 bytes public/images/pokemon/exp/shiny/4083.json | 2207 ++++++--------------- public/images/pokemon/exp/shiny/4083.png | Bin 4951 -> 4534 bytes 4 files changed, 1228 insertions(+), 3186 deletions(-) diff --git a/public/images/pokemon/exp/4083.json b/public/images/pokemon/exp/4083.json index 8a5bae6080a..26ced14739b 100644 --- a/public/images/pokemon/exp/4083.json +++ b/public/images/pokemon/exp/4083.json @@ -1,1595 +1,616 @@ { - "textures": [ - { - "image": "4083.png", - "format": "RGBA8888", - "size": { - "w": 276, - "h": 276 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 81, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 88, - "y": 46, - "w": 88, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 88, - "y": 92, - "w": 86, - "h": 46 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 86, - "y": 138, - "w": 86, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1de2d6bd2e4f26446b2c6f55de0f7b9b:e56909341ef6baa38f2c9dc5a42c7808:c8e39c2aa3816f24d9e5ee92c7ddf6b0$" - } + "textures": [ + { + "image": "4083.png", + "format": "RGBA8888", + "size": { "w": 264, "h": 240 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/4083.png b/public/images/pokemon/exp/4083.png index 0ce1b804a79109f2795499bce896457bf88761c5..d0fd23c248d5c358351f7f6406db90edd57bf9a7 100644 GIT binary patch literal 4528 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 literal 4946 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 C^P7zT diff --git a/public/images/pokemon/exp/shiny/4083.json b/public/images/pokemon/exp/shiny/4083.json index 3b08d82cc72..26ced14739b 100644 --- a/public/images/pokemon/exp/shiny/4083.json +++ b/public/images/pokemon/exp/shiny/4083.json @@ -1,1595 +1,616 @@ { - "textures": [ - { - "image": "4083.png", - "format": "RGBA8888", - "size": { - "w": 276, - "h": 276 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 0, - "y": 48, - "w": 88, - "h": 46 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 81, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 88, - "y": 46, - "w": 88, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 88, - "h": 46 - }, - "frame": { - "x": 169, - "y": 0, - "w": 88, - "h": 46 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 88, - "y": 92, - "w": 86, - "h": 46 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 86, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 86, - "y": 138, - "w": 86, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 86, - "h": 46 - }, - "frame": { - "x": 0, - "y": 140, - "w": 86, - "h": 46 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 46 - }, - "frame": { - "x": 172, - "y": 138, - "w": 85, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 84, - "h": 45 - }, - "frame": { - "x": 174, - "y": 92, - "w": 84, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 176, - "y": 46, - "w": 83, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 86, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 0, - "y": 186, - "w": 83, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 169, - "y": 184, - "w": 83, - "h": 46 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 46 - }, - "frame": { - "x": 83, - "y": 230, - "w": 83, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 88, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 46 - }, - "frame": { - "x": 166, - "y": 230, - "w": 81, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4ad56d9607be6aa947d6e44195a90329:4e05bca229cb6af4241ccb9cf6b54cc3:c8e39c2aa3816f24d9e5ee92c7ddf6b0$" - } + "textures": [ + { + "image": "4083.png", + "format": "RGBA8888", + "size": { "w": 264, "h": 240 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 144, "w": 88, "h": 48 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 192, "w": 88, "h": 48 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 96, "w": 88, "h": 48 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 176, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 88, "y": 48, "w": 88, "h": 48 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 88, "h": 48 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 88, "h": 48 }, + "frame": { "x": 0, "y": 0, "w": 88, "h": 48 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } diff --git a/public/images/pokemon/exp/shiny/4083.png b/public/images/pokemon/exp/shiny/4083.png index 4fd8c0e36a176370ad4431909947057fb3942cf0..40d6c6cc50f758837e19dbf4ae3acfee43983972 100644 GIT binary patch delta 4505 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 From bee2823e6ba7dbb3b2efa8e02734c10892ae20d8 Mon Sep 17 00:00:00 2001 From: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Date: Tue, 30 Jul 2024 04:44:18 +0800 Subject: [PATCH 044/321] [Localization] Zh_cn fix 7-29 (#3206) * Update battle.ts * Update menu-ui-handler.ts * Update menu.ts * Update modifier-type.ts * Update modifier.ts * Update pokemon-form.ts * Update starter-select-ui-handler.ts * Update achv.ts * Update challenges.ts * Update challenges.ts --- src/locales/zh_CN/achv.ts | 24 ++++++---- src/locales/zh_CN/battle.ts | 40 ++++++++-------- src/locales/zh_CN/challenges.ts | 6 +++ src/locales/zh_CN/menu-ui-handler.ts | 8 ++-- src/locales/zh_CN/menu.ts | 2 +- src/locales/zh_CN/modifier-type.ts | 16 +++---- src/locales/zh_CN/modifier.ts | 2 +- src/locales/zh_CN/pokemon-form.ts | 46 +++++++++---------- .../zh_CN/starter-select-ui-handler.ts | 2 +- 9 files changed, 78 insertions(+), 68 deletions(-) diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts index 486ff3cc02b..a32f244400d 100644 --- a/src/locales/zh_CN/achv.ts +++ b/src/locales/zh_CN/achv.ts @@ -172,43 +172,43 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_GEN_ONE": { name: "最初的劲敌", - description: "完成仅限第一世代的挑战.", + description: "完成仅限第一世代的挑战", }, "MONO_GEN_TWO": { name: "1.5世代", - description: "完成仅限第二世代的挑战.", + description: "完成仅限第二世代的挑战", }, "MONO_GEN_THREE": { name: "“水太多了”", - description: "完成仅限第三世代的挑战.", + description: "完成仅限第三世代的挑战", }, "MONO_GEN_FOUR": { name: "她真是最强冠军吗?", - description: "完成仅限第四世代的挑战.", + description: "完成仅限第四世代的挑战", }, "MONO_GEN_FIVE": { name: "完全原创", - description: "完成仅限第五世代的挑战.", + description: "完成仅限第五世代的挑战", }, "MONO_GEN_SIX": { name: "女大公", - description: "完成仅限第六世代的挑战.", + description: "完成仅限第六世代的挑战", }, "MONO_GEN_SEVEN": { name: "首届冠军", - description: "完成仅限第七世代的挑战.", + description: "完成仅限第七世代的挑战", }, "MONO_GEN_EIGHT": { name: "冠军时刻!", - description: "完成仅限第八世代的挑战.", + description: "完成仅限第八世代的挑战", }, "MONO_GEN_NINE": { name: "她又放水了", - description: "完成仅限第九世代的挑战.", + description: "完成仅限第九世代的挑战", }, "MonoType": { - description: "完成 {{type}} 单属性挑战.", + description: "完成 {{type}} 单属性挑战", }, "MONO_NORMAL": { name: "异乎寻常的寻常", @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "林克,醒醒!", }, + "FRESH_START": { + name: "初次尝试!", + description: "完成初次尝试挑战" + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index c3c9077b7f1..b07cb79e258 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -4,17 +4,17 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出现了。", "trainerAppeared": "{{trainerName}}\n想要和你对战!", "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", - "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", + "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", - "playerComeBack": "回来吧,{{pokemonName}}!", + "playerComeBack": "回来吧,{{pokemonName}}!", "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!", "playerGo": "去吧!{{pokemonName}}!", "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!", "switchQuestion": "要更换\n{{pokemonName}}吗?", "trainerDefeated": "你击败了\n{{trainerName}}!", "moneyWon": "你赢得了\n₽{{moneyAmount}}!", - "moneyPickedUp": "捡到了 ₽{{moneyAmount}}!", + "moneyPickedUp": "捡到了₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}}被抓住了!", "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", @@ -29,9 +29,9 @@ export const battle: SimpleTranslationEntries = { "attackMissed": "没有命中{{pokemonNameWithAffix}}!", "attackHitsCount": "击中{{count}}次!", "rewardGain": "你获得了\n{{modifierName}}!", - "expGain": "{{pokemonName}}获得了 {{exp}} 点经验值!", - "levelUp": "{{pokemonName}}升级到 Lv.{{level}}!", - "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", + "expGain": "{{pokemonName}}获得了{{exp}} 点经验值!", + "levelUp": "{{pokemonName}}升级到Lv.{{level}}!", + "learnMove": "{{pokemonName}}学会了{{moveName}}!", "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", @@ -61,27 +61,27 @@ export const battle: SimpleTranslationEntries = { "hpIsFull": "{{pokemonName}}的体力已满!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}!", "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP!", "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了体力!", "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", "wildPokemonWithAffix": "野生的{{pokemonName}}", - "foePokemonWithAffix": "对手 {{pokemonName}}", + "foePokemonWithAffix": "对手的{{pokemonName}}", "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!", "drainMessage": "{{pokemonName}}\n吸取了体力!", "regainHealth": "{{pokemonName}}\n回复了体力!", "fainted": "{{pokemonNameWithAffix}}\n倒下了!", - "statsAnd": "and", - "stats": "Stats", - "statRose_other": "{{pokemonNameWithAffix}}的 {{stats}}提高了!", - "statSharplyRose_other": "{{pokemonNameWithAffix}}的 {{stats}}大幅提高了!", - "statRoseDrastically_other": "{{pokemonNameWithAffix}}的 {{stats}}极大幅提高了!", - "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的 {{stats}}已经无法再提高了!", - "statFell_other": "{{pokemonNameWithAffix}}的 {{stats}}降低了!", - "statHarshlyFell_other": "{{pokemonNameWithAffix}}的 {{stats}}大幅降低了!", - "statSeverelyFell_other": "{{pokemonNameWithAffix}}的 {{stats}}极大幅降低了!", - "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的 {{stats}}已经无法再降低了!", - "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "statsAnd": "和", + "stats": "能力", + "statRose_other": "{{pokemonNameWithAffix}}的{{stats}}提高了!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}的{{stats}}大幅提高了!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}的{{stats}}极大幅提高了!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的{{stats}}已经无法再提高了!", + "statFell_other": "{{pokemonNameWithAffix}}的{{stats}}降低了!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}的{{stats}}大幅降低了!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}的{{stats}}极大幅降低了!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的{{stats}}已经无法再降低了!", + "transformedIntoType": "{{pokemonName}}变成了\n{{type}}属性!", "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", "retryBattle": "你要从对战开始时重试么?", "unlockedSomething": "{{unlockedThing}}\n已解锁。", @@ -147,5 +147,5 @@ export const battle: SimpleTranslationEntries = { "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!", - "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!" } as const; diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 4c1b523ef16..de14d2f6486 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "你只能使用{{type}}\n属性的宝可梦", "desc_default": "你只能使用所选\n属性的宝可梦" }, + "freshStart": { + "name": "初次尝试", + "desc": "你只能使用御三家,就像是你第一次玩宝可梦肉鸽一样。", + "value.0": "关闭", + "value.1": "开启", + }, } as const; diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 461f5bb9956..e5ca6d977df 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -18,10 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "选择要导出的存档位。", "importData": "导入数据", "exportData": "导出数据", - "linkDiscord": "Link Discord", - "unlinkDiscord": "Unlink Discord", - "linkGoogle": "Link Google", - "unlinkGoogle": "Unlink Google", + "linkDiscord": "关联Discord", + "unlinkDiscord": "解除关联Discord", + "linkGoogle": "关联Google", + "unlinkGoogle": "解除关联Google", "cancel": "取消", "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", "noEggs": "当前没有任何蛋\n正在孵化中!" diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 4ff4ffc3128..332457c949f 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -17,7 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "用户名", "password": "密码", "login": "登录", - "Or use": "Or use", + "Or use": "或使用", "register": "注册", "emptyUsername": "用户名不能为空", "invalidLoginUsername": "输入的用户名无效", diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index fcdaf9e8d9f..71f5b21ba81 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -153,7 +153,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "复活种子", description: "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" }, - "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "WHITE_HERB": { name: "白色香草", description: "当携带它的宝可梦能力降低时,\n仅能回到之前的状态1次。" }, "ETHER": { name: "PP单项小补剂" }, "MAX_ETHER": { name: "PP单项全补剂" }, @@ -184,7 +184,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, - "SCOPE_LENS": { name: "焦点镜", description: "能看见弱点的镜片。携带它的宝可梦的招式 会变得容易击中要害。" }, + "SCOPE_LENS": { name: "焦点镜", description: "能看见弱点的镜片。携带它的宝可梦的招式\n会变得容易击中要害。" }, "LEEK": { name: "大葱", description: "非常长且坚硬的茎。让大葱鸭携带后,\n招式会变得容易击中要害。" }, "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, @@ -220,8 +220,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "LEFTOVERS": { name: "吃剩的东西", description: "携带后,在每个回合结束时恢复\n最大HP的1/16。" }, "SHELL_BELL": { name: "贝壳之铃", description: "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" }, - "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, - "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, + "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。\n携带后,在战斗时会变成剧毒状态。" }, + "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。\n携带后,在战斗时会变成灼伤状态。" }, "BATON": { name: "接力棒", description: "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。" }, @@ -247,10 +247,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, }, SpeciesBoosterItem: { - "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, - "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, - "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, - "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } + "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,\n攻击和特攻就会提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。\n让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, + "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。\n非常细腻坚硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。\n非常细腻坚硬。" } }, TempBattleStatBoosterItem: { "x_attack": "力量强化", diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts index 458931ed9b5..57e01118ed2 100644 --- a/src/locales/zh_CN/modifier.ts +++ b/src/locales/zh_CN/modifier.ts @@ -5,7 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", - "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\复原了!", "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", diff --git a/src/locales/zh_CN/pokemon-form.ts b/src/locales/zh_CN/pokemon-form.ts index b8135cc78f1..9cba58838b6 100644 --- a/src/locales/zh_CN/pokemon-form.ts +++ b/src/locales/zh_CN/pokemon-form.ts @@ -5,7 +5,7 @@ export const pokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", - "primal": "原始回归{{pokemonName}}", + "primal": "原始{{pokemonName}}", "gigantamax": "超极巨{{pokemonName}}", "eternamax": "无极巨{{pokemonName}}", @@ -53,7 +53,7 @@ export const pokemonForm: SimpleTranslationEntries = { "castformSunny": "晴天", "castformRainy": "雨天", "castformSnowy": "雪天", - "deoxysNormal": "Normal", + "deoxysNormal": "普通", // 4G "burmyPlant": "草木蓑衣", "burmySandy": "砂土蓑衣", @@ -65,8 +65,8 @@ export const pokemonForm: SimpleTranslationEntries = { "rotomFrost": "结冰", "rotomFan": "旋转", "rotomMow": "切割", - "giratinaAltered": "Altered", - "shayminLand": "Land", + "giratinaAltered": "别种", + "shayminLand": "陆上", // 5G "basculinRedStriped": "红条纹", "basculinBlueStriped": "蓝条纹", @@ -75,11 +75,11 @@ export const pokemonForm: SimpleTranslationEntries = { "deerlingSummer": "夏天", "deerlingAutumn": "秋天", "deerlingWinter": "冬天", - "tornadusIncarnate": "Incarnate", - "thundurusIncarnate": "Incarnate", - "landorusIncarnate": "Incarnate", - "keldeoOrdinary": "Ordinary", - "meloettaAria": "Aria", + "tornadusIncarnate": "化身", + "thundurusIncarnate": "化身", + "landorusIncarnate": "化身", + "keldeoOrdinary": "通常", + "meloettaAria": "歌声", // 6G "froakieBattleBond": "牵绊变身", "scatterbugMeadow": "花园花纹", @@ -156,11 +156,11 @@ export const pokemonForm: SimpleTranslationEntries = { "eiscueNoIce": "解冻头", "indeedeeMale": "雄性", "indeedeeFemale": "雌性", - "morpekoFullBelly": "Full Belly", - "zacianHeroOfManyBattles": "Hero Of Many Battles", - "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "morpekoFullBelly": "满腹花纹", + "zacianHeroOfManyBattles": "百战勇者", + "zamazentaHeroOfManyBattles": "百战勇者", "zarudeDada": "老爹", - "enamorusIncarnate": "Incarnate", + "enamorusIncarnate": "化身", // 9G "squawkabillyGreenPlumage": "绿羽毛", "squawkabillyBluePlumage": "蓝羽毛", @@ -171,16 +171,16 @@ export const pokemonForm: SimpleTranslationEntries = { "tatsugiriStretchy": "平挺姿势", "gimmighoulChest": "宝箱形态", "gimmighoulRoaming": "徒步形态", - "koraidonApexBuild": "Apex Build", - "koraidonLimitedBuild":"Limited Build", - "koraidonSprintingBuild":"Sprinting Build", - "koraidonSwimmingBuild":"Swimming Build", - "koraidonGlidingBuild":"Gliding Build", - "miraidonUltimateMode":"Ultimate Mode", - "miraidonLowPowerMode":"Low Power Mode", - "miraidonDriveMode":"Drive Mode", - "miraidonAquaticMode":"Aquatic Mode", - "miraidonGlideMode":"Glide Mode", + "koraidonApexBuild": "顶尖形态", + "koraidonLimitedBuild":"限制形态", + "koraidonSprintingBuild":"冲刺形态", + "koraidonSwimmingBuild":"游泳形态", + "koraidonGlidingBuild":"滑翔形态", + "miraidonUltimateMode":"极限模式", + "miraidonLowPowerMode":"节能模式", + "miraidonDriveMode":"驾驶模式", + "miraidonAquaticMode":"水上模式", + "miraidonGlideMode":"滑翔模式", "poltchageistCounterfeit": "冒牌货", "poltchageistArtisan": "高档货", "paldeaTaurosCombat": "斗战种", diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index c23ceb66eb0..b93fc26cde3 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "使用这些宝可梦开始游戏吗?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "初始队伍不可用!", "gen1": "I", "gen2": "II", "gen3": "III", From 124ad5f970711539d7d9056985f1f030ed2bbb18 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:45:16 -0700 Subject: [PATCH 045/321] [Misc] Remove unneeded switch case in biome name (#3202) `Biome.ABYSS` has the same (English) name as its enum --- src/data/biomes.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/data/biomes.ts b/src/data/biomes.ts index 782826d8695..479e0994cb6 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -17,8 +17,6 @@ export function getBiomeName(biome: Biome | -1) { return i18next.t("biome:GRASS"); case Biome.RUINS: return i18next.t("biome:RUINS"); - case Biome.ABYSS: - return i18next.t("biome:ABYSS"); case Biome.END: return i18next.t("biome:END"); default: From 4b9c3e9b07b0794bf2bd381763f824d61448c659 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:46:04 -0700 Subject: [PATCH 046/321] [Test] Remove held item RNG (white herb) from intimidate tests (#3205) Also add a helper function to remove enemy held items --- src/test/abilities/intimidate.test.ts | 16 +++++++++++++--- src/test/utils/gameManagerUtils.ts | 16 ++++++++-------- src/test/utils/testUtils.ts | 9 +++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 2ff909def2e..b0642216630 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -12,6 +12,7 @@ import { GameModes, getGameMode } from "#app/game-mode"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { removeEnemyHeldItems } from "../utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -40,6 +41,7 @@ describe("Abilities - Intimidate", () => { it("single - wild with switch", async () => { await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -70,6 +72,7 @@ describe("Abilities - Intimidate", () => { it("single - boss should only trigger once then switch", async () => { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -99,6 +102,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once with switch", async () => { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -129,6 +133,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -155,6 +160,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -181,6 +187,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -207,6 +214,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AERIAL_ACE]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -233,6 +241,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -258,6 +267,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -297,6 +307,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); + removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -336,9 +347,7 @@ describe("Abilities - Intimidate", () => { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); await game.runToSummon([Species.MIGHTYENA]); - // Get rid of any modifiers that may alter power - game.scene.clearEnemyHeldItemModifiers(); - game.scene.clearEnemyModifiers(); + removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -365,6 +374,7 @@ describe("Abilities - Intimidate", () => { }); await game.phaseInterceptor.run(EncounterPhase); + removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index d83805e59e8..74a73bb7875 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/src/test/utils/gameManagerUtils.ts @@ -1,14 +1,14 @@ -// Function to convert Blob to string -import {getDailyRunStarters} from "#app/data/daily-run"; -import {Gender} from "#app/data/gender"; -import {Species} from "#enums/species"; -import {Starter} from "#app/ui/starter-select-ui-handler"; -import {GameModes, getGameMode} from "#app/game-mode"; -import {getPokemonSpecies, getPokemonSpeciesForm} from "#app/data/pokemon-species"; -import {PlayerPokemon} from "#app/field/pokemon"; +import { getDailyRunStarters } from "#app/data/daily-run"; +import { Gender } from "#app/data/gender"; +import { Species } from "#enums/species"; +import { Starter } from "#app/ui/starter-select-ui-handler"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { PlayerPokemon } from "#app/field/pokemon"; import { Moves } from "#app/enums/moves"; import BattleScene from "#app/battle-scene"; +/** Function to convert Blob to string */ export function blobToString(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index 0a9be16a4b5..4a807c7d892 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,3 +1,4 @@ +import BattleScene from "#app/battle-scene.js"; import { Moves } from "#app/enums/moves.js"; import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; @@ -26,3 +27,11 @@ export function arrayOfRange(start: integer, end: integer) { return Array.from({ length: end - start }, (_v, k) => k + start); } +/** + * Removes all held items from enemy pokemon + * @param scene `game.scene` + */ +export function removeEnemyHeldItems(scene: BattleScene) { + scene.clearEnemyHeldItemModifiers(); + scene.clearEnemyModifiers(); +} From a919e0c2b0f8b9f9054dfa743e0b92c16d761ded Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:46:25 -0700 Subject: [PATCH 047/321] [Test] Prevent berries from interfering in "multi target" tests (#3204) --- src/test/moves/multi_target.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 7548e9529d1..766c8c6c9cc 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -167,6 +167,7 @@ function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); From 4cf445b780d2533699e4e6b5a5d7181304efb69a Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:46:46 -0400 Subject: [PATCH 048/321] [Sprite] Mega Latias and Mega Latios back sprite fixes #3137 (#3194) * [Sprite] Mega Eon Duo back exps * [Sprite] Mega Eon Duo shiny back exps --- public/images/pokemon/exp/back/380-mega.png | Bin 8444 -> 4530 bytes public/images/pokemon/exp/back/381-mega.png | Bin 8444 -> 4530 bytes .../pokemon/exp/back/shiny/380-mega.png | Bin 8367 -> 4530 bytes .../pokemon/exp/back/shiny/381-mega.png | Bin 1581 -> 1916 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/exp/back/380-mega.png b/public/images/pokemon/exp/back/380-mega.png index d865e64c373ba843a854b0ef38a749e856ce49dc..b6941fc261159269643c0ede5516939f15687c88 100644 GIT binary patch delta 1901 zcmaKtdpy$%AIHaLW^)-c)=7J|>0ll)iEGeWh>Y2dvm;Dd8d1XN zu3U5bxyx}&O1j|bEV(3?r3*Qi|IKdI zE2AI~^xJ+4nUNq{D4aWc6Q@a4?->5fnFgEb;Zn`^hh^Q|n0Zhbu`0KwyV+aC>I#<38-u{MB)M6fke|lkz`(eauv^h#c9AtbZKA-Bxp=91hR@ zR4VLzFz~owj*!|xE`h}o?u&|rr)Y27+)yjmh~eCkQ=X)X6|YcT2`R4B5>X&cM)}c( z9HjktPu~Qe8goi(u@6O%O@@_J&Db;z{SN3RqsqEVM>x&x-wOZr#eOfk>^9K~M1WO- zU8Po^o7x~=#jqxgVY)Vn*cq830*Ng}dB^^V$d}}8Sk(FJ54GaF)9KGgF*$Rpr&Lw?BG~G#LDYVC-g?XGYyQXb z)*2HKC!8K2dWB5n)>|}|B3r+j7!g^kRA#U=Mg-SrOA2h1j#!>EzB>q3RA(&nzHGbY z#S{;~#LPogee?Ip>+6+OeXyyn8k`wn^k)j9tq>BzJCG8Y5~lv>{!r8~^=lWI zXX`G2PCu&(e&6ht-iKNa#Rno6AQ$Yj0ve%DF=_p^bu=1sO+`kqM6oAB<2_iLVW5zC zH8Vm3%5z<7+Rq4r|K#$rfxP@g|!9r})z&UHl zdoa`6(!~M%uWlVxfTP+{C25fS$hc+meZE%XX3F&4Sm z`?68#?yeHlqdQ&;S0=^@Y3YRWR(@3cLVVJT3?WjH7sJx7pRA!Q;|Jxlz{`{(xEtNp zP%*p0;9^D501taJg|oK8*b|*u)1&})IeYVs%gv87SV zyx(#6n)2*b458-OmA#uNJENB9;D*ajG`L{0_un)XYW`M^df8ZSp-h3=JE(rnTsnQQ z(RkC7`7B2D6(bqDC@*!AJ%OL_i?%99rn!>5)tVdsdMCGcs}+~z?$l2*pV~U1sgpOn z!&IFdFgM`Wrhg%m5}i40Yr3YLoZm;p+O~sRj$Hkvoa%jpnJ{1LAk44HjEo_cSNHjh z@rf90Z!kxCt+no=Bs`B-q$N2uEu%~up=HCyriOS>EV##7$EBf<*>O$;8}IYcCw}tO>+O{N1k0Hsms$=Lkh-Z3?di0o z;=hP?jxZ;5gN(9Tphv#sXTEQ!60r)g^yVM_HERZ|A4jjKd|HqACgc6~qBxq;BH6Q# zPD2$o;s%MQ6JqDNj;7G|bbPtN^3y<0C}8x#%9<-3im@#s551!}-&U;Z^tSgc2L1l{ RnDSAA_Pf(5w_Tas{{WVCW2688 delta 5846 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 Ar~m)} diff --git a/public/images/pokemon/exp/back/381-mega.png b/public/images/pokemon/exp/back/381-mega.png index d865e64c373ba843a854b0ef38a749e856ce49dc..b6941fc261159269643c0ede5516939f15687c88 100644 GIT binary patch delta 1901 zcmaKtdpy$%AIHaLW^)-c)=7J|>0ll)iEGeWh>Y2dvm;Dd8d1XN zu3U5bxyx}&O1j|bEV(3?r3*Qi|IKdI zE2AI~^xJ+4nUNq{D4aWc6Q@a4?->5fnFgEb;Zn`^hh^Q|n0Zhbu`0KwyV+aC>I#<38-u{MB)M6fke|lkz`(eauv^h#c9AtbZKA-Bxp=91hR@ zR4VLzFz~owj*!|xE`h}o?u&|rr)Y27+)yjmh~eCkQ=X)X6|YcT2`R4B5>X&cM)}c( z9HjktPu~Qe8goi(u@6O%O@@_J&Db;z{SN3RqsqEVM>x&x-wOZr#eOfk>^9K~M1WO- zU8Po^o7x~=#jqxgVY)Vn*cq830*Ng}dB^^V$d}}8Sk(FJ54GaF)9KGgF*$Rpr&Lw?BG~G#LDYVC-g?XGYyQXb z)*2HKC!8K2dWB5n)>|}|B3r+j7!g^kRA#U=Mg-SrOA2h1j#!>EzB>q3RA(&nzHGbY z#S{;~#LPogee?Ip>+6+OeXyyn8k`wn^k)j9tq>BzJCG8Y5~lv>{!r8~^=lWI zXX`G2PCu&(e&6ht-iKNa#Rno6AQ$Yj0ve%DF=_p^bu=1sO+`kqM6oAB<2_iLVW5zC zH8Vm3%5z<7+Rq4r|K#$rfxP@g|!9r})z&UHl zdoa`6(!~M%uWlVxfTP+{C25fS$hc+meZE%XX3F&4Sm z`?68#?yeHlqdQ&;S0=^@Y3YRWR(@3cLVVJT3?WjH7sJx7pRA!Q;|Jxlz{`{(xEtNp zP%*p0;9^D501taJg|oK8*b|*u)1&})IeYVs%gv87SV zyx(#6n)2*b458-OmA#uNJENB9;D*ajG`L{0_un)XYW`M^df8ZSp-h3=JE(rnTsnQQ z(RkC7`7B2D6(bqDC@*!AJ%OL_i?%99rn!>5)tVdsdMCGcs}+~z?$l2*pV~U1sgpOn z!&IFdFgM`Wrhg%m5}i40Yr3YLoZm;p+O~sRj$Hkvoa%jpnJ{1LAk44HjEo_cSNHjh z@rf90Z!kxCt+no=Bs`B-q$N2uEu%~up=HCyriOS>EV##7$EBf<*>O$;8}IYcCw}tO>+O{N1k0Hsms$=Lkh-Z3?di0o z;=hP?jxZ;5gN(9Tphv#sXTEQ!60r)g^yVM_HERZ|A4jjKd|HqACgc6~qBxq;BH6Q# zPD2$o;s%MQ6JqDNj;7G|bbPtN^3y<0C}8x#%9<-3im@#s551!}-&U;Z^tSgc2L1l{ RnDSAA_Pf(5w_Tas{{WVCW2688 delta 5846 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 Ar~m)} diff --git a/public/images/pokemon/exp/back/shiny/380-mega.png b/public/images/pokemon/exp/back/shiny/380-mega.png index b2450dd0b9ed79b9d19c8adb2fa68a466e3a7366..6efdf36e4cbbed7d059f8d64968d8431d10e3a61 100644 GIT binary patch delta 1901 zcmaKtdpy$%AIHaLW^)-c)`^{MI+#aHLW&r(Rv0mq+IhA`PKDfxqK(;&vm;EkG@^vj zT~QSFbBi3eq@)X;&XP;z@^o|X?0LPO{(ZiGeZKF{>-BkkKYx91kZ)V%uY-X>AkY(a zCveM&3g@j44q*6c01}Dx*!y#M=Ej7|ttly$*RGBB^(`zctTAiaZfb13ln{C-XzhRF zrhQ=;1cH9wNg*@R6mumr$FJh_sk%jjUwD&XTN7NS?at`DtE*FYN@5o$gzu9ay)LG< z`x@j({A*VA4JmsJ43@ZqgMIR?2k$7qybhH|%YK7PcpBT{n*-%cr$WoUY1<528=2xfbI@RwfwtiF>L|}}Ogz_B+T5~h z?oP@4%4=GW?k~$$d1m#lFA>VxqY(uE=c?Zuzm8%dLMuZ64T)uccC6UHlAnNTFELA! zWa4IYm|<==v6a>06Nalb55;f-VHi1IDP9gah*hU44ucVPZbo|L0@^;2qxHqYb<6W2 zWDnDn4;W+cr%8YDDi85_jn6iF{c)swCDVWU#u4QoA;GrV7bG5>kL;iK;jZg=Quf3Y zey$LA-06E#O^AbmeuTBZvU2 z0sF`uzdTey0?S|z^#@2jZNpXx08+m?^GH|4Q$zF{Y0M3&SrB z-gSD*MPebz_Vnio7ZR;+!hOail3;4}DbJ%{4q^&swBxk3dSW@cKKrS?eu9;jrPsnw zRju{bAYKeTLh=fEf`8w>sRG&h&Dw&F z@2X)(Tx|-5hYp>;qRX9nPmeS<5NxaspdaDAc$GzajH#It|7N3!JuY}_eqWBO*1dFw zb^P9G(9vhL%=gW{**&O*D10Px4szN(FQN(h6qD84aF0eqE^8?W4k*reRH{FFEgE!S zR>zjmhzeLSm<+Xm;6Ho6Y$Pu|w)y>0$%%O5ypIicm(nCvFV=wf8z2ioI*2%>g67=e%^zbFRJ_B&2pZR%VrdOvLmy61Lud3&BEMvcLt) z8Cx)umf6w>;Wyv*TEIhRzJ}CKeqh&|jl2P0wD>QAYmkx84@A?T0jpopYL5<`f7jXd zZftjE$o*kFD4M!Ue@I7F22{KsX2_|KY`82wI81oRmsCxH0dJnZ0c$*pNw+b>OXFqZ ztVhwRa$pbj5|BdqR81msK1j!d*&M<7_<{B^J1In(7>0R-2^VHbcmEI?(u#=`CQ8f0 zFkKokABcmw@V6HG+(cNe`xeH^Xgsf~rRjV*DbuKmiMUEJ$E=pz_-XE{0Ea3Z<)4)q^DcqOt zVy>QEWbm<)BtU?@%H=IDGPWe;)<0AOo4taBR#gd?D~l0N{`NrUDO|&%Kc_NA_RBlp zDHGnBdevR|0Bqj10dqN(P7ikf2t?@{8Fb^Pk{22nB`NGpBJrwgHtUgc67cRgu>M5b z0U+odf4hyqUCSJ5hh5yhhH|xNNn$phf1<|+lY{=EX;IIu=jm3CbeAa9sO|l_C+*~u zyPK@m0$9(IwO=tZupgBbo{A^%!=XuzRmdzKQjkt_)1U8@?!FDu^1@A~>2?$A$MlVg z1~=O1k|SpNLRF@xb16x=gDy79h8gF2h*+04aLc}nTdSx+S6FGY4co-$>T~0hiB)wy z!6QN<2HVZ#$uG6uJ0puJ5|kRq;wBZ8Nei@M(8|U_Olli(b5D(Ub~0VdrYil1Nw6XXhqfnrh@bz56D zZNBVJqN@kY6WyqwEESuO&xYFV7^p!kK^%gFd-mo{VNH+Gt81R#M|@WZetl7vL}`(2 z*+HkFN}6!}#G`2`vwRO5Xj?YE%533jBrgiE_~7Womk%Vnl#&PDQM|6JmyEVhRHAoo S@5?oh613BgPPy*G;{OMw3t{X4 delta 5768 zcmZwLc|25Y{|E3x#xl0SFd}P~Nt!6PWEl)&$u{;d%9bQ+j4e562F;MIP>7*yA#sx> z8KI(NU(1@ZC1tsV=sBL}ety5_xBM}$dA+XdI_F&1HFM7U`#IG|pXjC>7G?ziU`|c- zJM_hJS=US#0G=ju{&Iyql`?>XlI})UW&jW&2LRDz0N8;BMK1sVNeKX!TmV2l3jk07 zIgOT@PzOhVkwXvwaPl8~nEEH8enE|*!T9sR*8ZNsp|0010eY8wg2IC&t%FG(SNtVy z{QZ4ei)SJMK(NVJU)LrqXC+tp>c=;tuO#%kj{9-8)q)s|)UyjpF*YdXV^)nyVD%^^ z+qcqOP)Y5JUu(+JG&Wikbyc-P$i9f3930bDb(t;gr7r`I)nVR2U0?m?6=HBdbu!hU zfA{g%T06%ciyn=BFS~K0G?rM&^3fE+&(k7FX*D%9NsZd^h*x-dJN!$M1DfIo4q zeW9R+4g%Ca=DbwSz51klJ2_bv$@R}xbbnT1A9`_XcXVnhlc2;`NPAC-Rj~GvZZs;# zs2`^O2uq~VI9FL8Z84`1ln{@hZsza)gfcHiL0Q8Ki#PHHs9Y}Cw0z;nvh45u-IEv$ z2GHTj%evJKO@S`{mLGdc1{n!mDjlRRY({i?oN65!68vjxi>aO_DTCBJ=%E94+!}d3 z%EDa0Ls5IJ5Lon>Ph6*m8_^DJ=z~!gg}XG*0yI|E;imPO0Cs?%s?$DKuudl&=ZUtd zm6k!y-0H*^>oGk%e#e-(+1v>Il8?s8L9wEHsT?vo^WwdWQVM}ZQV2xl^1@QYnV_{c zyyay*^lm=LwAh-1^|W$*3c*Fn&EMZYynKmDj?EJ$8lm^yRYYX@scI!3DCAk~Nc~>r z)uExgWNCoZv$}?D)CAsJT)Ye{24pb@tE*oW{Zxdp>yY8DdYiwswY&Fz zL#PtgRYw$X9u$FRN-hwT)+SGD?Iq?)gxJ63iGM}YRbSseVt6_JRZH&e_o(Fu=9y1w zl@VB&g8x~^;SmarO)`<@h|^8_Cc@$(E48Zi=f^4Vg8Gx|;MTVJQfQ{w%$M%a$i1D~ zKVrTgBhZP+AApC19V+GovhLdeOQ^8lr0;awt_47)w9cv%%0AW#7n#ak~c2}6gm?7cP6oxKV~R}_b4Xb)7Y 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 diff --git a/public/images/pokemon/exp/back/shiny/381-mega.png b/public/images/pokemon/exp/back/shiny/381-mega.png index 2625284e9724111af07ba603c1abdfe6a90c17b9..9c0c182235bc4c2fa5af37cdc53743a86950f46c 100644 GIT binary patch delta 1901 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 From 9ce5453054f4e2e20a2f9ab67b709b905613fdb2 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:47:37 -0400 Subject: [PATCH 049/321] [Refactor/Documentation] Beta Merge 27/07 Cleanup (#3163) Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: torranx <68144167+torranx@users.noreply.github.com> Co-authored-by: DustinLin <39450497+DustinLin@users.noreply.github.com> --- src/battle-scene.ts | 4 +-- src/battle.ts | 4 +-- src/data/ability.ts | 54 +++++++++++++++++------------------ src/data/battle-stat.ts | 4 +-- src/data/battler-tags.ts | 11 ++++--- src/data/challenge.ts | 9 ++++-- src/data/move.ts | 6 ++-- src/data/pokemon-forms.ts | 4 +-- src/data/terrain.ts | 2 +- src/data/type.ts | 2 +- src/field/arena.ts | 4 ++- src/field/pokemon.ts | 16 +++++------ src/modifier/modifier-type.ts | 4 +-- src/phases.ts | 4 +-- 14 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 19f8dad862e..71f4dc7b9f6 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -230,7 +230,7 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; private shopOverlayShown: boolean = false; - private shopOverlayOpacity: number = .80; + private shopOverlayOpacity: number = .8; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; @@ -1056,7 +1056,7 @@ export default class BattleScene extends SceneBase { playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); doubleTrainer = !Utils.randSeedInt(doubleChance.value); // 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 === TrainerType.TATE || trainerType === TrainerType.LIZA)) { + if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { doubleTrainer = false; } } diff --git a/src/battle.ts b/src/battle.ts index b8df7635472..b6ae5354e5a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -294,7 +294,7 @@ export default class Battle { if (pokemon.species.speciesId === Species.TAPU_KOKO || pokemon.species.speciesId === Species.TAPU_LELE || pokemon.species.speciesId === Species.TAPU_BULU || pokemon.species.speciesId === Species.TAPU_FINI) { return "battle_legendary_tapu"; } - if (pokemon.species.speciesId === Species.COSMOG || pokemon.species.speciesId === Species.COSMOEM || pokemon.species.speciesId === Species.SOLGALEO || pokemon.species.speciesId === Species.LUNALA) { + if ([ Species.COSMOG, Species.COSMOEM, Species.SOLGALEO, Species.LUNALA ].includes(pokemon.species.speciesId)) { return "battle_legendary_sol_lun"; } if (pokemon.species.speciesId === Species.NECROZMA) { @@ -308,7 +308,7 @@ export default class Battle { return "battle_legendary_ultra_nec"; } } - if (pokemon.species.speciesId === Species.NIHILEGO || pokemon.species.speciesId === Species.BUZZWOLE || pokemon.species.speciesId === Species.PHEROMOSA || pokemon.species.speciesId === Species.XURKITREE || pokemon.species.speciesId === Species.CELESTEELA || pokemon.species.speciesId === Species.KARTANA || pokemon.species.speciesId === Species.GUZZLORD || pokemon.species.speciesId === Species.POIPOLE || pokemon.species.speciesId === Species.NAGANADEL || pokemon.species.speciesId === Species.STAKATAKA || pokemon.species.speciesId === Species.BLACEPHALON) { + if ([ Species.NIHILEGO, Species.BUZZWOLE, Species.PHEROMOSA, Species.XURKITREE, Species.CELESTEELA, Species.KARTANA, Species.GUZZLORD, Species.POIPOLE, Species.NAGANADEL, Species.STAKATAKA, Species.BLACEPHALON ].includes(pokemon.species.speciesId)) { return "battle_legendary_ub"; } if (pokemon.species.speciesId === Species.ZACIAN || pokemon.species.speciesId === Species.ZAMAZENTA) { diff --git a/src/data/ability.ts b/src/data/ability.ts index 40461f72e97..af97151f4b0 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -286,7 +286,7 @@ export class BlockItemTheftAbAttr extends AbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { return i18next.t("abilityTriggers:blockItemTheft", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -405,7 +405,7 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { if (!simulated) { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), i18next.t("abilityTriggers:typeImmunityHeal", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName}), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); } } return true; @@ -485,7 +485,7 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:nonSuperEffectiveImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -777,7 +777,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:postDefendTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName, typeName: i18next.t(`pokemonInfo:Type.${Type[pokemon.getTypes(true)[0]]}`) }); } @@ -901,7 +901,7 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:postDefendContactDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -999,7 +999,7 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:postDefendAbilityGive", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -1083,9 +1083,8 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * [1]: {@linkcode Moves } Move used by the ability user. */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - //Disable showAbility during getTargetBenefitScore - const showAbility = args[4]; - this.showAbility = showAbility; + // Disable showAbility during getTargetBenefitScore + this.showAbility = args[4]; if ((args[0] as Utils.NumberHolder).value <= 0 || (args[1] as Move).id === Moves.ORDER_UP) { return false; } @@ -1797,7 +1796,7 @@ export class IntimidateImmunityAbAttr extends AbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:intimidateImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -2354,8 +2353,8 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:protectStat", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, - statName: this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats", // TODO : Change "stats" to i18next.t("battle:stats") after PR#2600 merged to 'main' + abilityName, + statName: this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : i18next.t("battle:stats") }); } } @@ -2421,12 +2420,12 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { return this.immuneEffects.length ? i18next.t("abilityTriggers:statusEffectImmunityWithName", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName, statusEffectName: getStatusEffectDescriptor(args[0] as StatusEffect) }) : i18next.t("abilityTriggers:statusEffectImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName }); } } @@ -2458,7 +2457,7 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:battlerTagImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - abilityName: abilityName, + abilityName, battlerTagName: (args[0] as BattlerTag).getDescriptor() }); } @@ -2844,7 +2843,7 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), true)); + Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } @@ -2864,7 +2863,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName })); + scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); return true; } @@ -2938,7 +2937,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName}), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } } @@ -3031,10 +3030,11 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { ) as BerryModifier | undefined; if (!berryModifier) { + const newBerry = new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1); if (pokemon.isPlayer()) { - pokemon.scene.addModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + pokemon.scene.addModifier(newBerry); } else { - pokemon.scene.addEnemyModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + pokemon.scene.addEnemyModifier(newBerry); } } else if (berryModifier.stackCount < berryModifier.getMaxHeldItemCount(pokemon)) { berryModifier.stackCount++; @@ -3095,7 +3095,7 @@ export class PostTurnHealAbAttr extends PostTurnAbAttr { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); return true; } @@ -3347,7 +3347,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { pokemon.scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.getMaxHp() * this.healPercent), 1), - i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), + i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true ) ); @@ -3422,7 +3422,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:arenaTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); + return i18next.t("abilityTriggers:arenaTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3540,7 +3540,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:postFaintContactDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); + return i18next.t("abilityTriggers:postFaintContactDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3560,7 +3560,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:postFaintHpDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); + return i18next.t("abilityTriggers:postFaintHpDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3918,7 +3918,7 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt * @returns {string} - The trigger message. */ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); + return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }); } } @@ -3993,7 +3993,7 @@ async function applyAbAttrsInternal( pokemon.scene.setPhaseQueueSplice(); let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked PR#924 + // TODO Remove this when promises get reworked if (result instanceof Promise) { result = await result; } diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 47f52b46d94..d70e6655f8c 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -1,4 +1,4 @@ -import i18next, {ParseKeys} from "i18next"; +import i18next, { ParseKeys } from "i18next"; export enum BattleStat { ATK, @@ -32,7 +32,7 @@ export function getBattleStatName(stat: BattleStat) { } } -export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: integer = 1) { +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: number = 1) { const stringKey = (() => { if (up) { switch (levels) { diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 2755fd0bbbe..97c42fed514 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -31,14 +31,14 @@ export enum BattlerTagLapseType { export class BattlerTag { public tagType: BattlerTagType; - public lapseType: BattlerTagLapseType[]; + public lapseTypes: BattlerTagLapseType[]; public turnCount: number; public sourceMove: Moves; public sourceId?: number; constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove: Moves, sourceId?: number) { this.tagType = tagType; - this.lapseType = typeof lapseType === "number" ? [ lapseType ] : lapseType; + this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ]; this.turnCount = turnCount; this.sourceMove = sourceMove; this.sourceId = sourceId; @@ -650,8 +650,7 @@ export class OctolockTag extends TrappedTag { } canAdd(pokemon: Pokemon): boolean { - const isOctolocked = pokemon.getTag(BattlerTagType.OCTOLOCK); - return !isOctolocked; + return !pokemon.getTag(BattlerTagType.OCTOLOCK); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1628,8 +1627,8 @@ export class StockpilingTag extends BattlerTag { super.loadTag(source); this.stockpiledCount = source.stockpiledCount || 0; this.statChangeCounts = { - [BattleStat.DEF]: source.statChangeCounts?.[BattleStat.DEF] || 0, - [BattleStat.SPDEF]: source.statChangeCounts?.[BattleStat.SPDEF] || 0, + [ BattleStat.DEF ]: source.statChangeCounts?.[ BattleStat.DEF ] ?? 0, + [ BattleStat.SPDEF ]: source.statChangeCounts?.[ BattleStat.SPDEF ] ?? 0, }; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index ad8c312bdf6..701183e1733 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -17,6 +17,9 @@ import { Gender } from "./gender"; import { pokemonEvolutions } from "./pokemon-evolutions"; import { pokemonFormChanges } from "./pokemon-forms"; +/** A constant for the default max cost of the starting party before a run */ +const DEFAULT_PARTY_MAX_COST = 10; + /** * An enum for all the challenge types. The parameter entries on these describe the * parameters to use when calling the applyChallenges function. @@ -689,11 +692,11 @@ export class LowerStarterMaxCostChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return (10 - overrideValue).toString(); + return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { - if (speciesStarters[pokemon.speciesId] > 10 - this.value) { + if (speciesStarters[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) { valid.value = false; return true; } @@ -723,7 +726,7 @@ export class LowerStarterPointsChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return (10 - overrideValue).toString(); + return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } applyStarterPoints(points: Utils.NumberHolder): boolean { diff --git a/src/data/move.ts b/src/data/move.ts index a2b879a388b..8616c4caf9b 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5825,7 +5825,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { const moveHistory = target.getLastXMoves(); - return !!moveHistory.length; + return moveHistory.length !== 0; }; } } @@ -8691,8 +8691,8 @@ export function initMoves() { new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); - allMoves.map(m=>{ - if (m.getAttrs(StatChangeAttr).some(a=> a.selfTarget && a.levels < 0)) { + allMoves.map(m => { + if (m.getAttrs(StatChangeAttr).some(a => a.selfTarget && a.levels < 0)) { selfStatLowerMoves.push(m.id); } }); diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index d6fe12a8186..7391a92005f 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -138,7 +138,7 @@ export class SpeciesFormChange { public formKey: string; public trigger: SpeciesFormChangeTrigger; public quiet: boolean; - public conditions: SpeciesFormChangeCondition[]; + public readonly conditions: SpeciesFormChangeCondition[]; constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false, ...conditions: SpeciesFormChangeCondition[]) { this.speciesId = speciesId; @@ -378,7 +378,7 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie /** * Gives a condition for form changing checking if a species is registered as caught in the player's dex data. * Used for fusion forms such as Kyurem and Necrozma. - * @param species + * @param species {@linkcode Species} * @returns A {@linkcode SpeciesFormChangeCondition} checking if that species is registered as caught */ function getSpeciesDependentFormChangeCondition(species: Species): SpeciesFormChangeCondition { diff --git a/src/data/terrain.ts b/src/data/terrain.ts index 507557eaf9f..d0b2fb53d3e 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -61,7 +61,7 @@ export class Terrain { const priority = new Utils.IntegerHolder(move.priority); applyAbAttrs(IncrementMovePriorityAbAttr, user, null, move, priority); // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain - return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()).length > 0; + return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); } } diff --git a/src/data/type.ts b/src/data/type.ts index cf3bc85ab48..1330eb83f4b 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -505,7 +505,7 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): * Retrieve the types resisting a given type * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type) */ -export function getTypeResistances(type: integer): Type[] { +export function getTypeResistances(type: number): Type[] { switch (type) { case Type.NORMAL: return [Type.ROCK, Type.STEEL, Type.GHOST]; diff --git a/src/field/arena.ts b/src/field/arena.ts index 7d1046986a5..efbcdcd6727 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -638,7 +638,9 @@ export class Arena { } } - /** Clears terrain and arena tags when entering new biome or trainer battle. */ + /** + * Clears terrain and arena tags when entering new biome or trainer battle. + */ resetArenaEffects(): void { this.trySetTerrain(TerrainType.NONE, false, true); this.removeAllTags(); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f630cc16a48..7f6c8d11e31 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1241,14 +1241,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); - immuneTags.forEach(tag => { - if (move !== undefined) { - const hitsTagAttrs = move.getAttrs(HitsTagAttr).filter(attr => attr.tagType === tag.tagType); - if (hitsTagAttrs.length === 0) { - multiplier = 0; - } + for (const tag of immuneTags) { + if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + multiplier = 0; + break; } - }); + } return multiplier; } @@ -1949,7 +1947,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const targetCount = getMoveTargets(source, move.id).targets.length; - const targetMultiplier = targetCount > 1 ? 0.75 : 1; + const targetMultiplier = targetCount > 1 ? 0.75 : 1; // 25% damage debuff on multi-target hits (even if it's immune) applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); @@ -2282,7 +2280,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { lapseTags(lapseType: BattlerTagLapseType): void { const tags = this.summonData.tags; - tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseType.some(lType => lType === lapseType)) && !(t.lapse(this, lapseType)))).forEach(t => { + 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); }); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index fb2264fab8f..78af578c312 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -572,7 +572,7 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType { if (hasCandyJar) { levels += hasCandyJar.stackCount; } - return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description", {levels }); + return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description", { levels }); } } @@ -1569,7 +1569,7 @@ const modifierPool: ModifierPool = { p => !p.getHeldItems().some(i => i instanceof Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 3*(weightMultiplier? 2: 1)+(weightMultiplier? weightMultiplier-1: 0); + return 3 * (weightMultiplier ? 2: 1) + (weightMultiplier ? weightMultiplier - 1 : 0); }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), diff --git a/src/phases.ts b/src/phases.ts index 15fd1975d1c..ceefc34ba17 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1588,8 +1588,6 @@ export class SwitchSummonPhase extends SummonPhase { } } - // if doReturn === False OR slotIndex !== -1 (slotIndex is valid) and the pokemon doesn't exist/is false - // then switchAndSummon(), manually pick pokemon to switch into if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { if (this.player) { return this.switchAndSummon(); @@ -3321,7 +3319,7 @@ export class StatChangePhase extends PokemonPhase { applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); - //Look for any other stat change phases; if this is the last one, do White Herb check + // Look for any other stat change phases; if this is the last one, do White Herb check const existingPhase = this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex); if (!(existingPhase instanceof StatChangePhase)) { // Apply White Herb if needed From bdcefdb1438c49694e25afeb3f62e5ec3b0c0308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Fleury=20Oliveira?= Date: Mon, 29 Jul 2024 17:54:25 -0300 Subject: [PATCH 050/321] [Localization] Update achievement and battle translations in pt_BR locale (#3209) --- src/locales/pt_BR/achv.ts | 12 ++++++++++-- src/locales/pt_BR/battle.ts | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/locales/pt_BR/achv.ts b/src/locales/pt_BR/achv.ts index ea77e0c17e9..78c4da6ae2e 100644 --- a/src/locales/pt_BR/achv.ts +++ b/src/locales/pt_BR/achv.ts @@ -227,7 +227,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Comendo Poeira", }, "MONO_ROCK": { - name: "Duro Como Pedra", + name: "...Tanto Bate Até Que Fura", }, "MONO_BUG": { name: "Vida de Inseto", @@ -265,6 +265,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Clube das Winx", }, + "FRESH_START": { + name: "De Primeira!", + description: "Complete o desafio de novo começo." + }, } as const; // Achievement translations for the when the player character is female @@ -494,7 +498,7 @@ export const PGFachv: AchievementTranslationEntries = { name: "Comendo Poeira", }, "MONO_ROCK": { - name: "Duro Como Pedra", + name: "...Tanto Bate Até Que Fura", }, "MONO_BUG": { name: "Vida de Inseto", @@ -532,4 +536,8 @@ export const PGFachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Clube das Winx", }, + "FRESH_START": { + name: "De Primeira!", + description: "Complete o desafio de novo começo." + }, } as const; diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index 0e6831f9295..824b069f0a4 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -13,7 +13,7 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} escolheu {{pokemonName}}!", "switchQuestion": "Quer trocar\nde {{pokemonName}}?", "trainerDefeated": "Você derrotou\n{{trainerName}}!", - "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", + "moneyWon": "Você ganhou\n₽{{moneyAmount}} por vencer!", "moneyPickedUp": "Você pegou ₽{{moneyAmount}} do chão!", "pokemonCaught": "{{pokemonName}} foi capturado!", "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", From 06515d4d50019ae2e5f761548c2a2e33289eb210 Mon Sep 17 00:00:00 2001 From: Enoch Date: Tue, 30 Jul 2024 05:55:52 +0900 Subject: [PATCH 051/321] [Localization(ko)] fix korean postposition to dynamic (#3193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 송지원 --- src/locales/ko/modifier-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index 28df422645a..98e5f5d2ebf 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "No.{{moveId}} {{moveName}}", - description: "포켓몬에게 {{moveName}}를(을) 가르침.\n(C 또는 Shift를 꾹 눌러 정보 확인)", + description: "포켓몬에게 {{moveName}}[[를]] 가르침.\n(C 또는 Shift를 꾹 눌러 정보 확인)", }, "EvolutionItemModifierType": { description: "어느 특정 포켓몬을 진화시킨다.", From d7a121416888ebbfc33eb26877f250ca61a6355e Mon Sep 17 00:00:00 2001 From: returntoice Date: Tue, 30 Jul 2024 05:56:05 +0900 Subject: [PATCH 052/321] [Localization] New Korean translations (#3192) * trans once more * change2 --- src/locales/ko/achv.ts | 4 ++++ src/locales/ko/battle-info.ts | 2 +- src/locales/ko/challenges.ts | 6 ++++++ src/locales/ko/modifier-type.ts | 6 +++--- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index d8b8cc54f66..abc0f186fd4 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "설마 자시안으로?", }, + "FRESH_START": { + name: "첫트!", + description: "새 출발 챌린지 모드 클리어." + }, } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/ko/battle-info.ts b/src/locales/ko/battle-info.ts index 4386f7814b4..357de6003ec 100644 --- a/src/locales/ko/battle-info.ts +++ b/src/locales/ko/battle-info.ts @@ -1,5 +1,5 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleInfo: SimpleTranslationEntries = { - "generation": "{{generation}}세대", + "generation": "{{generation}}", } as const; diff --git a/src/locales/ko/challenges.ts b/src/locales/ko/challenges.ts index 136417f597b..f84a4f31dc6 100644 --- a/src/locales/ko/challenges.ts +++ b/src/locales/ko/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." //type in pokemon-info }, + "freshStart": { + "name": "새 출발", + "desc": "포켓로그를 처음 시작했던 때처럼 강화가 전혀 되지 않은 오리지널 스타팅 포켓몬만 고를 수 있습니다.", + "value.0": "해제", + "value.1": "설정", + } } as const; diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index 98e5f5d2ebf..f09fba0b09a 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다.", }, "PokemonLevelIncrementModifierType": { - description: "포켓몬 1마리의 레벨이 기본 1만큼, 사탕단지의 개수에 따라 최대 {{levels}}까지 상승한다.", + description: "포켓몬 1마리의 레벨이 {{levels}}만큼 상승한다.", }, "AllPokemonLevelIncrementModifierType": { - description: "자신의 모든 포켓몬의 레벨이 기본 1씩, 사탕단지의 개수에 따라 최대 {{levels}}까지 상승한다.", + description: "자신의 모든 포켓몬의 레벨이 {{levels}}만큼 상승한다.", }, "PokemonBaseStatBoosterModifierType": { description: "지니게 하면 {{statName}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다.", @@ -153,7 +153,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." }, - "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "WHITE_HERB": { name: "하양허브", description: "지니게 한 포켓몬의 능력이 떨어졌을 때 원래 상태로 돌아온다." }, "ETHER": { name: "PP에이드" }, "MAX_ETHER": { name: "PP회복" }, From 95242e463c274c63ef0ae9913e807943efcb4bc1 Mon Sep 17 00:00:00 2001 From: Enoch Date: Tue, 30 Jul 2024 05:58:42 +0900 Subject: [PATCH 053/321] [Localization] Localize arena-tag messages & texts (#3011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add Google and Discord login functionality feat: Add link to Discord in menu UI feat: Add Discord and Google login functionality Add container around discord and google icons refactor: Update environment variable names for Discord and Google client IDs feat: Add "Or use" translation for login options in multiple languages feat: Update menu UI translations for multiple languages Code review fixes refactor: Update Discord and Google client IDs in environment variables * refactor: Add missing properties to initLoggedInUser function * Update src/locales/de/menu-ui-handler.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * make i18n debugging an optional env setting this also reduces output noise in tests * set development default also to "0" * fix inaccurate docs for TypeImmunityAbAttr (#2957) * chore: Add beta branch to GitHub Actions tests workflow * chore: Add beta branch to GitHub Actions linter and gh-pages workflow * Update src/locales/ko/menu-ui-handler.ts Co-authored-by: lnuvy * Update src/locales/ko/menu.ts Co-authored-by: lnuvy * Localization(pt): translated bgm-name.ts (#2955) * Localization(pt): translated bgm-name.ts * fix * update VITE_I18N_DEBUG in .env files * chore: Update environment variables for beta and production environments * chore: Add beta branch to GitHub Actions deploy workflow * Hardcoded Pokemon should have proper names (#2941) * Refactor challenges and add fresh start (#2963) * [Balance] Update many TM learnsets (#2879) * Update TMs for more Indigo Disk changes * Fix typo, more Stored Power * Refactor challenges and add fresh start (#2964) * Refactor challenges and add fresh start * Add achievement for fresh start challenge * [Bug] Fix off-by-one error in damage calc (#2970) * Fix random damage roll to be 85-100% instead of 85-99% * Update battle.test.ts to reflect the fix * [Bug] Grounded on Terrain fixes (#2969) * [Help] [Move/Bug] Patches Psychic Terrain applicability edge cases Was cancelling moves even if targeted mons weren't on the terrain. * [Bug `]Pokemon.isGrounded` does not exist Replaced with `Pokemon.isGrounded()`, which does. * [Bug] Psychic Terrain priority move cancel ignoring ungrounded * [Bug] Semi-invulnerable should not be grounded * Update game-stats-ui-handler.ts (italian) (#2965) * [Bugfix] Fix a bug during bgm-bar initialization (#2822) * Prevent sizing error * Make reboot not necessary for show BGM * Makes the BGM Bar active by default + It had originally been decided that this would not be active by default because it was to be displayed outside the pause menu, but since its behavior has changed between this decision and its integration, the default deactivation is no longer necessary * [Mirror][Localization] Translate game victory sentences #2254 (#2906) * Translate forgotten sentences on phases * Translate to de forgotten sentences on phases * Translate to es forgotten sentences on phases * Translate to fr forgotten sentences on phases * Translate to it forgotten sentences on phases * Translate to ko forgotten sentences on phases * Translate to pt br forgotten sentences on phases * Translate to zh cn forgotten sentences on phases * Translate to zh tw forgotten sentences on phases * remove duplicate message * remove duplicate message * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update battle.ts [Localization(it)] * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> --------- Co-authored-by: Alexis Co-authored-by: 송지원 Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * [Mirror][Localization] Translate summary #2336 (#2907) * Translate pokemon summary * Translate pokemon summary to fr * Translate pokemon summary to de * Translate pokemon summary to es * Translate pokemon summary to it * Translate pokemon summary to ko * Translate pokemon summary to pt br * Translate pokemon summary to zh cn * Translate pokemon summary to zh tw * Fix import * Update partially for en and ko * Update interface name for en * Merge trainerLabel&Text and calculate typeLabel width * Update src/locales/es/pokemon-summary.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Apply translations key to all languages with interface TranslationEtries * Update ko/translationKey of status * Update ko/translationKey of pokemonInfo * Update de/translationKeys of memostring and metFragment * Update de/translationKeys of memostring and metFragment 2 * Update src/locales/ko/pokemon-summary.ts Co-authored-by: Enoch * Update src/locales/ko/pokemon-summary.ts Co-authored-by: returntoice * Update src/locales/pt_BR/pokemon-summary.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/ko/pokemon-summary.ts * Update src/locales/pt_BR/pokemon-summary.ts Co-authored-by: José Ricardo Fleury Oliveira * Update pokemon-summary.ts [Localization(it)] * remove unused code * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/es/pokemon-summary.ts Co-authored-by: Arxxer * Update src/locales/es/pokemon-summary.ts Co-authored-by: Arxxer --------- Co-authored-by: Alexis Co-authored-by: Mr.WaterT Co-authored-by: Alexis Faizeau Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: 송지원 Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Arxxer * [Localization] Localization arena flyout (Active Battle Effects) (#2932) * localizing Active Battle Effects (working) * Localize Active Battle Effects * Change return value * Modify arena terrain desc * Update src/locales/zh_CN/arena-flyout.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/de/arena-flyout.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/arena-flyout.ts Co-authored-by: Lugiad' * Update arena-flyout.ts (IT) * Update src/locales/pt_BR/arena-flyout.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/es/arena-flyout.ts Co-authored-by: Arxxer * Change util function name --------- Co-authored-by: 송지원 Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Arxxer * This should prevent gym leaders appear as doubles (marnie & piers) when they arent fixed battles (#2904) * The stat messages can now be plural (#2600) * The stat messages are now plural * "And" can now be localized * Revert Override * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/ko/battle.ts Co-authored-by: Enoch * Update src/locales/ko/battle.ts Co-authored-by: Enoch * Update src/locales/es/battle.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Update src/locales/es/battle.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Update src/locales/de/battle.ts * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/data/battle-stat.ts * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Changed the way the multiple is handeled to use the i18n way * Missed one file * Apply suggestions from code review * Apply suggestions from code review * Changed the tests so they work now with the i18n hting * Fixed some other tests (chinese still makes problems... * Fix tests for chinese * Tests * Update src/test/battle-stat.spec.ts * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Enoch Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira * [Enhancement][QoL] Add option to adjust shop overlay opacity (#2622) * add option to adjust shop overlay opacity * add localization * fix bug * Update src/locales/fr/settings.ts Co-authored-by: Lugiad' * Update src/locales/zh_CN/settings.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/fr/settings.ts Co-authored-by: Lugiad' * update default value * update setting values * re-add value 10 * Update src/locales/pt_BR/settings.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/ko/settings.ts Co-authored-by: Enoch * Update src/locales/es/settings.ts Co-authored-by: InnocentGameDev * Update settings.ts --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: InnocentGameDev Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * [Bug] Fix battler tags lapsing at incorrect times (#2944) * Fix battler tags lapsing at incorrect times * Document FlinchedTag * Update French pokemon-summary.ts (#2976) * [Test] Prevent tests from running if overrides are different from the default values (#2110) * mock default overrides in test setup * change beforeEach to beforeALl * move some more enums into the enums directory * replace modules that import i18n into overrides with modules that don't * add pre tests and update vitest configs, scripts * replace tabs with spaces * fix vitest server port overlap warning * add missing overrides and clean up workspace config * change test name * include spec files in main test suite * [QoL] Highlight targets of multitarget moves instead of immediate execution (#2863) * show targets for move targeting multiple pokemon * dont allow selecting target if multiple * fix targeting * cleanup * more cleanup * only highlight targets is move is not status * fix tests failing * fix tests * change "immediately" to "auto" * nevermind just remove auto * remove status move condition * [Refactor] rewrite applyAbAttrsInternal to use an iterator. (#1832) * initial rewrite of applyAbAttrsInternal * clean up applyAbAttrsInternal * remove the await because it wraps non Promises in a promise * add TODO comment about promises * fix broken costar test, hopefully * Update typescript and typedoc (#2988) * update typescript and typedoc to latest versions * forgot to add the package-lock * add fixes for breaking type gen * update workflow (#2989) * [Qol/Balance] Dynamax cannon tweak (#2540) * Dynamax Cannon fix * Update src/locales/fr/move.ts Added fr translation. Co-authored-by: Lugiad' * Update src/locales/fr/move.ts Adding an important missing precision in French description Co-authored-by: Lugiad' * Update src/locales/de/move.ts German locale commit. Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/zh_CN/move.ts Chinese locale commit, checked by a native speaker Co-authored-by: Lugiad' * Update src/locales/ko/move.ts Korean locale added Co-authored-by: returntoice * fixed trailing space in Chinese locale * added es locale * Different Dynamax Cannon fix. This one is the one * Dynamax Cannon fix localisations * Update src/locales/fr/move.ts Added fr locale Co-authored-by: Lugiad' * Update src/locales/de/move.ts German translation ^^ Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/move.ts pt-BR translation Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/de/move.ts Eslint fix, good catch @Enoch Co-authored-by: Enoch * Update src/locales/ko/move.ts Korean locale ^^ Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * Update src/locales/zh_CN/move.ts zh_CN locale Co-authored-by: RimKnight * Update src/locales/zh_TW/move.ts zh_TW locale Co-authored-by: RimKnight * Update move.ts linting mistake due to how my comment was written * Update move.ts linting mistake due to how my comment was written * Update move.ts [Localization(it)] * WIP test * WIP test part 2 * [Test] Add Unit Tests for Dynamax Cannon * removed some unnecessary cases in the test to reduce testing overhead * Update src/locales/ko/move.ts Updated kr locale Co-authored-by: Enoch * [Test] Adjust Unit Tests for Dynamax Cannon --------- Co-authored-by: Lugiad' Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: RimKnight Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: xsn34kzx * [Test] Fix/Extend Unit Test for Hard Press (#2992) * [Test] Update tests to enable no-crits override (#2971) * Update tests to enable no-crits override * Rename variable maxHP to initialHP * [Localization]Localized move-trigger text (#2913) * [Localization]Localized move-trigger text * [Localization]Localized zh-cn move-trigger text * [Localization]fix typo * [Localization]fix typo * Update src/locales/pt_BR/move-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * [Localization]add pokemonName to move-trigger.ts * [Localization]add pokemonName to move-trigger.ts * Update zh_TW move-trigger.ts * Update zh_CN move-trigger.ts * Update move.ts * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update move-trigger.ts * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * [Localization]add affix to target pokemon names * Update src/locales/fr/move-trigger.ts Co-authored-by: Lugiad' * localized type --------- Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' * [Bug] Fix description of rare candy to have proper amount of level (#2903) * [Bug] Fix description of rare candy to have proper amount of level * Update en locales * Add locales * Add locales * Update src/locales/de/modifier-type.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/modifier-type.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/modifier-type.ts Co-authored-by: Lugiad' * Update src/locales/fr/modifier-type.ts Co-authored-by: Lugiad' * Update src/locales/ko/modifier-type.ts Co-authored-by: Enoch * Update src/locales/ko/modifier-type.ts Co-authored-by: Enoch * Update src/locales/zh_CN/modifier-type.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/modifier-type.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/pt_BR/modifier-type.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/modifier-type.ts Co-authored-by: José Ricardo Fleury Oliveira * Update modifier-type.ts (IT) * Update src/locales/es/modifier-type.ts Co-authored-by: Arxxer * Update src/locales/es/modifier-type.ts Co-authored-by: Arxxer --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Enoch Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Arxxer * move status effect enum into separate file (#2998) * add .env.test (#2997) block i18n debug output by default * [QoL] Create default overrides class and export that with custom overrides (#2999) * Create default overrides class and export that with custom overrides * add comment to mock import and replace typecast with type narrowing * change modifier override type to pick keys from modifierTypes * [Feature][FUN] add breedersInSpace splash message (#2631) * add spaceBreeder splash message * fix typo (whops) * Add pt_BR translation Co-authored-by: José Ricardo Fleury Oliveira * replace text & key with breedersInSpace * add french tanslation Co-authored-by: Lugiad' * remove obsolete array split in splash-messages.ts * Update src/locales/pt_BR/splash-messages.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/es/splash-messages.ts Co-authored-by: Asdar * Update splash-messages.ts (Italian) * Update src/locales/zh_CN/splash-messages.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/ko/splash-messages.ts Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> --------- Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Lugiad' Co-authored-by: Asdar Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * [Enhancement] Pokemon generation number tooltip (#2642) * Create tooltip to show Pokemon generation * Add option to toggle generation tooltip * Use roman numeral for generation tooltip * Revert "Add option to toggle generation tooltip" This reverts commit 414b2366fc55c5642f8858d6f4854aa62c4caf60. * Update src/locales/de/battle-info.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/battle-info.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/battle-info.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/zh_TW/battle-info.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battle-info.ts Co-authored-by: RimKnight * Update src/locales/ko/battle-info.ts Co-authored-by: Enoch * Update battle-info.ts (IT) --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: RimKnight Co-authored-by: Enoch Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * [Beta] Updating the manage data->unlock all option to work with all abilities, natures, forms and passives (#2967) * Updated code to allow user to unlock all pokemon from the manage data menu option * Added code to Utils to allow it to check for a beta env, and hid the unlock all code behind that. This should stop it from being accessed in prod envs * Updated another section to be locked behind beta check, and also updated the everything.prsv to have everything unlocked going forward * Fixed some code reviews * [Bug] vite port (for development) (#3003) * make vite-port configurable and make it default 8000 * add retries for `does not trigger by non damage moves` test * feat: Update isBeta check in utils.ts to use import.meta.env.MODE The current implementation of the isBeta check in utils.ts is using import.meta.env.DEV, which gives the same value for both beta and dev environments. This commit updates the check to use import.meta.env.MODE === "beta" to accurately determine if the environment is beta. This ensures that the unlock all code is only accessible in the beta environment and not in production environments. * refactor: Update trainerId and secretId in game data This commit updates the `trainerId` and `secretId` properties in the `GameData` class. The values are replaced with the corresponding values from the `this.trainerId` and `this.secretId` variables. This change ensures that the `trainerId` and `secretId` are correctly updated in the game data. * Adds bg glow behind starters with unlocked passives (#2497) * [Localization] Localize missed things in battlers-tag.ts (#3004) * Localize missed things in battlers-tag * Change orders of configs * Add missed phase * Update src/locales/zh_CN/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battler-tags.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battler-tags.ts Co-authored-by: RimKnight --------- Co-authored-by: RimKnight * [Feature] Fully implement Octolock (#2985) * implement octolock * Add tests * Add localization of arena tag (TODO : config add) * [Bug] Fix import of overrides in a test (#3009) * [BUG] Fixes Sketch copying the first move used by the opponent instead of the last (#2759) * Changes getMoveHistory to getLastXMoves to fix sketch copying first move used instead of last * Optimizes move search and early return * Reverts check for virtual moves * [Bug] Making FormChangeItems Untransferrable (#2695) * Made FormChangeItems untransferrable. Replaced getTransferrable() * Made isTransferrable readonly. Removed unnecessary 'm as PokemonHeldItemModifier'. * [Bug] Fix Clear terrains upon Trainer Battle (#2027) * Clear terrains upon Trainer Battle * Adjusted comment * Fix item reward overrides going out of bounds (#3012) * [Localization] Localize Berry Heal message (#2996) * Localize berry heal message (HP/PP) * Change location of translation * conflict resolve * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/zh_CN/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update battle.ts (Berries ITALIAN) --------- Co-authored-by: 송지원 Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Adds a check to the bgm-bar display to prevent it from being displayed in case of an empty value (#3007) * Update src/locales/fr/arena-tag.ts Co-authored-by: Lugiad' * Update src/locales/de/arena-tag.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * [Sprite] Improves Corviknight Palette usage (#3020) * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Beta][Localization] Update French battler-tags.ts and battle.ts (#3015) * Update French battler-tags.ts * Update battle.ts * [Bug] Fix Lock-On and Mind Reader not working on the first turn (#3001) * [Bug] Struggle Recoil should ignore Magic Guard (#3017) * Drafted testable conditions for Magic Guard * Weather Test * Update src/test/abilities/magic_guard.test.ts InnerThunder Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Implemented checks for poison/toxic/burn * Added tests for recoil moves and volatile status * Updated Rock Head, Magic Guard, and Reckless interactions with Struggle * Removed stray file * Fixed Typedoc errors * Implemented innerthunder's feedback --------- Co-authored-by: Frutescens Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * [Enhancement] Decouple move power calculation from Pokemon.apply(), Fixes Power Spot & Battery not boosting ally's move (#2984) * refactor power calc, fix battery & power spot * fix hard press unit test * fix hard press * refactor tests * use sypOn hp instead * rename method * cleanup tests * improve tests * use slow vs fast pokemon * fix steely spirit test * fix steely spirit for real this time * remove unnecessary test * address pr feedback * add removed code * [QoL] Offset the status indicator to keep pokeball in view (#2966) * Offset the status indicator to keep pokeball in view * Only use offsetX when the Pokemon is the enemy * Adjust position to accomodate boss health bar * [Bug] Fix to epic shiny Yungoos icon (#2991) (#3016) Fixed a floating pixel in epic shiny Yungoos' icon. Caused by Mimikyu's epic shiny sprite being placed too high on the sprite sheet. Moved Mimikyu's sprite down and updated json to reflect the change. * [Localization(ko)] Change line-break position of ghost type curse add message (#3022) * Update src/locales/de/arena-tag.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Revert "[Localization]Localized move-trigger text (#2913)" (#3026) This reverts commit 39bdfea0c8b33a759db760809d6488d825b510e2. * [Localization(ko)] Fixed typo in Bertha's dialogue (#3025) * [Bug] Prevent fixed-damage and OHKO moves from being modified by damage-reducing abilities (#2703) * ReceivedMoveDamageMultiplierAbAttr patch: WIP refactored damage calculation, reordered ReceivedMoveDamageMultiplierAbAttr to avoid issues with fixed damage and OHKO moves, stubbed unit tests for dragon rage (fixed damage) and fissure (OHKO) * ReceivedMoveDamageMultiplierAbAttr patch: commented concerns regarding EnemyDamageBooster/ReducerModifier for others' reference in WIP branch * ReceivedMoveDamageMultiplierAbAttr patch: reordered ReceivedMoveDamageMultiplierAbAttr and EnemyDamageBooster/ReducerModifier to not trigger for fixed damage and OHKO moves, completed relevant tests for dragon rage and fissure * ReceivedMoveDamageMultiplierAbAttr patch: removed newline * ReceivedMoveDamageMultiplierAbAttr patch: in the unit test, extracted hard-coded Dragon Rage damage to a variable * ReceivedMoveDamageMultiplierAbAttr patch: naming consistency * ReceivedMoveDamageMultiplierAbAttr patch: replaced awaiting DamagePhase with TurnEndPhase as the former assumes damage will be done * ReceivedMoveDamageMultiplierAbAttr patch: removed redundant overrides in Fissure tests * ReceivedMoveDamageMultiplierAbAttr patch: tests: refactored crit removal, removed berries, fixed bug associated with Porygon sometimes getting Trace and copying the opponent's ability, which would override the manual ability override * Fixed unit tests * Added a comment and cleaned up an existing one * Update src/locales/zh_CN/arena-tag.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * [Localization] Brought german localization up to date (#3010) * Fixed errors in the german localization * Fresh Start Challenge * Update src/locales/de/move-trigger.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Bug] Remove redundant damage number popups (#3024) * Remove magic number from Belly Drum's attr * Remove redundant damage number popup * Fix merge issue and remove another duplicate damage number instance * [Move] Implements Conversion 2 (#2943) * Creates function to get type resistances, implements conversion 2 * Removes unimplemented tag, adds condition for move history to exist * Cleans up type selection, creates i18n entries for typeChanged * Uses typeChanged i18n in Conversion move * More detailed docs, early return with stellar/unknown type * Adds note that it wont track type-changing moves properly * Rephrases doc description, adds partial since it can't track type-changing moves * Updates localization, removes typeChanged entry to use move-trigger entry * Missed locale de entry in last commit * Adds comment for reason of .partial() * Fixes localization error due to revert, removes improper merge conflict from prior commit * [BUG] Fixes bug with Metronome freezing the game (#2819) * Tests MovePhase with new PokemonMove instead of moveset search * Accounts for metronome call on charging moves * Update comment in ChargeAttr to be clearer * Add missing passive background graphic for legacy UI Relating to #2497 , this adds an identical graphic to the legacy UI files, as it will show up as a missing texture otherwise. * [Localization] Localize ability messages in ability.ts (trigger, apply...) (#2972) * localize ability messages * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Modify parameter name, fix eslint * Korean Translation, modify some wrong param * Add missed message * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update ability-trigger.ts (Partial) (Italian) * Localize type name * Localize type name > Libero, Protean * param bug fix * Update src/data/ability.ts * Update zh-cn * Update ability-trigger.ts (Partial part 2, still not completed) (Italian) * Update src/locales/fr/ability-trigger.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/ability-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/fr/ability-trigger.ts Co-authored-by: Lugiad' --------- Co-authored-by: 송지원 Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira * Update egg.ts (italian) (#3038) * [Sprite] Revert Larvesta, fixing stray pixels (#3042) * [Sprite] Remove normal Larvesta stray pixels Taken from original commit * [Sprite] Revert shiny Larvesta stray pixels Taken from original commit * [Sprite] Match variant Larvesta colours * [Bug] Fix level 100 moves being skipped if leveled past 100 (#3040) * [Bug][Fix][Surf][Muddy Water][Sludge Wave][Animation] Added image to move animations. (#3044) * Update muddy-water.json * Update sludge-wave.json * Update surf.json * [Sprite] Fix Cofagrigus sprite (#3045) * Fix Cofagrigus sprite * Base sprite fix * Created json variant file... manually * Fix FR typo (#3051) * [Beta][Localization] Update Portuguese battler-tags.ts and battle.ts (#3050) * [Music/BGM] Fix bgm file & loop for battle_rival (#3053) * stop loading pride-update banner (#3057) * [Item] Add Scope Lens and Leek (#2666) * [Item] Add Scope Lens and Leek * Add Entry to pt_BR * Localize for pt_BR Co-authored-by: José Ricardo Fleury Oliveira * Fix & Clean Unit Tests --------- Co-authored-by: José Ricardo Fleury Oliveira * [Music/BGM] New music added for the "Slum" biome, composed by Andr06 (#3000) * Replacement of the BGM in the slum biome (by Andr06) * Modification of BGM credits in README.md * Replacement of the BGM name by the title chosen by its composer in all languages * Update BGM loop point for biome 'SLUM' * [Bug] implemented multi target damage penalty (#2329) * fix: damage multiplier by the number of targets * fix: used actual number value rather than the number holder * test: added unit test for counting targets * multi-target: fixed names of the unit tests. * test: simple-test changes * test: changed multi-target test code * test: testing damage decreasement * test: multi-target test fix * resolved conflicts in test --------- Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> * [BUG] Uturn faint switch bug fix (#2980) * reordering adding switch phases for u-turn * reverting some temp changes * generalizing function * adding PR suggestions * nit indenting * [Sprite] Remove extra Oinkologne sprites (#3067) * Delete public/images/pokemon/female/916.png * Delete public/images/pokemon/exp/female/916.json * Delete public/images/pokemon/exp/female/916.png * Delete public/images/pokemon/female/916.json * [Sprite] Mega Mewtwo sprite fixes (#3065) * [Sprite] Add static epic Mega Mewtwo Y Colours taken from exp, as consistent/exp rare backs share palettes. * [Sprite] Fix transparent pixels on Mega Mewtwo X * [Sprite] Fix transparent pixels on Mega Mewtwo X * [Sprite] Add static epic Mega Mewtwo Y Now exists, and is a paletteswap * [Music/BGM] New music added for the "Sea" biome, composed by Andr06 (#3063) * Replacement of the BGM in the sea biome (by Andr06) * Modification of BGM credits in README.md * Replacement of the BGM name by the title chosen by its composer in all languages * Update BGM loop point for biome 'SEA' * [Balance] Add 12 new TMs and remove 3 (#2733) * Added Counter TM * Counter, Aqua Tail, Gastro Acid, Pluck, Secret Power, Aurora Veil, Incinerate * Placed TMs in proper order, added to pool * Add Secret Power to the pool * Add TM for Synthesis * Covet, Heal Bell, PUPunch, Recycle, Volt Tackle, Worry Seed * Remove species specific TMs * Remove Secret Power TM until implementation * [Refactor/Test] Update Dynamax Cannon Unit Tests (#3074) * [Refactor/Test] Update Dynamax Cannon Unit Tests * Adjust Test Names * fix: update SameSite attribute in setCookie function to None * fix: update SameSite attribute in setCookie function to Strict * feat: Add prompt=none to Discord OAuth authorization URL * fix: Remove unnecessary cookie setting in LoginPhase and MenuUiHandler * feat: Improve cookie handling in getCookie function * feat: Delete duplicate cookies with the same name in getCookie function * [Localization] Add minor Korean translations to ability-trigger file (trace) (#3093) * modify trace trigger description (refered from official translation) modify trace trigger description (refered from official translation) * modify trace trigger description (refered from official translation) modify trace trigger description (refered from official translation) * Fix broken `multi_target` tests and remove RNG-based failures (#3095) * Prevent RNG from breaking the Quick Draw tests (#3096) * Make EXP boosting items stack additively and not multiplicatively (#3094) Fixes #2040 * [Bug] Fixes Encore bug with multi-target moves missing (#3060) * Pushes move history even when multi target move misses * Move pushMoveHistory out of Move Pending condition * Add remaining relearn moves (#2894) * [Enhancement] Decouple move accuracy and accuracy multiplier calculation from phases.ts (#2899) * refactor accuracy calc * update doc * move accuracy multiplier calculation outside phases * update wonder skin unit test * rename method * add docs * add unit tests * address feedback * rename method * fix imports * improve tests * add test for ohko move accuracy * [Sprite] Fix a number of sprite issues including the Zubat line, Goldeen, Golett, Dudunsparce, H-Sneasel, Garchomp, Sylveon, Marshadow (#3069) * Batfix, Goldeen, Chomp, Golett, genies * Fix Dudunsparce using Reborn shiny backsprite for whatever reason * Fix female Hisuian Sneasel missing variants * Marshadow epic front and Zenith, Sylveon back * Fix Zubat line back sprite inconsistencies * Fix Noivern shiny back * [Move] Finish implementation of Glaive Rush (#2720) * Finish implementation of Glaive Rush * Fix test RNG * Add code/test for Multi-Lens interaction * Fix off-by-one error in test caused by rounding issues * Update for code changes * Fix BattlerTag name * [Bug] fix not changing moveset after add to starter #1932 (#2396) * [Bug] Enemies can properly use stuff cheeks (#3090) * [Feature] Added pokemon nicknames/renaming (#2570) * Added basic temp renaming * Made nickname persistant after reloading * Localization and cancel button * Fixed instant rename on active pokemon * Small bugfix to prevent console errors * Changed logic to use the new nickname field. Replaced most .name with getNameToRender() for display. * Changed evolution message. Removed log messagesc * Added localization keys for other languages * Removed empty lines * French translation Co-authored-by: Lugiad' * Chinese translation Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Portuguese (Brazil) translation Co-authored-by: José Ricardo Fleury Oliveira * Korean translation Co-authored-by: Enoch * Update menu.ts * Update menu.ts [Localization(it)] * Changed most .getNameToRender() instance to getPokemonNameWithAffix() * Changed wild encounter messages back to just use the name without affix. * Added localization for the party ui rename selection * Escaping nickname characters to support all characters * Better Error handling * Update src/field/pokemon.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Sprite] Show Partner Eevee variants (#3097) * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants * Allow Necrozma forms to play their special music (#3054) * [BUG] fixing multi-hit and move messages on faint (#2981) * fixing order of messages, scences, to render messages before fainting * updated fix for effectiveness text rendering order for multi hit moves * fixing messages not appearing for multi-hit moves on faint * updated multi-hit condition) * fixing PR conflicts * adding comments and FaintPhase setPhaseQueueSplice bug, fixing overrides merge conflict * writing better comments * removing space diff in overrides * adding fainting check for self damage moves * emergency fixing broken last commit * additional comments for multi-hit problem * updating comments, jsdoc style * fixing linter, destiny bond errors * splitting up varaible comments to be in JSDoc format * fixing tests and merge mistakes * adding rendering of multihit moves that only hit once * fixing comment formatting_tabs and spaces --------- Co-authored-by: Benjamin Odom * [Bug] Sheer Force/Serene Grace Flyout Bugfix (#2496) * Disable Show Ability for Serene Grace and Sheer Force when opponent calculates targetBenefitScore * Add comment and definition to argument * [Visual] Achievement icons (#2617) * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas * Update item atlas again This time, after merging main into the PR. * [Sprite] Show Partner Eevee variants (#3097) * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Allow Necrozma forms to play their special music (#3054) * Allow Necrozma forms to play their special music (#3054) * MonoGen Ribbons added * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Updated texture files? I think * Changed image names and added new localizations for syntax * Fixed typedoc issues * Revert "Text Changes to MonoGen Challenges" This reverts commit 3bf79acc6a797b0e28e68e113e644b30096ea9ce. * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * MonoGen Ribbons added * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Updated texture files? I think * Changed image names and added new localizations for syntax * Fixed typedoc issues * Revert "Text Changes to MonoGen Challenges" This reverts commit 3bf79acc6a797b0e28e68e113e644b30096ea9ce. * Please fix this. * Revert "[Feature] replace bug-report template with form (#2772)" This reverts commit aa69b107778123b2173bee6130e5d172d201b637. --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: Madmadness65 Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * Re-add changes accidentally deleted by #2617 * Fix some broken images in item atlas & achievement Fixed the broken sprites in the item atlas, and fixed the Baton Pass achievement to use the Baton item now (it was broken by the Leek being renamed). Also resized the Baton item image to 32*32, like all the other items. * fix: Remove unnecessary cookie setting in removeCookie function * fix: Update removeCookie function to use Max-Age=-1 instead of Expires header The removeCookie function was updated to use the Max-Age=-1 attribute instead of setting the Expires header to a past date. This change ensures that the cookie is immediately expired when removed, preventing any potential login loops. Additionally, a legacy cookie without a domain was added to handle older cookies. This commit resolves the unnecessary cookie setting in the removeCookie function. * [QoL] Starter UI selection update to allow removing specific pokemon from party (#1983) * Initial commits with logic to remove starters if they're in your party. Still need to make it work so that the starter selection cursor disappears when a starter is unselected * Updated code to be able to remove pokemon, including the side icons and cursor locations * Fixed popstarter to work with any index * Updating code to allow navigation of starter icons * Updating code to allow navigation of party starter icons * Updaing navigation of party icons * Updated logic to fix incorrect icon in top left of pokemon options when navigating the starter icons * Updated logic to include the ability to navigate and interact with the starter icons * Forgot to push the actual starter-select-ui-handler. Might be a bit hard to test things out without that :) * Removed some unnecessary comments * Fixed small bug with not being able to move from the far right to the gen selection when the starter icons were empty * Updated code to not be using a method to generate the party menu and made it more like it used to be. This should help with merge conflicts in the future * I committed the merged version but forgot to make the starter-select-ui-handler staged after making the changes * Accidentally broke challenges that had a specific typing requirement with last commit. This should fix it * Changed how navigation worked based on popular demand * Fixed code review comments * Accidentally left in a whole block of commented code. Intentionally removing it now * Started adding logic for mono type challenge runs to not break the game if the user tries to start a run with an invalid party * Updated the text to say the party is invalid * Updated logic to make invalid pokemon greyed out when no valid pokemon are in your party * Added comments on some code * Updated locales to include the key for trying to start with invalid parties during a challenge * Fixed some code from a bad merge where a challenge related param that was previously a number now needed to be a boolean and wasn't * Removed comment as per review * [Bug] Ability changing on evolution fix (#2995) * Prevent Pokemon with their second ability from evolving into their HA * Add check for fusions too * Localization(pt): Updated move.ts (#3078) * Localization(pt): Updated move.ts and fixed King's Shield * more fixes * [Bug] Enemy pokemon's Harvest creates berry icons on the player's side when triggered (#3077) * [Bug] Fix hustle not applying attack boost (#3101) * [Sprite] Mega Latis using opposite's eye colour (#3102) * [Sprite] Mega Latis using opposite eyes Taken from counterpart Lati * [Sprite] Update Mega Latios eyes * [Sprite] Update Mega Latias eyes * [Sprite] Mega Latias duplicated palette value Colour taken from non-exp Mega Latias * [Bug] Fix Thousand Arrows not hitting targets under the effects of Magnet Rise (#3100) * Fix Thousand Arrows not hitting through Magnet Rise * Add integration test for Thousand Arrows vs. Magnet Rise * ESLint * Remove unnecessary checks in integration tests * [Move] Aeroblast is a wind move (#3109) * Hardcoded Pokemon should have proper names * Aeroblast is a wind move * [Refactor] Replaces the single and double battles overrides with a single override (#3104) `SINGLE_BATTLE_OVERRIDE` and `DOUBLE_BATTLE_OVERRIDE` are now `BATTLE_TYPE` Also updates all uses of the old overrides with the new one * fix `Overrides` capitalization (#3111) * [Balance] More TM fixes (#3081) * More TM fixes * Leaf Storm * Removed sexy matcha * [Refactor] Code readability update (#3085) * Clean up/clarify `src/field/pokemon.ts` a bit Code provided by DerTapp on Discord * Update `PokemonSpeciesForm.getAbilityCount()` * Update `PokemonSpeciesForm.getAbility()` * Add explicit `Abilities.NONE` checks * Add tests * Add jsdoc and implement test suggestions * [Move] Implement Stockpile, Spit Up, Swallow (#2960) * feat: Implement Stockpile, Spit Up, Swallow * chore: Minor, likely unnecessary null checks * feat: Localization * Undo non-English localizations (unsure if they went through proper channels) * ko localization from @EnochG1 Co-authored-by: Enoch * linting fix * add tests, tiny (non-functional) tweaks * Remove unnecessary cast * Update src/data/move.ts (oops) * remove some unnecessary comments, rename something for clarity --------- Co-authored-by: Enoch * [Bug] Remove ability swap code in `PlayerPokemon.evolve()` (#3113) * [Test] Add test for rollout move (#3114) * add test for rollout move Co-authored-by: Zach Day * fix tests still using `SINGLE_BATTLE_OVERRIDE` --------- Co-authored-by: Zach Day * [Bug][Beta] Fix Hyper Beam, etc. permanently recharging (#3115) * Fix Hyper Beam, etc. permanently recharging * Fix override in hyper beam test * [QoL] New Starter Select UI with Filter (#2916) * update images for new UI * add updated starter UI with filter code * update starter-select test code * update win filter condition to pass test * remove unnecessary console log * update test code to match current filter UI * merge update * apply bugfix & chrry-pick small issues fix which are handled beta branch * resolve conflicts * fix lint errors * Fixed a bug where the target location for escaping using the left and right buttons on the starter button did not account for scrolling * update filter bar label color change when activated * fix lint error * fix lint * fix octolock.text.ts. it looks override import error. idk why it is happend in this PR. but it looks ok now * add passive dropdown in unlocks filter * fix lint * fix double button sound bug. refactoring genSpecies -> allSpecies, starterContainers -> starterContainer which are remove unnecessary generation axis * optimize updateStarterValueLabel function which is bottleneck of UI update latency * apply translation of gen filter label. fix lint * add # candies sort option * merge beta * resolve confilcts * fix offset of starter and start cursor * make compatible with starter UI * add missing feature * add images for legacy UI. adjust the position and size of the starterContainerWindow * [Localization] Implement Form localization (#3030) * Implement Pokemon forms localization * Update French pokemon-form.ts * Update French pokemon-form.ts * Update pokemon-form.ts * Add battle forms korean translation from returntoice Co-authored-by: returntoice * Add cosplay forms korean translation from returntoice Co-authored-by: returntoice * Add pichu form korean translation from returntoice Co-authored-by: returntoice * Add castform forms korean translation by returntoice Co-authored-by: returntoice * Add remaining forms korean translation by returntoice Co-authored-by: returntoice * French typo corrections pokemon-form.ts * Update Korean pokemon-form.ts * Modify froakiBattleBond like rockruff of OwnTempo case, it is froakie, not greninja. * Modify zygardePc Power construct is more important information Switch its position to 50% or 10% to avoid overlapping with the sprite * Modify mispelling * Added german forms * Changed Gigadynamax and Unendynamax so it fits at all * Add partner pikachu and eevee form localization * Add mimikyu forms localization * Partner Pikachu, Partner Evoli und Mimikyu Formen hinzugefügt * Update pokemon-form.ts * Update partners * Fix conflicts * Fix useless ? by flx-sta Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fix switch use by flx-sta * Fix conflicts * Please work !!!!!!! * Update src/locales/fr/pokemon-form.ts Co-authored-by: Lugiad' * Update src/locales/fr/pokemon-form.ts Co-authored-by: Lugiad' * Add pt_br primal localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br pikachu localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br castform localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br 3g localization Co-authored-by: José Ricardo Fleury Oliveira * Add zh_cn localization Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Add pt_br other localization Co-authored-by: José Ricardo Fleury Oliveira * Add es castform localization Co-authored-by: InnocentGameDev * Add es burmy localization Co-authored-by: InnocentGameDev * Add es shellos localization Co-authored-by: InnocentGameDev * Add es rotom localization Co-authored-by: InnocentGameDev * Add es basculin localization Co-authored-by: InnocentGameDev * Add es deerling localization Co-authored-by: InnocentGameDev * Add es froakie localization Co-authored-by: InnocentGameDev * Add es scatterbug localization Co-authored-by: InnocentGameDev * Add es furfrou localization Co-authored-by: InnocentGameDev * Add es xerneas localization Co-authored-by: InnocentGameDev * Add es zygarde localization Co-authored-by: InnocentGameDev * Add es pumpkaboo localization Co-authored-by: InnocentGameDev * Add es flabebe localization Co-authored-by: InnocentGameDev * Add es oricorio localization Co-authored-by: InnocentGameDev * Add es minior localization Co-authored-by: InnocentGameDev * Add es magearna localization Co-authored-by: InnocentGameDev * Add es marshadow localization Co-authored-by: InnocentGameDev * Add es sinistea ocalization Co-authored-by: InnocentGameDev * Add es eiscue localization Co-authored-by: InnocentGameDev * Add es indeedee localization Co-authored-by: InnocentGameDev * Add es rockruff localization Co-authored-by: InnocentGameDev * Add es mimikyu localization Co-authored-by: InnocentGameDev * Add es zarude localization Co-authored-by: InnocentGameDev * Add es squawkabilly localization Co-authored-by: InnocentGameDev * Add es tatsugiri localization Co-authored-by: InnocentGameDev * Add es gimmighoul localization Co-authored-by: InnocentGameDev * Add es poltchageit localization Co-authored-by: InnocentGameDev * Add es paldeaTauros localization Co-authored-by: InnocentGameDev * Add es primal localization Co-authored-by: InnocentGameDev * Add es pikachu localization Co-authored-by: InnocentGameDev * Add es partner localization Co-authored-by: InnocentGameDev * Fix typedocs error * Fix typedocs error * cn form prefix added Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Fix german translate error * Fix typo Zh_CN Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update pokemon-form.ts [Localization(it)] * Update src/locales/es/pokemon-form.ts Co-authored-by: InnocentGameDev * Fix megas forms bug and add forgotten forms * Fix wrong ko config * Add fr localization for new forms Co-authored-by: Lugiad' * Add de localization for new forms Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Remove forgotten debug line Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Optimize battle forms * Update pokemon-form.ts (additional forms, italian localization) * The same typo is in the zh_TW placeholder text too. Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * Fix forgotten megaY Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Add capitalizeString to utils * Fix typedoc error * Update src/data/pokemon-species.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Add ko localization for new forms Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> --------- Co-authored-by: Lugiad Co-authored-by: returntoice Co-authored-by: Mr.WaterT Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: Benjamin Odom Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: InnocentGameDev Co-authored-by: EnochG1 Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * [Move] Fully implement Jungle Healing/Lunar Blessing status heal (#2785) * [Bug] Fix tags not resetting on switch (#3119) Fixes #2982 * [Move] Water Shuriken guarantees 3 hits with battle bond (#2687) * [Bug] Make on-summon abilities trigger after the switch check (#3118) * Make on-summon abilities trigger after the switch check * Add test * [Ability] Cloud Nine now displays a message on activation Maintains parity with Air Lock. Both of these probably need to be localized. Should fix issue 491 though * [QoL] Summary Option for Caught Pokemon (#2921) * Option to view Summary before adding new Pokemon to party * Fixed issues described by HopsWas * Adjusted makeRoomForConfirmUi to improve window spacing * Fixed ESLint issue + addressed OrangeRed review * Fixed Github pages issue * Removed duplicate unshiftPhase * Fixed phase order * Don't start from beginning of catch function * Option to view Summary before adding new Pokemon to party * Fixed issues described by HopsWas * Adjusted makeRoomForConfirmUi to improve window spacing * Fixed Github pages issue * Fixed phase order * Quick fix * This should fix the summaryOption feature without bugging confirm-ui-handler in other cases * Revert "Merge remote-tracking branch 'origin/summaryOption1' into summaryOption1" This reverts commit ea7d0ce59e3f5631a8ef3d76646069a3945ed036, reversing changes made to 4c565958dafe6904925015ed7100e4940f041213. * Added a better conditional that reflects its source and purpose --------- Co-authored-by: Frutescens Co-authored-by: AJ Fontaine * [Bug] Fix HP rounding issues (#2968) * [Bug] Fixes bug with frenzy moves keeping the confusion counter despite disruption (#3041) * Adds frenzyMissFunc trigger on NO_EFFECT hit result * Refactors FrenzyAttr to properly lapse tags each turn and remove tags on disrupt * Makes comment on CONFUSED tag clearer * Changes all integer usages to number in battler-tags * Update getBattlerTag function to use number instead of integer * [Tests] Updating Leftovers test (#3123) * Bug Fix * Update src/system/game-stats.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fixing a test * Fixed import * Revert "Bug Fix" This reverts commit 834844978ef2583b00555969a99b3071c47a19d9. --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Localization] Correctly Localized German names of the BGM for Evil Teams (#3124) * [Bug] Game Stats Sub-Legendary NaN bug for new game files (#3122) * Bug Fix * Update src/system/game-stats.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fixing a test * Revert "Fixing a test" This reverts commit 1bdbe2da5a7e29dce17911eb7c1084de44328573. * Test Re-Run --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Bug] Adjust how counter attacks target to account for uturn/voltswitch and double battles (#2462) * Adjust how counter attacks target to account for uturn/voltswitch * Creates move flag for metal burst/comeuppance to redirect in some cases * Remove debug printing * Bit shifts the redirect counter flag * Removes extraneous class from prior testing * Remove vitest timestamp file that was accidentally added * [Misc] Change fresh start achievement icon to reviver seed Mystic ticket icons in the achievements just confuse players * [Balance] Fix N-Solarizer etc appearing without secondary mon registered in dex (#2713) * Fix reins et al being available without unlocking second mon * Small fix * Parentheses for safety * Add documentation to new function * Bug Fix (#3129) Co-authored-by: Frutescens * [Bug] Fixed OHKO moves being affected by accuracy and evasion battle stats (#3117) * Fixed OHKO moves being affected by accuracy and evasion battle stats * Added related tests for Fissure, unskipped related test for Hustle * Tweaked fissure accuracy and evasion tests to use spyOn() for getAccuracyMultiplier() as per feedback * Fixed accuracy test for Fissure * [Fix][Sprite] Politoed Back Sprites (#3130) * [Fix][Sprite] Politoed Back Sprites Retrieved first version from history. Rearranged frames to make jump a little less floaty. Set same anim length for all variations. Json is identical for all variations. Spritesheet frame position is identical for all variations. Trimmed the frame of extra space Reduced file size of spritesheets and JSON due to less unique frames needed. * [Fix][Sprite] Politoed Back Sprites - Reformatted JSON to texturepacker standard Reformatted json. * [Bug] Hotfix for Starter select UI with Filter (#3121) * fix remove pokemon menu * fix dropdown all is not changing bug * fix bug when go down with no starter on start button * fix starter corsor bug on deletion. out of screen cursor bug * fix challenge log * fix lint error * [Bug] fix and condition of shiny and passive (#3136) * change param name (because beta was changed) * add config and fix message main key * change message key in pokemon.ts * modify test message (also same as og game) * Fixed form names not working in starter select (#3139) * [Bug] Prevent evolution causing a swap from the second ability to the HA (#3138) * Prevent evolution causing a swap from the second ability to the HA * Add tests * Update `starter-select-ui-handler.ts` * [Feature] [Item] Add White Herb item (#2719) * More work * More work * Should be finished * Fixed an error in checking target * Moved white herb effect to StatChangePhase, 50% chance of consumption * Added graphics for White Herb * Balance and documentation * Add localization entry for White Herb apply msg * Add new keys to other localization files * German translations Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update item sprite atlas * Redo item atlas * Remove whitespace in move.ts * Moved decrement outside conditional * Fix item atlas --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * [Localization] Translated missing portuguese entries and some fixes (#3142) * [Bug] Caught Pokemon Summary-Modifier Display Fix (#3145) * Fixed modifiers not displaying on summary screen * Addressed Typedoc issues * Documentation added --------- Co-authored-by: Frutescens * add missing text key * [BUG] Fixes bug that prevents pokemon with froms from hatching as rare/epic shiny variant and preventing illegal variants from legendary gacha (#2940) * Changed PokemonSpecies hasVariants function to also include for pokemon with differend forms * Added check to prevent illegal shiny variants from happening if the egg rolls the gacha legendary and has no variants * Simplified variant check. Fixed spelling on unit test * Bugfix for legacy eggs * Removed formIndex variable * Changed unit test * Added new line to unit test function Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --------- Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Unittest] remove held item rng (white herb) from intimidate.test.ts (#3151) * Emergency delete unlock all functionality - should remove the unlock all functionality but keeps the isBeta utils function for future stuff (#3153) * Update `getAbility()` and `getAbilityCount()` for the ability changes (#3157) * Update src/data/arena-tag.ts Co-authored-by: sirzento * Update src/locales/zh_CN/arena-tag.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * change message key of stickyWebActivateTrap (due to change of original) * Update src/locales/fr/arena-tag.ts Co-authored-by: Lugiad' --------- Co-authored-by: Frederico Santos Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Felix Staud Co-authored-by: Adrian T <68144167+torranx@users.noreply.github.com> Co-authored-by: lnuvy Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Co-authored-by: Xavion3 Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Dakurei Co-authored-by: Alexis Co-authored-by: 송지원 Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Mr.WaterT Co-authored-by: Alexis Faizeau Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: Arxxer Co-authored-by: Lugiad' Co-authored-by: InnocentGameDev Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> Co-authored-by: Dmitriy K Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: RimKnight Co-authored-by: xsn34kzx Co-authored-by: Amani H <109637146+xsn34kzx@users.noreply.github.com> Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: hayuna Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: EmberCM Co-authored-by: Opaque02 <66582645+Opaque02@users.noreply.github.com> Co-authored-by: mcmontag <54485715+mcmontag@users.noreply.github.com> Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Co-authored-by: Arxalc <63990624+Arxalc@users.noreply.github.com> Co-authored-by: Mumble Co-authored-by: Frutescens Co-authored-by: EmberCM Co-authored-by: Zoruu <113668528+ArielStevens@users.noreply.github.com> Co-authored-by: Corrade <49605314+Corrade@users.noreply.github.com> Co-authored-by: Madmadness65 Co-authored-by: cam Co-authored-by: 송영진 <36808515+bucket1582@users.noreply.github.com> Co-authored-by: DustinLin <39450497+DustinLin@users.noreply.github.com> Co-authored-by: 서명인 (Myungin, SEO) <65226760+smee6@users.noreply.github.com> Co-authored-by: gjeodnd12165 <61226524+gjeodnd12165@users.noreply.github.com> Co-authored-by: sirzento Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Co-authored-by: Benjamin Odom Co-authored-by: Daniel Gaston Co-authored-by: Zach Day Co-authored-by: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Co-authored-by: Kiriox <66013753+Kiriox94@users.noreply.github.com> Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> Co-authored-by: AJ Fontaine --- src/data/arena-tag.ts | 67 ++++++++++++++---------------- src/field/pokemon.ts | 2 +- src/locales/de/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/de/config.ts | 2 + src/locales/en/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/en/config.ts | 2 + src/locales/en/status-effect.ts | 12 +++--- src/locales/es/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/es/config.ts | 2 + src/locales/fr/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/fr/config.ts | 2 + src/locales/it/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/it/config.ts | 2 + src/locales/it/status-effect.ts | 12 +++--- src/locales/ko/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/ko/config.ts | 2 + src/locales/pt_BR/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/pt_BR/config.ts | 2 + src/locales/zh_CN/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/zh_CN/config.ts | 2 + src/locales/zh_TW/arena-tag.ts | 50 ++++++++++++++++++++++ src/locales/zh_TW/config.ts | 2 + src/locales/zh_TW/status-effect.ts | 12 +++--- src/test/items/toxic_orb.test.ts | 2 +- 24 files changed, 520 insertions(+), 55 deletions(-) create mode 100644 src/locales/de/arena-tag.ts create mode 100644 src/locales/en/arena-tag.ts create mode 100644 src/locales/es/arena-tag.ts create mode 100644 src/locales/fr/arena-tag.ts create mode 100644 src/locales/it/arena-tag.ts create mode 100644 src/locales/ko/arena-tag.ts create mode 100644 src/locales/pt_BR/arena-tag.ts create mode 100644 src/locales/zh_CN/arena-tag.ts create mode 100644 src/locales/zh_TW/arena-tag.ts diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index d678f36c802..fd72ab21026 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -2,7 +2,7 @@ import { Arena } from "../field/arena"; import { Type } from "./type"; import * as Utils from "../utils"; import { MoveCategory, allMoves, MoveTarget } from "./move"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; @@ -46,7 +46,7 @@ export abstract class ArenaTag { onRemove(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: this.getMoveName() })); } } @@ -77,14 +77,14 @@ export class MistTag extends ArenaTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!")); + arena.scene.queueMessage(i18next.t("arenaTag:mistOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); } } apply(arena: Arena, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; - arena.scene.queueMessage("The mist prevented\nthe lowering of stats!"); + arena.scene.queueMessage(i18next.t("arenaTag:mistApply")); return true; } @@ -144,7 +144,7 @@ class ReflectTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -160,7 +160,7 @@ class LightScreenTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -176,7 +176,7 @@ class AuroraVeilTag extends WeakenMoveScreenTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); + arena.scene.queueMessage(i18next.t(`arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -198,7 +198,7 @@ abstract class ConditionalProtectTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(`${super.getMoveName()} protected${this.side === ArenaTagSide.PLAYER ? " your" : this.side === ArenaTagSide.ENEMY ? " the\nopposing" : ""} team!`); + arena.scene.queueMessage(i18next.t(`arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: super.getMoveName() })); } // Removes default message for effect removal @@ -223,7 +223,7 @@ abstract class ConditionalProtectTag extends ArenaTag { && this.protectConditionFunc(...args.slice(2))) { (args[0] as Utils.BooleanHolder).value = true; new CommonBattleAnim(CommonAnim.PROTECT, target).play(arena.scene); - arena.scene.queueMessage(`${super.getMoveName()} protected ${getPokemonMessage(target, "!")}`); + arena.scene.queueMessage(i18next.t("arenaTag:conditionalProtectApply", { moveName: super.getMoveName(), pokemonNameWithAffix: getPokemonNameWithAffix(target) })); return true; } return false; @@ -281,7 +281,7 @@ class MatBlockTag extends ConditionalProtectTag { onAdd(arena: Arena) { const source = arena.scene.getPokemonById(this.sourceId); - arena.scene.queueMessage(getPokemonMessage(source, " intends to flip up a mat\nand block incoming attacks!")); + arena.scene.queueMessage(i18next.t("arenaTag:matBlockOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); } } @@ -319,7 +319,7 @@ class WishTag extends ArenaTag { onAdd(arena: Arena): void { const user = arena.scene.getPokemonById(this.sourceId); this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = getPokemonMessage(user, "'s wish\ncame true!"); + this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) }); this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); } @@ -373,11 +373,11 @@ class MudSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Electricity's power was weakened!"); + arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The effects of Mud Sport\nhave faded."); + arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnRemove")); } } @@ -391,11 +391,11 @@ class WaterSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Fire's power was weakened!"); + arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The effects of Water Sport\nhave faded."); + arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnRemove")); } } @@ -463,7 +463,7 @@ class SpikesTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + arena.scene.queueMessage(i18next.t("arenaTag:spikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -476,7 +476,7 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is hurt\nby the spikes!")); + pokemon.scene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -508,7 +508,7 @@ class ToxicSpikesTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); + arena.scene.queueMessage(i18next.t("arenaTag:toxicSpikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -523,12 +523,12 @@ class ToxicSpikesTag extends ArenaTrapTag { if (pokemon.isOfType(Type.POISON)) { this.neutralized = true; if (pokemon.scene.arena.removeTag(this.tagType)) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` absorbed the ${this.getMoveName()}!`)); + pokemon.scene.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, `the ${this.getMoveName()}`)) { + if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName())) { return true; } } @@ -590,7 +590,7 @@ class StealthRockTag extends ArenaTrapTag { const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`Pointed stones float in the air\naround ${source.getOpponentDescriptor()}!`); + arena.scene.queueMessage(i18next.t("arenaTag:stealthRockOnAdd", { opponentDesc: source.getOpponentDescriptor() })); } } @@ -635,7 +635,7 @@ class StealthRockTag extends ArenaTrapTag { if (damageHpRatio) { const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(`Pointed stones dug into\n${getPokemonNameWithAffix(pokemon)}!`); + pokemon.scene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -663,12 +663,9 @@ class StickyWebTag extends ArenaTrapTag { onAdd(arena: Arena, quiet: boolean = false): void { super.onAdd(arena); - - // does not seem to be used anywhere - // eslint-disable-next-line @typescript-eslint/no-unused-vars const source = arena.scene.getPokemonById(this.sourceId); if (!quiet) { - arena.scene.queueMessage(`A ${this.getMoveName()} has been laid out on the ground around the opposing team!`); + arena.scene.queueMessage(i18next.t("arenaTag:stickyWebOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); } } @@ -677,7 +674,7 @@ class StickyWebTag extends ArenaTrapTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.scene.queueMessage(`The opposing ${pokemon.getNameToRender()} was caught in a sticky web!`); + pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); const statLevels = new Utils.NumberHolder(-1); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value)); } @@ -705,11 +702,11 @@ export class TrickRoomTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(getPokemonMessage(arena.scene.getPokemonById(this.sourceId), " twisted\nthe dimensions!")); + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(arena.scene.getPokemonById(this.sourceId)) })); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The twisted dimensions\nreturned to normal!"); + arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); } } @@ -724,7 +721,7 @@ export class GravityTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Gravity intensified!"); + arena.scene.queueMessage(i18next.t("arenaTag:gravityOnAdd")); arena.scene.getField(true).forEach((pokemon) => { if (pokemon !== null) { pokemon.removeTag(BattlerTagType.MAGNET_RISEN); @@ -733,7 +730,7 @@ export class GravityTag extends ArenaTag { } onRemove(arena: Arena): void { - arena.scene.queueMessage("Gravity returned to normal!"); + arena.scene.queueMessage(i18next.t("arenaTag:gravityOnRemove")); } } @@ -749,7 +746,7 @@ class TailwindTag extends ArenaTag { onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? "\nyour" : this.side === ArenaTagSide.ENEMY ? "\nthe opposing" : ""} team!`); + arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } const source = arena.scene.getPokemonById(this.sourceId); @@ -771,7 +768,7 @@ class TailwindTag extends ArenaTag { onRemove(arena: Arena, quiet: boolean = false): void { if (!quiet) { - arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? "Your" : this.side === ArenaTagSide.ENEMY ? "The opposing" : ""} team's Tailwind petered out!`); + arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); } } } @@ -786,11 +783,11 @@ class HappyHourTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage("Everyone is caught up in the happy atmosphere!"); + arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnAdd")); } onRemove(arena: Arena): void { - arena.scene.queueMessage("The atmosphere returned to normal."); + arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnRemove")); } } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 7f6c8d11e31..8d6277da7f4 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1772,7 +1772,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (opponents.length === 1) { return opponents[0].name; } - return this.isPlayer() ? "the opposing team" : "your team"; + return this.isPlayer() ? i18next.t("arenaTag:opposingTeam") : i18next.t("arenaTag:yourTeam"); } getAlly(): Pokemon { diff --git a/src/locales/de/arena-tag.ts b/src/locales/de/arena-tag.ts new file mode 100644 index 00000000000..ea6105c09ef --- /dev/null +++ b/src/locales/de/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "Pokémon auf deiner Seite", + "opposingTeam": "Pokémon auf gegnerischer Seite", + "arenaOnRemove": "Der Effekt von {{moveName}} lässt nach!", + "arenaOnRemovePlayer": "Der Effekt von {{moveName}} lässt auf deiner Seite nach!", + "arenaOnRemoveEnemy": "Der Effekt von {{moveName}} lässt auf der Seite des Gegners nach!", + "mistOnAdd": "Pokémon, die auf der Seite von {{pokemonNameWithAffix} kämpfen, werden in Weißnebel gehüllt!!", + "mistApply": "Der Weißnebel verhindert die Senkung von Statuswerten!", + "reflectOnAdd": "Reflektor stärkt Pokémon gegen physische Attacken!", + "reflectOnAddPlayer": "Reflektor stärkt Pokémon auf deiner Seite gegen physische Attacken!", + "reflectOnAddEnemy": "Reflektor stärkt gegnerische Pokémon gegen physische Attacken!", + "lightScreenOnAdd": "Lichtschild stärkt Pokémon gegen Spezial-Attacken!", + "lightScreenOnAddPlayer": "Lichtschild stärkt Pokémon, die auf deiner Seite kämpfen, gegen Spezial-Attacken!", + "lightScreenOnAddEnemy": "Lichtschild stärkt gegnerische Pokémon gegen Spezial-Attacken!", + "auroraVeilOnAdd": "Auroraschleier stärkt Pokémon gegen physische und Spezial-Attacken", + "auroraVeilOnAddPlayer": "Auroraschleier stärkt Pokémon auf deiner Seite gegen physische und Spezial-Attacken!", + "auroraVeilOnAddEnemy": "Auroraschleier stärkt gegnerische Pokémon gegen physische und Spezial-Attacken!", + "conditionalProtectOnAdd": "Die Pokémon werden von {{moveName}} behütet!", + "conditionalProtectOnAddPlayer": "Die Pokémon auf deiner Seite werden von {{moveName}} behütet!", + "conditionalProtectOnAddEnemy": "Die Pokémon auf der gegnerischen Seite werden von {{moveName}} behütet!", + "conditionalProtectApply": "{{pokemonNameWithAffix}} wird durch {{moveName}} geschützt!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} bringt seinen Tatami-Schild in Position!", + "wishTagOnAdd": "Der Wunschtraum von {{pokemonNameWithAffix}} erfüllt sich!", + "mudSportOnAdd": "Die Stärke aller Elektro-Attacken wurde reduziert!", + "mudSportOnRemove": "Lehmsuhler hört auf zu wirken!", + "waterSportOnAdd": "Die Stärke aller Feuer-Attacken wurde reduziert!", + "waterSportOnRemove": "Nassmacher hört auf zu wirken!", + "spikesOnAdd": "Die {{opponentDesc}} sind von Stacheln umgeben!", + "spikesActivateTrap": "Die {{pokemonNameWithAffix}} wurde durch Stachler verletzt!!", + "toxicSpikesOnAdd": "Die {{opponentDesc}} sind überall von giftigen Stacheln umgeben", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbiert die {{moveName}}!", + "stealthRockOnAdd": "Um die {{opponentDesc}} schweben spitze Steine!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}} wird von spitzen Steinen getroffen!!", + "stickyWebOnAdd": "Am Boden um die {{opponentDesc}} entspinnt sich ein {{moveName}}!", + "stickyWebActivateTrap": "{{pokemonName}} ist im Klebenetz gefangen!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} hat die Dimensionen verdreht!", + "trickRoomOnRemove": "Die verdrehte Dimension ist wieder normal!", + "gravityOnAdd": "Die Erdanziehung wurde verstärkt!", + "gravityOnRemove": "Die Erdanziehung ist wieder normal!", + "tailwindOnAdd": "Die Pokémon erhalten Rückenwind!", + "tailwindOnAddPlayer": "Die Pokémon, die auf deiner Seite kämpfen, erhalten Rückenwind!", + "tailwindOnAddEnemy": "Die gegnerischen Pokémon erhalten Rückenwind!", + "tailwindOnRemove": "Der Rückenwind hat sich gelegt!", + "tailwindOnRemovePlayer": "Der Rückenwind auf deiner Seite hat sich gelegt!", + "tailwindOnRemoveEnemy": "Der Rückenwind auf gegnerischer Seite hat sich gelegt!", + "happyHourOnAdd": "Goldene Zeiten sind angebrochen!", + "happyHourOnRemove": "Die goldenen Zeiten sind vorbei!", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 940e3927bfd..d14eae3b77c 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const deConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/en/arena-tag.ts b/src/locales/en/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/en/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", + "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", + "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", + "happyHourOnRemove": "The atmosphere returned to normal.", +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 970bf5b71fc..8a54c565f0e 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -3,6 +3,7 @@ import { settings } from "./settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const enConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/en/status-effect.ts b/src/locales/en/status-effect.ts index 162b2ada281..5914fc27298 100644 --- a/src/locales/en/status-effect.ts +++ b/src/locales/en/status-effect.ts @@ -14,7 +14,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Poison", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -23,7 +23,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Toxic", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -32,7 +32,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Paralysis", description: "paralysis", obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}}!\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by the {{sourceText}}!\nIt may be unable to move!", activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" @@ -41,7 +41,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Sleep", description: "sleep", obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is fast asleep.", overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", heal: "{{pokemonNameWithAffix}} woke up!" @@ -50,7 +50,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Freeze", description: "freezing", obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", heal: "{{pokemonNameWithAffix}} was\ndefrosted!" @@ -59,7 +59,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Burn", description: "burn", obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", overlap: "{{pokemonNameWithAffix}} is\nalready burned!", heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" diff --git a/src/locales/es/arena-tag.ts b/src/locales/es/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/es/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", + "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", + "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", + "happyHourOnRemove": "The atmosphere returned to normal.", +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index ab23a52b7bb..6cc71222761 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const esConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/fr/arena-tag.ts b/src/locales/fr/arena-tag.ts new file mode 100644 index 00000000000..cc97cb4e34f --- /dev/null +++ b/src/locales/fr/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "votre équipe", + "opposingTeam": "l’équipe adverse", + "arenaOnRemove": "L’effet de la capacité {{moveName}}\ns’est dissipé !", + "arenaOnRemovePlayer": "L’effet de la capacité {{moveName}}\ns’est dissipé sur votre équipe !", + "arenaOnRemoveEnemy": "L’effet de la capacité {{moveName}}\ns’est dissipé sur l’équipe ennemie !", + "mistOnAdd": "La brume enveloppe l’équipe\de {{pokemonNameWithAffix}} !", + "mistApply": "La brume empêche les stats de baisser !", + "reflectOnAdd": "Protection augmente la résistance\naux capacités physiques !", + "reflectOnAddPlayer": "Protection augmente la résistance\nde l’équipe aux capacités physiques !", + "reflectOnAddEnemy": "Protection augmente la résistance\nde l’équipe ennemie aux capacités physiques !", + "lightScreenOnAdd": "Mur Lumière augmente la résistance\naux capacités spéciales !", + "lightScreenOnAddPlayer": "Mur Lumière augmente la résistance\nde l’équipe aux capacités spéciales !", + "lightScreenOnAddEnemy": "Mur Lumière augmente la résistance\nde l’équipe ennemie aux capacités spéciales !", + "auroraVeilOnAdd": "Voile Aurore augmente la résistance\naux capacités physiques et spéciales !", + "auroraVeilOnAddPlayer": "Voile Aurore augmente la résistance\nde l’équipe aux capacités physiques et spéciales !", + "auroraVeilOnAddEnemy": "Voile Aurore augmente la résistance\nde l’équipe ennemie aux capacités physiques et spéciales !", + "conditionalProtectOnAdd": "La capacité {{moveName}}\nprotège l’équipe !", + "conditionalProtectOnAddPlayer": "La capacité {{moveName}}\nprotège votre équipe !", + "conditionalProtectOnAddEnemy": "La capacité {{moveName}}\nprotège l’équipe ennemie !", + "conditionalProtectApply": "{{pokemonNameWithAffix}} est protégé\npar {{moveName}} !", + "matBlockOnAdd": "{{pokemonNameWithAffix}} se prépare\nà utiliser un tatami pour bloquer les attaques !", + "wishTagOnAdd": "Le vœu de{{pokemonNameWithAffix}}\nse réalise !", + "mudSportOnAdd": "La puissance des capacités\nde type Électrik diminue !", + "mudSportOnRemove": "L’effet de Lance-Boue se dissipe !", + "waterSportOnAdd": "La puissance des capacités\nde type Feu diminue !", + "waterSportOnRemove": "L’effet de Tourniquet se dissipe !", + "spikesOnAdd": "Des {{moveName}} s’éparpillent autour de {{opponentDesc}} !", + "spikesActivateTrap": "{{pokemonNameWithAffix}} est blessé\npar les picots !", + "toxicSpikesOnAdd": "Des {{moveName}} s’éparpillent autour de {{opponentDesc}} !", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbe\n{{moveName}} !", + "stealthRockOnAdd": "Des pierres pointues lévitent\nautour de {{opponentDesc}} !", + "stealthRockActivateTrap": "Des pierres pointues\ntranspercent {{pokemonNameWithAffix}} !", + "stickyWebOnAdd": "Le terrain est couvert d’une {{moveName}}\ndu côté de l’équipe ennemie !", + "stickyWebActivateTrap": "{{pokemonName}} ennemi\nest pris dans la toile gluante !", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}\nfausse les dimensions !", + "trickRoomOnRemove": "Les dimensions faussées\nreviennent à la normale !", + "gravityOnAdd": "La gravité s’intensifie !", + "gravityOnRemove": "La gravité est revenue à la normale !", + "tailwindOnAdd": "Un vent arrière souffle !", + "tailwindOnAddPlayer": "Un vent arrière souffle\nsur votre équipe !", + "tailwindOnAddEnemy": "Un vent arrière souffle\nsur l’équipe ennemie !", + "tailwindOnRemove": "Le vent arrière s’arrête !", + "tailwindOnRemovePlayer": "Le vent arrière soufflant\nsur votre équipe s’arrête !", + "tailwindOnRemoveEnemy": "Le vent arrière soufflant\nsur l’équipe ennemie s’arrête !", + "happyHourOnAdd": "L’ambiance est euphorique !", + "happyHourOnRemove": "L’ambiance se calme !", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 787c210c1b0..fc274306528 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const frConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/it/arena-tag.ts b/src/locales/it/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/it/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", + "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", + "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", + "happyHourOnRemove": "The atmosphere returned to normal.", +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index c22ab87949e..cfb8c4118c9 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const itConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/it/status-effect.ts b/src/locales/it/status-effect.ts index 1a402ac30fd..eb676c08c84 100644 --- a/src/locales/it/status-effect.ts +++ b/src/locales/it/status-effect.ts @@ -14,7 +14,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Poison", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -23,7 +23,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Toxic", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -32,7 +32,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Paralysis", description: "paralysis", obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by the {{sourceText}},\nIt may be unable to move!", activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" @@ -41,7 +41,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Sleep", description: "sleep", obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is fast asleep.", overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", heal: "{{pokemonNameWithAffix}} woke up!" @@ -50,7 +50,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Freeze", description: "freezing", obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", heal: "{{pokemonNameWithAffix}} was\ndefrosted!" @@ -59,7 +59,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Burn", description: "burn", obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", overlap: "{{pokemonNameWithAffix}} is\nalready burned!", heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" diff --git a/src/locales/ko/arena-tag.ts b/src/locales/ko/arena-tag.ts new file mode 100644 index 00000000000..ca1039e2bc0 --- /dev/null +++ b/src/locales/ko/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "우리 편", + "opposingTeam": "상대 편", + "arenaOnRemove": "{{moveName}}의 효과가 사라졌다!", + "arenaOnRemovePlayer": "우리 편 {{moveName}}의\n효과가 사라졌다!", + "arenaOnRemoveEnemy": "상대 편 {{moveName}}의\n효과가 사라졌다!", + "mistOnAdd": "{{pokemonNameWithAffix}} 편은\n흰안개에 둘러싸였다!", + "mistApply": "흰안개의 효과로\n능력은 떨어지지 않는다!", + "reflectOnAdd": "리플렉터로\n물리공격에 강해졌다!", + "reflectOnAddPlayer": "우리 편은 리플렉터로\n물리공격에 강해졌다!", + "reflectOnAddEnemy": "상대는 리플렉터로\n물리공격에 강해졌다!", + "lightScreenOnAdd": "빛의장막으로\n특수공격에 강해졌다!", + "lightScreenOnAddPlayer": "우리 편은 빛의장막으로\n특수공격에 강해졌다!", + "lightScreenOnAddEnemy": "상대는 빛의장막으로\n특수공격에 강해졌다!", + "auroraVeilOnAdd": "오로라베일로\n물리공격과 특수공격에 강해졌다!", + "auroraVeilOnAddPlayer": "우리 편은 오로라베일로\n물리공격과 특수공격에 강해졌다!", + "auroraVeilOnAddEnemy": "상대는 오로라베일로\n물리공격과 특수공격에 강해졌다!", + "conditionalProtectOnAdd": "팀을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectOnAddPlayer": "우리 편 주변을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectOnAddEnemy": "상대 주변을\n{{moveName}}[[가]] 보호하고 있다!", + "conditionalProtectApply": "{{pokemonNameWithAffix}}[[를]]\n{{moveName}}[[가]] 지켜주고 있다!", + "matBlockOnAdd": "{{pokemonNameWithAffix}}[[는]]\n마룻바닥세워막기를 노리고 있다!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}의\n희망사항이 이루어졌다!", + "mudSportOnAdd": "전기의 위력이 약해졌다!", + "mudSportOnRemove": "흙놀이의 효과가\n없어졌다!", + "waterSportOnAdd": "불꽃의 위력이 약해졌다!", + "waterSportOnRemove": "물놀이의 효과가\n없어졌다!", + "spikesOnAdd": "{{opponentDesc}}의 발밑에\n압정이 뿌려졌다!", + "spikesActivateTrap": "{{pokemonNameWithAffix}}[[는]]\n압정뿌리기의 데미지를 입었다!", + "toxicSpikesOnAdd": "{{opponentDesc}}의 발밑에\n독압정이 뿌려졌다!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}[[를]] 흡수했다!", + "stealthRockOnAdd": "{{opponentDesc}} 주변에\n뾰족한 바위가 떠다니기 시작했다!!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}}에게\n뾰족한 바위가 박혔다!", + "stickyWebOnAdd": "{{opponentDesc}} 발밑에\n{{moveName}}[[가]] 펼쳐졌다!", + "stickyWebActivateTrap": "{{pokemonName}}[[는]]\n끈적끈적네트에 걸렸다!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}[[는]]\n시공을 뒤틀었다!", + "trickRoomOnRemove": "뒤틀린 시공이 원래대로 되돌아왔다!", + "gravityOnAdd": "중력이 강해졌다!", + "gravityOnRemove": "중력이 원래대로 되돌아왔다!", + "tailwindOnAdd": "순풍이 불기 시작했다!", + "tailwindOnAddPlayer": "우리 편에게\n순풍이 불기 시작했다!", + "tailwindOnAddEnemy": "상대에게\n순풍이 불기 시작했다!", + "tailwindOnRemove": "순풍이 멈췄다!", + "tailwindOnRemovePlayer": "우리 편의\n순풍이 멈췄다!", + "tailwindOnRemoveEnemy": "상대의\n순풍이 멈췄다!", + "happyHourOnAdd": "모두 행복한 기분에\n휩싸였다!", + "happyHourOnRemove": "기분이 원래대로 돌아왔다.", +} as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 4ec47cec036..d9658b22c75 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -2,6 +2,7 @@ import { pokemonForm } from "./pokemon-form"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const koConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/pt_BR/arena-tag.ts b/src/locales/pt_BR/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/pt_BR/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", + "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", + "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", + "happyHourOnRemove": "The atmosphere returned to normal.", +} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 0aee484e1ce..1d204914ff6 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -2,6 +2,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { PGFachv, PGMachv } from "./achv"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; @@ -55,6 +56,7 @@ export const ptBrConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/zh_CN/arena-tag.ts b/src/locales/zh_CN/arena-tag.ts new file mode 100644 index 00000000000..027a5667415 --- /dev/null +++ b/src/locales/zh_CN/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "我方队伍", + "opposingTeam": "敌方队伍", + "arenaOnRemove": "{{moveName}}的效果消失了!", + "arenaOnRemovePlayer": "{{moveName}}在我方的效果消失了!", + "arenaOnRemoveEnemy": "{{moveName}}在敌方的效果消失了!", + "mistOnAdd": "{{pokemonNameWithAffix}}的一方被\n白雾包围了!", + "mistApply": "正受到白雾的保护\n能力不会被降低!", + "reflectOnAdd": "反射壁使\n物理抗性提高了!", + "reflectOnAddPlayer": "反射壁使我方的\n物理抗性提高了!", + "reflectOnAddEnemy": "反射壁使敌方的\n物理抗性提高了!", + "lightScreenOnAdd": "光墙使\n特殊抗性提高了!", + "lightScreenOnAddPlayer": "光墙使我方的\n特殊抗性提高了!", + "lightScreenOnAddEnemy": "光墙使敌方的\n特殊抗性提高了!", + "auroraVeilOnAdd": "极光幕使\n物理和特殊抗性提高了!", + "auroraVeilOnAddPlayer": "极光幕使我方的\n物理和特殊抗性提高了!", + "auroraVeilOnAddEnemy": "极光幕使敌方的\n物理和特殊抗性提高了!", + "conditionalProtectOnAdd": "{{moveName}}\n保护了!", + "conditionalProtectOnAddPlayer": "{{moveName}}\n保护了我方!", + "conditionalProtectOnAddEnemy": "{{moveName}}\n保护了敌方!", + "conditionalProtectApply": "{{moveName}}\n保护了{{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}}正在\n伺机使出掀榻榻米!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}的\n祈愿实现了!", + "mudSportOnAdd": "电气的威力减弱了!", + "mudSportOnRemove": "玩泥巴的效果消失了!", + "waterSportOnAdd": "火焰的威力减弱了!", + "waterSportOnRemove": "玩水的效果消失了!", + "spikesOnAdd": "{{opponentDesc}}脚下\n散落着{{moveName}}!", + "spikesActivateTrap": "{{pokemonNameWithAffix}}\n受到了撒菱的伤害!", + "toxicSpikesOnAdd": "{{opponentDesc}}脚下\n散落着{{moveName}}!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}\n吸收了{{moveName}}!", + "stealthRockOnAdd": "{{opponentDesc}}周围\n开始浮现出尖锐的岩石!", + "stealthRockActivateTrap": "尖锐的岩石扎进了\n{{pokemonNameWithAffix}}的体内!", + "stickyWebOnAdd": "对方的脚下\n延伸出了{{moveName}}!", + "stickyWebActivateTrap": "{{pokemonName}}\n被黏黏网粘住了!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}}\n扭曲了时空!", + "trickRoomOnRemove": "扭曲的时空复原了!", + "gravityOnAdd": "重力变强了!", + "gravityOnRemove": "重力复原了!", + "tailwindOnAdd": "从身后\n吹起了顺风!", + "tailwindOnAddPlayer": "从我方身后\n吹起了顺风!", + "tailwindOnAddEnemy": "从敌方身后\n吹起了顺风!", + "tailwindOnRemove": "顺风停止了!", + "tailwindOnRemovePlayer": "我方的顺风停止了!", + "tailwindOnRemoveEnemy": "敌方的顺风停止了!", + "happyHourOnAdd": "大家被欢乐的\n气氛包围了!", + "happyHourOnRemove": "气氛回复到平常了。", +} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 84b74c1a20c..c8fea6e71cb 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const zhCnConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/zh_TW/arena-tag.ts b/src/locales/zh_TW/arena-tag.ts new file mode 100644 index 00000000000..8bc2302368a --- /dev/null +++ b/src/locales/zh_TW/arena-tag.ts @@ -0,0 +1,50 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaTag: SimpleTranslationEntries = { + "yourTeam": "your team", + "opposingTeam": "the opposing team", + "arenaOnRemove": "{{moveName}}'s effect wore off.", + "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", + "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", + "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", + "mistApply": "The mist prevented\nthe lowering of stats!", + "reflectOnAdd": "Reflect reduced the damage of physical moves.", + "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", + "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", + "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", + "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", + "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", + "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", + "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", + "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", + "conditionalProtectOnAdd": "{{moveName}} protected team!", + "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", + "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", + "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", + "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", + "mudSportOnAdd": "Electricity's power was weakened!", + "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", + "waterSportOnAdd": "Fire's power was weakened!", + "waterSportOnRemove": "The effects of Water Sport\nhave faded.", + "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", + "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", + "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", + "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", + "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", + "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", + "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "gravityOnAdd": "Gravity intensified!", + "gravityOnRemove": "Gravity returned to normal!", + "tailwindOnAdd": "The Tailwind blew from behind team!", + "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", + "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", + "tailwindOnRemove": "Team's Tailwind petered out!", + "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", + "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", + "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", + "happyHourOnRemove": "The atmosphere returned to normal.", +} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 63887a1f3e3..72bfc4c19d8 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -1,6 +1,7 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; +import { arenaTag } from "./arena-tag"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleInfo } from "./battle-info"; @@ -55,6 +56,7 @@ export const zhTwConfig = { ability: ability, abilityTriggers: abilityTriggers, arenaFlyout: arenaFlyout, + arenaTag: arenaTag, battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, diff --git a/src/locales/zh_TW/status-effect.ts b/src/locales/zh_TW/status-effect.ts index 1a402ac30fd..eb676c08c84 100644 --- a/src/locales/zh_TW/status-effect.ts +++ b/src/locales/zh_TW/status-effect.ts @@ -14,7 +14,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Poison", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -23,7 +23,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Toxic", description: "poisoning", obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" @@ -32,7 +32,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Paralysis", description: "paralysis", obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", - obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by the {{sourceText}},\nIt may be unable to move!", activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" @@ -41,7 +41,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Sleep", description: "sleep", obtain: "{{pokemonNameWithAffix}}\nfell asleep!", - obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is fast asleep.", overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", heal: "{{pokemonNameWithAffix}} woke up!" @@ -50,7 +50,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Freeze", description: "freezing", obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", - obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", heal: "{{pokemonNameWithAffix}} was\ndefrosted!" @@ -59,7 +59,7 @@ export const statusEffect: StatusEffectTranslationEntries = { name: "Burn", description: "burn", obtain: "{{pokemonNameWithAffix}}\nwas burned!", - obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by the {{sourceText}}!", activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", overlap: "{{pokemonNameWithAffix}} is\nalready burned!", heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 45662ac29cf..25514ef763c 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -73,7 +73,7 @@ describe("Items - Toxic orb", () => { // Toxic orb should trigger here await game.phaseInterceptor.run(MessagePhase); const message = game.textInterceptor.getLatestMessage(); - expect(message).toContain("was badly poisoned by Toxic Orb"); + expect(message).toContain("was badly poisoned by the Toxic Orb"); await game.phaseInterceptor.run(MessagePhase); const message2 = game.textInterceptor.getLatestMessage(); expect(message2).toContain("is hurt"); From e190de7ff2da02bab31eb68bb886435c7b9bf85c Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:12:23 -0700 Subject: [PATCH 054/321] [Misc] Remove redundant BattlerTag sub-classes (#3223) --- src/data/battler-tags.ts | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 97c42fed514..6c19be27fae 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1413,30 +1413,6 @@ export class CritBoostTag extends BattlerTag { } } -export class AlwaysCritTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ALWAYS_CRIT, BattlerTagLapseType.TURN_END, 2, sourceMove); - } -} - -export class IgnoreAccuracyTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.IGNORE_ACCURACY, BattlerTagLapseType.TURN_END, 2, sourceMove); - } -} - -export class AlwaysGetHitTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ALWAYS_GET_HIT, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); - } -} - -export class ReceiveDoubleDamageTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.RECEIVE_DOUBLE_DAMAGE, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); - } -} - export class SaltCuredTag extends BattlerTag { private sourceIndex: number; @@ -1769,15 +1745,13 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.CRIT_BOOST: return new CritBoostTag(tagType, sourceMove); case BattlerTagType.ALWAYS_CRIT: - return new AlwaysCritTag(sourceMove); + case BattlerTagType.IGNORE_ACCURACY: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); case BattlerTagType.NO_CRIT: return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); - case BattlerTagType.IGNORE_ACCURACY: - return new IgnoreAccuracyTag(sourceMove); case BattlerTagType.ALWAYS_GET_HIT: - return new AlwaysGetHitTag(sourceMove); case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: - return new ReceiveDoubleDamageTag(sourceMove); + return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); case BattlerTagType.BYPASS_SLEEP: return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: From 89abe44d14ed5c5777fcadd25008a5bf3b05d585 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:12:49 -0700 Subject: [PATCH 055/321] [Misc] Remove redundant `AddBattlerTagAttr` sub-classes (#3224) --- src/data/move.ts | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 8616c4caf9b..20c369ef106 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4327,34 +4327,6 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { } } -export class AlwaysGetHitAttr extends AddBattlerTagAttr { - constructor() { - super(BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) { - return false; - } - - return true; - } -} - -export class ReceiveDoubleDamageAttr extends AddBattlerTagAttr { - constructor() { - super(BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) { - return false; - } - - return true; - } -} - export class FaintCountdownAttr extends AddBattlerTagAttr { constructor() { super(BattlerTagType.PERISH_SONG, false, true, 4); @@ -8495,8 +8467,8 @@ export function initMoves() { new AttackMove(Moves.ICE_SPINNER, Type.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) - .attr(AlwaysGetHitAttr) - .attr(ReceiveDoubleDamageAttr), + .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true) + .attr(AddBattlerTagAttr, BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true), new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) From 6b3b55510535c4dfd4d07f6b3b5b3aeb352e9513 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 30 Jul 2024 06:14:16 +0900 Subject: [PATCH 056/321] [QoL] Update on the requested code changes related to the Starter select UI (new) (#3199) * update requested changes from flx * requested code refactoring from Opaquer --- src/ui/starter-select-ui-handler.ts | 69 +++++++++-------------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 1307f46d28f..5201b12d2da 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1173,9 +1173,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isPartyValid = this.isPartyValid(); const isValidForChallenge = new Utils.BooleanHolder(true); if (isPartyValid) { - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length)); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), this.starterSpecies.length !== 0); } else { - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length), false, false); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), this.starterSpecies.length !== 0, false, false); } const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); @@ -1186,9 +1186,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { label: i18next.t("starterSelectUiHandler:addToParty"), handler: () => { ui.setMode(Mode.STARTER_SELECT); - - if (!isDupe && isValidForChallenge.value && this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId), true)) { - this.addToParty(species); + const isOverValueLimit = this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.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(species, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset.slice(0) as StarterMoveset); 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 @@ -1766,19 +1769,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return [isDupe, removeIndex]; } - addToParty(species: PokemonSpecies) { - const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; - cursorObj.setVisible(true); - cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor); + addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: integer, nature: Nature, moveset: StarterMoveset) { + const props = this.scene.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.starterSpecies.push(species); - this.starterAttr.push(this.dexAttrCursor); - this.starterAbilityIndexes.push(this.abilityCursor); - this.starterNatures.push(this.natureCursor as unknown as Nature); - this.starterMovesets.push(this.starterMoveset.slice(0) as StarterMoveset); + this.starterAttr.push(dexAttr); + this.starterAbilityIndexes.push(abilityIndex); + this.starterNatures.push(nature); + this.starterMovesets.push(moveset); if (this.speciesLoaded.get(species.speciesId)) { getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); } @@ -2018,7 +2019,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }; updateScroll = () => { - const perRow = 9; + const maxColumns = 9; const maxRows = 9; this.starterSelectScrollBar.setPage(this.scrollCursor); @@ -2028,7 +2029,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const pos = calcStarterPosition(i, this.scrollCursor); container.setPosition(pos.x, pos.y); - if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { container.setVisible(true); } else { container.setVisible(false); @@ -2037,7 +2038,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.pokerusSpecies.includes(container.species)) { this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); } else { this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); @@ -2048,7 +2049,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.starterSpecies.includes(container.species)) { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); - if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); } else { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); @@ -2129,31 +2130,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return changed; } - getGenCursorWithScroll(): integer { - return undefined; - // return this.genCursor !== undefined - // ? this.genCursor + this.genScrollCursor - // : undefined; - } - - updateGenOptions(): void { - // let text = ""; - // for (let g = this.genScrollCursor; g <= this.genScrollCursor + 2; g++) { - // let optionText = ""; - // if (g === this.genScrollCursor && this.genScrollCursor) { - // optionText = "↑"; - // } else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) { - // optionText = "↓"; - // } else { - // optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); - // } - // text += `${text ? "\n" : ""}${optionText}`; - // } - // this.genOptionsText.setText(text); - } - setFilterMode(filterMode: boolean): boolean { - // this.genCursorObj.setVisible(!filterMode); this.cursorObj.setVisible(!filterMode); this.filterBar.cursorObj.setVisible(filterMode); @@ -2369,8 +2346,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Initiates the small up and down idle animation this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); - let starterIndex = -1; - starterIndex = this.starterSpecies.indexOf(species); + const starterIndex = this.starterSpecies.indexOf(species); let props: DexAttrProps; @@ -2523,8 +2499,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { - let starterIndex = -1; - starterIndex = this.starterSpecies.indexOf(species); + const starterIndex = this.starterSpecies.indexOf(species); if (starterIndex > -1) { this.starterAttr[starterIndex] = this.dexAttrCursor; @@ -2902,7 +2877,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let s = 0; s < this.starterSpecies.length; s++) { const isValidForChallenge = new Utils.BooleanHolder(true); const species = this.starterSpecies[s]; - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!(this.starterSpecies.length), false, false); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterSpecies.length !== 0, false, false); canStart = canStart || isValidForChallenge.value; } return canStart; From 33978481ce169c28bd058f61f253ec10fd92af34 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:15:14 -0700 Subject: [PATCH 057/321] [Documentaiton] Fix typos in `src/data/egg.ts` comments (#3176) --- src/data/egg.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/egg.ts b/src/data/egg.ts index bf4d6577dd7..70f26503cf2 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -66,7 +66,7 @@ export interface IEggOptions { export class Egg { //// - // #region Privat properties + // #region Private properties //// private _id: number; @@ -182,7 +182,7 @@ export class Egg { } //// - // #region Public methodes + // #region Public methods //// public isManaphyEgg(): boolean { @@ -281,7 +281,7 @@ export class Egg { //// //// - // #region Private methodes + // #region Private methods //// private rollEggMoveIndex() { From 4b0157d5d772dcc77248190a64bde5748bf05ffe Mon Sep 17 00:00:00 2001 From: NxKarim <43686802+NxKarim@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:16:00 -0600 Subject: [PATCH 058/321] [Bug] Self effect moves fix for Shield Dust (#3167) * Self effect moves fix for Shield Dust Moves with self effects no longer affected by Shield Dust. * comma spaces Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --- src/data/move.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 20c369ef106..431ffb0bae4 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -973,7 +973,9 @@ export class MoveEffectAttr extends MoveAttr { getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { const moveChance = new Utils.NumberHolder(move.chance); applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect, showAbility); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr,target,user,null,null, moveChance); + if (!selfEffect) { + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, moveChance); + } return moveChance.value; } } From de7afd026caeb7857526239b02291c1025d922f2 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:18:53 -0700 Subject: [PATCH 059/321] [Misc] Remove redundant `ChargingTag` (#3156) --- src/data/battler-tags.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 6c19be27fae..ce70240df8c 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -497,12 +497,6 @@ export class FrenzyTag extends BattlerTag { } } -export class ChargingTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: number) { - super(BattlerTagType.CHARGING, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); - } -} - export class EncoreTag extends BattlerTag { public moveId: Moves; @@ -1672,7 +1666,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.FRENZY: return new FrenzyTag(turnCount, sourceMove, sourceId); case BattlerTagType.CHARGING: - return new ChargingTag(sourceMove, sourceId); + return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); case BattlerTagType.ENCORE: return new EncoreTag(sourceId); case BattlerTagType.HELPING_HAND: From b5d77c3d159a284834d1359d17fc92b15de8d649 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:32:02 -0400 Subject: [PATCH 060/321] [Move] Implement Fusion Flare and Fusion Bolt (#1774) --- src/data/move.ts | 72 ++++- src/field/pokemon.ts | 1 + src/phases.ts | 3 + src/test/moves/fusion_bolt.test.ts | 54 ++++ src/test/moves/fusion_flare.test.ts | 60 +++++ src/test/moves/fusion_flare_bolt.test.ts | 323 +++++++++++++++++++++++ 6 files changed, 510 insertions(+), 3 deletions(-) create mode 100644 src/test/moves/fusion_bolt.test.ts create mode 100644 src/test/moves/fusion_flare.test.ts create mode 100644 src/test/moves/fusion_flare_bolt.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 431ffb0bae4..4cc146ff99a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3406,6 +3406,72 @@ export class MultiHitPowerIncrementAttr extends VariablePowerAttr { } } +/** + * Attribute used for moves that double in power if the given move immediately + * preceded the move applying the attribute, namely Fusion Flare and + * Fusion Bolt. + * @extends VariablePowerAttr + * @see {@linkcode apply} + */ +export class LastMoveDoublePowerAttr extends VariablePowerAttr { + /** The move that must precede the current move */ + private move: Moves; + + constructor(move: Moves) { + super(); + + this.move = move; + } + + /** + * Doubles power of move if the given move is found to precede the current + * move with no other moves being executed in between, only ignoring failed + * moves if any. + * @param user {@linkcode Pokemon} that used the move + * @param target N/A + * @param move N/A + * @param args [0] {@linkcode Utils.NumberHolder} that holds the resulting power of the move + * @returns true if attribute application succeeds, false otherwise + */ + apply(user: Pokemon, _target: Pokemon, _move: Move, args: any[]): boolean { + const power = args[0] as Utils.NumberHolder; + const enemy = user.getOpponent(0); + const pokemonActed: Pokemon[] = []; + + if (enemy.turnData.acted) { + pokemonActed.push(enemy); + } + + if (user.scene.currentBattle.double) { + const userAlly = user.getAlly(); + const enemyAlly = enemy.getAlly(); + + if (userAlly && userAlly.turnData.acted) { + pokemonActed.push(userAlly); + } + if (enemyAlly && enemyAlly.turnData.acted) { + pokemonActed.push(enemyAlly); + } + } + + pokemonActed.sort((a, b) => b.turnData.order - a.turnData.order); + + for (const p of pokemonActed) { + const [ lastMove ] = p.getLastXMoves(1); + if (lastMove.result !== MoveResult.FAIL) { + if ((lastMove.result === MoveResult.SUCCESS) && (lastMove.move === this.move)) { + power.value *= 2; + return true; + } else { + break; + } + } + } + + return false; + } +} + export class VariableAtkAttr extends MoveAttr { constructor() { super(); @@ -7419,10 +7485,10 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF, BattleStat.SPD ], -1, true), new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) - .partial(), + .attr(LastMoveDoublePowerAttr, Moves.FUSION_BOLT), new AttackMove(Moves.FUSION_BOLT, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) - .makesContact(false) - .partial(), + .attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE) + .makesContact(false), new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) .attr(MinimizeAccuracyAttr) .attr(FlyingTypeMultiplierAttr) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 8d6277da7f4..f151aef2751 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4062,6 +4062,7 @@ export class PokemonTurnData { public currDamageDealt: integer = 0; public damageTaken: integer = 0; public attacksReceived: AttackMoveResult[] = []; + public order: number; } export enum AiType { diff --git a/src/phases.ts b/src/phases.ts index ceefc34ba17..fad95951c26 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2314,6 +2314,8 @@ export class TurnStartPhase extends FieldPhase { return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0; }); + let orderIndex = 0; + for (const o of moveOrder) { const pokemon = field[o]; @@ -2326,6 +2328,7 @@ export class TurnStartPhase extends FieldPhase { switch (turnCommand.command) { case Command.FIGHT: const queuedMove = turnCommand.move; + pokemon.turnData.order = orderIndex++; if (!queuedMove) { continue; } diff --git a/src/test/moves/fusion_bolt.test.ts b/src/test/moves/fusion_bolt.test.ts new file mode 100644 index 00000000000..368c75b0f54 --- /dev/null +++ b/src/test/moves/fusion_bolt.test.ts @@ -0,0 +1,54 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { Abilities } from "#enums/abilities"; + +describe("Moves - Fusion Bolt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionBolt = Moves.FUSION_BOLT; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionBolt ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ROUGH_SKIN); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("should not make contact", async() => { + await game.startBattle([ + Species.ZEKROM, + ]); + + const partyMember = game.scene.getPlayerPokemon(); + const initialHp = partyMember.hp; + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt)); + + await game.toNextTurn(); + + expect(initialHp - partyMember.hp).toBe(0); + }, 20000); +}); diff --git a/src/test/moves/fusion_flare.test.ts b/src/test/moves/fusion_flare.test.ts new file mode 100644 index 00000000000..5ccbd82d25e --- /dev/null +++ b/src/test/moves/fusion_flare.test.ts @@ -0,0 +1,60 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { TurnStartPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { StatusEffect } from "#app/data/status-effect"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; + +describe("Moves - Fusion Flare", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionFlare = Moves.FUSION_FLARE; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("should thaw freeze status condition", async() => { + await game.startBattle([ + Species.RESHIRAM, + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare)); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Inflict freeze quietly and check if it was properly inflicted + partyMember.trySetStatus(StatusEffect.FREEZE, false); + expect(partyMember.status.effect).toBe(StatusEffect.FREEZE); + + await game.toNextTurn(); + + // Check if FUSION_FLARE thawed freeze + expect(partyMember.status?.effect).toBeUndefined(); + }); +}); diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/src/test/moves/fusion_flare_bolt.test.ts new file mode 100644 index 00000000000..83c7c0e5993 --- /dev/null +++ b/src/test/moves/fusion_flare_bolt.test.ts @@ -0,0 +1,323 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { MoveEffectPhase, MovePhase, MoveEndPhase, TurnStartPhase, DamagePhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#app/data/pokemon-stat"; +import { allMoves } from "#app/data/move"; +import { BattlerIndex } from "#app/battle"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; + +describe("Moves - Fusion Flare and Fusion Bolt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const fusionFlare = allMoves[Moves.FUSION_FLARE]; + const fusionBolt = allMoves[Moves.FUSION_BOLT]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionBolt.id ]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(fusionFlare, "calculateBattlePower"); + vi.spyOn(fusionBolt, "calculateBattlePower"); + }); + + it("FUSION_FLARE should double power of subsequent FUSION_BOLT", async() => { + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_BOLT should double power of subsequent FUSION_FLARE", async() => { + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 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 + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(0); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act (and fail) in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEndPhase); + + // Skip enemy move; because the enemy is at full HP, Rest should fail + await game.phaseInterceptor.runFrom(MovePhase).to(MoveEndPhase); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE should not double power of subsequent FUSION_BOLT if a move succeeded in between", async() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEndPhase); + // Skip enemy move + await game.phaseInterceptor.runFrom(MovePhase).to(MoveEndPhase); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + }, 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 + ]); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + game.doAttack(getMovePosition(game.scene, 0, fusionFlare.id)); + game.doSelectTarget(BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force user party to act before enemy party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + const party = game.scene.getParty(); + const enemyParty = game.scene.getEnemyParty(); + + // Get rid of any modifiers that may alter power + game.scene.clearEnemyHeldItemModifiers(); + game.scene.clearEnemyModifiers(); + + // 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], + ] + }; + + // 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(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))); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves if moves are aimed at allies", async() => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); + await game.startBattle([ + Species.ZEKROM, + Species.ZEKROM + ]); + + const party = game.scene.getParty(); + const enemyParty = game.scene.getEnemyParty(); + + // Get rid of any modifiers that may alter power + game.scene.clearEnemyHeldItemModifiers(); + game.scene.clearEnemyModifiers(); + + // 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], + ] + }; + + // 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(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))); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + game.doAttack(getMovePosition(game.scene, 0, fusionBolt.id)); + game.doSelectTarget(BattlerIndex.PLAYER); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + // Force first enemy to act in between party + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ 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); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); + await game.phaseInterceptor.to(DamagePhase, false); + expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); +}); From 4b448d371fdc5213c28afcbe54b6308746cd608d Mon Sep 17 00:00:00 2001 From: Mumble Date: Mon, 29 Jul 2024 16:00:56 -0700 Subject: [PATCH 061/321] [Bug] Caught Pokemon-Summary Option playing Error Sound (#3229) Co-authored-by: Frutescens --- src/ui/confirm-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index 2d83508384b..4a60b0c9689 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -28,7 +28,7 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { label: i18next.t("partyUiHandler:SUMMARY"), handler: () => { args[0](); - return false; + return true; }, }, { label: i18next.t("menu:yes"), From 22cfa48103a7dc44fee1f3321a9a7b793ad49484 Mon Sep 17 00:00:00 2001 From: Mumble Date: Mon, 29 Jul 2024 16:10:50 -0700 Subject: [PATCH 062/321] [Bug] Magic Guard-Ability Interactions (#3227) * Liquid Ooze * Added checks for the last of the abilities * Updated some abilities * Reverted old message --------- Co-authored-by: Frutescens --- src/data/ability.ts | 7 +++++-- src/data/move.ts | 11 ++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index af97151f4b0..fe3a0e9478f 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2862,6 +2862,9 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { const scene = pokemon.scene; + if (pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + return false; + } const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); @@ -3139,7 +3142,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { - if (opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) { + if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER); pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)})); hadEffect = true; @@ -3528,7 +3531,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { const cancelled = new Utils.BooleanHolder(false); pokemon.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); - if (cancelled.value) { + if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { return false; } attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); diff --git a/src/data/move.ts b/src/data/move.ts index 4cc146ff99a..ccdb5e85630 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1638,9 +1638,14 @@ export class HitHealAttr extends MoveEffectAttr { message = i18next.t("battle:regainHealth", {pokemonName: getPokemonNameWithAffix(user)}); } if (reverseDrain) { - user.turnData.damageTaken += healAmount; - healAmount = healAmount * -1; - message = null; + if (user.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + healAmount = 0; + message = null; + } else { + user.turnData.damageTaken += healAmount; + healAmount = healAmount * -1; + message = null; + } } user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), healAmount, message, false, true)); return true; From b573076789653f56a17f8a2c79579dc846de2a6e Mon Sep 17 00:00:00 2001 From: Steven Chan <29343843+chansyu@users.noreply.github.com> Date: Mon, 29 Jul 2024 23:11:14 +0000 Subject: [PATCH 063/321] [Bug] disallow ghost-type curse to bypass crafty shield (#3228) Co-authored-by: Steven Chan --- src/field/pokemon.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f151aef2751..6e00fa05ac9 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1855,6 +1855,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); } + // Apply exceptional condition of Crafty Shield if the move used is Curse + if (move.id === Moves.CURSE) { + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); + } + switch (moveCategory) { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: From d3e5a68f10ae6a4d77855ffa712a6272cfc47fa8 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:13:36 -0700 Subject: [PATCH 064/321] [Optimization] Minify json files in build directory (after beta rebase) (#3214) * add and use minify-json vite plugin it minifies all the json files in the given directorties (currently `/dist/images` and `/dist/battle-anim`). That way we can work with the beautified jsons but the users retrieve the minified ones. * bump vite to v5 to fix typedoc issue https://github.com/vitejs/vite/issues/15714 --- package-lock.json | 3297 ++++++------------- package.json | 2 +- src/plugins/vite/vite-minify-json-plugin.ts | 56 + vite.config.ts | 6 +- 4 files changed, 1122 insertions(+), 2239 deletions(-) create mode 100644 src/plugins/vite/vite-minify-json-plugin.ts diff --git a/package-lock.json b/package-lock.json index 71de51abb35..b4d6348af51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "typedoc": "^0.26.4", "typescript": "^5.5.3", "typescript-eslint": "^7.10.0", - "vite": "^4.5.0", + "vite": "^5.3.4", "vite-plugin-fs": "^0.4.4", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.4.0", @@ -62,12 +62,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "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, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -75,30 +75,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "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, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.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", @@ -123,12 +123,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -138,14 +138,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "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, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@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" }, @@ -163,62 +163,66 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "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.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "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.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "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.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "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, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "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, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@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" @@ -228,77 +232,77 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "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, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "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.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "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, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -307,10 +311,81 @@ "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, + "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, + "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 + }, + "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, + "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, + "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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -320,9 +395,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "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" }, @@ -331,33 +406,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@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.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@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" }, @@ -365,14 +440,23 @@ "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.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -380,9 +464,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "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" ], @@ -396,9 +480,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "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" ], @@ -412,9 +496,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "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" ], @@ -428,9 +512,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -444,9 +528,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "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" ], @@ -460,9 +544,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "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" ], @@ -476,9 +560,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "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" ], @@ -492,9 +576,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "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" ], @@ -508,9 +592,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -524,9 +608,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "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" ], @@ -540,9 +624,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -556,9 +640,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "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" ], @@ -572,9 +656,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -588,9 +672,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "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" ], @@ -604,9 +688,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "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" ], @@ -620,9 +704,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -636,9 +720,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "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" ], @@ -652,9 +736,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -668,9 +752,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -684,9 +768,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "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" ], @@ -700,9 +784,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -716,9 +800,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "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" ], @@ -732,9 +816,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "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" ], @@ -763,9 +847,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "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, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -794,34 +878,69 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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, "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "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": { - "url": "https://github.com/sponsors/sindresorhus" + "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.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", + "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", + "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", + "dev": true + }, "node_modules/@hpcc-js/wasm": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.16.2.tgz", - "integrity": "sha512-THiidUMYR8/cIfFT3MVcWuRE7bQKh295nrFBxGvUNc4Nq8e2uU1LtiplHs7AUkJ0GxgvZoR+8TQ1/E3Qb/uE2g==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", + "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", "dependencies": { "yargs": "17.7.2" }, @@ -833,6 +952,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -843,6 +963,28 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -860,6 +1002,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@istanbuljs/schema": { @@ -916,9 +1059,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "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": { @@ -972,9 +1115,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], @@ -985,9 +1128,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], @@ -998,9 +1141,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], @@ -1011,9 +1154,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], @@ -1024,9 +1167,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", "cpu": [ "arm" ], @@ -1037,9 +1180,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], @@ -1050,9 +1193,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], @@ -1063,9 +1206,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], @@ -1076,9 +1219,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ "ppc64" ], @@ -1089,9 +1232,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], @@ -1102,9 +1245,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], @@ -1115,9 +1258,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], @@ -1128,9 +1271,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], @@ -1141,9 +1284,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], @@ -1154,9 +1297,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], @@ -1167,9 +1310,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], @@ -1184,7 +1327,6 @@ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", "dev": true, - "license": "MIT", "dependencies": { "@types/hast": "^3.0.4" } @@ -1206,7 +1348,6 @@ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -1228,9 +1369,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", - "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dependencies": { "undici-types": "~5.26.4" } @@ -1244,20 +1385,19 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", - "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", + "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/type-utils": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/type-utils": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1281,15 +1421,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", - "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", + "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4" }, "engines": { @@ -1309,13 +1449,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", + "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1326,13 +1466,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1353,9 +1493,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1366,13 +1506,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1393,40 +1533,16 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/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, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1440,12 +1556,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", + "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/types": "7.16.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -1463,9 +1579,9 @@ "dev": true }, "node_modules/@vitest/coverage-istanbul": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.5.2.tgz", - "integrity": "sha512-YGC+QSWOL8cQ2HQaTEFttmG9v3DGLy7lMZIGdqjtTgaW6omW17/uZPxuh6m2t69T0rFLqImduVthm5o/gYYWTQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.6.0.tgz", + "integrity": "sha512-h/BwpXehkkS0qsNCS00QxiupAqVkNi0WT19BR0dQvlge5oHghoSVLx63fABYFoKxVb7Ue7+k6V2KokmQ1zdMpg==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -1482,90 +1598,30 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.5.2" + "vitest": "1.6.0" } }, "node_modules/@vitest/expect": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", - "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@vitest/expect/node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vitest/expect/node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@vitest/expect/node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vitest/expect/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/@vitest/runner": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", - "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "dependencies": { - "@vitest/utils": "1.5.2", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1589,9 +1645,9 @@ } }, "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -1601,9 +1657,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", - "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1615,9 +1671,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", - "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1627,9 +1683,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", - "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -1655,9 +1711,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -1690,9 +1746,12 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -1710,15 +1769,14 @@ } }, "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, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "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" + "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", @@ -1734,15 +1792,17 @@ } }, "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, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { @@ -1873,6 +1933,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1895,9 +1964,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -1906,12 +1975,12 @@ } }, "node_modules/axios-cache-interceptor": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.2.tgz", - "integrity": "sha512-zrJZ9DZo5hKfrU+SEN/qhXxGD7GWRzwoqJ7sSvxikizUvDhWy/U9BoAbWLZZdyjbHHsfmS1OlQZCDW6o69r4DA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.3.tgz", + "integrity": "sha512-kPgGId9XW7tR+VF7hgSkqF4f6FrV4ecCyKxjkD9v1hNJ4sXSAskocr7SMKaVHVvrbzVeruwB6yL6Y9/lY1ApKg==", "dev": true, "dependencies": { - "cache-parser": "1.2.4", + "cache-parser": "1.2.5", "fast-defer": "1.1.8", "object-code": "1.3.3" }, @@ -1932,13 +2001,12 @@ "dev": true }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -1954,9 +2022,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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": [ { @@ -1973,10 +2041,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2017,9 +2085,9 @@ } }, "node_modules/cache-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.4.tgz", - "integrity": "sha512-O0KwuHuJnbHUrghHi2kGp0SxnWSIBXTYt7M8WVhW0kbPRUNUKoE/Of6e1rRD6AAxmfxFunKnt90yEK09D+sc5g==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.5.tgz", + "integrity": "sha512-Md/4VhAHByQ9frQ15WD6LrMNiVw9AEl/J7vWIXw+sxT6fSOpbtt6LHTp76vy8+bOESPBO94117Hm2bIjlI7XjA==", "dev": true }, "node_modules/call-bind": { @@ -2050,9 +2118,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "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": [ { @@ -2069,20 +2137,51 @@ } ] }, - "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==", + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2107,31 +2206,36 @@ } }, "node_modules/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", + "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", "dev": true, "dependencies": { + "@hapi/bourne": "^3.0.0", "inflation": "^2.0.0", "qs": "^6.5.2", "raw-body": "^2.3.3", "type-is": "^1.6.16" + }, + "engines": { + "node": ">=8.0.0" } }, "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, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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 + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -2256,6 +2360,12 @@ "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", @@ -2269,40 +2379,6 @@ "node": ">=18" } }, - "node_modules/data-urls/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/data-urls/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/data-urls/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/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -2355,9 +2431,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -2377,6 +2453,18 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -2447,37 +2535,33 @@ } }, "node_modules/dependency-cruiser": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.3.tgz", - "integrity": "sha512-+YHPbd6RqM1nLUUbRVkbYO6mVeeq+VEL+bBkR+KFkYVU20vs1D0TalZ9z/hDLxiYiYCSTctUaoWWaUrRc1I+mw==", + "version": "16.3.9", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.9.tgz", + "integrity": "sha512-rtYBXmwYGcuwvGHI+gqXMyXXKjJ3d8nfg6hdwOtgm3Z7VHczuDwUJTg1PDQNzhWLWjMKzV5igAIpuxXOhslyZA==", "dependencies": { - "acorn": "8.11.3", + "acorn": "8.12.1", "acorn-jsx": "5.3.2", "acorn-jsx-walk": "2.0.0", "acorn-loose": "8.4.0", - "acorn-walk": "8.3.2", - "ajv": "8.16.0", - "chalk": "5.3.0", + "acorn-walk": "8.3.3", + "ajv": "8.17.1", "commander": "12.1.0", "enhanced-resolve": "5.17.0", - "figures": "6.1.0", "ignore": "5.3.1", - "indent-string": "5.0.0", "interpret": "^3.1.1", "is-installed-globally": "1.0.0", "json5": "2.2.3", "lodash": "4.17.21", "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.2", - "semver-try-require": "7.0.0", + "semver": "^7.6.3", "teamcity-service-messages": "0.1.14", "tsconfig-paths-webpack-plugin": "4.1.0", - "watskeburt": "4.0.2", - "wrap-ansi": "9.0.0" + "watskeburt": "4.1.0" }, "bin": { "depcruise": "bin/dependency-cruise.mjs", @@ -2491,110 +2575,6 @@ "node": "^18.17||>=20" } }, - "node_modules/dependency-cruiser/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/dependency-cruiser/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/dependency-cruiser/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, - "node_modules/dependency-cruiser/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==" - }, - "node_modules/dependency-cruiser/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dependency-cruiser/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/dependency-cruiser/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -2645,9 +2625,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", - "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", + "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": { @@ -2819,9 +2799,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "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, "bin": { @@ -2831,28 +2811,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@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": { @@ -2870,12 +2851,15 @@ "dev": true }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { @@ -3010,6 +2994,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/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-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -3031,6 +3025,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/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-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3077,101 +3083,48 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/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==", + "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, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "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": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint/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/eslint/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==", + "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/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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, "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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/eslint/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": "*" } }, "node_modules/espree": { @@ -3192,9 +3145,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3321,6 +3274,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "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==" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -3330,20 +3288,6 @@ "reusify": "^1.0.4" } }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3528,17 +3472,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -3599,6 +3532,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3627,6 +3561,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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/glob/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/global-directory": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", @@ -3642,12 +3598,18 @@ } }, "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==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -3724,12 +3686,11 @@ } }, "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, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -3861,9 +3822,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "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, "dependencies": { "agent-base": "^7.0.2", @@ -3883,9 +3844,9 @@ } }, "node_modules/i18next": { - "version": "23.11.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", - "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", + "version": "23.12.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", + "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", "funding": [ { "type": "individual", @@ -3913,9 +3874,9 @@ } }, "node_modules/i18next-http-backend": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.1.tgz", - "integrity": "sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz", + "integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==", "dependencies": { "cross-fetch": "4.0.0" } @@ -3929,12 +3890,12 @@ } }, "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==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -3973,17 +3934,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/inflation": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", @@ -4097,11 +4047,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "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==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4346,17 +4299,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4390,9 +4332,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "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, "dependencies": { "@babel/core": "^7.23.9", @@ -4419,31 +4361,10 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-lib-source-maps": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", - "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "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, "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", @@ -4495,9 +4416,9 @@ } }, "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", "dev": true, "dependencies": { "cssstyle": "^4.0.1", @@ -4505,21 +4426,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.10", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "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.16.0", + "ws": "^8.17.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -4534,40 +4455,6 @@ } } }, - "node_modules/jsdom/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/jsdom/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/jsdom/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/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4596,10 +4483,9 @@ "dev": true }, "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 + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify": { "version": "1.1.1", @@ -4763,29 +4649,29 @@ } }, "node_modules/lefthook": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.12.tgz", - "integrity": "sha512-SoHhB0L1D5twH5KKsGAT1h4qF+RhGfPo/JC5z60H0RDuFWtSwFNOeFpT4Qa7XwM6J9c1fvqZzOH9/4XF7dG9Uw==", + "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, "bin": { "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "1.6.12", - "lefthook-darwin-x64": "1.6.12", - "lefthook-freebsd-arm64": "1.6.12", - "lefthook-freebsd-x64": "1.6.12", - "lefthook-linux-arm64": "1.6.12", - "lefthook-linux-x64": "1.6.12", - "lefthook-windows-arm64": "1.6.12", - "lefthook-windows-x64": "1.6.12" + "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.6.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.12.tgz", - "integrity": "sha512-IJa50i+78nGxtSvnxLSDfSjBjjM7Ixl03V4+yl3Kdn+S+FwzEZet3LYTLbnKFUVy9Bg23obI3yXgwUx+tJjFXg==", + "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" ], @@ -4796,9 +4682,9 @@ ] }, "node_modules/lefthook-darwin-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.12.tgz", - "integrity": "sha512-h11ByUtwM78FShgWgSUyyZtwKW6pjYfYvTygw24c/lZXKjupfowK5Ps5A73hCsjr0AEJNVpgW1S5Jd22gIJJCA==", + "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" ], @@ -4809,9 +4695,9 @@ ] }, "node_modules/lefthook-freebsd-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.12.tgz", - "integrity": "sha512-Aw1+AosL8r/LFSVKG7i8GI1FpHnWFG66/6DBDUgCwNAwhNCXt7tERAM8dj9S6EqmqHCQCC0nI/6qKNBsFPk7Ow==", + "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" ], @@ -4822,9 +4708,9 @@ ] }, "node_modules/lefthook-freebsd-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.12.tgz", - "integrity": "sha512-G8Dg7UuRstXrqaEA8MSOZikz6PpjPUQu3QmiihzcyGdzI76jFsmjJb2vkrnvMsH9u2gWb3J4sp3TULhbMHXwSw==", + "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" ], @@ -4835,9 +4721,9 @@ ] }, "node_modules/lefthook-linux-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.12.tgz", - "integrity": "sha512-fwO0i6x5EPelL66EwaySzGzvVbN2vLFZDUWuTi8nZzEgBsCBuG0mORxZg91cNCGLRPT3sgzWPraTkyzIJa7kHg==", + "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" ], @@ -4848,9 +4734,9 @@ ] }, "node_modules/lefthook-linux-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.12.tgz", - "integrity": "sha512-pRAZKZhSoirjRwDF0TrqxgkeXtUmJqaUi0kGmMJmutToqo9IXQcnpueVmyV9Z1m6lLJn4PpKoFydY6tFXqvyNQ==", + "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" ], @@ -4861,9 +4747,9 @@ ] }, "node_modules/lefthook-windows-arm64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.12.tgz", - "integrity": "sha512-jMMIoqNKtiqGrwyWeN3JXGXi7H7iAXsGB5v4DkcUbdw9y50qhruxWz84I2PoxwYmZVeMxRR+VpYvS7nOvBmzWA==", + "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" ], @@ -4874,9 +4760,9 @@ ] }, "node_modules/lefthook-windows-x64": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.12.tgz", - "integrity": "sha512-XqEBVIhp/Fd1Fs+VBlPhrSJlUkyXEJuxQmiYSYow3C18RNpQQrJFVFpz0wE/IDTn2jOXx+p5+hcdlJb+s6bnpA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", + "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", "cpu": [ "x64" ], @@ -4904,7 +4790,6 @@ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, - "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } @@ -5015,7 +4900,6 @@ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -5032,8 +4916,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -5083,18 +4966,30 @@ } }, "node_modules/micromatch": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", - "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { "braces": "^3.0.3", - "picomatch": "^4.0.2" + "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, + "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", @@ -5140,15 +5035,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -5160,15 +5058,15 @@ } }, "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" } }, "node_modules/moo-color": { @@ -5180,12 +5078,6 @@ "color-name": "^1.1.4" } }, - "node_modules/moo-color/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/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5252,10 +5144,29 @@ } } }, + "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.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/npm-run-path": { @@ -5286,9 +5197,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", - "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", + "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-code": { @@ -5298,10 +5209,13 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5560,6 +5474,15 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/phaser": { "version": "3.80.1", "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", @@ -5569,13 +5492,13 @@ } }, "node_modules/phaser3-rex-plugins": { - "version": "1.80.2", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.2.tgz", - "integrity": "sha512-ZPA4c47WQRU6rqLdlOFizGU+ljtP4C2blhcpbYSsNMqNRHD7o8vRBEzEhl8w6CMGvcy+eVoA6v10cyL4eIZARw==", + "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.0", + "i18next-http-backend": "^2.5.2", "js-yaml": "^4.1.0", "mustache": "^4.2.0", "papaparse": "^5.4.1", @@ -5616,10 +5539,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "4.0.2", @@ -5633,13 +5555,13 @@ } }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", "dev": true, "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.6.1", + "mlly": "^1.7.1", "pathe": "^1.1.2" } }, @@ -5669,9 +5591,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -5689,7 +5611,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -5759,6 +5681,7 @@ "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" } @@ -5768,15 +5691,14 @@ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", + "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", "dev": true, "dependencies": { "side-channel": "^1.0.6" @@ -5845,18 +5767,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/raw-body/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -5867,9 +5777,9 @@ } }, "node_modules/react-is": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", - "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/rechoir": { @@ -5975,6 +5885,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -5987,25 +5898,44 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, "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==", + "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-parallel": { @@ -6113,9 +6043,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -6123,17 +6053,6 @@ "node": ">=10" } }, - "node_modules/semver-try-require": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver-try-require/-/semver-try-require-7.0.0.tgz", - "integrity": "sha512-LI7GzDuAZmNKOY0/LY4nB3ifh6kYMvBimFTHVpA6wNEl3gw59QrLbTAnJb7vQzPd1qXPz+BtKJZaYORXWMerrA==", - "dependencies": { - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.17||>=20" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6197,7 +6116,6 @@ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", "dev": true, - "license": "MIT", "dependencies": { "@shikijs/core": "1.10.3", "@types/hast": "^3.0.4" @@ -6407,15 +6325,14 @@ "dev": true }, "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, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -6462,6 +6379,28 @@ "node": ">=8" } }, + "node_modules/test-exclude/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/test-exclude/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/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6523,9 +6462,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -6538,9 +6477,16 @@ } }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "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", @@ -6555,9 +6501,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.0.tgz", - "integrity": "sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", "dev": true, "bin": { "tsconfck": "bin/tsconfck.js" @@ -6599,70 +6545,6 @@ "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/tsconfig-paths-webpack-plugin/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/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==" - }, - "node_modules/tsconfig-paths-webpack-plugin/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "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", @@ -6821,7 +6703,6 @@ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.4.tgz", "integrity": "sha512-FlW6HpvULDKgc3rK04V+nbFyXogPV88hurarDPOjuuB5HAwuAlrCMQ5NeH7Zt68a/ikOKu6Z/0hFXAeC9xPccQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "markdown-it": "^14.1.0", @@ -6839,38 +6720,11 @@ "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/typedoc/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/typedoc/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/typescript": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6880,14 +6734,14 @@ } }, "node_modules/typescript-eslint": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.10.0.tgz", - "integrity": "sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.16.1.tgz", + "integrity": "sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "7.10.0", - "@typescript-eslint/parser": "7.10.0", - "@typescript-eslint/utils": "7.10.0" + "@typescript-eslint/eslint-plugin": "7.16.1", + "@typescript-eslint/parser": "7.16.1", + "@typescript-eslint/utils": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6909,13 +6763,12 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "dev": true }, "node_modules/unbox-primitive": { @@ -6957,9 +6810,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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": [ { @@ -6976,8 +6829,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6990,6 +6843,7 @@ "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" } @@ -7014,515 +6868,13 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", - "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "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-node/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vite-node/node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "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.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", + "esbuild": "^0.21.3", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -7570,6 +6922,28 @@ } } }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "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-plugin-fs": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/vite-plugin-fs/-/vite-plugin-fs-0.4.4.tgz", @@ -7605,16 +6979,16 @@ } }, "node_modules/vitest": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", - "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "dependencies": { - "@vitest/expect": "1.5.2", - "@vitest/runner": "1.5.2", - "@vitest/snapshot": "1.5.2", - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -7628,7 +7002,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.2", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -7643,8 +7017,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.2", - "@vitest/ui": "1.5.2", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -7681,546 +7055,6 @@ "vitest": "*" } }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vitest/node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vitest/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/vitest/node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "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.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.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": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -8234,9 +7068,9 @@ } }, "node_modules/watskeburt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.0.2.tgz", - "integrity": "sha512-w7X8AGrBZExP5/3e3c1X/CUY8Yod/aiAazQCvrg7n8Un6piD+NFFK926G15zRq4+wu0XAEWpSsZ4C+fEfVOCYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", + "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", "bin": { "watskeburt": "dist/run-cli.js" }, @@ -8250,9 +7084,13 @@ "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" }, "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==" + "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", @@ -8266,6 +7104,18 @@ "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", @@ -8276,12 +7126,16 @@ } }, "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==", + "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": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -8335,9 +7189,9 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "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, "dependencies": { "siginfo": "^2.0.0", @@ -8375,36 +7229,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/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==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8412,9 +7236,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -8466,7 +7290,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "dev": true, - "license": "ISC", "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index 612321906eb..3d5839e6cc1 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "typedoc": "^0.26.4", "typescript": "^5.5.3", "typescript-eslint": "^7.10.0", - "vite": "^4.5.0", + "vite": "^5.3.4", "vite-plugin-fs": "^0.4.4", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.4.0", diff --git a/src/plugins/vite/vite-minify-json-plugin.ts b/src/plugins/vite/vite-minify-json-plugin.ts new file mode 100644 index 00000000000..9a0da184e1e --- /dev/null +++ b/src/plugins/vite/vite-minify-json-plugin.ts @@ -0,0 +1,56 @@ +import path from "path"; +import fs from "fs"; +import { type Plugin as VitePlugin } from "vite"; + +/** + * Crawl a directory (recursively if wanted) for json files and minifies found ones. + * @param dir the directory to crawl + * @param recursive if true, will crawl subdirectories + */ +function applyToDir(dir: string, recursive?: boolean) { + const files = fs.readdirSync(dir).filter((file) => !/^\..*/.test(file)); + + for (const file of files) { + const filePath = path.join(dir, file); + const stat = fs.lstatSync(filePath); + + if (stat.isDirectory() && recursive) { + applyToDir(filePath, recursive); // only if recursive is true + } else if (path.extname(file) === ".json") { + const contents = fs.readFileSync(filePath, "utf8"); + const minifiedContent = JSON.stringify(JSON.parse(contents)); + + fs.writeFileSync(filePath, minifiedContent, "utf8"); + } + } +} + +/** + * Plugin to mnify json files in the build folder after the bundling is done. + * @param basePath base path/es starting inside the build dir (e.g. will always start with "/dist" if dist is the build dir) + * @param recursive if true, will crawl subdirectories + */ +export function minifyJsonPlugin(basePath: string | string[], recursive?: boolean): VitePlugin { + let buildDir = "dist"; // Default build dir + + return { + name: "flx-minify-json", + configResolved(config) { + buildDir = config.build.outDir; // Read the build output directory from Vite config + }, + async closeBundle() { + console.log("Minifying JSON files..."); + const basePathes = Array.isArray(basePath) ? basePath : [basePath]; + + basePathes.forEach((basePath) => { + const baseDir = path.resolve(buildDir, basePath); + if (fs.existsSync(baseDir)) { + applyToDir(baseDir, recursive); + } else { + console.error(`Path ${baseDir} does not exist!`); + } + }); + console.log("Finished minifying JSON files!"); + }, + }; +} diff --git a/vite.config.ts b/vite.config.ts index 6dce1272ee6..f5c95aa56bd 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,12 @@ import { defineConfig, loadEnv } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; +import { minifyJsonPlugin } from "./src/plugins/vite/vite-minify-json-plugin"; export const defaultConfig = { - plugins: [tsconfigPaths() as any], + plugins: [ + tsconfigPaths() as any, + minifyJsonPlugin(["images", "battle-anims"], true) + ], clearScreen: false, build: { minify: 'esbuild' as const, From e6e58131c19591e8aecb907a1d1fca1f61e46962 Mon Sep 17 00:00:00 2001 From: NxKarim <43686802+NxKarim@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:27:03 -0600 Subject: [PATCH 065/321] [Ability] Fix Shield Dust and Sparkling Aria interaction (#3170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Shield Dust and Sparkling Aria interaction. Shield Dust prevents a Pokémon's burn being cured by Sparkling Aria if it is the only target of the attack. * Update src/data/move.ts * Fix lint issue --------- Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> --- src/data/move.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/move.ts b/src/data/move.ts index ccdb5e85630..148aa420fbe 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2156,6 +2156,12 @@ export class HealStatusEffectAttr extends MoveEffectAttr { return false; } + // Special edge case for shield dust blocking Sparkling Aria curing burn + const moveTargets = getMoveTargets(user, move.id); + if (target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && move.id === Moves.SPARKLING_ARIA && moveTargets.targets.length === 1) { + return false; + } + const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); From 37a27c773e06a2bf48f2a2737fb9ba46a5424bca Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:27:50 -0700 Subject: [PATCH 066/321] [Bug] Fix Beat Up dealing NaN damage with Multi-Lens (#3165) * Fix Beat Up dealing NaN damage with Multi-Lens * Simplify allyCount logic --- src/data/move.ts | 7 ++- src/test/moves/beat_up.test.ts | 106 +++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/test/moves/beat_up.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 148aa420fbe..c0d04cf5891 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2867,7 +2867,12 @@ export class BeatUpAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - const allyIndex = user.turnData.hitCount - user.turnData.hitsLeft; + + const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const allyCount = party.filter(pokemon => { + return pokemon.id === user.id || !pokemon.status?.effect; + }).length; + const allyIndex = (user.turnData.hitCount - user.turnData.hitsLeft) % allyCount; power.value = beatUpFunc(user, allyIndex); return true; } diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts new file mode 100644 index 00000000000..751b91fefa3 --- /dev/null +++ b/src/test/moves/beat_up.test.ts @@ -0,0 +1,106 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveEffectPhase } from "#app/phases.js"; +import { StatusEffect } from "#app/enums/status-effect.js"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout + +describe("Moves - Beat Up", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + let enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, 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(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + }, TIMEOUT + ); + + 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(); + + game.scene.getParty()[1].trySetStatus(StatusEffect.BURN); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BEAT_UP)); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(5); + }, TIMEOUT + ); + + it( + "should hit twice for each player Pokemon if the user has Multi-Lens", + async () => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + 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; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BEAT_UP)); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(12); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + + while (playerPokemon.turnData.hitsLeft > 0) { + enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to(MoveEffectPhase); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + }, TIMEOUT + ); +}); From e3fb55834f25eb2cc2be03e4ac4e794b7ff91bf0 Mon Sep 17 00:00:00 2001 From: NxKarim <43686802+NxKarim@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:31:30 -0600 Subject: [PATCH 067/321] [Bug] [Fix] Metal Burst always hitting left target. (#3182) * [Fix] Metal Burst always hitting left target. Fixed Metal Burst always hitting left target, and the related freeze/crash. * Prevent enemy redirection to their ally. Co-Authored-By: innerthunder <168692175+innerthunder@users.noreply.github.com> * Rename attackingPosition per chriSS's comment --------- Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> --- src/field/pokemon.ts | 4 ++-- src/phases.ts | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 6e00fa05ac9..c9dfae5d140 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2084,7 +2084,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { source.turnData.damageDealt += damage.value; source.turnData.currDamageDealt = damage.value; this.battleData.hitCount++; - const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id, attackingPosition: source.getBattlerIndex() }; + const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); @@ -4021,7 +4021,7 @@ export interface AttackMoveResult { damage: integer; critical: boolean; sourceId: integer; - attackingPosition: BattlerIndex; + sourceBattlerIndex: BattlerIndex; } export class PokemonSummonData { diff --git a/src/phases.ts b/src/phases.ts index fad95951c26..dc5dcd0d167 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2666,13 +2666,14 @@ export class MovePhase extends BattlePhase { if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { if (this.pokemon.turnData.attacksReceived.length) { const attack = this.pokemon.turnData.attacksReceived[0]; - this.targets[0] = attack.attackingPosition; + this.targets[0] = attack.sourceBattlerIndex; // account for metal burst and comeuppance hitting remaining targets in double battles // counterattack will redirect to remaining ally if original attacker faints if (this.scene.currentBattle.double && this.move.getMove().hasFlag(MoveFlags.REDIRECT_COUNTER)) { - if (!this.scene.getEnemyField()[this.targets[0]]) { - this.targets[0] = this.scene.getEnemyField().find(p => p.isActive(true)).getBattlerIndex(); + if (this.scene.getField()[this.targets[0]].hp === 0) { + const opposingField = this.pokemon.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); + this.targets[0] = opposingField.find(p => p.hp > 0)?.getBattlerIndex(); } } } From 1e42c1576556a4b3542e2cde87b623c57076edf9 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:38:47 -0400 Subject: [PATCH 068/321] [Balance] Remove Reviver Seed from trainer modifier pool (#1900) --- src/modifier/modifier-type.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 78af578c312..86014d37a5b 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1672,7 +1672,6 @@ const trainerModifierPool: ModifierPool = { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.REVIVER_SEED, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 1), From 07b6563118e1c3539392a153d7228dac9302876d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2?= <123510358+NicusPulcis@users.noreply.github.com> Date: Tue, 30 Jul 2024 01:49:59 +0200 Subject: [PATCH 069/321] [Localization(it)] Added Honey Gather translation (#2301) * Update ability.ts [Localization(it)] * Update ability.ts [Localization(it)] Fixed capitalization --- src/locales/it/ability.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts index 5e01e02a718..3b98f1b389d 100644 --- a/src/locales/it/ability.ts +++ b/src/locales/it/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Mielincetta", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", + description: "Il Pokémon raccoglie del miele dopo ogni battaglia. Esso viene poi venduto.", }, frisk: { name: "Indagine", From 77167d8595f27bb4b719e1e75227521177ddf300 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:57:27 +0900 Subject: [PATCH 070/321] [Localization] Add initial translation files for filter menu names for the starter select UI ( new ) (#3197) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update translation for filter menu in starter select UI * fix lint error * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * more clear translation for zh_CN `hasNotWon` * Update src/locales/ko/filter-bar.ts Co-authored-by: Enoch * Update src/locales/ko/filter-bar.ts Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * Update src/locales/ko/filter-bar.ts Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * update missing entry of starter UI on each locales. move `sameSpeciesEgg` line for readibility * add invalidParty and removeFromParty in zh_CH * Update src/locales/ko/starter-select-ui-handler.ts Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * fix mis added line * update as suggested in de * update sort candy option to `candy count` suggested * update win filter dropdown in english * update initial translation for zh_TW * fix eslint * updated zh_TW * Update src/locales/zh_CN/starter-select-ui-handler.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/starter-select-ui-handler.ts Co-authored-by: Asdar * Update src/locales/es/starter-select-ui-handler.ts Co-authored-by: Asdar * Update src/locales/es/starter-select-ui-handler.ts Co-authored-by: Asdar * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * update `invalidParty` entry of es * Update src/locales/fr/starter-select-ui-handler.ts Co-authored-by: Lugiad' * Update src/locales/fr/filter-bar.ts Co-authored-by: Lugiad' * update `invalidParty` entry in fr * update default eng entry for `hasWon` `hasNotWon` * Update src/locales/pt_BR/starter-select-ui-handler.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/it/filter-bar.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Update src/locales/it/starter-select-ui-handler.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * update `invalidParty` entry for `it` * Update src/locales/fr/filter-bar.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira --------- Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Enoch Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Asdar Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> --- src/locales/de/config.ts | 2 ++ src/locales/de/filter-bar.ts | 21 ++++++++++++ src/locales/de/starter-select-ui-handler.ts | 3 +- src/locales/en/config.ts | 2 ++ src/locales/en/filter-bar.ts | 21 ++++++++++++ src/locales/es/config.ts | 2 ++ src/locales/es/filter-bar.ts | 21 ++++++++++++ src/locales/es/starter-select-ui-handler.ts | 9 +++--- src/locales/fr/config.ts | 2 ++ src/locales/fr/filter-bar.ts | 21 ++++++++++++ src/locales/fr/starter-select-ui-handler.ts | 3 +- src/locales/it/config.ts | 2 ++ src/locales/it/filter-bar.ts | 21 ++++++++++++ src/locales/it/starter-select-ui-handler.ts | 3 +- src/locales/ko/config.ts | 2 ++ src/locales/ko/filter-bar.ts | 21 ++++++++++++ src/locales/ko/starter-select-ui-handler.ts | 5 +-- src/locales/pt_BR/config.ts | 2 ++ src/locales/pt_BR/filter-bar.ts | 21 ++++++++++++ .../pt_BR/starter-select-ui-handler.ts | 3 +- src/locales/zh_CN/config.ts | 2 ++ src/locales/zh_CN/filter-bar.ts | 21 ++++++++++++ .../zh_CN/starter-select-ui-handler.ts | 3 +- src/locales/zh_TW/config.ts | 2 ++ src/locales/zh_TW/filter-bar.ts | 21 ++++++++++++ .../zh_TW/starter-select-ui-handler.ts | 5 +-- src/ui/dropdown.ts | 3 +- src/ui/starter-select-ui-handler.ts | 32 +++++++++---------- 28 files changed, 246 insertions(+), 30 deletions(-) create mode 100644 src/locales/de/filter-bar.ts create mode 100644 src/locales/en/filter-bar.ts create mode 100644 src/locales/es/filter-bar.ts create mode 100644 src/locales/fr/filter-bar.ts create mode 100644 src/locales/it/filter-bar.ts create mode 100644 src/locales/ko/filter-bar.ts create mode 100644 src/locales/pt_BR/filter-bar.ts create mode 100644 src/locales/zh_CN/filter-bar.ts create mode 100644 src/locales/zh_TW/filter-bar.ts diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index d14eae3b77c..dcce95ed9a5 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const deConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts new file mode 100644 index 00000000000..31c6fee20d4 --- /dev/null +++ b/src/locales/de/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen.", + "typeFilter": "Typ", + "unlocksFilter": "Freisch.", + "winFilter": "Abschluss", + "sortFilter": "Sort.", + "all": "Alle", + "normal": "Normal", + "uncaught": "Nicht gefangen", + "passiveUnlocked": "Passive freigeschaltet", + "passiveLocked": "Passive gesperrt", + "hasWon": "Hat Klassik-Modus gewonnen", + "hasNotWon": "Hat Klassik-Modus nicht gewonnen", + "sortByNumber": "Pokédex-Nummer", + "sortByCost": "Kosten", + "sortByCandies": "Anzahl Bonbons", + "sortByIVs": "IS-Werte", + "sortByName": "Name", +}; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index 9cf08846401..caade5c524d 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Mit diesen Pokémon losziehen?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "Das ist kein gültiges Team!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Wesen:", "eggMoves": "Ei-Attacken", "addToParty": "Zum Team hinzufügen", + "removeFromParty": "Aus Team entfernen", "toggleIVs": "DVs anzeigen/verbergen", "manageMoves": "Attacken ändern", "manageNature": "Wesen ändern", diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 8a54c565f0e..8b40b7a667b 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -26,6 +26,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const enConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts new file mode 100644 index 00000000000..60c6ffb1bbc --- /dev/null +++ b/src/locales/en/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Type", + "unlocksFilter": "Unlocks", + "winFilter": "Win", + "sortFilter": "Sort", + "all": "All", + "normal": "Normal", + "uncaught": "Uncaught", + "passiveUnlocked": "Passive Unlocked", + "passiveLocked": "Passive Locked", + "hasWon": "Yes", + "hasNotWon": "No", + "sortByNumber": "No.", + "sortByCost": "Cost", + "sortByCandies": "Candy Count", + "sortByIVs": "IVs", + "sortByName": "Name", +}; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 6cc71222761..6d3d5504f26 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const esConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts new file mode 100644 index 00000000000..50826ba0502 --- /dev/null +++ b/src/locales/es/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen.", + "typeFilter": "Tipo", + "unlocksFilter": "Otros", + "winFilter": "Vic.", + "sortFilter": "Orden", + "all": "Todo", + "normal": "Normal", + "uncaught": "No Capt.", + "passiveUnlocked": "Pasiva Desbloq.", + "passiveLocked": "Pasiva Bloq.", + "hasWon": "Ya ha ganado", + "hasNotWon": "Aún no ha ganado", + "sortByNumber": "Núm.", + "sortByCost": "Coste", + "sortByCandies": "# Caramelos", + "sortByIVs": "IVs", + "sortByName": "Nombre", +}; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 6f7d845ca64..583e302bfeb 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "¿Comenzar con estos Pokémon?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "¡Este equipo no es válido!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,10 +22,11 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Pasiva:", "nature": "Natur:", "eggMoves": "Mov. Huevo", - "addToParty": "Añadir a Equipo", + "addToParty": "Añadir al Equipo", + "removeFromParty": "Excluir del Equipo", "toggleIVs": "Mostrar IVs", - "manageMoves": "Gestionar Movs.", - "manageNature": "Gestionar Natur", + "manageMoves": "Cambiar movs.", + "manageNature": "Cambiar natur.", "useCandies": "Usar Caramelos", "selectNature": "Elige Natur.", "selectMoveSwapOut": "Elige el movimiento que sustituir.", diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index fc274306528..30171ee634a 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const frConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts new file mode 100644 index 00000000000..de0be450ad6 --- /dev/null +++ b/src/locales/fr/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Type", + "unlocksFilter": "Autres", + "winFilter": "Victoires", + "sortFilter": "Tri", + "all": "Tous", + "normal": "Normal", + "uncaught": "Non-capturé", + "passiveUnlocked": "Passif débloqué", + "passiveLocked": "Passif verrouillé", + "hasWon": "Oui", + "hasNotWon": "Aucune", + "sortByNumber": "Par N°", + "sortByCost": "Par cout", + "sortByCandies": "Par # bonbons", + "sortByIVs": "Par IV", + "sortByName": "Par nom", +}; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index fa45624c0f0..ce5959062ac 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Commencer avec ces Pokémon ?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "Cette équipe de départ est invalide !", "gen1": "1G", "gen2": "2G", "gen3": "3G", @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Nature :", "eggMoves": "Capacités Œuf", "addToParty": "Ajouter à l’équipe", + "removeFromParty": "Retirer de l’équipe", "toggleIVs": "Voir les IV", "manageMoves": "Modifier les Capacités", "manageNature": "Modifier la Nature", diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index cfb8c4118c9..3bce2bd723f 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const itConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts new file mode 100644 index 00000000000..979b52f1729 --- /dev/null +++ b/src/locales/it/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Gen", + "typeFilter": "Tipo", + "unlocksFilter": "Altro", + "winFilter": "Vinto", + "sortFilter": "Ordina", + "all": "Tutto", + "normal": "Normale", + "uncaught": "Mancante", + "passiveUnlocked": "Passiva sbloccata", + "passiveLocked": "Passiva bloccata", + "hasWon": "Si", + "hasNotWon": "No", + "sortByNumber": "Num. Dex", + "sortByCost": "Costo", + "sortByCandies": "Caramelle", + "sortByIVs": "IVs", + "sortByName": "Nome", +}; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 8b42a0db8de..9b0197e48ab 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Vuoi iniziare con questi Pokémon?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "Questo squadra iniziale non è valida!", "gen1": "1ª", "gen2": "2ª", "gen3": "3ª", @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Natura:", "eggMoves": "Mosse da uova", "addToParty": "Aggiungi al gruppo", + "removeFromParty": "Rimuovi dal gruppo", "toggleIVs": "Vedi/Nascondi IV", "manageMoves": "Gestisci mosse", "manageNature": "Gestisci natura", diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index d9658b22c75..49b46f84131 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -25,6 +25,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const koConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts new file mode 100644 index 00000000000..7f2dbf89db8 --- /dev/null +++ b/src/locales/ko/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "세대", + "typeFilter": "타입", + "unlocksFilter": "등록", + "winFilter": "클리어", + "sortFilter": "정렬", + "all": "전체", + "normal": "기본", + "uncaught": "미포획", + "passiveUnlocked": "패시브 해금", + "passiveLocked": "패시브 잠김", + "hasWon": "완료", + "hasNotWon": "미완료", + "sortByNumber": "도감번호", + "sortByCost": "코스트", + "sortByCandies": "사탕 수", + "sortByIVs": "개체값", + "sortByName": "이름", +}; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index a0c305b4266..8fe66e0d58a 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "성격:", "eggMoves": "알 기술", "addToParty": "파티에 추가", + "removeFromParty": "파티에서 제외", "toggleIVs": "개체값 토글", "manageMoves": "기술 관리", "manageNature": "성격 관리", @@ -30,9 +31,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "교체할 성격을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", + "sameSpeciesEgg": "알 구매하기", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", - "sameSpeciesEgg": "알 구매하기", "cycleShiny": ": 색이 다른", "cycleForm": ": 폼", "cycleGender": ": 암수", diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 1d204914ff6..ccadf78d67a 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -25,6 +25,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const ptBrConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts new file mode 100644 index 00000000000..5e3ab7114da --- /dev/null +++ b/src/locales/pt_BR/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "Ger.", + "typeFilter": "Tipo", + "unlocksFilter": "Outros", + "winFilter": "Vit.", + "sortFilter": "Ordem", + "all": "Tudo", + "normal": "Normal", + "uncaught": "Não Capturado", + "passiveUnlocked": "Passiva Desbloq.", + "passiveLocked": "Passiva Bloq.", + "hasWon": "Sim", + "hasNotWon": "Não", + "sortByNumber": "Núm.", + "sortByCost": "Custo", + "sortByCandies": "# Doces", + "sortByIVs": "IVs", + "sortByName": "Nome", +}; diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index bec408f4550..d1038630c8c 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Natureza:", "eggMoves": "Mov. de Ovo", "addToParty": "Adicionar à equipe", + "removeFromParty": "Remover da Equipe", "toggleIVs": "Mostrar IVs", "manageMoves": "Mudar Movimentos", "manageNature": "Mudar Natureza", @@ -30,9 +31,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "Escolha uma natureza.", "selectMoveSwapOut": "Escolha um movimento para substituir.", "selectMoveSwapWith": "Escolha o movimento que substituirá", + "sameSpeciesEgg": "Comprar Ovo", "unlockPassive": "Aprender Passiva", "reduceCost": "Reduzir Custo", - "sameSpeciesEgg": "Comprar Ovo", "cycleShiny": ": » Shiny", "cycleForm": ": » Forma", "cycleGender": ": » Gênero", diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index c8fea6e71cb..39c43a24631 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const zhCnConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts new file mode 100644 index 00000000000..581c7bf6b8c --- /dev/null +++ b/src/locales/zh_CN/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "世代", + "typeFilter": "属性", + "unlocksFilter": "解锁", + "winFilter": "通关", + "sortFilter": "排序", + "all": "全部", + "normal": "无闪光", + "uncaught": "未捕获", + "passiveUnlocked": "被动解锁", + "passiveLocked": "被动未解锁", + "hasWon": "已通关", + "hasNotWon": "未通关", + "sortByNumber": "编号", + "sortByCost": "费用", + "sortByCandies": "糖果", + "sortByIVs": "个体", + "sortByName": "名称", +}; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index b93fc26cde3..45327bab55b 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -23,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "蛋招式", "addToParty": "加入队伍", + "removeFromParty": "移出队伍", "toggleIVs": "显示个体", "manageMoves": "管理招式", "manageNature": "管理性格", @@ -30,9 +31,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "选择性格", "selectMoveSwapOut": "选择要替换的招式。", "selectMoveSwapWith": "选择要替换成的招式", + "sameSpeciesEgg": "兑换一颗蛋", "unlockPassive": "解锁被动", "reduceCost": "降低花费", - "sameSpeciesEgg": "兑换一颗蛋", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 72bfc4c19d8..a0217f004cf 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -24,6 +24,7 @@ import { } from "./dialogue"; import { egg } from "./egg"; import { fightUiHandler } from "./fight-ui-handler"; +import { filterBar } from "./filter-bar"; import { gameMode } from "./game-mode"; import { gameStatsUiHandler } from "./game-stats-ui-handler"; import { growth } from "./growth"; @@ -79,6 +80,7 @@ export const zhTwConfig = { PGFdoubleBattleDialogue: PGFdoubleBattleDialogue, egg: egg, fightUiHandler: fightUiHandler, + filterBar: filterBar, gameMode: gameMode, gameStatsUiHandler: gameStatsUiHandler, growth: growth, diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts new file mode 100644 index 00000000000..1f562ffb7ba --- /dev/null +++ b/src/locales/zh_TW/filter-bar.ts @@ -0,0 +1,21 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const filterBar: SimpleTranslationEntries = { + "genFilter": "世代", + "typeFilter": "屬性", + "unlocksFilter": "解鎖", + "winFilter": "通關", + "sortFilter": "排序", + "all": "全部", + "normal": "通常", + "uncaught": "未捕獲", + "passiveUnlocked": "被動解鎖", + "passiveLocked": "被動未解鎖", + "hasWon": "已通關", + "hasNotWon": "未通關", + "sortByNumber": "編號", + "sortByCost": "花費", + "sortByCandies": "糖果", + "sortByIVs": "個體值", + "sortByName": "名稱", +}; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index c3b78c8078d..0ea1e2d0415 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "使用這些寶可夢開始嗎?", - "invalidParty": "This is not a valid starting party!", + "invalidParty": "此為無效隊伍!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -24,6 +24,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "eggMoves": "孵化招式", "start": "開始", "addToParty": "加入隊伍", + "removeFromParty": "移出隊伍", "toggleIVs": "查看個體值", "manageMoves": "管理技能", "manageNature": "管理性格", @@ -31,9 +32,9 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "selectNature": "選擇性格", "selectMoveSwapOut": "選擇想要替換走的招式", "selectMoveSwapWith": "選擇想要替換成的招式", + "sameSpeciesEgg": "買蛋", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", - "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 34ff96d66ee..15830773b98 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -2,6 +2,7 @@ import BattleScene from "#app/battle-scene.js"; import { SceneBase } from "#app/scene-base.js"; import { addTextObject, TextStyle } from "./text"; import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; export enum DropDownState { ON = 0, @@ -108,7 +109,7 @@ export class DropDown extends Phaser.GameObjects.Container { this.cursorObj.setVisible(false); if (this.dropDownType === DropDownType.MULTI) { - this.options.unshift(new DropDownOption(scene, "ALL", "All", null, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF)); + this.options.unshift(new DropDownOption(scene, "ALL", i18next.t("filterBar:all"), null, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF)); } options.forEach((option, index) => { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5201b12d2da..a20b04a825d 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -322,7 +322,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption(this.scene, 8, i18next.t("starterSelectUiHandler:gen8"), null, DropDownState.ON), new DropDownOption(this.scene, 9, i18next.t("starterSelectUiHandler:gen9"), null, DropDownState.ON), ]; - this.filterBar.addFilter("Gen", new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.addFilter(i18next.t("filterBar:genFilter"), new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.MULTI)); this.filterBar.defaultGenVals = this.filterBar.getVals(DropDownColumn.GEN); // set gen filter to all off except for the I GEN for (const option of genOptions) { @@ -343,7 +343,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { typeSprite.setFrame(type.toLowerCase()); typeOptions.push(new DropDownOption(this.scene, index, null, typeSprite)); }); - this.filterBar.addFilter("Type", new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.MULTI, 0.5)); + this.filterBar.addFilter(i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.MULTI, 0.5)); this.filterBar.defaultTypeVals = this.filterBar.getVals(DropDownColumn.TYPES); // Unlocks filter @@ -358,29 +358,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption(this.scene, "SHINY3", null, shiny3Sprite), new DropDownOption(this.scene, "SHINY2", null, shiny2Sprite), new DropDownOption(this.scene, "SHINY", null, shiny1Sprite), - new DropDownOption(this.scene, "NORMAL", "Normal"), - new DropDownOption(this.scene, "UNCAUGHT", "Not Caught"), - new DropDownOption(this.scene, "PASSIVEUNLOCKED", "Passive Unlocked"), - new DropDownOption(this.scene, "PASSIVELOCKED", "Passive Locked"),]; + new DropDownOption(this.scene, "NORMAL", i18next.t("filterBar:normal")), + new DropDownOption(this.scene, "UNCAUGHT", i18next.t("filterBar:uncaught")), + new DropDownOption(this.scene, "PASSIVEUNLOCKED", i18next.t("filterBar:passiveUnlocked")), + new DropDownOption(this.scene, "PASSIVELOCKED", i18next.t("filterBar:passiveLocked"))]; - this.filterBar.addFilter("Unlocks", new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.addFilter(i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.MULTI)); this.filterBar.defaultUnlockVals = this.filterBar.getVals(DropDownColumn.UNLOCKS); // win filter const winOptions = [ - new DropDownOption(this.scene, "WIN", "has won"), - new DropDownOption(this.scene, "NOTWIN", "hasn't won yet")]; - this.filterBar.addFilter("Win", new DropDown(this.scene, 0, 0, winOptions, this.updateStarters, DropDownType.MULTI)); + new DropDownOption(this.scene, "WIN", i18next.t("filterBar:hasWon")), + new DropDownOption(this.scene, "NOTWIN", i18next.t("filterBar:hasNotWon"))]; + this.filterBar.addFilter(i18next.t("filterBar:winFilter"), new DropDown(this.scene, 0, 0, winOptions, this.updateStarters, DropDownType.MULTI)); this.filterBar.defaultWinVals = this.filterBar.getVals(DropDownColumn.WIN); // sort filter const sortOptions = [ - new DropDownOption(this.scene, 0, "No."), - new DropDownOption(this.scene, 1, "Cost", null, DropDownState.OFF), - new DropDownOption(this.scene, 2, "# Candies", null, DropDownState.OFF), - new DropDownOption(this.scene, 3, "IVs", null, DropDownState.OFF), - new DropDownOption(this.scene, 4, "Name", null, DropDownState.OFF)]; - this.filterBar.addFilter("Sort", new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + new DropDownOption(this.scene, 0, i18next.t("filterBar:sortByNumber")), + new DropDownOption(this.scene, 1, i18next.t("filterBar:sortByCost"), null, DropDownState.OFF), + new DropDownOption(this.scene, 2, i18next.t("filterBar:sortByCandies"), null, DropDownState.OFF), + new DropDownOption(this.scene, 3, i18next.t("filterBar:sortByIVs"), null, DropDownState.OFF), + new DropDownOption(this.scene, 4, i18next.t("filterBar:sortByName"), null, DropDownState.OFF)]; + this.filterBar.addFilter(i18next.t("filterBar:sortFilter"), new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); this.filterBarContainer.add(this.filterBar); this.filterBar.defaultSortVals = this.filterBar.getVals(DropDownColumn.SORT); From fc354147eb724c650404d170e3426d083df98f60 Mon Sep 17 00:00:00 2001 From: Enoch Date: Tue, 30 Jul 2024 11:58:43 +0900 Subject: [PATCH 071/321] [Localization] localize quick claw message (bypass speed chance modifier) (#3232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 송지원 --- src/locales/de/modifier.ts | 1 + src/locales/en/modifier.ts | 1 + src/locales/es/modifier.ts | 1 + src/locales/fr/modifier.ts | 1 + src/locales/it/modifier.ts | 1 + src/locales/ko/modifier.ts | 1 + src/locales/pt_BR/modifier.ts | 1 + src/locales/zh_CN/modifier.ts | 3 ++- src/locales/zh_TW/modifier.ts | 1 + src/modifier/modifier.ts | 4 ++-- 10 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/locales/de/modifier.ts b/src/locales/de/modifier.ts index 50b7e80b252..5a8126e3d85 100644 --- a/src/locales/de/modifier.ts +++ b/src/locales/de/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!", "contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!", "enemyTurnHealApply": "{{pokemonNameWithAffix}} stellt einige KP wieder her!", + "bypassSpeedChanceApply": "Dank des Items {{itemName}} kann {{pokemonName}} schneller handeln als sonst!", } as const; diff --git a/src/locales/en/modifier.ts b/src/locales/en/modifier.ts index 85098cdaaec..26a6a9c18ae 100644 --- a/src/locales/en/modifier.ts +++ b/src/locales/en/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!", + "bypassSpeedChanceApply": "{{pokemonName}} can act faster than normal, thanks to its {{itemName}}!", } as const; diff --git a/src/locales/es/modifier.ts b/src/locales/es/modifier.ts index 85098cdaaec..b0a3d36e233 100644 --- a/src/locales/es/modifier.ts +++ b/src/locales/es/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!", + "bypassSpeedChanceApply": "¡Gracias {{itemName}} {{pokemonName}} puede tener prioridad!", } as const; diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts index 3cc72600f91..4047aa078ec 100644 --- a/src/locales/fr/modifier.ts +++ b/src/locales/fr/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "bypassSpeedChanceApply": "{{itemName}} {{pokemonName}} lui permettent d’agir plus vite que d’habitude !", } as const; diff --git a/src/locales/it/modifier.ts b/src/locales/it/modifier.ts index 85098cdaaec..810524a9e5e 100644 --- a/src/locales/it/modifier.ts +++ b/src/locales/it/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!", + "bypassSpeedChanceApply": "{{pokemonName}} agisce più rapidamente del normale grazie al suo {{itemName}}!", } as const; diff --git a/src/locales/ko/modifier.ts b/src/locales/ko/modifier.ts index 71508f774c7..98460b118f1 100644 --- a/src/locales/ko/modifier.ts +++ b/src/locales/ko/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}의\n체력이 약간 회복되었다!", + "bypassSpeedChanceApply": "{{pokemonName}}[[는]] {{itemName}}[[로]]\n행동이 빨라졌다!", } as const; diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts index 87682a55466..eef08db25ae 100644 --- a/src/locales/pt_BR/modifier.ts +++ b/src/locales/pt_BR/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaurou um pouco de seus PS!", + "bypassSpeedChanceApply": "{{pokemonName}} se move mais rápido que o normal graças a sua {{itemName}}!", } as const; diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts index 57e01118ed2..6900e99dfb6 100644 --- a/src/locales/zh_CN/modifier.ts +++ b/src/locales/zh_CN/modifier.ts @@ -5,9 +5,10 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", - "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\复原了!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n复原了!", "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回复了一些体力!", + "bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}后,行动变快了!", } as const; diff --git a/src/locales/zh_TW/modifier.ts b/src/locales/zh_TW/modifier.ts index 5174ae68362..7909e8150a0 100644 --- a/src/locales/zh_TW/modifier.ts +++ b/src/locales/zh_TW/modifier.ts @@ -10,4 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回復了一些體力!", + "bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}後,行動變快了!", } as const; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 4467f82cb85..9c47867d931 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -9,7 +9,7 @@ import { addTextObject, TextStyle } from "../ui/text"; import { Type } from "../data/type"; import { EvolutionPhase } from "../evolution-phase"; import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; -import {getPokemonMessage, getPokemonNameWithAffix} from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import * as Utils from "../utils"; import { TempBattleStat } from "../data/temp-battle-stat"; import { getBerryEffectFunc, getBerryPredicate } from "../data/berry"; @@ -1088,7 +1088,7 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { const hasQuickClaw = this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW"; if (isCommandFight && hasQuickClaw) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " used its Quick Claw to move faster!")); + pokemon.scene.queueMessage(i18next.t("modifier:bypassSpeedChanceApply", { pokemonName: getPokemonNameWithAffix(pokemon), itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name") })); } return true; } From c2b2cf08db4b59243aabcbccf75b393d6d65e5cb Mon Sep 17 00:00:00 2001 From: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:32:27 +0800 Subject: [PATCH 072/321] [Localization]Localized move-trigger text (#3233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add Google and Discord login functionality feat: Add link to Discord in menu UI feat: Add Discord and Google login functionality Add container around discord and google icons refactor: Update environment variable names for Discord and Google client IDs feat: Add "Or use" translation for login options in multiple languages feat: Update menu UI translations for multiple languages Code review fixes refactor: Update Discord and Google client IDs in environment variables * refactor: Add missing properties to initLoggedInUser function * Update src/locales/de/menu-ui-handler.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * make i18n debugging an optional env setting this also reduces output noise in tests * set development default also to "0" * [Localization]Localized move-trigger text * [Localization]Localized zh-cn move-trigger text * [Localization]fix typo * [Localization]fix typo * Update src/locales/pt_BR/move-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * [Localization]add pokemonName to move-trigger.ts * [Localization]add pokemonName to move-trigger.ts * Update zh_TW move-trigger.ts * Update zh_CN move-trigger.ts * Update move.ts * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update move-trigger.ts * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * [Localization]add affix to target pokemon names * fix inaccurate docs for TypeImmunityAbAttr (#2957) * chore: Add beta branch to GitHub Actions tests workflow * chore: Add beta branch to GitHub Actions linter and gh-pages workflow * Update src/locales/ko/menu-ui-handler.ts Co-authored-by: lnuvy * Update src/locales/ko/menu.ts Co-authored-by: lnuvy * Localization(pt): translated bgm-name.ts (#2955) * Localization(pt): translated bgm-name.ts * fix * update VITE_I18N_DEBUG in .env files * chore: Update environment variables for beta and production environments * chore: Add beta branch to GitHub Actions deploy workflow * Hardcoded Pokemon should have proper names (#2941) * Refactor challenges and add fresh start (#2963) * [Balance] Update many TM learnsets (#2879) * Update TMs for more Indigo Disk changes * Fix typo, more Stored Power * Refactor challenges and add fresh start (#2964) * Refactor challenges and add fresh start * Add achievement for fresh start challenge * Update src/locales/fr/move-trigger.ts Co-authored-by: Lugiad' * [Bug] Fix off-by-one error in damage calc (#2970) * Fix random damage roll to be 85-100% instead of 85-99% * Update battle.test.ts to reflect the fix * [Bug] Grounded on Terrain fixes (#2969) * [Help] [Move/Bug] Patches Psychic Terrain applicability edge cases Was cancelling moves even if targeted mons weren't on the terrain. * [Bug `]Pokemon.isGrounded` does not exist Replaced with `Pokemon.isGrounded()`, which does. * [Bug] Psychic Terrain priority move cancel ignoring ungrounded * [Bug] Semi-invulnerable should not be grounded * Update game-stats-ui-handler.ts (italian) (#2965) * [Bugfix] Fix a bug during bgm-bar initialization (#2822) * Prevent sizing error * Make reboot not necessary for show BGM * Makes the BGM Bar active by default + It had originally been decided that this would not be active by default because it was to be displayed outside the pause menu, but since its behavior has changed between this decision and its integration, the default deactivation is no longer necessary * [Mirror][Localization] Translate game victory sentences #2254 (#2906) * Translate forgotten sentences on phases * Translate to de forgotten sentences on phases * Translate to es forgotten sentences on phases * Translate to fr forgotten sentences on phases * Translate to it forgotten sentences on phases * Translate to ko forgotten sentences on phases * Translate to pt br forgotten sentences on phases * Translate to zh cn forgotten sentences on phases * Translate to zh tw forgotten sentences on phases * remove duplicate message * remove duplicate message * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update battle.ts [Localization(it)] * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> --------- Co-authored-by: Alexis Co-authored-by: 송지원 Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * [Mirror][Localization] Translate summary #2336 (#2907) * Translate pokemon summary * Translate pokemon summary to fr * Translate pokemon summary to de * Translate pokemon summary to es * Translate pokemon summary to it * Translate pokemon summary to ko * Translate pokemon summary to pt br * Translate pokemon summary to zh cn * Translate pokemon summary to zh tw * Fix import * Update partially for en and ko * Update interface name for en * Merge trainerLabel&Text and calculate typeLabel width * Update src/locales/es/pokemon-summary.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Apply translations key to all languages with interface TranslationEtries * Update ko/translationKey of status * Update ko/translationKey of pokemonInfo * Update de/translationKeys of memostring and metFragment * Update de/translationKeys of memostring and metFragment 2 * Update src/locales/ko/pokemon-summary.ts Co-authored-by: Enoch * Update src/locales/ko/pokemon-summary.ts Co-authored-by: returntoice * Update src/locales/pt_BR/pokemon-summary.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/ko/pokemon-summary.ts * Update src/locales/pt_BR/pokemon-summary.ts Co-authored-by: José Ricardo Fleury Oliveira * Update pokemon-summary.ts [Localization(it)] * remove unused code * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/pokemon-summary.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/es/pokemon-summary.ts Co-authored-by: Arxxer * Update src/locales/es/pokemon-summary.ts Co-authored-by: Arxxer --------- Co-authored-by: Alexis Co-authored-by: Mr.WaterT Co-authored-by: Alexis Faizeau Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: 송지원 Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Arxxer * [Localization] Localization arena flyout (Active Battle Effects) (#2932) * localizing Active Battle Effects (working) * Localize Active Battle Effects * Change return value * Modify arena terrain desc * Update src/locales/zh_CN/arena-flyout.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/de/arena-flyout.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/arena-flyout.ts Co-authored-by: Lugiad' * Update arena-flyout.ts (IT) * Update src/locales/pt_BR/arena-flyout.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/es/arena-flyout.ts Co-authored-by: Arxxer * Change util function name --------- Co-authored-by: 송지원 Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Arxxer * This should prevent gym leaders appear as doubles (marnie & piers) when they arent fixed battles (#2904) * The stat messages can now be plural (#2600) * The stat messages are now plural * "And" can now be localized * Revert Override * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/ko/battle.ts Co-authored-by: Enoch * Update src/locales/ko/battle.ts Co-authored-by: Enoch * Update src/locales/es/battle.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Update src/locales/es/battle.ts Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> * Update src/locales/de/battle.ts * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/data/battle-stat.ts * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Changed the way the multiple is handeled to use the i18n way * Missed one file * Apply suggestions from code review * Apply suggestions from code review * Changed the tests so they work now with the i18n hting * Fixed some other tests (chinese still makes problems... * Fix tests for chinese * Tests * Update src/test/battle-stat.spec.ts * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Enoch Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira * [Enhancement][QoL] Add option to adjust shop overlay opacity (#2622) * add option to adjust shop overlay opacity * add localization * fix bug * Update src/locales/fr/settings.ts Co-authored-by: Lugiad' * Update src/locales/zh_CN/settings.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/fr/settings.ts Co-authored-by: Lugiad' * update default value * update setting values * re-add value 10 * Update src/locales/pt_BR/settings.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/ko/settings.ts Co-authored-by: Enoch * Update src/locales/es/settings.ts Co-authored-by: InnocentGameDev * Update settings.ts --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: InnocentGameDev Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * [Bug] Fix battler tags lapsing at incorrect times (#2944) * Fix battler tags lapsing at incorrect times * Document FlinchedTag * Update French pokemon-summary.ts (#2976) * [Test] Prevent tests from running if overrides are different from the default values (#2110) * mock default overrides in test setup * change beforeEach to beforeALl * move some more enums into the enums directory * replace modules that import i18n into overrides with modules that don't * add pre tests and update vitest configs, scripts * replace tabs with spaces * fix vitest server port overlap warning * add missing overrides and clean up workspace config * change test name * include spec files in main test suite * [QoL] Highlight targets of multitarget moves instead of immediate execution (#2863) * show targets for move targeting multiple pokemon * dont allow selecting target if multiple * fix targeting * cleanup * more cleanup * only highlight targets is move is not status * fix tests failing * fix tests * change "immediately" to "auto" * nevermind just remove auto * remove status move condition * [Refactor] rewrite applyAbAttrsInternal to use an iterator. (#1832) * initial rewrite of applyAbAttrsInternal * clean up applyAbAttrsInternal * remove the await because it wraps non Promises in a promise * add TODO comment about promises * fix broken costar test, hopefully * Update typescript and typedoc (#2988) * update typescript and typedoc to latest versions * forgot to add the package-lock * add fixes for breaking type gen * update workflow (#2989) * [Qol/Balance] Dynamax cannon tweak (#2540) * Dynamax Cannon fix * Update src/locales/fr/move.ts Added fr translation. Co-authored-by: Lugiad' * Update src/locales/fr/move.ts Adding an important missing precision in French description Co-authored-by: Lugiad' * Update src/locales/de/move.ts German locale commit. Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/zh_CN/move.ts Chinese locale commit, checked by a native speaker Co-authored-by: Lugiad' * Update src/locales/ko/move.ts Korean locale added Co-authored-by: returntoice * fixed trailing space in Chinese locale * added es locale * Different Dynamax Cannon fix. This one is the one * Dynamax Cannon fix localisations * Update src/locales/fr/move.ts Added fr locale Co-authored-by: Lugiad' * Update src/locales/de/move.ts German translation ^^ Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/move.ts pt-BR translation Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/de/move.ts Eslint fix, good catch @Enoch Co-authored-by: Enoch * Update src/locales/ko/move.ts Korean locale ^^ Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * Update src/locales/zh_CN/move.ts zh_CN locale Co-authored-by: RimKnight * Update src/locales/zh_TW/move.ts zh_TW locale Co-authored-by: RimKnight * Update move.ts linting mistake due to how my comment was written * Update move.ts linting mistake due to how my comment was written * Update move.ts [Localization(it)] * WIP test * WIP test part 2 * [Test] Add Unit Tests for Dynamax Cannon * removed some unnecessary cases in the test to reduce testing overhead * Update src/locales/ko/move.ts Updated kr locale Co-authored-by: Enoch * [Test] Adjust Unit Tests for Dynamax Cannon --------- Co-authored-by: Lugiad' Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: RimKnight Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: xsn34kzx * [Test] Fix/Extend Unit Test for Hard Press (#2992) * [Test] Update tests to enable no-crits override (#2971) * Update tests to enable no-crits override * Rename variable maxHP to initialHP * localized type * [Localization]Localized move-trigger text (#2913) * [Localization]Localized move-trigger text * [Localization]Localized zh-cn move-trigger text * [Localization]fix typo * [Localization]fix typo * Update src/locales/pt_BR/move-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * [Localization]add pokemonName to move-trigger.ts * [Localization]add pokemonName to move-trigger.ts * Update zh_TW move-trigger.ts * Update zh_CN move-trigger.ts * Update move.ts * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update move-trigger.ts * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * [Localization]add affix to target pokemon names * Update src/locales/fr/move-trigger.ts Co-authored-by: Lugiad' * localized type --------- Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' * [Bug] Fix description of rare candy to have proper amount of level (#2903) * [Bug] Fix description of rare candy to have proper amount of level * Update en locales * Add locales * Add locales * Update src/locales/de/modifier-type.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/modifier-type.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/modifier-type.ts Co-authored-by: Lugiad' * Update src/locales/fr/modifier-type.ts Co-authored-by: Lugiad' * Update src/locales/ko/modifier-type.ts Co-authored-by: Enoch * Update src/locales/ko/modifier-type.ts Co-authored-by: Enoch * Update src/locales/zh_CN/modifier-type.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_CN/modifier-type.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/pt_BR/modifier-type.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/modifier-type.ts Co-authored-by: José Ricardo Fleury Oliveira * Update modifier-type.ts (IT) * Update src/locales/es/modifier-type.ts Co-authored-by: Arxxer * Update src/locales/es/modifier-type.ts Co-authored-by: Arxxer --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Enoch Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Arxxer * move status effect enum into separate file (#2998) * add .env.test (#2997) block i18n debug output by default * [QoL] Create default overrides class and export that with custom overrides (#2999) * Create default overrides class and export that with custom overrides * add comment to mock import and replace typecast with type narrowing * change modifier override type to pick keys from modifierTypes * [Feature][FUN] add breedersInSpace splash message (#2631) * add spaceBreeder splash message * fix typo (whops) * Add pt_BR translation Co-authored-by: José Ricardo Fleury Oliveira * replace text & key with breedersInSpace * add french tanslation Co-authored-by: Lugiad' * remove obsolete array split in splash-messages.ts * Update src/locales/pt_BR/splash-messages.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/es/splash-messages.ts Co-authored-by: Asdar * Update splash-messages.ts (Italian) * Update src/locales/zh_CN/splash-messages.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/ko/splash-messages.ts Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> --------- Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Lugiad' Co-authored-by: Asdar Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> * [Enhancement] Pokemon generation number tooltip (#2642) * Create tooltip to show Pokemon generation * Add option to toggle generation tooltip * Use roman numeral for generation tooltip * Revert "Add option to toggle generation tooltip" This reverts commit 414b2366fc55c5642f8858d6f4854aa62c4caf60. * Update src/locales/de/battle-info.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/battle-info.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/battle-info.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/zh_TW/battle-info.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battle-info.ts Co-authored-by: RimKnight * Update src/locales/ko/battle-info.ts Co-authored-by: Enoch * Update battle-info.ts (IT) --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: RimKnight Co-authored-by: Enoch Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * [Beta] Updating the manage data->unlock all option to work with all abilities, natures, forms and passives (#2967) * Updated code to allow user to unlock all pokemon from the manage data menu option * Added code to Utils to allow it to check for a beta env, and hid the unlock all code behind that. This should stop it from being accessed in prod envs * Updated another section to be locked behind beta check, and also updated the everything.prsv to have everything unlocked going forward * Fixed some code reviews * [Bug] vite port (for development) (#3003) * make vite-port configurable and make it default 8000 * add retries for `does not trigger by non damage moves` test * feat: Update isBeta check in utils.ts to use import.meta.env.MODE The current implementation of the isBeta check in utils.ts is using import.meta.env.DEV, which gives the same value for both beta and dev environments. This commit updates the check to use import.meta.env.MODE === "beta" to accurately determine if the environment is beta. This ensures that the unlock all code is only accessible in the beta environment and not in production environments. * refactor: Update trainerId and secretId in game data This commit updates the `trainerId` and `secretId` properties in the `GameData` class. The values are replaced with the corresponding values from the `this.trainerId` and `this.secretId` variables. This change ensures that the `trainerId` and `secretId` are correctly updated in the game data. * Adds bg glow behind starters with unlocked passives (#2497) * [Localization] Localize missed things in battlers-tag.ts (#3004) * Localize missed things in battlers-tag * Change orders of configs * Add missed phase * Update src/locales/zh_CN/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battle.ts Co-authored-by: RimKnight * Update src/locales/zh_TW/battler-tags.ts Co-authored-by: RimKnight * Update src/locales/zh_CN/battler-tags.ts Co-authored-by: RimKnight --------- Co-authored-by: RimKnight * [Feature] Fully implement Octolock (#2985) * implement octolock * Add tests * [Bug] Fix import of overrides in a test (#3009) * [BUG] Fixes Sketch copying the first move used by the opponent instead of the last (#2759) * Changes getMoveHistory to getLastXMoves to fix sketch copying first move used instead of last * Optimizes move search and early return * Reverts check for virtual moves * [Bug] Making FormChangeItems Untransferrable (#2695) * Made FormChangeItems untransferrable. Replaced getTransferrable() * Made isTransferrable readonly. Removed unnecessary 'm as PokemonHeldItemModifier'. * [Bug] Fix Clear terrains upon Trainer Battle (#2027) * Clear terrains upon Trainer Battle * Adjusted comment * Fix item reward overrides going out of bounds (#3012) * [Localization] Localize Berry Heal message (#2996) * Localize berry heal message (HP/PP) * Change location of translation * conflict resolve * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/zh_CN/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/battle.ts Co-authored-by: José Ricardo Fleury Oliveira * Update battle.ts (Berries ITALIAN) --------- Co-authored-by: 송지원 Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Adds a check to the bgm-bar display to prevent it from being displayed in case of an empty value (#3007) * [Sprite] Improves Corviknight Palette usage (#3020) * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Sprite] Compress Corviknight exp * [Beta][Localization] Update French battler-tags.ts and battle.ts (#3015) * Update French battler-tags.ts * Update battle.ts * [Bug] Fix Lock-On and Mind Reader not working on the first turn (#3001) * [Bug] Struggle Recoil should ignore Magic Guard (#3017) * Drafted testable conditions for Magic Guard * Weather Test * Update src/test/abilities/magic_guard.test.ts InnerThunder Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Implemented checks for poison/toxic/burn * Added tests for recoil moves and volatile status * Updated Rock Head, Magic Guard, and Reckless interactions with Struggle * Removed stray file * Fixed Typedoc errors * Implemented innerthunder's feedback --------- Co-authored-by: Frutescens Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * [Enhancement] Decouple move power calculation from Pokemon.apply(), Fixes Power Spot & Battery not boosting ally's move (#2984) * refactor power calc, fix battery & power spot * fix hard press unit test * fix hard press * refactor tests * use sypOn hp instead * rename method * cleanup tests * improve tests * use slow vs fast pokemon * fix steely spirit test * fix steely spirit for real this time * remove unnecessary test * address pr feedback * add removed code * [QoL] Offset the status indicator to keep pokeball in view (#2966) * Offset the status indicator to keep pokeball in view * Only use offsetX when the Pokemon is the enemy * Adjust position to accomodate boss health bar * [Bug] Fix to epic shiny Yungoos icon (#2991) (#3016) Fixed a floating pixel in epic shiny Yungoos' icon. Caused by Mimikyu's epic shiny sprite being placed too high on the sprite sheet. Moved Mimikyu's sprite down and updated json to reflect the change. * [Localization(ko)] Change line-break position of ghost type curse add message (#3022) * Revert "[Localization]Localized move-trigger text (#2913)" (#3026) This reverts commit 39bdfea0c8b33a759db760809d6488d825b510e2. * [Localization(ko)] Fixed typo in Bertha's dialogue (#3025) * [Bug] Prevent fixed-damage and OHKO moves from being modified by damage-reducing abilities (#2703) * ReceivedMoveDamageMultiplierAbAttr patch: WIP refactored damage calculation, reordered ReceivedMoveDamageMultiplierAbAttr to avoid issues with fixed damage and OHKO moves, stubbed unit tests for dragon rage (fixed damage) and fissure (OHKO) * ReceivedMoveDamageMultiplierAbAttr patch: commented concerns regarding EnemyDamageBooster/ReducerModifier for others' reference in WIP branch * ReceivedMoveDamageMultiplierAbAttr patch: reordered ReceivedMoveDamageMultiplierAbAttr and EnemyDamageBooster/ReducerModifier to not trigger for fixed damage and OHKO moves, completed relevant tests for dragon rage and fissure * ReceivedMoveDamageMultiplierAbAttr patch: removed newline * ReceivedMoveDamageMultiplierAbAttr patch: in the unit test, extracted hard-coded Dragon Rage damage to a variable * ReceivedMoveDamageMultiplierAbAttr patch: naming consistency * ReceivedMoveDamageMultiplierAbAttr patch: replaced awaiting DamagePhase with TurnEndPhase as the former assumes damage will be done * ReceivedMoveDamageMultiplierAbAttr patch: removed redundant overrides in Fissure tests * ReceivedMoveDamageMultiplierAbAttr patch: tests: refactored crit removal, removed berries, fixed bug associated with Porygon sometimes getting Trace and copying the opponent's ability, which would override the manual ability override * Fixed unit tests * Added a comment and cleaned up an existing one * [Localization] Brought german localization up to date (#3010) * Fixed errors in the german localization * Fresh Start Challenge * Update src/locales/de/move-trigger.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Bug] Remove redundant damage number popups (#3024) * Remove magic number from Belly Drum's attr * Remove redundant damage number popup * Fix merge issue and remove another duplicate damage number instance * [Localization]fix placeholder error * [Move] Implements Conversion 2 (#2943) * Creates function to get type resistances, implements conversion 2 * Removes unimplemented tag, adds condition for move history to exist * Cleans up type selection, creates i18n entries for typeChanged * Uses typeChanged i18n in Conversion move * More detailed docs, early return with stellar/unknown type * Adds note that it wont track type-changing moves properly * Rephrases doc description, adds partial since it can't track type-changing moves * Updates localization, removes typeChanged entry to use move-trigger entry * Missed locale de entry in last commit * Adds comment for reason of .partial() * Fixes localization error due to revert, removes improper merge conflict from prior commit * [BUG] Fixes bug with Metronome freezing the game (#2819) * Tests MovePhase with new PokemonMove instead of moveset search * Accounts for metronome call on charging moves * Update comment in ChargeAttr to be clearer * Add missing passive background graphic for legacy UI Relating to #2497 , this adds an identical graphic to the legacy UI files, as it will show up as a missing texture otherwise. * [Localization]fix placeholder error * [Localization]fix placeholder error * [Localization]fix placeholder error * [Localization] Localize ability messages in ability.ts (trigger, apply...) (#2972) * localize ability messages * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Modify parameter name, fix eslint * Korean Translation, modify some wrong param * Add missed message * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update ability-trigger.ts (Partial) (Italian) * Localize type name * Localize type name > Libero, Protean * param bug fix * Update src/data/ability.ts * Update zh-cn * Update ability-trigger.ts (Partial part 2, still not completed) (Italian) * Update src/locales/fr/ability-trigger.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/ability-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/fr/ability-trigger.ts Co-authored-by: Lugiad' --------- Co-authored-by: 송지원 Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira * Update egg.ts (italian) (#3038) * [Localization]complete AddTypeAttr localization * [Sprite] Revert Larvesta, fixing stray pixels (#3042) * [Sprite] Remove normal Larvesta stray pixels Taken from original commit * [Sprite] Revert shiny Larvesta stray pixels Taken from original commit * [Sprite] Match variant Larvesta colours * [Bug] Fix level 100 moves being skipped if leveled past 100 (#3040) * [Bug][Fix][Surf][Muddy Water][Sludge Wave][Animation] Added image to move animations. (#3044) * Update muddy-water.json * Update sludge-wave.json * Update surf.json * [Sprite] Fix Cofagrigus sprite (#3045) * Fix Cofagrigus sprite * Base sprite fix * Created json variant file... manually * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/move-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * [Localization]fix typo * Fix FR typo (#3051) * Update src/locales/fr/move-trigger.ts Co-authored-by: Lugiad' * [Beta][Localization] Update Portuguese battler-tags.ts and battle.ts (#3050) * Update move-trigger.ts (PARTIAL, italian) * Update move-trigger.ts (PARTIAL, italian) * [Music/BGM] Fix bgm file & loop for battle_rival (#3053) * stop loading pride-update banner (#3057) * Update src/locales/ko/move-trigger.ts Co-authored-by: Enoch * [Item] Add Scope Lens and Leek (#2666) * [Item] Add Scope Lens and Leek * Add Entry to pt_BR * Localize for pt_BR Co-authored-by: José Ricardo Fleury Oliveira * Fix & Clean Unit Tests --------- Co-authored-by: José Ricardo Fleury Oliveira * [Music/BGM] New music added for the "Slum" biome, composed by Andr06 (#3000) * Replacement of the BGM in the slum biome (by Andr06) * Modification of BGM credits in README.md * Replacement of the BGM name by the title chosen by its composer in all languages * Update BGM loop point for biome 'SLUM' * [Bug] implemented multi target damage penalty (#2329) * fix: damage multiplier by the number of targets * fix: used actual number value rather than the number holder * test: added unit test for counting targets * multi-target: fixed names of the unit tests. * test: simple-test changes * test: changed multi-target test code * test: testing damage decreasement * test: multi-target test fix * resolved conflicts in test --------- Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> * [BUG] Uturn faint switch bug fix (#2980) * reordering adding switch phases for u-turn * reverting some temp changes * generalizing function * adding PR suggestions * nit indenting * [Sprite] Remove extra Oinkologne sprites (#3067) * Delete public/images/pokemon/female/916.png * Delete public/images/pokemon/exp/female/916.json * Delete public/images/pokemon/exp/female/916.png * Delete public/images/pokemon/female/916.json * [Sprite] Mega Mewtwo sprite fixes (#3065) * [Sprite] Add static epic Mega Mewtwo Y Colours taken from exp, as consistent/exp rare backs share palettes. * [Sprite] Fix transparent pixels on Mega Mewtwo X * [Sprite] Fix transparent pixels on Mega Mewtwo X * [Sprite] Add static epic Mega Mewtwo Y Now exists, and is a paletteswap * [Music/BGM] New music added for the "Sea" biome, composed by Andr06 (#3063) * Replacement of the BGM in the sea biome (by Andr06) * Modification of BGM credits in README.md * Replacement of the BGM name by the title chosen by its composer in all languages * Update BGM loop point for biome 'SEA' * [Balance] Add 12 new TMs and remove 3 (#2733) * Added Counter TM * Counter, Aqua Tail, Gastro Acid, Pluck, Secret Power, Aurora Veil, Incinerate * Placed TMs in proper order, added to pool * Add Secret Power to the pool * Add TM for Synthesis * Covet, Heal Bell, PUPunch, Recycle, Volt Tackle, Worry Seed * Remove species specific TMs * Remove Secret Power TM until implementation * [Refactor/Test] Update Dynamax Cannon Unit Tests (#3074) * [Refactor/Test] Update Dynamax Cannon Unit Tests * Adjust Test Names * fix: update SameSite attribute in setCookie function to None * fix: update SameSite attribute in setCookie function to Strict * feat: Add prompt=none to Discord OAuth authorization URL * fix: Remove unnecessary cookie setting in LoginPhase and MenuUiHandler * feat: Improve cookie handling in getCookie function * feat: Delete duplicate cookies with the same name in getCookie function * [Localization] Add minor Korean translations to ability-trigger file (trace) (#3093) * modify trace trigger description (refered from official translation) modify trace trigger description (refered from official translation) * modify trace trigger description (refered from official translation) modify trace trigger description (refered from official translation) * Fix broken `multi_target` tests and remove RNG-based failures (#3095) * Prevent RNG from breaking the Quick Draw tests (#3096) * Make EXP boosting items stack additively and not multiplicatively (#3094) Fixes #2040 * [Bug] Fixes Encore bug with multi-target moves missing (#3060) * Pushes move history even when multi target move misses * Move pushMoveHistory out of Move Pending condition * Add remaining relearn moves (#2894) * [Enhancement] Decouple move accuracy and accuracy multiplier calculation from phases.ts (#2899) * refactor accuracy calc * update doc * move accuracy multiplier calculation outside phases * update wonder skin unit test * rename method * add docs * add unit tests * address feedback * rename method * fix imports * improve tests * add test for ohko move accuracy * [Sprite] Fix a number of sprite issues including the Zubat line, Goldeen, Golett, Dudunsparce, H-Sneasel, Garchomp, Sylveon, Marshadow (#3069) * Batfix, Goldeen, Chomp, Golett, genies * Fix Dudunsparce using Reborn shiny backsprite for whatever reason * Fix female Hisuian Sneasel missing variants * Marshadow epic front and Zenith, Sylveon back * Fix Zubat line back sprite inconsistencies * Fix Noivern shiny back * [Move] Finish implementation of Glaive Rush (#2720) * Finish implementation of Glaive Rush * Fix test RNG * Add code/test for Multi-Lens interaction * Fix off-by-one error in test caused by rounding issues * Update for code changes * Fix BattlerTag name * [Bug] fix not changing moveset after add to starter #1932 (#2396) * [Bug] Enemies can properly use stuff cheeks (#3090) * [Feature] Added pokemon nicknames/renaming (#2570) * Added basic temp renaming * Made nickname persistant after reloading * Localization and cancel button * Fixed instant rename on active pokemon * Small bugfix to prevent console errors * Changed logic to use the new nickname field. Replaced most .name with getNameToRender() for display. * Changed evolution message. Removed log messagesc * Added localization keys for other languages * Removed empty lines * French translation Co-authored-by: Lugiad' * Chinese translation Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Portuguese (Brazil) translation Co-authored-by: José Ricardo Fleury Oliveira * Korean translation Co-authored-by: Enoch * Update menu.ts * Update menu.ts [Localization(it)] * Changed most .getNameToRender() instance to getPokemonNameWithAffix() * Changed wild encounter messages back to just use the name without affix. * Added localization for the party ui rename selection * Escaping nickname characters to support all characters * Better Error handling * Update src/field/pokemon.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --------- Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Sprite] Show Partner Eevee variants (#3097) * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants * Allow Necrozma forms to play their special music (#3054) * [BUG] fixing multi-hit and move messages on faint (#2981) * fixing order of messages, scences, to render messages before fainting * updated fix for effectiveness text rendering order for multi hit moves * fixing messages not appearing for multi-hit moves on faint * updated multi-hit condition) * fixing PR conflicts * adding comments and FaintPhase setPhaseQueueSplice bug, fixing overrides merge conflict * writing better comments * removing space diff in overrides * adding fainting check for self damage moves * emergency fixing broken last commit * additional comments for multi-hit problem * updating comments, jsdoc style * fixing linter, destiny bond errors * splitting up varaible comments to be in JSDoc format * fixing tests and merge mistakes * adding rendering of multihit moves that only hit once * fixing comment formatting_tabs and spaces --------- Co-authored-by: Benjamin Odom * [Bug] Sheer Force/Serene Grace Flyout Bugfix (#2496) * Disable Show Ability for Serene Grace and Sheer Force when opponent calculates targetBenefitScore * Add comment and definition to argument * [Visual] Achievement icons (#2617) * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas * Update item atlas again This time, after merging main into the PR. * [Sprite] Show Partner Eevee variants (#3097) * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants Taken from non-partner Eevee * [Sprite] Show Partner Eevee variants * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Allow Necrozma forms to play their special music (#3054) * Allow Necrozma forms to play their special music (#3054) * MonoGen Ribbons added * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Updated texture files? I think * Changed image names and added new localizations for syntax * Fixed typedoc issues * Revert "Text Changes to MonoGen Challenges" This reverts commit 3bf79acc6a797b0e28e68e113e644b30096ea9ce. * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * [Feature] replace bug-report template with form (#2772) * replace bug-report template with form * update bug_report.yml * add palceholders for data & session file * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Resolving merge conflict * Updated texture files? I think * Changed image names and added new localizations for syntax * Removed unused ribbons * Update item atlas * Update item atlas again This time, after merging main into the PR. * Merged with beta's new items * Fixed typedoc issues * Removing localizations * MonoGen Ribbons added * Text Changes to MonoGen Challenges * Item Texture Files * MonoGen Ribbons added * Updated texture files? I think * Changed image names and added new localizations for syntax * Fixed typedoc issues * Revert "Text Changes to MonoGen Challenges" This reverts commit 3bf79acc6a797b0e28e68e113e644b30096ea9ce. * Please fix this. * Revert "[Feature] replace bug-report template with form (#2772)" This reverts commit aa69b107778123b2173bee6130e5d172d201b637. --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: Madmadness65 Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * Re-add changes accidentally deleted by #2617 * Fix some broken images in item atlas & achievement Fixed the broken sprites in the item atlas, and fixed the Baton Pass achievement to use the Baton item now (it was broken by the Leek being renamed). Also resized the Baton item image to 32*32, like all the other items. * fix: Remove unnecessary cookie setting in removeCookie function * fix: Update removeCookie function to use Max-Age=-1 instead of Expires header The removeCookie function was updated to use the Max-Age=-1 attribute instead of setting the Expires header to a past date. This change ensures that the cookie is immediately expired when removed, preventing any potential login loops. Additionally, a legacy cookie without a domain was added to handle older cookies. This commit resolves the unnecessary cookie setting in the removeCookie function. * [QoL] Starter UI selection update to allow removing specific pokemon from party (#1983) * Initial commits with logic to remove starters if they're in your party. Still need to make it work so that the starter selection cursor disappears when a starter is unselected * Updated code to be able to remove pokemon, including the side icons and cursor locations * Fixed popstarter to work with any index * Updating code to allow navigation of starter icons * Updating code to allow navigation of party starter icons * Updaing navigation of party icons * Updated logic to fix incorrect icon in top left of pokemon options when navigating the starter icons * Updated logic to include the ability to navigate and interact with the starter icons * Forgot to push the actual starter-select-ui-handler. Might be a bit hard to test things out without that :) * Removed some unnecessary comments * Fixed small bug with not being able to move from the far right to the gen selection when the starter icons were empty * Updated code to not be using a method to generate the party menu and made it more like it used to be. This should help with merge conflicts in the future * I committed the merged version but forgot to make the starter-select-ui-handler staged after making the changes * Accidentally broke challenges that had a specific typing requirement with last commit. This should fix it * Changed how navigation worked based on popular demand * Fixed code review comments * Accidentally left in a whole block of commented code. Intentionally removing it now * Started adding logic for mono type challenge runs to not break the game if the user tries to start a run with an invalid party * Updated the text to say the party is invalid * Updated logic to make invalid pokemon greyed out when no valid pokemon are in your party * Added comments on some code * Updated locales to include the key for trying to start with invalid parties during a challenge * Fixed some code from a bad merge where a challenge related param that was previously a number now needed to be a boolean and wasn't * Removed comment as per review * [Bug] Ability changing on evolution fix (#2995) * Prevent Pokemon with their second ability from evolving into their HA * Add check for fusions too * Localization(pt): Updated move.ts (#3078) * Localization(pt): Updated move.ts and fixed King's Shield * more fixes * [Bug] Enemy pokemon's Harvest creates berry icons on the player's side when triggered (#3077) * [Bug] Fix hustle not applying attack boost (#3101) * [Sprite] Mega Latis using opposite's eye colour (#3102) * [Sprite] Mega Latis using opposite eyes Taken from counterpart Lati * [Sprite] Update Mega Latios eyes * [Sprite] Update Mega Latias eyes * [Sprite] Mega Latias duplicated palette value Colour taken from non-exp Mega Latias * [Bug] Fix Thousand Arrows not hitting targets under the effects of Magnet Rise (#3100) * Fix Thousand Arrows not hitting through Magnet Rise * Add integration test for Thousand Arrows vs. Magnet Rise * ESLint * Remove unnecessary checks in integration tests * [Move] Aeroblast is a wind move (#3109) * Hardcoded Pokemon should have proper names * Aeroblast is a wind move * [Refactor] Replaces the single and double battles overrides with a single override (#3104) `SINGLE_BATTLE_OVERRIDE` and `DOUBLE_BATTLE_OVERRIDE` are now `BATTLE_TYPE` Also updates all uses of the old overrides with the new one * fix `Overrides` capitalization (#3111) * [Balance] More TM fixes (#3081) * More TM fixes * Leaf Storm * Removed sexy matcha * [Refactor] Code readability update (#3085) * Clean up/clarify `src/field/pokemon.ts` a bit Code provided by DerTapp on Discord * Update `PokemonSpeciesForm.getAbilityCount()` * Update `PokemonSpeciesForm.getAbility()` * Add explicit `Abilities.NONE` checks * Add tests * Add jsdoc and implement test suggestions * [Move] Implement Stockpile, Spit Up, Swallow (#2960) * feat: Implement Stockpile, Spit Up, Swallow * chore: Minor, likely unnecessary null checks * feat: Localization * Undo non-English localizations (unsure if they went through proper channels) * ko localization from @EnochG1 Co-authored-by: Enoch * linting fix * add tests, tiny (non-functional) tweaks * Remove unnecessary cast * Update src/data/move.ts (oops) * remove some unnecessary comments, rename something for clarity --------- Co-authored-by: Enoch * [Bug] Remove ability swap code in `PlayerPokemon.evolve()` (#3113) * [Test] Add test for rollout move (#3114) * add test for rollout move Co-authored-by: Zach Day * fix tests still using `SINGLE_BATTLE_OVERRIDE` --------- Co-authored-by: Zach Day * [Bug][Beta] Fix Hyper Beam, etc. permanently recharging (#3115) * Fix Hyper Beam, etc. permanently recharging * Fix override in hyper beam test * [QoL] New Starter Select UI with Filter (#2916) * update images for new UI * add updated starter UI with filter code * update starter-select test code * update win filter condition to pass test * remove unnecessary console log * update test code to match current filter UI * merge update * apply bugfix & chrry-pick small issues fix which are handled beta branch * resolve conflicts * fix lint errors * Fixed a bug where the target location for escaping using the left and right buttons on the starter button did not account for scrolling * update filter bar label color change when activated * fix lint error * fix lint * fix octolock.text.ts. it looks override import error. idk why it is happend in this PR. but it looks ok now * add passive dropdown in unlocks filter * fix lint * fix double button sound bug. refactoring genSpecies -> allSpecies, starterContainers -> starterContainer which are remove unnecessary generation axis * optimize updateStarterValueLabel function which is bottleneck of UI update latency * apply translation of gen filter label. fix lint * add # candies sort option * merge beta * resolve confilcts * fix offset of starter and start cursor * make compatible with starter UI * add missing feature * add images for legacy UI. adjust the position and size of the starterContainerWindow * [Localization] Implement Form localization (#3030) * Implement Pokemon forms localization * Update French pokemon-form.ts * Update French pokemon-form.ts * Update pokemon-form.ts * Add battle forms korean translation from returntoice Co-authored-by: returntoice * Add cosplay forms korean translation from returntoice Co-authored-by: returntoice * Add pichu form korean translation from returntoice Co-authored-by: returntoice * Add castform forms korean translation by returntoice Co-authored-by: returntoice * Add remaining forms korean translation by returntoice Co-authored-by: returntoice * French typo corrections pokemon-form.ts * Update Korean pokemon-form.ts * Modify froakiBattleBond like rockruff of OwnTempo case, it is froakie, not greninja. * Modify zygardePc Power construct is more important information Switch its position to 50% or 10% to avoid overlapping with the sprite * Modify mispelling * Added german forms * Changed Gigadynamax and Unendynamax so it fits at all * Add partner pikachu and eevee form localization * Add mimikyu forms localization * Partner Pikachu, Partner Evoli und Mimikyu Formen hinzugefügt * Update pokemon-form.ts * Update partners * Fix conflicts * Fix useless ? by flx-sta Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fix switch use by flx-sta * Fix conflicts * Please work !!!!!!! * Update src/locales/fr/pokemon-form.ts Co-authored-by: Lugiad' * Update src/locales/fr/pokemon-form.ts Co-authored-by: Lugiad' * Add pt_br primal localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br pikachu localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br castform localization Co-authored-by: José Ricardo Fleury Oliveira * Add pt_br 3g localization Co-authored-by: José Ricardo Fleury Oliveira * Add zh_cn localization Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Add pt_br other localization Co-authored-by: José Ricardo Fleury Oliveira * Add es castform localization Co-authored-by: InnocentGameDev * Add es burmy localization Co-authored-by: InnocentGameDev * Add es shellos localization Co-authored-by: InnocentGameDev * Add es rotom localization Co-authored-by: InnocentGameDev * Add es basculin localization Co-authored-by: InnocentGameDev * Add es deerling localization Co-authored-by: InnocentGameDev * Add es froakie localization Co-authored-by: InnocentGameDev * Add es scatterbug localization Co-authored-by: InnocentGameDev * Add es furfrou localization Co-authored-by: InnocentGameDev * Add es xerneas localization Co-authored-by: InnocentGameDev * Add es zygarde localization Co-authored-by: InnocentGameDev * Add es pumpkaboo localization Co-authored-by: InnocentGameDev * Add es flabebe localization Co-authored-by: InnocentGameDev * Add es oricorio localization Co-authored-by: InnocentGameDev * Add es minior localization Co-authored-by: InnocentGameDev * Add es magearna localization Co-authored-by: InnocentGameDev * Add es marshadow localization Co-authored-by: InnocentGameDev * Add es sinistea ocalization Co-authored-by: InnocentGameDev * Add es eiscue localization Co-authored-by: InnocentGameDev * Add es indeedee localization Co-authored-by: InnocentGameDev * Add es rockruff localization Co-authored-by: InnocentGameDev * Add es mimikyu localization Co-authored-by: InnocentGameDev * Add es zarude localization Co-authored-by: InnocentGameDev * Add es squawkabilly localization Co-authored-by: InnocentGameDev * Add es tatsugiri localization Co-authored-by: InnocentGameDev * Add es gimmighoul localization Co-authored-by: InnocentGameDev * Add es poltchageit localization Co-authored-by: InnocentGameDev * Add es paldeaTauros localization Co-authored-by: InnocentGameDev * Add es primal localization Co-authored-by: InnocentGameDev * Add es pikachu localization Co-authored-by: InnocentGameDev * Add es partner localization Co-authored-by: InnocentGameDev * Fix typedocs error * Fix typedocs error * cn form prefix added Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Fix german translate error * Fix typo Zh_CN Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update pokemon-form.ts [Localization(it)] * Update src/locales/es/pokemon-form.ts Co-authored-by: InnocentGameDev * Fix megas forms bug and add forgotten forms * Fix wrong ko config * Add fr localization for new forms Co-authored-by: Lugiad' * Add de localization for new forms Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Remove forgotten debug line Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Optimize battle forms * Update pokemon-form.ts (additional forms, italian localization) * The same typo is in the zh_TW placeholder text too. Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * Fix forgotten megaY Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Add capitalizeString to utils * Fix typedoc error * Update src/data/pokemon-species.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Add ko localization for new forms Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> --------- Co-authored-by: Lugiad Co-authored-by: returntoice Co-authored-by: Mr.WaterT Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: Benjamin Odom Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: InnocentGameDev Co-authored-by: EnochG1 Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> * [Move] Fully implement Jungle Healing/Lunar Blessing status heal (#2785) * [Bug] Fix tags not resetting on switch (#3119) Fixes #2982 * [Move] Water Shuriken guarantees 3 hits with battle bond (#2687) * [Bug] Make on-summon abilities trigger after the switch check (#3118) * Make on-summon abilities trigger after the switch check * Add test * [Ability] Cloud Nine now displays a message on activation Maintains parity with Air Lock. Both of these probably need to be localized. Should fix issue 491 though * [QoL] Summary Option for Caught Pokemon (#2921) * Option to view Summary before adding new Pokemon to party * Fixed issues described by HopsWas * Adjusted makeRoomForConfirmUi to improve window spacing * Fixed ESLint issue + addressed OrangeRed review * Fixed Github pages issue * Removed duplicate unshiftPhase * Fixed phase order * Don't start from beginning of catch function * Option to view Summary before adding new Pokemon to party * Fixed issues described by HopsWas * Adjusted makeRoomForConfirmUi to improve window spacing * Fixed Github pages issue * Fixed phase order * Quick fix * This should fix the summaryOption feature without bugging confirm-ui-handler in other cases * Revert "Merge remote-tracking branch 'origin/summaryOption1' into summaryOption1" This reverts commit ea7d0ce59e3f5631a8ef3d76646069a3945ed036, reversing changes made to 4c565958dafe6904925015ed7100e4940f041213. * Added a better conditional that reflects its source and purpose --------- Co-authored-by: Frutescens Co-authored-by: AJ Fontaine * [Bug] Fix HP rounding issues (#2968) * [Bug] Fixes bug with frenzy moves keeping the confusion counter despite disruption (#3041) * Adds frenzyMissFunc trigger on NO_EFFECT hit result * Refactors FrenzyAttr to properly lapse tags each turn and remove tags on disrupt * Makes comment on CONFUSED tag clearer * Changes all integer usages to number in battler-tags * Update getBattlerTag function to use number instead of integer * [Tests] Updating Leftovers test (#3123) * Bug Fix * Update src/system/game-stats.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fixing a test * Fixed import * Revert "Bug Fix" This reverts commit 834844978ef2583b00555969a99b3071c47a19d9. --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Localization] Correctly Localized German names of the BGM for Evil Teams (#3124) * [Bug] Game Stats Sub-Legendary NaN bug for new game files (#3122) * Bug Fix * Update src/system/game-stats.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Fixing a test * Revert "Fixing a test" This reverts commit 1bdbe2da5a7e29dce17911eb7c1084de44328573. * Test Re-Run --------- Co-authored-by: Frutescens Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * [Bug] Adjust how counter attacks target to account for uturn/voltswitch and double battles (#2462) * Adjust how counter attacks target to account for uturn/voltswitch * Creates move flag for metal burst/comeuppance to redirect in some cases * Remove debug printing * Bit shifts the redirect counter flag * Removes extraneous class from prior testing * Remove vitest timestamp file that was accidentally added * [Misc] Change fresh start achievement icon to reviver seed Mystic ticket icons in the achievements just confuse players * [Balance] Fix N-Solarizer etc appearing without secondary mon registered in dex (#2713) * Fix reins et al being available without unlocking second mon * Small fix * Parentheses for safety * Add documentation to new function * Bug Fix (#3129) Co-authored-by: Frutescens * [Bug] Fixed OHKO moves being affected by accuracy and evasion battle stats (#3117) * Fixed OHKO moves being affected by accuracy and evasion battle stats * Added related tests for Fissure, unskipped related test for Hustle * Tweaked fissure accuracy and evasion tests to use spyOn() for getAccuracyMultiplier() as per feedback * Fixed accuracy test for Fissure * [Fix][Sprite] Politoed Back Sprites (#3130) * [Fix][Sprite] Politoed Back Sprites Retrieved first version from history. Rearranged frames to make jump a little less floaty. Set same anim length for all variations. Json is identical for all variations. Spritesheet frame position is identical for all variations. Trimmed the frame of extra space Reduced file size of spritesheets and JSON due to less unique frames needed. * [Fix][Sprite] Politoed Back Sprites - Reformatted JSON to texturepacker standard Reformatted json. * [Bug] Hotfix for Starter select UI with Filter (#3121) * fix remove pokemon menu * fix dropdown all is not changing bug * fix bug when go down with no starter on start button * fix starter corsor bug on deletion. out of screen cursor bug * fix challenge log * fix lint error * Update src/locales/it/move-trigger.ts * Sync with beta * resolve merge at move.ts * remove duplicate method --------- Co-authored-by: Frederico Santos Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Felix Staud Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Adrian T <68144167+torranx@users.noreply.github.com> Co-authored-by: lnuvy Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Co-authored-by: Xavion3 Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Dakurei Co-authored-by: Alexis Co-authored-by: 송지원 Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Mr.WaterT Co-authored-by: Alexis Faizeau Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com> Co-authored-by: returntoice Co-authored-by: Arxxer Co-authored-by: InnocentGameDev Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> Co-authored-by: Dmitriy K Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com> Co-authored-by: RimKnight Co-authored-by: xsn34kzx Co-authored-by: Amani H <109637146+xsn34kzx@users.noreply.github.com> Co-authored-by: hayuna Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> Co-authored-by: EmberCM Co-authored-by: Opaque02 <66582645+Opaque02@users.noreply.github.com> Co-authored-by: mcmontag <54485715+mcmontag@users.noreply.github.com> Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Co-authored-by: Arxalc <63990624+Arxalc@users.noreply.github.com> Co-authored-by: Mumble Co-authored-by: Frutescens Co-authored-by: EmberCM Co-authored-by: Zoruu <113668528+ArielStevens@users.noreply.github.com> Co-authored-by: Corrade <49605314+Corrade@users.noreply.github.com> Co-authored-by: Madmadness65 Co-authored-by: cam Co-authored-by: 송영진 <36808515+bucket1582@users.noreply.github.com> Co-authored-by: DustinLin <39450497+DustinLin@users.noreply.github.com> Co-authored-by: 서명인 (Myungin, SEO) <65226760+smee6@users.noreply.github.com> Co-authored-by: gjeodnd12165 <61226524+gjeodnd12165@users.noreply.github.com> Co-authored-by: sirzento Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Co-authored-by: Benjamin Odom Co-authored-by: Daniel Gaston Co-authored-by: Zach Day Co-authored-by: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Co-authored-by: Kiriox <66013753+Kiriox94@users.noreply.github.com> Co-authored-by: MrWaterT <87186129+MrWaterT@users.noreply.github.com> Co-authored-by: AJ Fontaine --- src/data/move.ts | 118 +++++++++++++++--------------- src/locales/de/config.ts | 4 +- src/locales/de/move-trigger.ts | 54 ++++++++++++++ src/locales/en/config.ts | 4 +- src/locales/en/move-trigger.ts | 54 ++++++++++++++ src/locales/es/config.ts | 4 +- src/locales/es/move-trigger.ts | 54 ++++++++++++++ src/locales/fr/config.ts | 4 +- src/locales/fr/move-trigger.ts | 54 ++++++++++++++ src/locales/it/config.ts | 4 +- src/locales/it/move-trigger.ts | 54 ++++++++++++++ src/locales/ko/config.ts | 4 +- src/locales/ko/move-trigger.ts | 54 ++++++++++++++ src/locales/pt_BR/config.ts | 4 +- src/locales/pt_BR/move-trigger.ts | 54 ++++++++++++++ src/locales/zh_CN/config.ts | 4 +- src/locales/zh_CN/move-trigger.ts | 54 ++++++++++++++ src/locales/zh_TW/config.ts | 4 +- src/locales/zh_TW/move-trigger.ts | 54 ++++++++++++++ 19 files changed, 571 insertions(+), 69 deletions(-) create mode 100644 src/locales/en/move-trigger.ts create mode 100644 src/locales/es/move-trigger.ts create mode 100644 src/locales/fr/move-trigger.ts create mode 100644 src/locales/it/move-trigger.ts create mode 100644 src/locales/ko/move-trigger.ts create mode 100644 src/locales/pt_BR/move-trigger.ts create mode 100644 src/locales/zh_CN/move-trigger.ts create mode 100644 src/locales/zh_TW/move-trigger.ts diff --git a/src/data/move.ts b/src/data/move.ts index c0d04cf5891..18e58ecb527 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1222,7 +1222,7 @@ export class RecoilAttr extends MoveEffectAttr { } user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, " is hit\nwith recoil!")); + user.scene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", {pokemonName: getPokemonNameWithAffix(user)})); user.turnData.damageTaken += recoilDamage; return true; @@ -1334,7 +1334,7 @@ export class HalfSacrificialAttr extends MoveEffectAttr { applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value) { user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, " cut its own HP to power up its move!")); // Queue recoil message + user.scene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", {pokemonName: getPokemonNameWithAffix(user)})); // Queue recoil message } return true; } @@ -1929,7 +1929,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; user.scene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { if (success) { - user.scene.queueMessage(getPokemonMessage(user, ` stole\n${target.name}'s ${stolenItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:stoleItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name})); } resolve(success); }); @@ -2008,9 +2008,9 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { target.scene.updateModifiers(target.isPlayer()); if (this.berriesOnly) { - user.scene.queueMessage(getPokemonMessage(user, ` incinerated\n${target.name}'s ${removedItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:incineratedItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name})); } else { - user.scene.queueMessage(getPokemonMessage(user, ` knocked off\n${target.name}'s ${removedItem.type.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:knockedOffItem", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name})); } } @@ -2337,7 +2337,7 @@ export class ChargeAttr extends OverrideMoveEffectAttr { if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && (this.sameTurn || lastMove.turn !== user.scene.currentBattle.turn))) { (args[0] as Utils.BooleanHolder).value = true; new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); if (this.tagType) { user.addTag(this.tagType, 1, move.id, user.id); } @@ -2393,7 +2393,7 @@ export class SunlightChargeAttr extends ChargeAttr { export class ElectroShotChargeAttr extends ChargeAttr { private statIncreaseApplied: boolean; constructor() { - super(ChargeAnim.ELECTRO_SHOT_CHARGING, "absorbed electricity!", null, true); + super(ChargeAnim.ELECTRO_SHOT_CHARGING, i18next.t("moveTriggers:absorbedElectricity", {pokemonName: "{USER}"}), null, true); // Add a flag because ChargeAttr skills use themselves twice instead of once over one-to-two turns this.statIncreaseApplied = false; } @@ -2445,14 +2445,14 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { if (args.length < 2 || !args[1]) { new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { (args[0] as Utils.BooleanHolder).value = true; - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target))}`)); + user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, false, target.getBattlerIndex()); resolve(true); }); } else { - user.scene.ui.showText(getPokemonMessage(user.scene.getPokemonById(target.id), ` took\nthe ${move.name} attack!`), null, () => resolve(true)); + user.scene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", {pokemonName: getPokemonNameWithAffix(user.scene.getPokemonById(target.id)), moveName: move.name}), null, () => resolve(true)); } }); } @@ -2602,7 +2602,7 @@ export class HalfHpStatMaxAttr extends StatChangeAttr { user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); - user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand maximized its ${getBattleStatName(this.stats[BattleStat.ATK])}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(this.stats[BattleStat.ATK])})); resolve(ret); }); }); @@ -2655,8 +2655,7 @@ export class CopyStatsAttr extends MoveEffectAttr { } target.updateInfo(); user.updateInfo(); - - target.scene.queueMessage(getPokemonMessage(user, " copied\n") + getPokemonMessage(target, "'s stat changes!")); + target.scene.queueMessage(i18next.t("moveTriggers:copiedStatChanges", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); return true; } @@ -2722,7 +2721,7 @@ export class SwapStatsAttr extends MoveEffectAttr { } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(user, " switched stat changes with the target!")); + target.scene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", {pokemonName: getPokemonNameWithAffix(user)})); return true; } } @@ -2883,7 +2882,7 @@ const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move user.scene.executeWithSeedOffset(() => { const rand = Utils.randSeedInt(100); if (rand < move.chance) { - message = getPokemonMessage(user, " is going all out for this attack!"); + message = i18next.t("moveTriggers:goingAllOutForAttack", {pokemonName: getPokemonNameWithAffix(user)}); } }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); return message; @@ -3162,7 +3161,7 @@ const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { } } - message = `Magnitude ${m + 4}!`; + message = i18next.t("moveTriggers:magnitudeMessage", {magnitude: m + 4}); }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); return message; }; @@ -3312,7 +3311,7 @@ export class PresentPowerAttr extends VariablePowerAttr { // If this move is multi-hit, disable all other hits user.stopMultiHit(); target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, " regained\nhealth!"), true)); + Math.max(Math.floor(target.getMaxHp() / 4), 1), i18next.t("moveTriggers:regainedHealth", {pokemonName: getPokemonNameWithAffix(target)}), true)); } return true; @@ -4068,7 +4067,7 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { } user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.scene.queueMessage(getPokemonMessage(user, " kept going\nand crashed!")); + user.scene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", {pokemonName: getPokemonNameWithAffix(user)})); user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2); return true; @@ -4405,7 +4404,7 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:tookAimAtTarget", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); return true; } @@ -4781,7 +4780,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { if (switchOutTarget.hp) { switchOutTarget.hideInfo().then(() => switchOutTarget.destroy()); switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.queueMessage(getPokemonMessage(switchOutTarget, " fled!"), null, true, 500); + user.scene.queueMessage(i18next.t("moveTriggers:fled", {pokemonName: getPokemonNameWithAffix(switchOutTarget)}), null, true, 500); } if (!switchOutTarget.getAlly()?.isActive(true)) { @@ -4805,7 +4804,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? getPokemonMessage(target, " can't be switched out!") : null; + return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", {pokemonName: getPokemonNameWithAffix(target)}) : null; } getSwitchOutCondition(): MoveConditionFunc { @@ -4918,7 +4917,7 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { user.summonData.types = [ biomeType ]; user.updateInfo(); - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto the ${Utils.toReadableString(Type[biomeType])} type!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[biomeType]}`)})); return true; } @@ -4937,7 +4936,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [this.type]; target.updateInfo(); - user.scene.queueMessage(getPokemonMessage(target, ` transformed\ninto the ${Utils.toReadableString(Type[this.type])} type!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", {pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`)})); return true; } @@ -4964,7 +4963,7 @@ export class AddTypeAttr extends MoveEffectAttr { target.summonData.types = types; target.updateInfo(); - user.scene.queueMessage(`${Utils.toReadableString(Type[this.type])} was added to\n` + getPokemonMessage(target, "!")); + user.scene.queueMessage(i18next.t("moveTriggers:addType", {typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`), pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -4986,7 +4985,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { const firstMoveType = target.getMoveset()[0].getMove().type; user.summonData.types = [ firstMoveType ]; - user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[firstMoveType])})); + user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${Type[firstMoveType]}`)})); return true; } @@ -5388,7 +5387,7 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { user.summonData.moveset = user.getMoveset().slice(0); user.summonData.moveset[thisMoveIndex] = new PokemonMove(copiedMove.id, 0, 0); - user.scene.queueMessage(getPokemonMessage(user, ` copied\n${copiedMove.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copiedMove", {pokemonName: getPokemonNameWithAffix(user), moveName: copiedMove.name})); return true; } @@ -5421,7 +5420,7 @@ export class SketchAttr extends MoveEffectAttr { user.setMove(sketchIndex, sketchedMove.id); - user.scene.queueMessage(getPokemonMessage(user, ` sketched\n${sketchedMove.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:sketchedMove", {pokemonName: getPokemonNameWithAffix(user), moveName: sketchedMove.name})); return true; } @@ -5464,7 +5463,7 @@ export class AbilityChangeAttr extends MoveEffectAttr { (this.selfTarget ? user : target).summonData.ability = this.ability; - user.scene.queueMessage("The " + getPokemonMessage((this.selfTarget ? user : target), ` acquired\n${allAbilities[this.ability].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name})); return true; } @@ -5490,11 +5489,11 @@ export class AbilityCopyAttr extends MoveEffectAttr { user.summonData.ability = target.getAbility().id; - user.scene.queueMessage(getPokemonMessage(user, " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name})); if (this.copyToPartner && user.scene.currentBattle?.double && user.getAlly().hp) { user.getAlly().summonData.ability = target.getAbility().id; - user.getAlly().scene.queueMessage(getPokemonMessage(user.getAlly(), " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.getAlly().scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", {pokemonName: getPokemonNameWithAffix(user.getAlly()), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name})); } return true; @@ -5527,7 +5526,7 @@ export class AbilityGiveAttr extends MoveEffectAttr { target.summonData.ability = user.getAbility().id; - user.scene.queueMessage("The" + getPokemonMessage(target, `\nacquired ${allAbilities[user.getAbility().id].name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix(target), abilityName: allAbilities[user.getAbility().id].name})); return true; } @@ -5547,7 +5546,7 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { user.summonData.ability = target.getAbility().id; target.summonData.ability = tempAbilityId; - user.scene.queueMessage(getPokemonMessage(user, " swapped\nabilities with its target!")); + user.scene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", {pokemonName: getPokemonNameWithAffix(user)})); return true; } @@ -5631,7 +5630,7 @@ export class TransformAttr extends MoveEffectAttr { user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); user.summonData.types = target.getTypes(); - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto ${target.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", {pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target)})); user.loadAssets(false).then(() => { user.playAnim(); @@ -5662,7 +5661,7 @@ export class MoneyAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move): boolean { user.scene.currentBattle.moneyScattered += user.scene.getWaveMoneyAmount(0.2); - user.scene.queueMessage("Coins were scattered everywhere!"); + user.scene.queueMessage(i18next.t("moveTriggers:coinsScatteredEverywhere")); return true; } } @@ -5686,7 +5685,7 @@ export class DestinyBondAttr extends MoveEffectAttr { * @returns true */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.scene.queueMessage(`${getPokemonMessage(user, " is trying\nto take its foe down with it!")}`); + user.scene.queueMessage(`${i18next.t("moveTriggers:tryingToTakeFoeDown", {pokemonName: getPokemonNameWithAffix(user)})}`); user.addTag(BattlerTagType.DESTINY_BOND, undefined, move.id, user.id); return true; } @@ -5725,8 +5724,7 @@ export class AttackedByItemAttr extends MoveAttr { } const itemName = heldItems[0]?.type?.name ?? "item"; - const attackedByItemString = ` is about to be attacked by its ${itemName}!`; - target.scene.queueMessage(getPokemonMessage(target, attackedByItemString)); + target.scene.queueMessage(i18next.t("moveTriggers:attackedByItem", {pokemonName: getPokemonNameWithAffix(target), itemName: itemName})); return true; }; @@ -5760,7 +5758,7 @@ const failIfDampCondition: MoveConditionFunc = (user, target, move) => { user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); // Queue a message if an ability prevented usage of the move if (cancelled.value) { - user.scene.queueMessage(getPokemonMessage(user, ` cannot use ${move.name}!`)); + user.scene.queueMessage(i18next.t("moveTriggers:cannotUseMove", {pokemonName: getPokemonNameWithAffix(user), moveName: move.name})); } return !cancelled.value; }; @@ -5986,7 +5984,7 @@ export function initMoves() { .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, "whipped\nup a whirlwind!") + .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, i18next.t("moveTriggers:whippedUpAWhirlwind", {pokemonName: "{USER}"})) .attr(HighCritAttr) .windMove() .ignoresVirtual() @@ -6006,7 +6004,7 @@ export function initMoves() { .hidesTarget() .windMove(), new AttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, "flew\nup high!", BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, i18next.t("moveTriggers:flewUpHigh", {pokemonName: "{USER}"}), BattlerTagType.FLYING) .condition(failOnGravityCondition) .ignoresVirtual(), new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) @@ -6154,7 +6152,7 @@ export function initMoves() { .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, "took\nin sunlight!") + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, i18next.t("moveTriggers:tookInSunlight", {pokemonName: "{USER}"})) .attr(AntiSunlightPowerDecreaseAttr) .ignoresVirtual(), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) @@ -6203,7 +6201,7 @@ export function initMoves() { .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, false) .makesContact(false), new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, "dug a hole!", BattlerTagType.UNDERGROUND) + .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, i18next.t("moveTriggers:dugAHole", {pokemonName: "{USER}"}), BattlerTagType.UNDERGROUND) .ignoresVirtual(), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) @@ -6299,7 +6297,7 @@ export function initMoves() { new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, "lowered\nits head!", null, true) + .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, i18next.t("moveTriggers:loweredItsHead", {pokemonName: "{USER}"}), null, true) .attr(StatChangeAttr, BattleStat.DEF, 1, true) .ignoresVirtual(), new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) @@ -6338,7 +6336,7 @@ export function initMoves() { new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP), new AttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, "is glowing!") + .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, i18next.t("moveTriggers:isGlowing", {pokemonName: "{USER}"})) .attr(HighCritAttr) .attr(FlinchAttr) .makesContact(false) @@ -6544,7 +6542,7 @@ export function initMoves() { .target(MoveTarget.ALL_ENEMIES) .ignoresVirtual(), new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) - .attr(PartyStatusCureAttr, "A bell chimed!", Abilities.SOUNDPROOF) + .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) @@ -6647,7 +6645,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPDEF, -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, "foresaw\nan attack!"), + .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) .attr(StatChangeAttr, BattleStat.DEF, -1), new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) @@ -6768,7 +6766,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) - .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, "hid\nunderwater!", BattlerTagType.UNDERWATER) + .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), @@ -6824,7 +6822,7 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (user, target, move) => [WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN].includes(user.scene.arena.weather?.weatherType) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 2 : 1) .ballBombMove(), new StatusMove(Moves.AROMATHERAPY, Type.GRASS, -1, 5, -1, 0, 3) - .attr(PartyStatusCureAttr, "A soothing aroma wafted through the area!", Abilities.SAP_SIPPER) + .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(StatChangeAttr, BattleStat.SPDEF, -2), @@ -6899,7 +6897,7 @@ export function initMoves() { new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1, true), new AttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) - .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, "sprang up!", BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, i18next.t("moveTriggers:sprangUp", {pokemonName: "{USER}"}), BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .condition(failOnGravityCondition) .ignoresVirtual(), @@ -6935,7 +6933,7 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, "chose\nDoom Desire as its destiny!"), + .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) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) @@ -7248,7 +7246,7 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .windMove(), new AttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) - .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", {pokemonName: "{USER}"}), BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) @@ -7363,7 +7361,7 @@ export function initMoves() { MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE)? 2 : 1), new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) - .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, "took {TARGET}\ninto the sky!", BattlerTagType.FLYING) // TODO: Add 2nd turn message + .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, i18next.t("moveTriggers:tookTargetIntoSky", {pokemonName: "{USER}", targetName: "{TARGET}"}), BattlerTagType.FLYING) // TODO: Add 2nd turn message .condition(failOnGravityCondition) .ignoresVirtual(), new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) @@ -7483,11 +7481,11 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .danceMove(), new AttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, "became cloaked\nin a freezing light!") + .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingLight", {pokemonName: "{USER}"})) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), new AttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, "became cloaked\nin freezing air!") + .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingAir", {pokemonName: "{USER}"})) .attr(StatusEffectAttr, StatusEffect.BURN) .ignoresVirtual(), new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) @@ -7529,7 +7527,7 @@ export function initMoves() { new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatChangeAttr, BattleStat.ATK, 3, true ), new AttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", {pokemonName: "{USER}"}), BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) @@ -7631,7 +7629,7 @@ export function initMoves() { .powderMove() .unimplemented(), new SelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, "is charging its power!") + .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, i18next.t("moveTriggers:isChargingPower", {pokemonName: "{USER}"})) .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true) .ignoresVirtual(), new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) @@ -7837,7 +7835,7 @@ export function initMoves() { .condition((user, target, move) => target.summonData.battleStats[BattleStat.ATK] > -6) .triageMove(), new AttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BLADE_CHARGING, "is glowing!") + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BLADE_CHARGING, i18next.t("moveTriggers:isGlowing", {pokemonName: "{USER}"})) .attr(AntiSunlightPowerDecreaseAttr) .slicingMove(), new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) @@ -7877,7 +7875,7 @@ export function initMoves() { }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(RemoveTypeAttr, Type.FIRE, (user) => { - user.scene.queueMessage(getPokemonMessage(user, " burned itself out!")); + user.scene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", {pokemonName: getPokemonNameWithAffix(user)})); }), new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7) .unimplemented(), @@ -7899,7 +7897,7 @@ export function initMoves() { new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) .unimplemented(), new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, 5, 7) - .attr(ChargeAttr, ChargeAnim.BEAK_BLAST_CHARGING, "started\nheating up its beak!", undefined, false, true, -3) + .attr(ChargeAttr, ChargeAnim.BEAK_BLAST_CHARGING, i18next.t("moveTriggers:startedHeatingUpBeak", {pokemonName: "{USER}"}), undefined, false, true, -3) .ballBombMove() .makesContact(false) .partial(), @@ -8255,7 +8253,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, 100, 0, 8) - .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, "is overflowing\nwith space power!", null, true) + .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, i18next.t("moveTriggers:isOverflowingWithSpacePower", {pokemonName: "{USER}"}), null, true) .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .ignoresVirtual(), new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) @@ -8651,7 +8649,7 @@ export function initMoves() { return userTypes.includes(Type.ELECTRIC); }) .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { - user.scene.queueMessage(getPokemonMessage(user, " used up all its electricity!")); + user.scene.queueMessage(i18next.t("moveTriggers:usedUpAllElectricity", {pokemonName: getPokemonNameWithAffix(user)})); }), new AttackMove(Moves.GIGATON_HAMMER, Type.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) .makesContact(false) diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index dcce95ed9a5..b01f8343b29 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const deConfig = { ability: ability, @@ -109,5 +110,6 @@ export const deConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/de/move-trigger.ts b/src/locales/de/move-trigger.ts index e69de29bb2d..0dc88931282 100644 --- a/src/locales/de/move-trigger.ts +++ b/src/locales/de/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} erleidet Schaden durch Rückstoß!", + "cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!", + "absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!", + "switchedStatChanges": "{{pokemonName}}tauschte die Statuswerteveränderungen mit dem Ziel!", + "goingAllOutForAttack": "{{pokemonName}}legt sich ins Zeug!", + "regainedHealth": "{{pokemonName}} erholt sich!", + "keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!", + "fled": "{{pokemonName}} ist geflüchtet!", + "cannotBeSwitchedOut": "{{pokemonName}} kann nicht ausgewechselt werden!", + "swappedAbilitiesWithTarget": "{{pokemonName}} tauscht Fähigkeiten mit dem Ziel!", + "coinsScatteredEverywhere": "Es sind überall Münzen verstreut!", + "attackedByItem": "{{pokemonName}} wird von seinem Item {{itemName}} angegriffen!", + "whippedUpAWhirlwind": "{{pokemonName}} erzeugt eine Windböe!", + "flewUpHigh": "{{pokemonName}} fliegt hoch empor!", + "tookInSunlight": "{{pokemonName}} absorbiert Sonnenlicht!", + "dugAHole": "{{pokemonName}} vergräbt sich in der Erde!", + "loweredItsHead": "{{pokemonName}} zieht seinen Kopf ein!", + "isGlowing": "{{pokemonName}} leuchtet grell!", + "bellChimed": "Eine Glocke läutet!", + "foresawAnAttack": "{{pokemonName}} sieht einen Angriff voraus!", + "hidUnderwater": "{{pokemonName}} taucht unter!", + "soothingAromaWaftedThroughArea": "Ein wohltuendes Aroma breitet sich aus!", + "sprangUp": "{{pokemonName}} springt hoch in die Luft!", + "choseDoomDesireAsDestiny": "{{pokemonName}} äußert einen Kismetwunsch für die Zukunft!", + "vanishedInstantly": "{{pokemonName}} verschwindet augenblicklich!", + "tookTargetIntoSky": "{{pokemonName}} entführt {{targetName}} in luftige Höhen!", + "becameCloakedInFreezingLight": "{{pokemonName}} wird von einem kühlen Licht umhüllt!", + "becameCloakedInFreezingAir": "{{pokemonName}} wird in klirrend kalte Luft gehüllt!", + "isChargingPower": "{{pokemonName}} saugt Kraft in sich auf!", + "burnedItselfOut": "{{pokemonName}} braucht sein Feuer komplett auf!", + "startedHeatingUpBeak": "{{pokemonName}} erhitzt seinen Schnabel!", + "isOverflowingWithSpacePower": "Kosmische Kräfte strömen aus {{pokemonName}}!", + "usedUpAllElectricity": "{{pokemonName}} braucht seinen Strom komplett auf!", + "stoleItem": "{{pokemonName}} hat {{targetName}} das Item {{itemName}} geklaut!", + "incineratedItem": "{{itemName}} von {{targetName}} ist verbrannt und somit nutzlos geworden!", + "knockedOffItem": "{{pokemonName}} schlägt das Item {{itemName}} von {{targetName}} weg!", + "tookMoveAttack": "{{pokemonName}} wurde von {{moveName}} getroffen!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} nutzt seine KP und maximiert dadurch seinen {{statName}}-Wert!", + "copiedStatChanges": "{{pokemonName}} kopiert die Statusveränderungen von {{targetName}}!", + "magnitudeMessage": "Intensität {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} zielt auf {{targetName}}!", + "transformedIntoType": "{{pokemonName}} nimmt den Typ {{typeName}} an!", + "copiedMove": "{{pokemonName}} kopiert {{moveName}}!", + "sketchedMove": "{{pokemonName}} ahmt die Attacke {{moveName}} nach!", + "acquiredAbility": "The {{pokemonName}} nimmt die Fähigkeit {{abilityName}} an!", + "copiedTargetAbility": "{{pokemonName}} kopiert{{abilityName}} von {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} verwandelt sich in {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} versucht, den Angreifer mit sich zu nehmen!", + "addType": "{{pokemonName}} nimmt zusätzlich den Typ {{typeName}} an!", + "cannotUseMove": "{{pokemonName}} kann {{moveName}} nicht einsetzen!" +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 8b40b7a667b..ee180163eb1 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -52,6 +52,7 @@ import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { terrain, weather } from "./weather"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const enConfig = { ability: ability, @@ -109,5 +110,6 @@ export const enConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/en/move-trigger.ts b/src/locales/en/move-trigger.ts new file mode 100644 index 00000000000..18427f59b59 --- /dev/null +++ b/src/locales/en/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} was damaged by the recoil!", + "cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!", + "absorbedElectricity": "{{pokemonName}} absorbed electricity!", + "switchedStatChanges": "{{pokemonName}} switched stat changes with the target!", + "goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!", + "regainedHealth": "{{pokemonName}} regained\nhealth!", + "keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!", + "fled": "{{pokemonName}} fled!", + "cannotBeSwitchedOut": "{{pokemonName}} can't be switched out!", + "swappedAbilitiesWithTarget": "{{pokemonName}} swapped\nabilities with its target!", + "coinsScatteredEverywhere": "Coins were scattered everywhere!", + "attackedByItem": "{{pokemonName}} is about to be attacked by its {{itemName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} whipped\nup a whirlwind!", + "flewUpHigh": "{{pokemonName}} flew\nup high!", + "tookInSunlight": "{{pokemonName}} absorbed light!", + "dugAHole": "{{pokemonName}} burrowed its way under the ground!", + "loweredItsHead": "{{pokemonName}} tucked in its head!", + "isGlowing": "{{pokemonName}} became cloaked in a harsh light!", + "bellChimed": "A bell chimed!", + "foresawAnAttack": "{{pokemonName}} foresaw\nan attack!", + "hidUnderwater": "{{pokemonName}} hid\nunderwater!", + "soothingAromaWaftedThroughArea": "A soothing aroma wafted through the area!", + "sprangUp": "{{pokemonName}} sprang up!", + "choseDoomDesireAsDestiny": "{{pokemonName}} chose\nDoom Desire as its destiny!", + "vanishedInstantly": "{{pokemonName}} vanished\ninstantly!", + "tookTargetIntoSky": "{{pokemonName}} took {{targetName}}\ninto the sky!", + "becameCloakedInFreezingLight": "{{pokemonName}} became cloaked\nin a freezing light!", + "becameCloakedInFreezingAir": "{{pokemonName}} became cloaked\nin freezing air!", + "isChargingPower": "{{pokemonName}} is absorbing power!", + "burnedItselfOut": "{{pokemonName}} burned itself out!", + "startedHeatingUpBeak": "{{pokemonName}} started\nheating up its beak!", + "isOverflowingWithSpacePower": "{{pokemonName}} is overflowing\nwith space power!", + "usedUpAllElectricity": "{{pokemonName}} used up all its electricity!", + "stoleItem": "{{pokemonName}} stole\n{{targetName}}'s {{itemName}}!", + "incineratedItem": "{{pokemonName}} incinerated\n{{targetName}}'s {{itemName}}!", + "knockedOffItem": "{{pokemonName}} knocked off\n{{targetName}}'s {{itemName}}!", + "tookMoveAttack": "{{pokemonName}} took\nthe {{moveName}} attack!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} cut its own HP\nand maximized its {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copied\n{{targetName}}'s stat changes!", + "magnitudeMessage": "Magnitude {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} took aim\nat {{targetName}}!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{typeName}} type!", + "copiedMove": "{{pokemonName}} copied\n{{moveName}}!", + "sketchedMove": "{{pokemonName}} sketched\n{{moveName}}!", + "acquiredAbility": "The {{pokemonName}} acquired\n{{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copied the {{targetName}}'s\n{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!", + "addType": "{{typeName}} was added to\n{{pokemonName}}!", + "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!" +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 6d3d5504f26..ed2477aa14d 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const esConfig = { ability: ability, @@ -109,5 +110,6 @@ export const esConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/es/move-trigger.ts b/src/locales/es/move-trigger.ts new file mode 100644 index 00000000000..18427f59b59 --- /dev/null +++ b/src/locales/es/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} was damaged by the recoil!", + "cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!", + "absorbedElectricity": "{{pokemonName}} absorbed electricity!", + "switchedStatChanges": "{{pokemonName}} switched stat changes with the target!", + "goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!", + "regainedHealth": "{{pokemonName}} regained\nhealth!", + "keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!", + "fled": "{{pokemonName}} fled!", + "cannotBeSwitchedOut": "{{pokemonName}} can't be switched out!", + "swappedAbilitiesWithTarget": "{{pokemonName}} swapped\nabilities with its target!", + "coinsScatteredEverywhere": "Coins were scattered everywhere!", + "attackedByItem": "{{pokemonName}} is about to be attacked by its {{itemName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} whipped\nup a whirlwind!", + "flewUpHigh": "{{pokemonName}} flew\nup high!", + "tookInSunlight": "{{pokemonName}} absorbed light!", + "dugAHole": "{{pokemonName}} burrowed its way under the ground!", + "loweredItsHead": "{{pokemonName}} tucked in its head!", + "isGlowing": "{{pokemonName}} became cloaked in a harsh light!", + "bellChimed": "A bell chimed!", + "foresawAnAttack": "{{pokemonName}} foresaw\nan attack!", + "hidUnderwater": "{{pokemonName}} hid\nunderwater!", + "soothingAromaWaftedThroughArea": "A soothing aroma wafted through the area!", + "sprangUp": "{{pokemonName}} sprang up!", + "choseDoomDesireAsDestiny": "{{pokemonName}} chose\nDoom Desire as its destiny!", + "vanishedInstantly": "{{pokemonName}} vanished\ninstantly!", + "tookTargetIntoSky": "{{pokemonName}} took {{targetName}}\ninto the sky!", + "becameCloakedInFreezingLight": "{{pokemonName}} became cloaked\nin a freezing light!", + "becameCloakedInFreezingAir": "{{pokemonName}} became cloaked\nin freezing air!", + "isChargingPower": "{{pokemonName}} is absorbing power!", + "burnedItselfOut": "{{pokemonName}} burned itself out!", + "startedHeatingUpBeak": "{{pokemonName}} started\nheating up its beak!", + "isOverflowingWithSpacePower": "{{pokemonName}} is overflowing\nwith space power!", + "usedUpAllElectricity": "{{pokemonName}} used up all its electricity!", + "stoleItem": "{{pokemonName}} stole\n{{targetName}}'s {{itemName}}!", + "incineratedItem": "{{pokemonName}} incinerated\n{{targetName}}'s {{itemName}}!", + "knockedOffItem": "{{pokemonName}} knocked off\n{{targetName}}'s {{itemName}}!", + "tookMoveAttack": "{{pokemonName}} took\nthe {{moveName}} attack!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} cut its own HP\nand maximized its {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copied\n{{targetName}}'s stat changes!", + "magnitudeMessage": "Magnitude {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} took aim\nat {{targetName}}!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{typeName}} type!", + "copiedMove": "{{pokemonName}} copied\n{{moveName}}!", + "sketchedMove": "{{pokemonName}} sketched\n{{moveName}}!", + "acquiredAbility": "The {{pokemonName}} acquired\n{{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copied the {{targetName}}'s\n{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!", + "addType": "{{typeName}} was added to\n{{pokemonName}}!", + "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!" +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 30171ee634a..153e9edcf1d 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const frConfig = { ability: ability, @@ -109,5 +110,6 @@ export const frConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/fr/move-trigger.ts b/src/locales/fr/move-trigger.ts new file mode 100644 index 00000000000..7d57fa87335 --- /dev/null +++ b/src/locales/fr/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} est blessé par le contrecoup !", + "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !", + "absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !", + "switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !", + "goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !", + "regainedHealth": "{{pokemonName}}\nrécupère des PV !", + "keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !", + "fled": "{{pokemonName}}\nprend la fuite !", + "cannotBeSwitchedOut": "Impossible de rappeler {{pokemonName}}\nau combat.", + "swappedAbilitiesWithTarget": "{{pokemonName}} et sa cible\néchangent leurs talents !", + "coinsScatteredEverywhere": "Il pleut des pièces !", + "attackedByItem": "{{pokemonName}} est attaqué\npar son propre objet {{itemName}} !", + "whippedUpAWhirlwind": "{{pokemonName}}se prépare\nà lancer une bourrasque !", + "flewUpHigh": "{{pokemonName}} s’envole !", + "tookInSunlight": "{{pokemonName}}\nabsorbe la lumière !", + "dugAHole": "{{pokemonName}}\nse cache dans le sol !", + "loweredItsHead": "{{pokemonName}}\nbaisse la tête !", + "isGlowing": "{{pokemonName}} est entouré\nd’une lumière intense !", + "bellChimed": "Un grelot sonne !", + "foresawAnAttack": "{{pokemonName}\nprévoit une attaque !", + "hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !", + "soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !", + "sprangUp": "{{pokemonName}}\nse propulse dans les airs !", + "choseDoomDesireAsDestiny": "{{pokemonName}}souhaite\nle déclenchement de la capacité Vœu Destructeur !", + "vanishedInstantly": "{{pokemonName}}\ndisparait instantanément !", + "tookTargetIntoSky": "{{pokemonName}} emporte\n{{targetName}} haut dans le ciel !", + "becameCloakedInFreezingLight": "{{pokemonName}} est baigné\nd’une lumière blafarde !", + "becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !", + "isChargingPower": "{{pokemonName}}\nconcentre son énergie !", + "burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est entièrement consumé !", + "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !", + "isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !", + "usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !", + "stoleItem": "{{pokemonName}} vole\nl’objet {{itemName}} de {{targetName}} !", + "incineratedItem": "{{pokemonName}} brule\nla {{itemName}} de {{targetName}} !", + "knockedOffItem": "{{pokemonName}} fait tomber\nl’objet {{itemName}} de {{targetName}} !", + "tookMoveAttack": "{{pokemonName}}\nsubit l’attaque {{moveName}} !", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} sacrifie des PV\net monte son {{statName}} au maximum !", + "copiedStatChanges": "{{pokemonName}} copie\nles changements de stats de {{targetName}} !", + "magnitudeMessage": "Ampleur {{magnitude}} !", + "tookAimAtTarget": "{{pokemonName}} vise\n{{targetName}} !", + "transformedIntoType": "{{pokemonName}} prend\nle type {{typeName}} !", + "copiedMove": "{{pokemonName}} copie\nla capacité {{moveName}} !", + "sketchedMove": "{{pokemonName}} utilise Gribouille\npour copier {{moveName}} !", + "acquiredAbility": "Le talent de {{pokemonName}}\ndevient {{abilityName}} !", + "copiedTargetAbility": "{{pokemonName}} copie le talent\n{{abilityName}} de {{targetName}} !", + "transformedIntoTarget": "{{pokemonName}} prend\nl’apparence de {{targetName}} !", + "tryingToTakeFoeDown": "{{pokemonName}} veut entrainer\nson assaillant dans sa chute !", + "addType": "{{pokemonName}} gagne\nle type {{typeName}}.", + "cannotUseMove": "{{pokemonName}} ne peut pas\nutiliser la capacité {{moveName}} !" +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 3bce2bd723f..a6cb95c20eb 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const itConfig = { ability: ability, @@ -109,5 +110,6 @@ export const itConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/it/move-trigger.ts b/src/locales/it/move-trigger.ts new file mode 100644 index 00000000000..645d62ef1a6 --- /dev/null +++ b/src/locales/it/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} ha subito il contraccolpo!", + "cutHpPowerUpMove": "{{pokemonName}} riduce i suoi PS per potenziare la sua mossa!", + "absorbedElectricity": "{{pokemonName}} assorbe elettricità!", + "switchedStatChanges": "{{pokemonName}} scambia con il bersaglio le modifiche alle statistiche!", + "goingAllOutForAttack": "{{pokemonName}} fa sul serio!", + "regainedHealth": "{{pokemonName}} s'è\nripreso!", + "keptGoingAndCrashed": "{{pokemonName}} si sbilancia e\nsi schianta!", + "fled": "{{pokemonName}} è fuggito!", + "cannotBeSwitchedOut": "{{pokemonName}} non può essere sostituito!", + "swappedAbilitiesWithTarget": "{{pokemonName}} scambia la sua\nabilità con il bersaglio!", + "coinsScatteredEverywhere": "Ci sono monete sparse ovunque!", + "attackedByItem": "{{itemName}} attacca {{pokemonName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} genera un\nuragano!", + "flewUpHigh": "{{pokemonName}} vola\nin alto!", + "tookInSunlight": "{{pokemonName}} assorbe la luce!", + "dugAHole": "{{pokemonName}} si nasconde sottoterra!", + "loweredItsHead": "{{pokemonName}} abbassa la testa!", + "isGlowing": "{{pokemonName}} è avvolto da una luce intensa!", + "bellChimed": " Si sente suonare una campanella!", + "foresawAnAttack": "{{pokemonName}} presagisce\nl’attacco imminente!", + "hidUnderwater": "{{pokemonName}} sparisce\nsott’acqua!", + "soothingAromaWaftedThroughArea": "Un gradevole profumo si diffonde nell’aria!", + "sprangUp": "{{pokemonName}} spicca un gran balzo!", + "choseDoomDesireAsDestiny": "{{pokemonName}} ipoteca\nil futuro con Desiderio Fatale!", + "vanishedInstantly": "{{pokemonName}} sparisce\nimprovvisamente!", + "tookTargetIntoSky": "{{pokemonName}} trascina\nin aria {{targetName}}!", + "becameCloakedInFreezingLight": "{{pokemonName}} è avvolto da\nuna luce fredda!", + "becameCloakedInFreezingAir": "{{pokemonName}} è avvolto da\nun’atmosfera gelida!", + "isChargingPower": "{{pokemonName}} accumula energia!", + "burnedItselfOut": "Le fiamme di {{pokemonName}} si sono spente!", + "startedHeatingUpBeak": "{{pokemonName}} inizia a\nscaldare il becco!", + "isOverflowingWithSpacePower": "La forza dell’universo pervade {{pokemonName}}!", + "usedUpAllElectricity": "{{pokemonName}} ha usato tutta la sua elettricità!", + "stoleItem": "{{pokemonName}} ruba\nil/lo/la {{itemName}} di {{targetName}}!", + "incineratedItem": "{{pokemonName}} incenerisce\nil/lo/la {{itemName}} di {{targetName}}!", + "knockedOffItem": "{{pokemonName}} fa cadere\nil/lo/la {{itemName}} di {{targetName}}!", + "tookMoveAttack": "{{pokemonName}} attira\nl'attacco {{moveName}} su di sé!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} riduce i suoi PS\ne aumenta al massimo il/la suo/a {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copia\nle modifiche alle statistiche di {{targetName}}!", + "magnitudeMessage": "Magnitudo {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} prende la mira\nsu {{targetName}}!", + "transformedIntoType": "{{pokemonName}} è diventato\ndi tipo {{typeName}}!", + "copiedMove": "{{pokemonName}} copia\n{{moveName}}!", + "sketchedMove": "{{pokemonName}} disegna uno schizzo\ndella mossa {{moveName}}!", + "acquiredAbility": "L’abilità di {{pokemonName}}\nè ora {{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copia l’abilità {{abilityName}}\ndi {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} assume le sembianze\ndi {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} tenta di far subire a chi lo manda KO la sua stessa sorte!", + "addType": "Adesso {{pokemonName}} è anche\ndi tipo {{typeName}}!", + "cannotUseMove": "{{pokemonName}} non può usare {{moveName}}!" +} as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 49b46f84131..f3017dd350e 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const koConfig = { ability: ability, @@ -109,5 +110,6 @@ export const koConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/ko/move-trigger.ts b/src/locales/ko/move-trigger.ts new file mode 100644 index 00000000000..437f2fc6d15 --- /dev/null +++ b/src/locales/ko/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}[[는]]\n반동으로 데미지를 입었다!", + "cutHpPowerUpMove": "{{pokemonName}}[[는]]\n체력을 깎아서 자신의 기술을 강화했다!", + "absorbedElectricity": "{{pokemonName}}는(은)\n전기를 흡수했다!", + "switchedStatChanges": "{{pokemonName}}[[는]] 상대와 자신의\n능력 변화를 바꿨다!", + "goingAllOutForAttack": "{{pokemonName}}[[는]]\n전력을 다하기 시작했다!", + "regainedHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!", + "keptGoingAndCrashed": "{{pokemonName}}[[는]]\n의욕이 넘쳐서 땅에 부딪쳤다!", + "fled": "{{pokemonName}}[[는]]\N도망쳤다!", + "cannotBeSwitchedOut": "{{pokemonName}}[[를]]\n돌아오게 할 수 없습니다!", + "swappedAbilitiesWithTarget": "{{pokemonName}}[[는]]\n서로의 특성을 교체했다!", + "coinsScatteredEverywhere": "돈이 주위에 흩어졌다!", + "attackedByItem": "{{itemName}}[[가]]\n{{pokemonName}}에게 덤벼들었다!", + "whippedUpAWhirlwind": "{{pokemonName}}의 주위에서\n공기가 소용돌이친다!", + "flewUpHigh": "{{pokemonName}}는(은)\n하늘 높이 날아올랐다!", + "tookInSunlight": "{{pokemonName}}는(은)\n빛을 흡수했다!", + "dugAHole": "{{pokemonName}}는(은)\n땅으로 파고들었다!", + "loweredItsHead": "{{pokemonName}}는(은)\n목을 움츠렸다!", + "isGlowing": "{{pokemonName}}를(을)\n강렬한 빛이 감쌌다!", + "bellChimed": "방울소리가 울려 퍼졌다!", + "foresawAnAttack": "{{pokemonName}}는(은)\n미래의 공격을 예지했다!", + "hidUnderwater": "{{pokemonName}}는(은)\n물속에 몸을 숨겼다!", + "soothingAromaWaftedThroughArea": "기분 좋은 향기가 퍼졌다!", + "sprangUp": "{{pokemonName}}는(은)\n높이 뛰어올랐다!", + "choseDoomDesireAsDestiny": "{{pokemonName}}는(은)\n파멸의소원을 미래에 맡겼다!", + "vanishedInstantly": "{{pokemonName}}의 모습이\n일순간에 사라졌다!", + "tookTargetIntoSky": "{{pokemonName}}는(은) {{targetName}}를(을)\n상공으로 데려갔다!", + "becameCloakedInFreezingLight": "{{pokemonName}}는(은)\n차가운 빛에 둘러싸였다!", + "becameCloakedInFreezingAir": "{{pokemonName}}는(은)\n차디찬 공기에 둘러싸였다!", + "isChargingPower": "{{pokemonName}}는(은)\n파워를 모으고 있다!", + "burnedItselfOut": "{{pokemonName}}의 불꽃은 다 타 버렸다!", + "startedHeatingUpBeak": "{{pokemonName}}는(은)\n부리를 가열하기 시작했다!", + "isOverflowingWithSpacePower": "{{pokemonName}}에게서\n우주의 힘이 넘쳐난다!", + "usedUpAllElectricity": "{{pokemonName}}[[는]]\n전기를 다 써 버렸다!", + "stoleItem": "{{pokemonName}}[[는]] {{targetName}}[[로]]부터\n{{itemName}}[[을]] 빼앗았다!", + "incineratedItem": "{{pokemonName}}[[는]] {{targetName}}의\n{{itemName}}[[를]] 불태워서 없애버렸다!", + "knockedOffItem": "{{pokemonName}}[[는]] {{targetName}}의\n{{itemName}}[[를]] 탁 쳐서 떨구었다!", + "tookMoveAttack": "{{pokemonName}}[[는]]\n{{moveName}} 공격을 끌어들였다!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}[[는]] 체력을 깎아서\n{{statName}}[[를]] 풀 파워로 만들었다!", + "copiedStatChanges": "{{pokemonName}}[[는]] {{targetName}}의\n능력 변화를 복사했다!", + "magnitudeMessage": "매그니튜드{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}[[는]] 목표를\n{{targetName}}[[로]] 결정했다!", + "transformedIntoType": "{{pokemonName}}[[는]]\n{{typeName}}타입이 됐다!", + "copiedMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 복사했다!", + "sketchedMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 스케치했다!", + "acquiredAbility": "{{pokemonName}}[[는]]\n{{abilityName}}[[가]] 되었다!", + "copiedTargetAbility": "{{pokemonName}}[[는]] {{targetName}}의\n{{abilityName}}[[를]] 복사했다!", + "transformedIntoTarget": "{{pokemonName}}[[는]]\n{{targetName}}[[로]] 변신했다!", + "tryingToTakeFoeDown": "{{pokemonName}}[[는]] 상대를\n길동무로 삼으려 하고 있다!", + "addType": "{{pokemonName}}에게\n{{typeName}}타입이 추가되었다!", + "cannotUseMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 쓸 수 없다!" +} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index ccadf78d67a..ce4576646c2 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -52,6 +52,7 @@ import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { terrain, weather } from "./weather"; +import { moveTriggers } from "./move-trigger"; export const ptBrConfig = { ability: ability, @@ -109,5 +110,6 @@ export const ptBrConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/pt_BR/move-trigger.ts b/src/locales/pt_BR/move-trigger.ts new file mode 100644 index 00000000000..272da44e1f6 --- /dev/null +++ b/src/locales/pt_BR/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}} foi ferido pelo dano reverso!", + "cutHpPowerUpMove": "{{pokemonName}} diminuiu seus PS para aumentar o poder do ataque!", + "absorbedElectricity": "{{pokemonName}} absorveu eletricidade!", + "switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!", + "goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!", + "regainedHealth": "{{pokemonName}} recuperou/nsaúde!", + "keptGoingAndCrashed": "{{pokemonName}} continuou/nindo e bateu!", + "fled": "{{pokemonName}} fugiu!", + "cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!", + "swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!", + "coinsScatteredEverywhere": "Moedas foram espalhadas por toda parte!", + "attackedByItem": "{{pokemonName}} está prestes a ser atacado por {{itemName}}!", + "whippedUpAWhirlwind": "{{pokemonName}} criou\num redemoinho de vento!", + "flewUpHigh": "{{pokemonName}} voou\nbem alto!", + "tookInSunlight": "{{pokemonName}} absorveu a luz do sol!", + "dugAHole": "{{pokemonName}} cavou um buraco no chão!", + "loweredItsHead": "{{pokemonName}} abaixou sua cabeça!", + "isGlowing": "{{pokemonName}} ficou envolto em uma luz forte!", + "bellChimed": "Um sino tocou!", + "foresawAnAttack": "{{pokemonName}} previu/num ataque!", + "hidUnderwater": "{{pokemonName}} se escondeu/nembaixo d'água!", + "soothingAromaWaftedThroughArea": "Um aroma suave se espalhou pelo ambiente!", + "sprangUp": "{{pokemonName}} se levantou!", + "choseDoomDesireAsDestiny": "{{pokemonName}} escolheu\no Desejo da Perdição como seu destino!", + "vanishedInstantly": "{{pokemonName}} desapareceu/nde repente!", + "tookTargetIntoSky": "{{pokemonName}} levou {{targetName}}\npara o céu!", + "becameCloakedInFreezingLight": "{{pokemonName}} ficou envolto/nem uma luz congelante!", + "becameCloakedInFreezingAir": "{{pokemonName}} ficou envolto/nem ar congelante!", + "isChargingPower": "{{pokemonName}} está absorvendo energia!", + "burnedItselfOut": "{{pokemonName}} apagou seu próprio fogo!", + "startedHeatingUpBeak": "{{pokemonName}} começou\na esquentar seu bico!", + "isOverflowingWithSpacePower": "{{pokemonName}} está sobrecarregado\ncom energia espacial!", + "usedUpAllElectricity": "{{pokemonName}} usou toda a sua eletricidade!", + "stoleItem": "{{pokemonName}} roubou/no(a) {{itemName}} de {{targetName}}!", + "incineratedItem": "{{pokemonName}} incinerou\na {{itemName}} de {{targetName}}!", + "knockedOffItem": "{{pokemonName}} derrubou\no(a) {{itemName}} de {{targetName}}!", + "tookMoveAttack": "{{pokemonName}} pegou\no movimento {{moveName}}!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}} reduziu seus PS\ne maximizou seu atributo de {{statName}}!", + "copiedStatChanges": "{{pokemonName}} copiou\nas mudanças de atributo de {{targetName}}!", + "magnitudeMessage": "Magnitude {{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}} mirou\nem {{targetName}}!", + "transformedIntoType": "{{pokemonName}} se transformou\nem tipo {{typeName}}!", + "copiedMove": "{{pokemonName}} copiou\no movimento {{moveName}}!", + "sketchedMove": "{{pokemonName}} desenhou\no movimento {{moveName}}!", + "acquiredAbility": "{{pokemonName}} adquiriu\na habilidade {{abilityName}}!", + "copiedTargetAbility": "{{pokemonName}} copiou a habilidade\nde {{targetName}}!", + "transformedIntoTarget": "{{pokemonName}} se transformou\nem um(a) {{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}} está tentando derrubar o atacante com ele!", + "addType": "{{pokemonName}} recebeu\no tipo {{typeName}}!", + "cannotUseMove": "{{pokemonName}} não pode usar {{moveName}}!" +} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 39c43a24631..8f00168c58c 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const zhCnConfig = { ability: ability, @@ -109,5 +110,6 @@ export const zhCnConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/zh_CN/move-trigger.ts b/src/locales/zh_CN/move-trigger.ts new file mode 100644 index 00000000000..16d49f3f9e1 --- /dev/null +++ b/src/locales/zh_CN/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}\n受到了反作用力造成的伤害!", + "cutHpPowerUpMove": "{{pokemonName}}\n削减了体力并提升了招式威力!", + "absorbedElectricity": "{{pokemonName}}\n吸收了电力!", + "switchedStatChanges": "{{pokemonName}}和对手互换了\n自己的能力变化!", + "goingAllOutForAttack": "{{pokemonName}}拿出全力了!", + "regainedHealth": "{{pokemonName}}的\n体力回复了!", + "keptGoingAndCrashed": "{{pokemonName}}因势头过猛\n而撞到了地面!", + "fled": "{{pokemonName}}\n逃走了!", + "cannotBeSwitchedOut": "{{pokemonName}}\n无法被收回!", + "swappedAbilitiesWithTarget": "{{pokemonName}}\n互换了各自的特性!", + "coinsScatteredEverywhere": "金币散落一地!", + "attackedByItem": "{{pokemonName}}被\n{{itemName}}袭击了!", + "whippedUpAWhirlwind": "{{pokemonName}}周围的\n空气产生了旋涡!", + "flewUpHigh": "{{pokemonName}}\n飞向了高空!", + "tookInSunlight": "{{pokemonName}}\n吸收了光!", + "dugAHole": "{{pokemonName}}\n钻入了地里!", + "loweredItsHead": "{{pokemonName}}\n把头缩了进去!", + "isGlowing": "强光包围了{{pokemonName}}\n!", + "bellChimed": "铃声响彻四周!", + "foresawAnAttack": "{{pokemonName}}\n预知了未来的攻击!", + "hidUnderwater": "{{pokemonName}}\n潜入了水中!", + "soothingAromaWaftedThroughArea": "怡人的香气扩散了开来!", + "sprangUp": "{{pokemonName}}\n高高地跳了起来!", + "choseDoomDesireAsDestiny": "{{pokemonName}}\n将破灭之愿托付给了未来!", + "vanishedInstantly": "{{pokemonName}}的身影\n瞬间消失了!", + "tookTargetIntoSky": "{{pokemonName}}将{{targetName}}\n带上了高空!", + "becameCloakedInFreezingLight": "{{pokemonName}}\n被冷光包围了!", + "becameCloakedInFreezingAir": "{{pokemonName}}\n被冰冻的空气包围了!", + "isChargingPower": "{{pokemonName}}\n正在积蓄力量!", + "burnedItselfOut": "{{pokemonName}}的火焰燃尽了!", + "startedHeatingUpBeak": "{{pokemonName}}\n开始给鸟嘴加热了!", + "isOverflowingWithSpacePower": "{{pokemonName}}身上\n溢出了宇宙之力!", + "usedUpAllElectricity": "{{pokemonName}}\n用尽电力了!", + "stoleItem": "{{pokemonName}}从{{targetName}}那里\n夺取了{{itemName}}!", + "incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}!", + "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!", + "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!", + "copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!", + "magnitudeMessage": "震级{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}!", + "transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!", + "copiedMove": "{{pokemonName}}\n复制了{{moveName}}!", + "sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!", + "acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!", + "copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}}\n变身成了{{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}}\n想和对手同归于尽!", + "addType": "{{pokemonName}}\n增加了{{typeName}}属性!", + "cannotUseMove": "{{pokemonName}}\n无法使用{{moveName}}!" +} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index a0217f004cf..7a974d58fc3 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -52,6 +52,7 @@ import { partyUiHandler } from "./party-ui-handler"; import { settings } from "./settings.js"; import { common } from "./common.js"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; +import { moveTriggers } from "./move-trigger"; export const zhTwConfig = { ability: ability, @@ -109,5 +110,6 @@ export const zhTwConfig = { voucher: voucher, weather: weather, partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler + modifierSelectUiHandler: modifierSelectUiHandler, + moveTriggers: moveTriggers }; diff --git a/src/locales/zh_TW/move-trigger.ts b/src/locales/zh_TW/move-trigger.ts new file mode 100644 index 00000000000..7e5f54538bc --- /dev/null +++ b/src/locales/zh_TW/move-trigger.ts @@ -0,0 +1,54 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const moveTriggers: SimpleTranslationEntries = { + "hitWithRecoil" : "{{pokemonName}}\n受到了反作用力造成的傷害!", + "cutHpPowerUpMove": "{{pokemonName}}\n削減體力並提升了招式威力!", + "absorbedElectricity": "{{pokemonName}}\n吸收了电力!", + "switchedStatChanges": "{{pokemonName}}和對手互換了\n自身的能力變化!", + "goingAllOutForAttack": "{{pokemonName}}拿出全力了!", + "regainedHealth": "{{pokemonName}}的\n體力回復了!", + "keptGoingAndCrashed": "{{pokemonName}}因勢頭過猛\n而撞到了地面!", + "fled": "{{pokemonName}}\n逃走了!", + "cannotBeSwitchedOut": "{{pokemonName}}\n無法被收回!", + "swappedAbilitiesWithTarget": "{{pokemonName}}\n互換了各自的特性!", + "coinsScatteredEverywhere": "金幣散落一地!", + "attackedByItem": "{{pokemonName}}被\n{{itemName}}襲擊了!", + "whippedUpAWhirlwind": "{{pokemonName}}周圍的\n空氣產生了旋渦!", + "flewUpHigh": "{{pokemonName}}\n飛向了高空!", + "tookInSunlight": "{{pokemonName}}\n吸收了光線!", + "dugAHole": "{{pokemonName}}\n鑽進了地下!", + "loweredItsHead": "{{pokemonName}}\n把頭縮了進去!", + "isGlowing": "強光包圍了\n{{pokemonName}}!", + "bellChimed": "鈴聲響徹四周!", + "foresawAnAttack": "{{pokemonName}}\n預知了未來的攻擊!", + "hidUnderwater": "{{pokemonName}}\n潛入了水中!", + "soothingAromaWaftedThroughArea": "怡人的香氣擴散了開來!", + "sprangUp": "{{pokemonName}}\n高高地跳了起來!", + "choseDoomDesireAsDestiny": "{{pokemonName}}\n將破滅之願託付給了未來!", + "vanishedInstantly": "{{pokemonName}}的身影\n瞬間消失了!", + "tookTargetIntoSky": "{{pokemonName}}將{{targetName}}\n帶上了高空!", + "becameCloakedInFreezingLight": "{{pokemonName}}\n被冷光包圍了!", + "becameCloakedInFreezingAir": "{{pokemonName}}\n被冰凍的空氣包圍了!", + "isChargingPower": "{{pokemonName}}\n正在積蓄力量!", + "burnedItselfOut": "{{pokemonName}}的火焰燃盡了!", + "startedHeatingUpBeak": "{{pokemonName}}\n開始給鳥嘴加熱了!", + "isOverflowingWithSpacePower": "{{pokemonName}}湧起了宇宙的力量!", + "usedUpAllElectricity": "{{pokemonName}}\n用盡了電力!", + "stoleItem": "{{pokemonName}}从{{targetName}}那裏\n奪取了{{itemName}}!", + "incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}!", + "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!", + "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!", + "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!", + "copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!", + "magnitudeMessage": "震級{{magnitude}}!", + "tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}!", + "transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!", + "copiedMove": "{{pokemonName}}\n複製了{{moveName}}!", + "sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!", + "acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!", + "copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}!", + "transformedIntoTarget": "{{pokemonName}}\n變身成了{{targetName}}!", + "tryingToTakeFoeDown": "{{pokemonName}}\n想和對手同歸於盡!", + "addType": "{{pokemonName}}\n增加了{{typeName}}屬性!", + "cannotUseMove": "{{pokemonName}}\n無法使用{{moveName}}!" +} as const; From 7582eefabce5d9efece07e8328489ed6fea4b07e Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Mon, 29 Jul 2024 20:51:56 -0700 Subject: [PATCH 073/321] [Bug] Fix final boss 2nd phase transition on status effect damage (#3226) * fix final-boss phase change on status-effect dmg - move final-boss 2nd phase check into battle-scene. - call method at the end of damage phase - call method at the end of PostTurnStatusEffect phase * improve ui.getHandler types * WIP: final_boss.test.ts * add "should spawn Eternatus on wave 200 in END biome" test * add more final_boss tests couldn't cover the form change due to lack of support from current test framework --- src/battle-scene.ts | 34 ++++++- src/phases.ts | 44 ++++----- src/test/final_boss.test.ts | 89 +++++++++++++++++++ src/test/utils/TextInterceptor.ts | 5 ++ .../utils/mocks/mocksContainer/mockSprite.ts | 1 + src/ui/ui.ts | 4 +- 6 files changed, 144 insertions(+), 33 deletions(-) create mode 100644 src/test/final_boss.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 71f4dc7b9f6..9f8612633fc 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import UI from "./ui/ui"; -import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; +import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase, SummonPhase, ToggleDoublePositionPhase } from "./phases"; import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import { Constructor } from "#app/utils"; @@ -14,7 +14,7 @@ import { Arena, ArenaBase } from "./field/arena"; import { GameData } from "./system/game-data"; import { TextStyle, addTextObject, getTextColor } from "./ui/text"; import { allMoves } from "./data/move"; -import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from "./modifier/modifier-type"; +import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, modifierTypes } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; import { allAbilities } from "./data/ability"; @@ -68,6 +68,7 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import {TrainerType} from "#enums/trainer-type"; +import { battleSpecDialogue } from "./data/dialogue"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -2619,4 +2620,33 @@ export default class BattleScene extends SceneBase { }; (window as any).gameInfo = gameInfo; } + + /** + * Initialized the 2nd phase of the final boss (e.g. form-change for Eternatus) + * @param pokemon The (enemy) pokemon + */ + initFinalBossPhaseTwo(pokemon: Pokemon): void { + 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, null, () => { + this.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + this.currentBattle.double = true; + const availablePartyMembers = this.getParty().filter((p) => p.isAllowedInBattle()); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(this, true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(this, 1)); + } + } + + this.shiftPhase(); + }); + return; + } + + this.shiftPhase(); + } } diff --git a/src/phases.ts b/src/phases.ts index dc5dcd0d167..9f927b0fcc1 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -37,7 +37,7 @@ import { vouchers } from "./system/voucher"; import { clientSessionId, loggedInUser, updateUserInfo } from "./account"; import { SessionSaveData } from "./system/game-data"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims"; -import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; +import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "./ui/modifier-select-ui-handler"; import { SettingKeys } from "./system/settings/settings"; @@ -3598,6 +3598,14 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { this.end(); } } + + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); + } + } } export class MessagePhase extends Phase { @@ -3705,34 +3713,12 @@ export class DamagePhase extends PokemonPhase { } } - end() { - switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const pokemon = this.getPokemon(); - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { - this.scene.fadeOutBgm(Utils.fixedInt(2000), false); - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, null, () => { - this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true); - pokemon.generateAndPopulateMoveset(1); - this.scene.setFieldScale(0.75); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.scene.currentBattle.double = true; - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); - if (!availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); - } - } - - super.end(); - }); - return; - } - break; + override end() { + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + this.scene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); } - - super.end(); } } diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts new file mode 100644 index 00000000000..bc950e45767 --- /dev/null +++ b/src/test/final_boss.test.ts @@ -0,0 +1,89 @@ +import { Biome } from "#app/enums/biome.js"; +import { Species } from "#app/enums/species.js"; +import { GameModes, getGameMode } from "#app/game-mode.js"; +import { EncounterPhase, SelectStarterPhase } from "#app/phases.js"; +import { Mode } from "#app/ui/ui.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "./utils/gameManager"; +import { generateStarter } from "./utils/gameManagerUtils"; + +const FinalWave = { + Classic: 200, +}; + +describe("Final Boss", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.startingWave(FinalWave.Classic).startingBiome(Biome.END).disableCrits(); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should spawn Eternatus on wave 200 in END biome", async () => { + await runToFinalBossEncounter(game, [Species.BIDOOF]); + + expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).toBe(Biome.END); + expect(game.scene.getEnemyPokemon().species.speciesId).toBe(Species.ETERNATUS); + }); + + it("should NOT spawn Eternatus before wave 200 in END biome", async () => { + game.override.startingWave(FinalWave.Classic - 1); + await runToFinalBossEncounter(game, [Species.BIDOOF]); + + expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).toBe(Biome.END); + expect(game.scene.getEnemyPokemon().species.speciesId).not.toBe(Species.ETERNATUS); + }); + + it("should NOT spawn Eternatus outside of END biome", async () => { + game.override.startingBiome(Biome.FOREST); + await runToFinalBossEncounter(game, [Species.BIDOOF]); + + expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); + expect(game.scene.arena.biomeType).not.toBe(Biome.END); + expect(game.scene.getEnemyPokemon().species.speciesId).not.toBe(Species.ETERNATUS); + }); + + it.todo("should change form on direct hit down to last boss fragment", () => {}); +}); + +/** + * Helper function to run to the final boss encounter as it's a bit tricky due to extra dialogue + * @param game - The game manager + */ +async function runToFinalBossEncounter(game: GameManager, species: Species[]) { + console.log("===to final boss encounter==="); + await game.runToTitle(); + + game.onNextPrompt("TitlePhase", Mode.TITLE, () => { + game.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(game.scene, species); + const selectStarterPhase = new SelectStarterPhase(game.scene); + game.scene.pushPhase(new EncounterPhase(game.scene, false)); + selectStarterPhase.initBattle(starters); + }); + + game.onNextPrompt("EncounterPhase", Mode.MESSAGE, async () => { + // This will skip all entry dialogue (I can't figure out a way to sequentially handle the 8 chained messages via 1 prompt handler) + game.setMode(Mode.MESSAGE); + const encounterPhase = game.scene.getCurrentPhase() as EncounterPhase; + + // No need to end phase, this will do it for you + encounterPhase.doEncounterCommon(false); + }); + + await game.phaseInterceptor.to(EncounterPhase, true); + console.log("===finished run to final boss encounter==="); +} diff --git a/src/test/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index 34b55aa30ac..a49f41f6be0 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -11,6 +11,11 @@ export default class TextInterceptor { this.logs.push(text); } + showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, promptDelay?: integer): void { + console.log(name, text); + this.logs.push(name, text); + } + getLatestMessage(): string { return this.logs.pop(); } diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 3a5de09b258..fb7f84741e8 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -31,6 +31,7 @@ export default class MockSprite { }; this.anims = { pause: () => null, + stop: () => null, }; } diff --git a/src/ui/ui.ts b/src/ui/ui.ts index ae1bc10a74f..b409b7c0d78 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -235,8 +235,8 @@ export default class UI extends Phaser.GameObjects.Container { (this.scene as BattleScene).uiContainer.add(this.tooltipContainer); } - getHandler(): UiHandler { - return this.handlers[this.mode]; + getHandler(): H { + return this.handlers[this.mode] as H; } getMessageHandler(): BattleMessageUiHandler { From e9c48ef865552554cce74e7f6eda5ae0cfd2f032 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:23:47 -0400 Subject: [PATCH 074/321] Sync beta with changes to main (#3235) * [Hotfix] Fix interactions of some moves not changing types (#3183) * [Hotfix] Fix wild spawns not having their HA (#3190) * [Hotfix] Allow to hatch pokemon with Hidden Ability again (#3222) * chore: Update TNC links layout and position in index.html * chore: Update TNC links font size in index.css (#3230) --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Frederico Santos --- index.css | 4 ++-- index.html | 6 +++--- src/data/egg.ts | 2 +- src/data/move.ts | 6 +++++- src/field/pokemon.ts | 7 ++++--- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/index.css b/index.css index 85878e54fff..be480ab6c78 100644 --- a/index.css +++ b/index.css @@ -33,6 +33,7 @@ body { display: flex; justify-content: space-around; } + #app { display: flex; justify-content: center; @@ -207,9 +208,8 @@ input:-internal-autofill-selected { } #tnc-links { - font-size: larger; + font-size: xx-small; position: relative; - bottom: max(calc(92vh - 100vw / 16 * 9), 0%); } a { diff --git a/index.html b/index.html index e37529572e5..ebe5b063c52 100644 --- a/index.html +++ b/index.html @@ -114,9 +114,6 @@ - - - + + + \ No newline at end of file diff --git a/src/data/egg.ts b/src/data/egg.ts index 70f26503cf2..a7a1b167238 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -212,7 +212,7 @@ export class Egg { let abilityIndex = undefined; if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { - abilityIndex = pokemonSpecies.ability2 ? 2 : 1; + abilityIndex = 2; } // This function has way to many optional parameters diff --git a/src/data/move.ts b/src/data/move.ts index 18e58ecb527..7bb4d19770a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -717,9 +717,13 @@ export default class Move implements Localizable { * @returns The calculated power of the move. */ calculateBattlePower(source: Pokemon, target: Pokemon): number { - const power = new Utils.NumberHolder(this.power); + if (this.category === MoveCategory.STATUS) { + return -1; + } + const power = new Utils.NumberHolder(this.power); const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); + applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, typeChangeMovePowerMultiplier); const sourceTeraType = source.getTeraType(); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index c9dfae5d140..9b586d235c6 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -135,10 +135,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // If abilityIndex is not provided, determine it based on species and hidden ability if (species.abilityHidden && hasHiddenAbility) { // If the species has a hidden ability and the hidden ability is present - this.abilityIndex = species.ability2 ? 2 : 1; // Use ability index 2 if species has a second ability, otherwise use 1 + this.abilityIndex = 2; } else { // If there is no hidden ability or species does not have a hidden ability - this.abilityIndex = species.ability2 ? 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) { @@ -1834,7 +1834,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const types = this.getTypes(true, true); const cancelled = new Utils.BooleanHolder(false); + const power = move.calculateBattlePower(source, this); const typeless = move.hasAttr(TypelessAttr); + const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes(attr.immuneType))) ? this.getAttackTypeEffectiveness(move, source, false, false) : 1); @@ -1865,7 +1867,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const power = move.calculateBattlePower(source, this); const sourceTeraType = source.getTeraType(); if (!typeless) { From 29aa1a68e785409faf47dfb8836a123a066ec7c2 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:28:43 -0700 Subject: [PATCH 075/321] [Optimization] Destroy LoadingScene when done (after beta rebase) (#3215) * destroy loading-scene when done - unused event listeners are shut off - children are removed - `loading_bg` will be removed after transition is finished - Added some simple types for `rex` plugins * fix tests * fix pokemonSprite.test.ts on local runs it would include hidden dirs like `.DS_store`. Any files starting with `.` is now excluded * add `mockGameObjectCreator` and use in `gameWrapper` * add battle-scene.test.ts add test to verify that LoadingScene is being removed on `BatleScene.create()` call * update types usage for phaser3-rex-plugins * remove phaser-extensions.d.ts fk you typedoc... --- src/battle-scene.ts | 10 +++++-- src/loading-scene.ts | 22 ++++++++++++-- src/test/battle-scene.test.ts | 27 +++++++++++++++++ src/test/sprites/pokemonSprite.test.ts | 29 ++++++++++--------- src/test/utils/gameWrapper.ts | 9 ++---- src/test/utils/mocks/mockGameObjectCreator.ts | 23 +++++++++++++++ 6 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 src/test/battle-scene.test.ts create mode 100644 src/test/utils/mocks/mockGameObjectCreator.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 9f8612633fc..0ac3f9c6245 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -69,6 +69,7 @@ import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import {TrainerType} from "#enums/trainer-type"; import { battleSpecDialogue } from "./data/dialogue"; +import { LoadingScene } from "./loading-scene"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -320,6 +321,7 @@ export default class BattleScene extends SceneBase { } create() { + this.scene.remove(LoadingScene.KEY); initGameSpeed.apply(this); this.inputController = new InputsController(this); this.uiInputs = new UiInputs(this, this.inputController); @@ -370,7 +372,7 @@ export default class BattleScene extends SceneBase { this.fieldUI = fieldUI; - const transition = (this.make as any).rexTransitionImagePack({ + const transition = this.make.rexTransitionImagePack({ x: 0, y: 0, scale: 6, @@ -378,11 +380,15 @@ export default class BattleScene extends SceneBase { origin: { x: 0, y: 0 } }, true); + //@ts-ignore (the defined types in the package are incromplete...) transition.transit({ mode: "blinds", ease: "Cubic.easeInOut", duration: 1250, - oncomplete: () => transition.destroy() + }); + transition.once("complete", () => { + this.textures.remove("loading_bg"); + transition.destroy(); }); this.add.existing(transition); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 61178144ded..5275411055e 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -24,10 +24,12 @@ import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; export class LoadingScene extends SceneBase { + public static readonly KEY = "loading"; + readonly LOAD_EVENTS = Phaser.Loader.Events; constructor() { - super("loading"); + super(LoadingScene.KEY); Phaser.Plugins.PluginCache.register("Loader", CacheBustedLoaderPlugin, "load"); initI18n(); @@ -434,7 +436,7 @@ export class LoadingScene extends SceneBase { } const intro = this.add.video(0, 0); - intro.on(Phaser.GameObjects.Events.VIDEO_COMPLETE, (video: Phaser.GameObjects.Video) => { + intro.once(Phaser.GameObjects.Events.VIDEO_COMPLETE, (video: Phaser.GameObjects.Video) => { this.tweens.add({ targets: intro, duration: 500, @@ -482,7 +484,10 @@ export class LoadingScene extends SceneBase { } }); - this.load.on(this.LOAD_EVENTS.COMPLETE, () => loadingGraphics.forEach(go => go.destroy())); + this.load.on(this.LOAD_EVENTS.COMPLETE, () => { + loadingGraphics.forEach(go => go.destroy()); + intro.destroy(); + }); } get gameHeight() { @@ -494,6 +499,17 @@ export class LoadingScene extends SceneBase { } async create() { + this.events.once(Phaser.Scenes.Events.DESTROY, () => this.handleDestroy()); this.scene.start("battle"); } + + handleDestroy() { + console.debug(`Destroying ${LoadingScene.KEY} scene`); + this.load.off(this.LOAD_EVENTS.PROGRESS); + this.load.off(this.LOAD_EVENTS.FILE_COMPLETE); + this.load.off(this.LOAD_EVENTS.COMPLETE); + // this.textures.remove("loading_bg"); is removed in BattleScene.launchBattle() + this.children.removeAll(true); + console.debug(`Destroyed ${LoadingScene.KEY} scene`); + } } diff --git a/src/test/battle-scene.test.ts b/src/test/battle-scene.test.ts new file mode 100644 index 00000000000..21d3f689d1c --- /dev/null +++ b/src/test/battle-scene.test.ts @@ -0,0 +1,27 @@ +import { LoadingScene } from "#app/loading-scene.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "./utils/gameManager"; + +describe("BattleScene", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should remove LoadingScene on create", () => { + // `BattleScene.create()` is called during the `new GameManager()` call + expect(game.scene.scene.remove).toHaveBeenCalledWith(LoadingScene.KEY); + }); +}); diff --git a/src/test/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index 52b20017715..0fd725b2f58 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/src/test/sprites/pokemonSprite.test.ts @@ -1,20 +1,21 @@ -import {beforeAll, describe, expect, it} from "vitest"; +import { beforeAll, describe, expect, it } from "vitest"; import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; import fs from "fs"; import path from "path"; -import {getAppRootDir} from "#app/test/sprites/spritesUtils"; +import { getAppRootDir } from "#app/test/sprites/spritesUtils"; -const deepCopy = (data) => { +type PokemonVariantMasterlist = typeof _masterlist; + +const deepCopy = (data: any) => { return JSON.parse(JSON.stringify(data)); }; - describe("check if every variant's sprite are correctly set", () => { - let masterlist; - let expVariant; - let femaleVariant; - let backVariant; - let rootDir; + let masterlist: PokemonVariantMasterlist; + let expVariant: PokemonVariantMasterlist["exp"]; + let femaleVariant: PokemonVariantMasterlist["female"]; + let backVariant: PokemonVariantMasterlist["back"]; + let rootDir: string; beforeAll(() => { rootDir = `${getAppRootDir()}${path.sep}public${path.sep}images${path.sep}pokemon${path.sep}variant${path.sep}`; @@ -34,11 +35,11 @@ describe("check if every variant's sprite are correctly set", () => { expect(backVariant).not.toBeUndefined(); }); - function getMissingMasterlist(mlist, dirpath, excludes = []) { - const errors = []; + function getMissingMasterlist(mlist: any, dirpath: string, excludes: string[] = []): string[] { + const errors: string[] = []; const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath).filter(filename => !filename.startsWith(".")); + const files = fs.readdirSync(dirpath).filter((filename) => !/^\..*/.test(filename)); for (const filename of files) { const filePath = `${dirpath}${filename}`; const trimmedFilePath = `${trimmedDirpath}${filename}`; @@ -101,12 +102,12 @@ describe("check if every variant's sprite are correctly set", () => { return errors; } - function getMissingFiles(keys, dirPath) { + function getMissingFiles(keys: Record, dirPath: string): string[] { const errors = []; for (const key of Object.keys(keys)) { const row = keys[key]; for (const [index, elm] of row.entries()) { - let url; + let url: string; if (elm === 0) { continue; } else if (elm === 1) { diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index b1b00c8e15d..de32215fabb 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -25,6 +25,7 @@ import {MoveAnim} from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as battleScene from "#app/battle-scene"; import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; +import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -223,13 +224,9 @@ export default class GameWrapper { return resolve(response); }); }; - this.scene.make = { - graphics: (config) => new MockGraphics(mockTextureManager, config), - rexTransitionImagePack: () => ({ - transit: () => null, - }), - }; + this.scene.make = new MockGameObjectCreator(mockTextureManager); this.scene.time = new MockClock(this.scene); + this.scene.remove = vi.fn(); } } diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/src/test/utils/mocks/mockGameObjectCreator.ts new file mode 100644 index 00000000000..19406a46923 --- /dev/null +++ b/src/test/utils/mocks/mockGameObjectCreator.ts @@ -0,0 +1,23 @@ +import { vi } from "vitest"; +import MockGraphics from "./mocksContainer/mockGraphics"; +import MockTextureManager from "./mockTextureManager"; + +export class MockGameObjectCreator { + private readonly textureManager: MockTextureManager; + + constructor(textureManager: MockTextureManager) { + console.log("Mocking Phaser.GameObjects.GameObjectCreator;"); + this.textureManager = textureManager; + } + + graphics(config: any) { + return new MockGraphics(this.textureManager, config); + } + + rexTransitionImagePack() { + return { + transit: vi.fn(), + once: vi.fn(), + }; + } +} From cb7dbe601a1d11b895dbf04b66e62ab1a7587f46 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:29:34 -0700 Subject: [PATCH 076/321] [Dependencies] Update to resolve install warnings (after beta rebase) (#3213) * bump up `vitest` and `eslint` version to resolve inflight warning... - remove and disable `eslint-plugin-import` due to not supporting `eslint@9` yet (can be reactivated later) - bump `eslint` to `9.7.0`. - bump `@typescript-eslint/eslint-plugin` to `8.0.0-alpha.54` - update `@typescript-eslint/parser` to `8.0.0-alpha.54` - update `typescript-eslint` to `8.0.0-alpha.54` - update `vitest` to `2.0.4` - update `@vitest/coverage-istanbul` to `2.0.4` * remove `vite-plugin-fs` dependency... - removed `api-generatort-script.ts` file (this was in consultations with devs https://discord.com/channels/1125469663833370665/1250836282926436413/1266469312609259550) * bump `vite` to version 5 * fix pokemonSprite.test.ts to run locally It should ignore hidden (starting with `.`) files! * migrate some `typescript-eslint` to @stylistic/eslint-plugin-ts as stated here: https://typescript-eslint.io/blog/deprecating-formatting-rules#upgrading-to-eslint-stylistic - fix eslint complaints inside `i18next.d.ts` * delete `pokenode-ts` dependency * remove `phaser3spectorjs` It's a WebGL debugging tool but I've never seen anyone using it * remove `axios` and `axios-cache-interceptor` dependency They are unused * remove unused `json-beautify` dependency * move `dependency-cruiser` to dev dependencies * Revert "remove `phaser3spectorjs`" This reverts commit 725e6815386be5e39455b41d53f165ad5320173a. * fix pokemonSprite.test.ts (invert condition) whops.. * move `@hpcc-js/wasm` to devDependencies See #2275 * move `@types/jsdom` to devDependencies See #2275 * update package-lock.json --- eslint.config.js | 10 +- package-lock.json | 3698 ++++++++++-------------------- package.json | 27 +- src/@types/i18next.d.ts | 2 +- src/data/api-generator.script.ts | 689 ------ 5 files changed, 1269 insertions(+), 3157 deletions(-) delete mode 100644 src/data/api-generator.script.ts diff --git a/eslint.config.js b/eslint.config.js index d04b7a7176d..de63fbac82e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,7 @@ import tseslint from '@typescript-eslint/eslint-plugin'; +import stylisticTs from '@stylistic/eslint-plugin-ts' import parser from '@typescript-eslint/parser'; -import imports from 'eslint-plugin-import'; +// import imports from 'eslint-plugin-import'; // Disabled due to not being compatible with eslint v9 export default [ { @@ -10,7 +11,8 @@ export default [ parser: parser }, plugins: { - imports: imports.configs.recommended, + // imports: imports.configs.recommended // Disabled due to not being compatible with eslint v9 + '@stylistic/ts': stylisticTs, '@typescript-eslint': tseslint }, rules: { @@ -25,12 +27,12 @@ export default [ "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 rest. }], "eol-last": ["error", "always"], // Enforces at least one newline at the end of files - "@typescript-eslint/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax + "@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 - "@typescript-eslint/brace-style": ["error", "1tbs"], + "@stylistic/ts/brace-style": ["error", "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 diff --git a/package-lock.json b/package-lock.json index b4d6348af51..0605b299dab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,8 @@ "name": "pokemon-rogue-battle", "version": "1.0.4", "dependencies": { - "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", - "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", - "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", @@ -22,26 +19,24 @@ }, "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": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", - "@vitest/coverage-istanbul": "^1.4.0", - "axios": "^1.6.2", - "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.0.4", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", "jsdom": "^24.0.0", - "json-beautify": "^1.1.1", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", - "pokenode-ts": "^1.20.0", "typedoc": "^0.26.4", "typescript": "^5.5.3", - "typescript-eslint": "^7.10.0", - "vite": "^5.3.4", - "vite-plugin-fs": "^0.4.4", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.3.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.4.0", + "vitest": "^2.0.4", "vitest-canvas-mock": "^0.3.3" }, "engines": { @@ -53,6 +48,7 @@ "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" @@ -66,6 +62,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" @@ -79,6 +76,7 @@ "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" } @@ -88,6 +86,7 @@ "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", @@ -118,6 +117,7 @@ "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" } @@ -127,6 +127,7 @@ "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", @@ -142,6 +143,7 @@ "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", @@ -158,6 +160,7 @@ "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" } @@ -204,6 +207,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" @@ -217,6 +221,7 @@ "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", @@ -236,6 +241,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" @@ -261,6 +267,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -270,6 +277,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -279,6 +287,7 @@ "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" } @@ -288,6 +297,7 @@ "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" @@ -301,6 +311,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", @@ -328,6 +339,7 @@ "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", @@ -342,6 +354,7 @@ "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" } @@ -350,13 +363,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "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" } @@ -366,6 +381,7 @@ "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" } @@ -375,6 +391,7 @@ "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" }, @@ -383,10 +400,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -410,6 +428,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", @@ -424,6 +443,7 @@ "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", @@ -450,10 +470,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -471,6 +492,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -487,6 +509,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -503,6 +526,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -519,6 +543,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -535,6 +560,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -551,6 +577,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -567,6 +594,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -583,6 +611,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -599,6 +628,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -615,6 +645,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -631,6 +662,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -647,6 +679,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -663,6 +696,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -679,6 +713,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -695,6 +730,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -711,6 +747,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -727,6 +764,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -743,6 +781,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -759,6 +798,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -775,6 +815,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -791,6 +832,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -807,6 +849,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -823,6 +866,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -836,6 +880,7 @@ "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" }, @@ -851,20 +896,61 @@ "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/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -872,7 +958,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -883,6 +969,7 @@ "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", @@ -927,20 +1014,26 @@ "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/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "dev": true + "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" }, @@ -948,48 +1041,12 @@ "dot-wasm": "bin/dot-wasm.js" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "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" }, @@ -998,39 +1055,83 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "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/@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/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "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", @@ -1045,6 +1146,7 @@ "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" } @@ -1054,6 +1156,7 @@ "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" } @@ -1069,6 +1172,7 @@ "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" @@ -1077,13 +1181,15 @@ "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==" + "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", + "license": "Apache-2.0" }, "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" @@ -1097,6 +1203,7 @@ "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" } @@ -1106,6 +1213,7 @@ "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" @@ -1114,6 +1222,17 @@ "node": ">= 8" } }, + "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.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", @@ -1122,6 +1241,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1135,6 +1255,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1148,6 +1269,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1161,6 +1283,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1174,6 +1297,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1187,6 +1311,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1200,6 +1325,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1213,6 +1339,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1226,6 +1353,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1239,6 +1367,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1252,6 +1381,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1265,6 +1395,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1278,6 +1409,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1291,6 +1423,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1304,6 +1437,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1317,31 +1451,88 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "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/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "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/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 + "dev": true, + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -1356,22 +1547,26 @@ "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/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "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/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" } @@ -1379,7 +1574,9 @@ "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==" + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.2", @@ -1388,31 +1585,32 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "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": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1421,26 +1619,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", + "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": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1449,16 +1648,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", - "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "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": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1466,26 +1666,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "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": "7.16.1", - "@typescript-eslint/utils": "7.16.1", + "@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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1493,12 +1691,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1506,13 +1705,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "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": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@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", @@ -1521,7 +1721,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1534,186 +1734,163 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "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": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" + "@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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", - "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "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": "7.16.1", + "@typescript-eslint/types": "8.0.0-alpha.58", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitest/coverage-istanbul": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.6.0.tgz", - "integrity": "sha512-h/BwpXehkkS0qsNCS00QxiupAqVkNi0WT19BR0dQvlge5oHghoSVLx63fABYFoKxVb7Ue7+k6V2KokmQ1zdMpg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.4.tgz", + "integrity": "sha512-6VibYMkXh8cJm5Bg8JYeOoR4oURlPf4YKP9kuVRE/NKasfYrXPnzSwuxrpgMbgOfPj13KUJXgMB3VAGukECtlQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4", + "@istanbuljs/schema": "^0.1.3", + "debug": "^4.3.5", "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "test-exclude": "^6.0.0" + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magicast": "^0.3.4", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.6.0" + "vitest": "2.0.4" } }, "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", + "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", + "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", + "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/utils": "2.0.4", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", + "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", "dev": true, + "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "2.0.4", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", + "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", "dev": true, + "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", + "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", "dev": true, + "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", + "@vitest/pretty-format": "2.0.4", "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "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" }, @@ -1725,6 +1902,8 @@ "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" } @@ -1732,12 +1911,16 @@ "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==" + "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" }, @@ -1749,6 +1932,7 @@ "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" }, @@ -1761,6 +1945,7 @@ "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" }, @@ -1772,6 +1957,7 @@ "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", @@ -1787,6 +1973,8 @@ "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" } @@ -1795,6 +1983,7 @@ "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" }, @@ -1808,150 +1997,33 @@ "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==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "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/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "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": "*" + "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 - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1963,48 +2035,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-cache-interceptor": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.3.tgz", - "integrity": "sha512-kPgGId9XW7tR+VF7hgSkqF4f6FrV4ecCyKxjkD9v1hNJ4sXSAskocr7SMKaVHVvrbzVeruwB6yL6Y9/lY1ApKg==", - "dev": true, - "dependencies": { - "cache-parser": "1.2.5", - "fast-defer": "1.1.8", - "object-code": "1.3.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" - }, - "peerDependencies": { - "axios": "^1" - } - }, "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 + "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" } @@ -2014,6 +2057,7 @@ "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" }, @@ -2040,6 +2084,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001640", "electron-to-chromium": "^1.4.820", @@ -2053,47 +2098,21 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "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/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/cache-parser": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.5.tgz", - "integrity": "sha512-Md/4VhAHByQ9frQ15WD6LrMNiVw9AEl/J7vWIXw+sxT6fSOpbtt6LHTp76vy8+bOESPBO94117Hm2bIjlI7XjA==", - "dev": true - }, "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", @@ -2113,6 +2132,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2135,30 +2155,31 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "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": ">=4" + "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" @@ -2171,21 +2192,21 @@ } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 16" } }, "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", @@ -2195,36 +2216,51 @@ "node": ">=12" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "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, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } + "license": "MIT" }, - "node_modules/co-body": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", - "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", + "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": { - "@hapi/bourne": "^3.0.0", - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8.0.0" + "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" }, @@ -2235,13 +2271,15 @@ "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==" + "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" }, @@ -2253,6 +2291,8 @@ "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" } @@ -2261,64 +2301,21 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "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 - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copy-to": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", - "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", - "dev": true + "license": "MIT" }, "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" } @@ -2328,6 +2325,7 @@ "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", @@ -2340,19 +2338,22 @@ "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==" + "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 + "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" }, @@ -2371,6 +2372,7 @@ "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" @@ -2379,62 +2381,12 @@ "node": ">=18" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2451,36 +2403,31 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "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, - "dependencies": { - "type-detect": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, "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 + "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", @@ -2493,51 +2440,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.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/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dependency-cruiser": { - "version": "16.3.9", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.9.tgz", - "integrity": "sha512-rtYBXmwYGcuwvGHI+gqXMyXXKjJ3d8nfg6hdwOtgm3Z7VHczuDwUJTg1PDQNzhWLWjMKzV5igAIpuxXOhslyZA==", + "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", @@ -2546,12 +2464,11 @@ "acorn-walk": "8.3.3", "ajv": "8.17.1", "commander": "12.1.0", - "enhanced-resolve": "5.17.0", + "enhanced-resolve": "5.17.1", "ignore": "5.3.1", "interpret": "^3.1.1", "is-installed-globally": "1.0.0", "json5": "2.2.3", - "lodash": "4.17.21", "memoize": "10.0.0", "picocolors": "1.0.1", "picomatch": "4.0.2", @@ -2575,30 +2492,12 @@ "node": "^18.17||>=20" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "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" }, @@ -2606,23 +2505,12 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "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, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.4.830", @@ -2631,23 +2519,18 @@ "dev": true }, "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==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "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" @@ -2660,6 +2543,8 @@ "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" }, @@ -2667,70 +2552,11 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" }, @@ -2742,68 +2568,18 @@ "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-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" }, @@ -2840,21 +2616,18 @@ "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-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, "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" }, @@ -2863,41 +2636,38 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "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.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@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", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "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": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -2911,152 +2681,24 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "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, - "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, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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-plugin-import/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, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3067,6 +2709,7 @@ "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" }, @@ -3074,20 +2717,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "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", @@ -3104,11 +2739,25 @@ "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", @@ -3120,6 +2769,7 @@ "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" }, @@ -3128,17 +2778,31 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "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.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "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" @@ -3149,6 +2813,7 @@ "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" }, @@ -3161,6 +2826,7 @@ "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" }, @@ -3173,6 +2839,7 @@ "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" } @@ -3182,6 +2849,7 @@ "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" } @@ -3191,6 +2859,7 @@ "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" } @@ -3198,13 +2867,15 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -3226,19 +2897,16 @@ "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==" - }, - "node_modules/fast-defer": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", - "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", - "dev": true + "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", @@ -3255,6 +2923,7 @@ "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" }, @@ -3266,38 +2935,43 @@ "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 + "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 + "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==" + "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": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "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": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -3305,6 +2979,7 @@ "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" }, @@ -3317,6 +2992,7 @@ "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" @@ -3329,52 +3005,41 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "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.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "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 - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } + "license": "ISC" }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "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": { - "is-callable": "^1.1.3" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { @@ -3382,6 +3047,7 @@ "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", @@ -3391,27 +3057,13 @@ "node": ">= 6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "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, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3424,33 +3076,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3460,6 +3086,7 @@ "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" } @@ -3468,6 +3095,8 @@ "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.*" } @@ -3477,6 +3106,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -3485,6 +3115,7 @@ "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", @@ -3504,6 +3135,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -3511,49 +3143,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "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" }, @@ -3561,32 +3156,12 @@ "node": ">=10.13.0" } }, - "node_modules/glob/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/glob/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/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" }, @@ -3598,41 +3173,24 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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", @@ -3652,12 +3210,14 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true + "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" }, @@ -3668,27 +3228,22 @@ "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==" + "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 - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "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" } @@ -3697,6 +3252,7 @@ "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" }, @@ -3708,6 +3264,7 @@ "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" }, @@ -3719,21 +3276,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3745,6 +3288,7 @@ "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" }, @@ -3757,6 +3301,7 @@ "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" }, @@ -3768,51 +3313,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "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" @@ -3826,6 +3335,7 @@ "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" @@ -3839,6 +3349,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } @@ -3861,6 +3372,7 @@ "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" } @@ -3869,6 +3381,7 @@ "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" } @@ -3885,26 +3398,17 @@ "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, - "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" } @@ -3914,6 +3418,7 @@ "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" @@ -3930,126 +3435,36 @@ "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/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "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/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "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-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" }, @@ -4060,41 +3475,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "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" } @@ -4103,30 +3489,18 @@ "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-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" }, @@ -4138,6 +3512,8 @@ "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" @@ -4153,6 +3529,8 @@ "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" }, @@ -4160,47 +3538,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" } @@ -4209,44 +3562,15 @@ "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 - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -4254,79 +3578,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "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 + "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" } @@ -4336,6 +3606,7 @@ "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", @@ -4352,6 +3623,7 @@ "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", @@ -4366,6 +3638,7 @@ "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", @@ -4380,6 +3653,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" @@ -4388,11 +3662,28 @@ "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" @@ -4402,12 +3693,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "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" }, @@ -4420,6 +3713,7 @@ "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", @@ -4460,6 +3754,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -4467,30 +3762,24 @@ "node": ">=4" } }, - "node_modules/json-beautify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz", - "integrity": "sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==", - "dev": true, - "bin": { - "json-beautify": "bin/json-beautify" - } - }, "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 + "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==" + "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", @@ -4508,12 +3797,15 @@ "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 + "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" }, @@ -4525,27 +3817,17 @@ "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/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, "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" } @@ -4554,106 +3836,19 @@ "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/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", - "dev": true, - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-bodyparser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", - "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", - "dev": true, - "dependencies": { - "co-body": "^6.0.0", - "copy-to": "^2.0.1", - "type-is": "^1.6.18" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-cors": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/koa-cors/-/koa-cors-0.0.16.tgz", - "integrity": "sha512-s15knPxe3AJBi2I/ZMPL0pSqU+PLYLO6k5tI0AqClkzavowvocPlSdFUwaHNqtjHMhsGmiq2tiX/25iILJx9YA==", - "dev": true - }, - "node_modules/koa-router": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", - "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", - "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "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" }, @@ -4676,6 +3871,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4689,6 +3885,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4702,6 +3899,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4715,6 +3913,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4728,6 +3927,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4741,6 +3941,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4754,6 +3955,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4767,6 +3969,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4777,6 +3980,7 @@ "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" @@ -4794,27 +3998,12 @@ "uc.micro": "^2.0.0" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "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" }, @@ -4825,22 +4014,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "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 + "dev": true, + "license": "MIT" }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -4850,6 +4036,7 @@ "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" } @@ -4858,15 +4045,17 @@ "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/magicast": { @@ -4874,6 +4063,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.24.4", "@babel/types": "^7.24.0", @@ -4885,6 +4075,7 @@ "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" }, @@ -4918,19 +4109,12 @@ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "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" }, @@ -4945,31 +4129,25 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "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/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "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" @@ -4983,6 +4161,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4995,6 +4174,7 @@ "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" } @@ -5004,6 +4184,7 @@ "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" }, @@ -5016,6 +4197,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5027,6 +4209,8 @@ "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" }, @@ -5039,6 +4223,7 @@ "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" }, @@ -5053,20 +4238,20 @@ "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/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/moo-color": { @@ -5074,6 +4259,7 @@ "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" } @@ -5082,12 +4268,14 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "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" } @@ -5103,6 +4291,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5114,21 +4303,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "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" }, @@ -5174,6 +4356,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -5189,6 +4372,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5202,125 +4386,21 @@ "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, - "node_modules/object-code": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", - "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -5331,17 +4411,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, "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", @@ -5359,6 +4434,7 @@ "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" }, @@ -5374,6 +4450,7 @@ "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" }, @@ -5384,16 +4461,25 @@ "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/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + "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" }, @@ -5405,6 +4491,8 @@ "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" }, @@ -5412,38 +4500,22 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "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-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "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" } @@ -5451,19 +4523,40 @@ "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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true + "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-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" } @@ -5472,21 +4565,24 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "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": "*" + "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" } @@ -5508,7 +4604,8 @@ "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==" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "license": "MIT" }, "node_modules/phaser3-rex-plugins/node_modules/i18next": { "version": "22.5.1", @@ -5528,6 +4625,7 @@ "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" } @@ -5536,17 +4634,21 @@ "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 + "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==" + "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" }, @@ -5554,33 +4656,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", - "dev": true, - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" - } - }, - "node_modules/pokenode-ts": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/pokenode-ts/-/pokenode-ts-1.20.0.tgz", - "integrity": "sha512-6MekrbiQc9nmaZJ5xpyhRSEMFo4xEsMuB7RR3EqfPvuXo/3StnH1p4brfIiIWDCcZvu7t9a0vjodiR4TnRdLEw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/Gabb-c/pokenode-ts?sponsor=1" - }, - "peerDependencies": { - "axios": "^1.4.0", - "axios-cache-interceptor": "^1.2.0" - } - }, "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", @@ -5609,6 +4684,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -5623,40 +4699,17 @@ "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/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "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" @@ -5665,17 +4718,12 @@ "node": ">= 6" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "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 + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", @@ -5695,26 +4743,12 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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 + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -5736,56 +4770,12 @@ } ] }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, "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" }, @@ -5796,38 +4786,25 @@ "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==" + "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/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" } @@ -5836,6 +4813,8 @@ "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" } @@ -5844,12 +4823,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "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", @@ -5867,6 +4849,7 @@ "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" } @@ -5876,27 +4859,12 @@ "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/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", @@ -5957,84 +4925,34 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/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/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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 + "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" }, @@ -6046,6 +4964,7 @@ "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" }, @@ -6057,6 +4976,7 @@ "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", @@ -6069,32 +4989,12 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, "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" }, @@ -6107,49 +5007,34 @@ "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.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", + "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.10.3", + "@shikijs/core": "1.12.0", "@types/hast": "^3.0.4" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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 + "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" }, @@ -6160,13 +5045,16 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "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" } @@ -6176,6 +5064,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6184,27 +5073,41 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "dev": true, + "license": "MIT" }, "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", @@ -6214,59 +5117,62 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "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, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, + "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": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "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": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "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" }, @@ -6278,6 +5184,8 @@ "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" } @@ -6287,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6299,6 +5208,7 @@ "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" }, @@ -6306,28 +5216,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, "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" }, @@ -6339,6 +5232,8 @@ "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" }, @@ -6350,12 +5245,15 @@ "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 + "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" } @@ -6363,70 +5261,86 @@ "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==" + "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "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": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/test-exclude/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==", + "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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/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" + "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" }, - "engines": { - "node": "*" + "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 + "dev": true, + "license": "MIT" }, "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", "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": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -6436,6 +5350,7 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6445,6 +5360,7 @@ "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" }, @@ -6452,20 +5368,12 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "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", @@ -6493,6 +5401,7 @@ "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" }, @@ -6505,6 +5414,7 @@ "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" }, @@ -6520,22 +5430,12 @@ } } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "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", @@ -6549,6 +5449,8 @@ "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", @@ -6558,32 +5460,12 @@ "node": ">=6" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true, - "engines": { - "node": ">=0.6.x" - } - }, "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" }, @@ -6591,117 +5473,10 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedoc": { - "version": "0.26.4", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.4.tgz", - "integrity": "sha512-FlW6HpvULDKgc3rK04V+nbFyXogPV88hurarDPOjuuB5HAwuAlrCMQ5NeH7Zt68a/ikOKu6Z/0hFXAeC9xPccQ==", + "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", @@ -6721,9 +5496,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "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", @@ -6734,25 +5509,23 @@ } }, "node_modules/typescript-eslint": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.16.1.tgz", - "integrity": "sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==", + "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": "7.16.1", - "@typescript-eslint/parser": "7.16.1", - "@typescript-eslint/utils": "7.16.1" + "@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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -6765,50 +5538,23 @@ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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==" + "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -6828,6 +5574,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -6853,25 +5600,18 @@ "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/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.39", @@ -6923,15 +5663,16 @@ } }, "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", + "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -6944,26 +5685,12 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-plugin-fs": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/vite-plugin-fs/-/vite-plugin-fs-0.4.4.tgz", - "integrity": "sha512-TT9kEU2LX3musejDL99nLdjDl7P74AdTnK3yozehswg0FhKSGlNstkHVUgcswKSk6vH/Uzqgz+df7WT0sEA/IA==", - "dev": true, - "dependencies": { - "koa": "^2.13.4", - "koa-bodyparser": "^4.3.0", - "koa-cors": "^0.0.16", - "koa-router": "^10.1.1" - }, - "engines": { - "node": ">=14" - } - }, "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", @@ -6979,31 +5706,31 @@ } }, "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", + "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.4", + "@vitest/pretty-format": "^2.0.4", + "@vitest/runner": "2.0.4", + "@vitest/snapshot": "2.0.4", + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "debug": "^4.3.5", "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" + "vite-node": "2.0.4", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -7017,8 +5744,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/browser": "2.0.4", + "@vitest/ui": "2.0.4", "happy-dom": "*", "jsdom": "*" }, @@ -7048,6 +5775,7 @@ "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" }, @@ -7060,6 +5788,7 @@ "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" }, @@ -7071,6 +5800,7 @@ "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" }, @@ -7081,7 +5811,8 @@ "node_modules/webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", @@ -7097,6 +5828,7 @@ "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" }, @@ -7121,6 +5853,7 @@ "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" } @@ -7143,6 +5876,7 @@ "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" }, @@ -7153,46 +5887,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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" @@ -7209,14 +5909,36 @@ "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", @@ -7229,17 +5951,76 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "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" }, @@ -7261,6 +6042,7 @@ "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" } @@ -7269,12 +6051,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "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" } @@ -7283,12 +6068,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "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" @@ -7301,6 +6087,8 @@ "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", @@ -7318,17 +6106,32 @@ "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/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "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": ">= 4.0.0" + "node": ">=8" } }, "node_modules/yocto-queue": { @@ -7336,6 +6139,7 @@ "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" }, diff --git a/package.json b/package.json index 3d5839e6cc1..dc851e05c92 100644 --- a/package.json +++ b/package.json @@ -21,34 +21,29 @@ }, "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": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", - "@vitest/coverage-istanbul": "^1.4.0", - "axios": "^1.6.2", - "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.57.0", - "eslint-plugin-import": "^2.29.1", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.0.4", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", "jsdom": "^24.0.0", - "json-beautify": "^1.1.1", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", - "pokenode-ts": "^1.20.0", "typedoc": "^0.26.4", "typescript": "^5.5.3", - "typescript-eslint": "^7.10.0", - "vite": "^5.3.4", - "vite-plugin-fs": "^0.4.4", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.3.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.4.0", + "vitest": "^2.0.4", "vitest-canvas-mock": "^0.3.3" }, "dependencies": { - "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", - "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", - "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index f3a63d6f4ec..a1cf70d91d5 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,4 +1,4 @@ -import { enConfig } from "#app/locales/en/config.js"; +import { type enConfig } from "#app/locales/en/config.js"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { diff --git a/src/data/api-generator.script.ts b/src/data/api-generator.script.ts deleted file mode 100644 index f4a72a24c76..00000000000 --- a/src/data/api-generator.script.ts +++ /dev/null @@ -1,689 +0,0 @@ -import { MainClient, NamedAPIResource } from "pokenode-ts"; -import { MoveTarget, allMoves } from "./move"; -import * as Utils from "../utils"; -import fs from "vite-plugin-fs/browser"; -import PokemonSpecies, { PokemonForm, SpeciesFormKey, allSpecies } from "./pokemon-species"; -import { GrowthRate } from "./exp"; -import { Type } from "./type"; -import { allAbilities } from "./ability"; -import { pokemonFormLevelMoves } from "./pokemon-level-moves"; -import { tmSpecies } from "./tms"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; - -const targetMap = { - "specific-move": MoveTarget.ATTACKER, - "selected-pokemon-me-first": MoveTarget.NEAR_ENEMY, - "ally": MoveTarget.NEAR_ALLY, - "users-field": MoveTarget.USER_SIDE, - "user-or-ally": MoveTarget.USER_OR_NEAR_ALLY, - "opponents-field": MoveTarget.ENEMY_SIDE, - "user": MoveTarget.USER, - "random-opponent": MoveTarget.RANDOM_NEAR_ENEMY, - "all-other-pokemon": MoveTarget.ALL_NEAR_OTHERS, - "selected-pokemon": MoveTarget.NEAR_OTHER, - "all-opponents": MoveTarget.ALL_NEAR_ENEMIES, - "entire-field": MoveTarget.BOTH_SIDES, - "user-and-allies": MoveTarget.USER_AND_ALLIES, - "all-pokemon": MoveTarget.ALL, - "all-allies": MoveTarget.NEAR_ALLY, - "fainting-pokemon": MoveTarget.NEAR_OTHER -}; - -const generationMap = { - "generation-i": 1, - "generation-ii": 2, - "generation-iii": 3, - "generation-iv": 4, - "generation-v": 5, - "generation-vi": 6, - "generation-vii": 7, - "generation-viii": 8, - "generation-ix": 9 -}; - -const growthRateMap = { - "slow-then-very-fast": GrowthRate.ERRATIC, - "fast": GrowthRate.FAST, - "medium": GrowthRate.MEDIUM_FAST, - "medium-slow": GrowthRate.MEDIUM_SLOW, - "slow": GrowthRate.SLOW, - "fast-then-very-slow": GrowthRate.FLUCTUATING -}; - -const regionalForms = [ "alola", "galar", "hisui", "paldea" ]; - -const ignoredForms = [ "gmax", "totem", "cap", "starter" ]; - -const generationDexNumbers = { - 1: 151, - 2: 251, - 3: 386, - 4: 494, - 5: 649, - 6: 721, - 7: 809, - 8: 905, - 9: 1010 -}; - -const versions = [ "scarlet-violet", "sword-shield", "sun-moon" ]; - -type LevelMove = [level: integer, moveId: integer]; - -interface SpeciesLevelMoves { - [key: string]: LevelMove[] -} - -interface FormLevelMoves { - [key: integer]: LevelMove[] -} - -interface SpeciesFormLevelMoves { - [key: string]: FormLevelMoves -} - -interface TmSpecies { - [key: string]: Array -} - -export async function printPokemon() { - const api = new MainClient(); - - const useExistingTmList = true; - - let enumStr = "export enum Species {\n"; - let pokemonSpeciesStr = "\tallSpecies.push(\n"; - const speciesLevelMoves: SpeciesLevelMoves = {}; - const speciesFormLevelMoves: SpeciesFormLevelMoves = {}; - const moveTmSpecies: TmSpecies = {}; - - let pokemonArr: NamedAPIResource[] = []; - - const offset = 0; - const pokemonResponse = await api.pokemon.listPokemons(offset, 2000); - - pokemonArr = pokemonResponse.results; - - const types = Utils.getEnumKeys(Type).map(t => t.toLowerCase()); - const abilities = Utils.getEnumKeys(Abilities).map(a => a.toLowerCase().replace(/\_/g, "-")); - - const pokemonSpeciesList: PokemonSpecies[] = []; - - for (const p of pokemonArr) { - const pokemon = await api.pokemon.getPokemonByName(p.name); - - let region: string = ""; - - if (pokemon.id > 10000) { - const dexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!dexIdMatch) { - continue; - } - - const matchingSpecies = pokemonSpeciesList[parseInt(dexIdMatch[1]) - 1]; - - if (!matchingSpecies) { - continue; - } - - const speciesKey = (matchingSpecies as any).key as string; - - const formName = pokemon.name.slice(speciesKey.length + 1); - - if (ignoredForms.filter(f => formName.indexOf(f) > -1).length) { - continue; - } - - const shortFormName = formName.indexOf("-") > -1 - ? formName.slice(0, formName.indexOf("-")) - : formName; - - if (regionalForms.indexOf(shortFormName) > -1) { - region = shortFormName.toUpperCase(); - } else { - const formBaseStats: integer[] = []; - let formBaseTotal = 0; - // Assume correct stat order in API result - for (const stat of pokemon.stats) { - formBaseStats.push(stat.base_stat); - formBaseTotal += stat.base_stat; - } - - const [ formType1, formType2 ] = [ types.indexOf(pokemon.types.find(t => t.slot === 1).type.name), types.indexOf(pokemon.types.find(t => t.slot === 2)?.type.name) ]; - const [ formAbility1, formAbility2, formAbilityHidden ] = [ - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 1)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 2)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 3)?.ability.name), 0) - ]; - - const pokemonForm = new PokemonForm(formName, formName, formType1 as Type, formType2 > -1 ? formType2 as Type : null, pokemon.height / 10, pokemon.weight / 10, - formAbility1 as Abilities, formAbility2 as Abilities, formAbilityHidden as Abilities, formBaseTotal, formBaseStats[0], formBaseStats[1], formBaseStats[2], formBaseStats[3], formBaseStats[4], formBaseStats[5], - matchingSpecies.catchRate, matchingSpecies.baseFriendship, matchingSpecies.baseExp, matchingSpecies.genderDiffs); - pokemonForm.speciesId = matchingSpecies.speciesId; - pokemonForm.formIndex = matchingSpecies.forms.length; - pokemonForm.generation = matchingSpecies.generation; - - let moveVer: string; - - if (!speciesFormLevelMoves.hasOwnProperty(speciesKey)) { - speciesFormLevelMoves[speciesKey] = []; - } - speciesFormLevelMoves[speciesKey][pokemonForm.formIndex] = []; - - for (const version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { - moveVer = version; - break; - } - } - - if (moveVer) { - pokemon.moves.forEach(moveData => { - moveData.version_group_details.filter(v => versions.indexOf(v.version_group.name) > -1).forEach(verData => { - const isMoveVer = verData.version_group.name === moveVer; - - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); - - const learnMethod = verData.move_learn_method.name; - - if (isMoveVer && learnMethod === "level-up") { - speciesFormLevelMoves[speciesKey][pokemonForm.formIndex].push([ verData.level_learned_at, moveId ]); - } - - if ([ "machine", "tutor" ].indexOf(learnMethod) > -1 || (useExistingTmList && tmSpecies.hasOwnProperty(moveId as Moves) && learnMethod === "level-up")) { - if (!moveTmSpecies.hasOwnProperty(moveId)) { - moveTmSpecies[moveId] = []; - } - const speciesIndex = moveTmSpecies[moveId].findIndex(s => s[0] === speciesKey); - if (speciesIndex === -1) { - moveTmSpecies[moveId].push([ speciesKey, formName ]); - } else { - (moveTmSpecies[moveId][speciesIndex] as string[]).push(formName); - } - } - }); - }); - - if (JSON.stringify(speciesLevelMoves[speciesKey]) === JSON.stringify(speciesFormLevelMoves[speciesKey][pokemonForm.formIndex])) { - delete speciesFormLevelMoves[speciesKey][pokemonForm.formIndex]; - if (!Object.keys(speciesFormLevelMoves[speciesKey]).length) { - delete speciesFormLevelMoves[speciesKey]; - } - } - } - - matchingSpecies.forms.push(pokemonForm); - continue; - } - } - - const species = await api.pokemon.getPokemonSpeciesByName(pokemon.species.name); - - let speciesKey = species.name.toUpperCase().replace(/\-/g, "_"); - - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === speciesKey); - - let dexId = species.id; - - if (region) { - dexId += (regionalForms.indexOf(region.toLowerCase()) + 1) * 2000; - speciesKey = `${region}_${speciesKey}`; - } - - let generationIndex = 0; - - if (!region) { - while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]) {} - } else { - generationIndex = regionalForms.indexOf(region.toLowerCase()) + 6; - } - - const baseStats: integer[] = []; - let baseTotal = 0; - // Assume correct stat order in API result - for (const stat of pokemon.stats) { - baseStats.push(stat.base_stat); - baseTotal += stat.base_stat; - } - - console.log(pokemon); - - const [ type1, type2 ] = [ types.indexOf(pokemon.types.find(t => t.slot === 1).type.name), types.indexOf(pokemon.types.find(t => t.slot === 2)?.type.name) ]; - const [ ability1, ability2, abilityHidden ] = [ - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 1)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 2)?.ability.name), 0), - Math.max(abilities.indexOf(pokemon.abilities.find(a => a.slot === 3)?.ability.name), 0) - ]; - - const pokemonSpecies = new PokemonSpecies(dexId, generationIndex, species.is_legendary && baseTotal < 660, species.is_legendary && baseTotal >= 660, species.is_mythical, - species.genera.find(g => g.language.name === "en")?.genus, type1 as Type, type2 > -1 ? type2 as Type : null, pokemon.height / 10, pokemon.weight / 10, ability1 as Abilities, ability2 as Abilities, abilityHidden as Abilities, - baseTotal, baseStats[0], baseStats[1], baseStats[2], baseStats[3], baseStats[4], baseStats[5], species.capture_rate, species.base_happiness, pokemon.base_experience, growthRateMap[species.growth_rate.name], - species.gender_rate < 9 ? 100 - (species.gender_rate * 12.5) : null, species.has_gender_differences, species.forms_switchable); - - (pokemonSpecies as any).key = speciesKey; - - pokemonSpeciesList.push(pokemonSpecies); - - let moveVer: string; - - speciesLevelMoves[speciesKey] = []; - - for (const version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { - moveVer = version; - break; - } - } - - const speciesTmMoves: integer[] = []; - - if (moveVer) { - pokemon.moves.forEach(moveData => { - const verData = moveData.version_group_details.find(v => v.version_group.name === moveVer); - if (!verData) { - return; - } - - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); - - switch (verData.move_learn_method.name) { - case "level-up": - speciesLevelMoves[speciesKey].push([ verData.level_learned_at, moveId ]); - break; - case "machine": - case "tutor": - if (moveId > 0) { - if (!moveTmSpecies.hasOwnProperty(moveId)) { - moveTmSpecies[moveId] = []; - } - if (moveTmSpecies[moveId].indexOf(speciesKey) === -1) { - moveTmSpecies[moveId].push(speciesKey); - } - speciesTmMoves.push(moveId); - } - break; - } - }); - } - - for (const f of pokemon.forms) { - const form = await api.pokemon.getPokemonFormByName(f.name); - const formIndex = pokemonSpecies.forms.length; - - const matchingForm = matchingExistingSpecies && matchingExistingSpecies.forms.length > formIndex - ? matchingExistingSpecies.forms.find(f2 => f2.formKey === form.form_name || f2.formName === form.form_name) || matchingExistingSpecies.forms[formIndex] - : null; - const formName = matchingForm - ? matchingForm.formName - : form.form_names.find(fn => fn.language.name === "en")?.name || form.form_name; - const formKey = matchingForm - ? matchingForm.formKey - : form.form_name; - - const [ formType1, formType2 ] = [ types.indexOf(form.types.find(t => t.slot === 1).type.name), types.indexOf(form.types.find(t => t.slot === 2)?.type.name) ]; - const pokemonForm = new PokemonForm(formName, formKey, formType1 as Type, formType2 > -1 ? formType2 as Type : null, - pokemonSpecies.height, pokemonSpecies.weight, pokemonSpecies.ability1, pokemonSpecies.ability2, pokemonSpecies.abilityHidden, baseTotal, baseStats[0], baseStats[1], baseStats[2], baseStats[3], baseStats[4], baseStats[5], - pokemonSpecies.catchRate, pokemonSpecies.baseFriendship, pokemonSpecies.baseExp, pokemonSpecies.genderDiffs); - pokemonForm.speciesId = pokemonSpecies.speciesId; - pokemonForm.formIndex = formIndex; - pokemonForm.generation = pokemonSpecies.generation; - - if (!pokemonForm.formIndex && speciesTmMoves.length) { - for (const moveId of speciesTmMoves) { - const speciesIndex = moveTmSpecies[moveId].findIndex(s => s === speciesKey); - moveTmSpecies[moveId][speciesIndex] = [ - speciesKey, - formKey - ]; - } - } - - pokemonSpecies.forms.push(pokemonForm); - } - - console.log(pokemonSpecies.name, pokemonSpecies); - } - - for (const pokemonSpecies of pokemonSpeciesList) { - const speciesKey = (pokemonSpecies as any).key as string; - - enumStr += ` ${speciesKey}${pokemonSpecies.speciesId >= 2000 ? ` = ${pokemonSpecies.speciesId}` : ""},\n`; - pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.subLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : "null"}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`; - if (pokemonSpecies.forms.length > 1) { - pokemonSpeciesStr += `, ${pokemonSpecies.canChangeForm},`; - for (const form of pokemonSpecies.forms) { - pokemonSpeciesStr += `\n new PokemonForm("${form.formName}", "${form.formName}", Type.${Type[form.type1]}, ${form.type2 ? `Type.${Type[form.type2]}` : "null"}, ${form.height}, ${form.weight}, Abilities.${Abilities[form.ability1]}, Abilities.${Abilities[form.ability2]}, Abilities.${Abilities[form.abilityHidden]}, ${form.baseTotal}, ${form.baseStats[0]}, ${form.baseStats[1]}, ${form.baseStats[2]}, ${form.baseStats[3]}, ${form.baseStats[4]}, ${form.baseStats[5]}, ${form.catchRate}, ${form.baseFriendship}, ${form.baseExp}${form.genderDiffs ? ", true" : ""}),`; - } - pokemonSpeciesStr += "\n "; - } - pokemonSpeciesStr += "),\n"; - } - - let speciesLevelMovesStr = "export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {\n"; - let speciesFormLevelMovesStr = "export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {\n"; - let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - - for (const species of Object.keys(speciesLevelMoves)) { - speciesLevelMovesStr += ` [Species.${species}]: [\n`; - - const orderedLevelMoves = speciesLevelMoves[species].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) { - return a[0] < b[0] ? -1 : 1; - } - return a[1] < b[1] ? -1 : 1; - }); - - for (const lm of orderedLevelMoves) { - speciesLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; - } - - speciesLevelMovesStr += " ],\n"; - } - - for (const species of Object.keys(speciesFormLevelMoves)) { - speciesFormLevelMovesStr += ` [Species.${species}]: {\n`; - - for (const f of Object.keys(speciesFormLevelMoves[species])) { - speciesFormLevelMovesStr += ` ${f}: [\n`; - - const orderedLevelMoves = speciesFormLevelMoves[species][f].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) { - return a[0] < b[0] ? -1 : 1; - } - return a[1] < b[1] ? -1 : 1; - }); - - for (const lm of orderedLevelMoves) { - speciesFormLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; - } - - speciesFormLevelMovesStr += " ],\n"; - } - - speciesFormLevelMovesStr += " },\n"; - } - - for (const moveId of Object.keys(moveTmSpecies)) { - tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (const species of moveTmSpecies[moveId]) { - if (typeof species === "string") { - tmSpeciesStr += ` Species.${species},\n`; - } else { - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); - const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { - tmSpeciesStr += ` Species.${species[0]},\n`; - } else { - tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (const form of forms) { - tmSpeciesStr += ` '${form}',\n`; - } - tmSpeciesStr += " ],\n"; - } - } - } - tmSpeciesStr += " ],\n"; - } - - enumStr += "\n};"; - pokemonSpeciesStr += " );"; - speciesLevelMovesStr += "\n};"; - speciesFormLevelMovesStr += "\n};"; - tmSpeciesStr += "\n};"; - - console.log(enumStr); - console.log(pokemonSpeciesStr); - console.log(speciesLevelMovesStr); - console.log(speciesFormLevelMovesStr); - console.log(tmSpeciesStr); - - console.log(moveTmSpecies); -} - -export async function printAbilities() { - const replaceText = true; - - let abilityContent: string = await fs.readFile("./src/data/ability.ts"); - - const api = new MainClient(); - - let enumStr = "export enum Abilities {\n NONE,"; - let abilityStr = " allAbilities.push("; - - abilityContent = abilityContent.slice(abilityContent.indexOf(abilityStr)); - - let abilities: NamedAPIResource[] = []; - const offset = 0; - const abilitiesResponse = await api.pokemon.listAbilities(offset, 2000); - abilities = abilitiesResponse.results; - - for (const a of abilities) { - const ability = await api.pokemon.getAbilityByName(a.name); - const abilityEnumName = ability.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - enumStr += `\n ${abilityEnumName},`; - console.log(ability.name, ability); - - const matchingLineIndex = abilityContent.search(new RegExp(`new Ability\\\(Abilities.${abilityEnumName},`)); - let matchingLine = matchingLineIndex > -1 ? abilityContent.slice(matchingLineIndex) : null; - if (matchingLine) { - matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); - } - - let abilityName = ability.names.find(ln => ln.language.name === "en").name; - [ "N", "P" ].every(s => { - if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { - abilityName += ` (${s})`; - return false; - } - return true; - }); - - let flavorText: string; - if (!matchingLine || replaceText) { - for (const version of versions) { - if ((flavorText = ability.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { - if (flavorText.indexOf("forgotten") > -1) { - continue; - } - break; - } - } - } else if (matchingLine) { - flavorText = allAbilities[ability.id].description; - } - abilityStr += `\n new Ability(Abilities.${abilityEnumName}, "${abilityName}", "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${generationMap[ability.generation.name]})`; - if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf("\n"); - if (newLineIndex > -1) { - abilityStr += matchingLine.slice(newLineIndex); - } - } - abilityStr += ","; - } - - enumStr += "\n};"; - abilityStr += "\n);"; - - console.log(enumStr); - console.log(abilityStr); -} - -export async function printMoves() { - const replaceText = true; - - let moveContent: string = await fs.readFile("./src/data/move.ts"); - - const api = new MainClient(); - - let enumStr = "export enum Moves {\n NONE,"; - let moveStr = " allMoves.push("; - - moveContent = moveContent.slice(moveContent.indexOf(moveStr)); - - let moves: NamedAPIResource[] = []; - const offset = 0; - const movesResponse = await api.move.listMoves(offset, 2000); - moves = movesResponse.results; - - console.log(moves); - - for (const m of moves) { - const move = await api.move.getMoveByName(m.name); - const moveEnumName = move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); - enumStr += `\n ${moveEnumName},`; - console.log(move.name, move); - - const matchingLineIndex = moveContent.search(new RegExp(`new (?:Attack|(?:Self)?Status)Move\\\(Moves.${Moves[move.id]},`)); - let matchingLine = matchingLineIndex > -1 ? moveContent.slice(matchingLineIndex) : null; - if (matchingLine) { - matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); - } - - let moveName = move.names.find(ln => ln.language.name === "en").name; - [ "N", "P" ].every(s => { - if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { - moveName += ` (${s})`; - return false; - } - return true; - }); - - let flavorText: string; - if (!matchingLine || replaceText) { - for (const version of versions) { - if ((flavorText = move.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { - if (flavorText.indexOf("forgotten") > -1) { - continue; - } - break; - } - } - } else if (matchingLine) { - flavorText = allMoves[move.id].effect; - } - const moveTarget = targetMap[move.target.name]; - moveStr += `\n new ${move.damage_class.name !== "status" ? "Attack" : (moveTarget === MoveTarget.USER ? "Self" : "") + "Status"}Move(Moves.${moveEnumName}, "${moveName}", Type.${move.type.name.toUpperCase()}${move.damage_class.name !== "status" ? `, MoveCategory.${move.damage_class.name.toUpperCase()}` : ""}${move.damage_class.name !== "status" ? `, ${move.power || -1}` : ""}, ${move.accuracy || -1}, ${move.pp}, "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${move.effect_chance || -1}, ${move.priority}, ${generationMap[move.generation.name]})`; - const expectedTarget = move.damage_class.name !== "status" || moveTarget !== MoveTarget.USER ? MoveTarget.NEAR_OTHER : MoveTarget.USER; - if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf("\n"); - if (newLineIndex > -1) { - console.log(matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""), newLineIndex); - moveStr += matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""); - } - } - if (moveTarget !== expectedTarget) { - moveStr += `\n .target(MoveTarget.${MoveTarget[moveTarget]})`; - } - moveStr += ","; - } - - enumStr += "\n};"; - moveStr += "\n);"; - - console.log(enumStr); - console.log(moveStr); -} - -export async function printTmSpecies() { - const moveTmSpecies: TmSpecies = {}; - - const api = new MainClient(); - - const moveIds = Object.keys(tmSpecies).map(k => parseInt(k) as Moves); - - for (const moveId of moveIds) { - const move = await api.move.getMoveById(moveId); - - moveTmSpecies[moveId] = []; - - for (const species of move.learned_by_pokemon) { - const dexIdMatch = /\/(\d+)\//.exec(species.url); - if (!dexIdMatch) { - continue; - } - - const dexId = parseInt(dexIdMatch[1]); - - let matchingSpecies: PokemonSpecies; - let formKey = ""; - - console.log(species.name); - - if (dexId < 10000) { - matchingSpecies = allSpecies[dexId - 1]; - } else { - const pokemon = await api.pokemon.getPokemonById(dexId); - - const speciesDexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!speciesDexIdMatch) { - continue; - } - - const speciesDexId = parseInt(speciesDexIdMatch[1]); - - const speciesKey = Species[allSpecies[speciesDexId - 1].speciesId]; - - formKey = species.name.slice(speciesKey.length + 1); - - const regionKey = regionalForms.find(r => formKey.indexOf(r) > -1); - - if (regionKey) { - formKey = formKey.slice(regionKey.length + 1); - matchingSpecies = allSpecies.find(s => Species[s.speciesId] === `${regionKey.toUpperCase()}_${speciesKey}`); - } else { - matchingSpecies = allSpecies[speciesDexId - 1]; - } - } - - if (!matchingSpecies) { - console.log("NO MATCH", species.name); - continue; - } - - const speciesKey = Species[matchingSpecies.speciesId]; - - const matchingIndex = moveTmSpecies[moveId].findIndex(s => Array.isArray(s) ? s[0] === speciesKey : s === speciesKey); - - if (matchingIndex === -1) { - moveTmSpecies[moveId].push(!formKey ? speciesKey : [ speciesKey, formKey ]); - } else { - if (!Array.isArray(moveTmSpecies[moveId][matchingIndex])) { - moveTmSpecies[moveId][matchingIndex] = [ moveTmSpecies[moveId][matchingIndex] as string, "" ]; - } - (moveTmSpecies[moveId][matchingIndex] as string[]).push(formKey); - } - } - } - - let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - - for (const moveId of Object.keys(moveTmSpecies)) { - tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (const species of moveTmSpecies[moveId]) { - if (typeof species === "string") { - tmSpeciesStr += ` Species.${species},\n`; - } else { - const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); - const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { - tmSpeciesStr += ` Species.${species[0]},\n`; - } else { - tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (const form of forms) { - tmSpeciesStr += ` '${form}',\n`; - } - tmSpeciesStr += " ],\n"; - } - } - } - tmSpeciesStr += " ],\n"; - } - - tmSpeciesStr += "\n};"; - - console.log(tmSpeciesStr); -} From 208f5af62a44fe0881641f63e6108b66911ff080 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 30 Jul 2024 22:05:54 +0800 Subject: [PATCH 077/321] [Move] Implement Flame Burst (after beta fix) (#3239) * add integration tests * account for magic guard * update test name * remove test code * fix magic guard interaction * set 1 as min damage * fix tests * only apply magic guard attr if ally is active * nit: remove new line * update docs * add the move attr --- src/data/move.ts | 35 ++++++++- src/test/moves/flame_burst.test.ts | 118 +++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 src/test/moves/flame_burst.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 7bb4d19770a..fdf2efcd13f 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1435,6 +1435,39 @@ export class PartyStatusCureAttr extends MoveEffectAttr { } } +/** + * Applies damage to the target's ally equal to 1/16 of that ally's max HP. + * @extends MoveEffectAttr + */ +export class FlameBurstAttr extends MoveEffectAttr { + /** + * @param user - n/a + * @param target - The target Pokémon. + * @param move - n/a + * @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 { + const targetAlly = target.getAlly(); + const cancelled = new Utils.BooleanHolder(false); + + if (targetAlly) { + applyAbAttrs(BlockNonDirectDamageAbAttr, targetAlly, cancelled); + } + + if (cancelled.value || !targetAlly) { + return false; + } + + targetAlly.damageAndUpdate(Math.max(1, Math.floor(1/16 * targetAlly.getMaxHp())), HitResult.OTHER); + return true; + } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + return target.getAlly() ? -5 : 0; + } +} + export class SacrificialFullRestoreAttr extends SacrificialAttr { constructor() { super(); @@ -7292,7 +7325,7 @@ export function initMoves() { new AttackMove(Moves.STORM_THROW, Type.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) - .partial(), + .attr(FlameBurstAttr), new AttackMove(Moves.SLUDGE_WAVE, Type.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) .attr(StatusEffectAttr, StatusEffect.POISON) .target(MoveTarget.ALL_NEAR_OTHERS), diff --git a/src/test/moves/flame_burst.test.ts b/src/test/moves/flame_burst.test.ts new file mode 100644 index 00000000000..69d11c79f93 --- /dev/null +++ b/src/test/moves/flame_burst.test.ts @@ -0,0 +1,118 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + SelectTargetPhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities.js"; +import { allAbilities } from "#app/data/ability.js"; +import Pokemon from "#app/field/pokemon.js"; + +describe("Moves - Flame Burst", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + /** + * Calculates the effect damage of Flame Burst which is 1/16 of the target ally's max HP + * See Flame Burst {@link https://bulbapedia.bulbagarden.net/wiki/Flame_Burst_(move)} + * See Flame Burst's move attribute {@linkcode FlameBurstAttr} + * @param pokemon {@linkcode Pokemon} - The ally of the move's target + * @returns Effect damage of Flame Burst + */ + const getEffectDamage = (pokemon: Pokemon): number => { + return Math.max(1, Math.floor(pokemon.getMaxHp() * 1/16)); + }; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLAME_BURST, Moves.SPLASH]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(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(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp() - getEffectDamage(rightEnemy)); + }); + + it("does not inflict damage to the target's ally if the target was not affected by Flame Burst", async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FLASH_FIRE); + + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBe(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp()); + }); + + it("does not interact with the target ally's abilities", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + + vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.FLASH_FIRE]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp() - getEffectDamage(rightEnemy)); + }); + + it("effect damage is prevented by Magic Guard", async () => { + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + + vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.MAGIC_GUARD]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAME_BURST)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(leftEnemy.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leftEnemy.hp).toBeLessThan(leftEnemy.getMaxHp()); + 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 }); +}); From 5b4a24824fe0fdc2c5c9447259e59da76bb0767b Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 30 Jul 2024 22:06:31 +0800 Subject: [PATCH 078/321] [Ability] Fully implement Pastel Veil, update Sweet Veil (after beta fix) (#3208) * ful implement pastel veil, update sweet veil * improve docs * update docs * cleanup attrs --- src/data/ability.ts | 101 +++++++++++++++++++++-- src/field/pokemon.ts | 17 +++- src/test/abilities/pastel_veil.test.ts | 79 ++++++++++++++++++ src/test/abilities/sweet_veil.test.ts | 108 +++++++++++++++++++++++++ 4 files changed, 297 insertions(+), 8 deletions(-) create mode 100644 src/test/abilities/pastel_veil.test.ts create mode 100644 src/test/abilities/sweet_veil.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index fe3a0e9478f..8f01e98e2be 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,4 +1,4 @@ -import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; +import Pokemon, { HitResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { Type } from "./type"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -2147,6 +2147,49 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { } } +/** + * Removes supplied status effects from the user's field. + */ +export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAttr { + private statusEffect: StatusEffect[]; + + /** + * @param statusEffect - The status effects to be removed from the user's field. + */ + constructor(...statusEffect: StatusEffect[]) { + super(false); + + this.statusEffect = statusEffect; + } + + /** + * 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 or a promise that resolves to a boolean indicating the result of the ability application. + */ + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + const party = pokemon instanceof PlayerPokemon ? pokemon.scene.getPlayerField() : pokemon.scene.getEnemyField(); + const allowedParty = party.filter(p => p.isAllowedInBattle()); + + if (allowedParty.length < 1) { + return false; + } + + for (const pokemon of allowedParty) { + if (this.statusEffect.includes(pokemon.status?.effect)) { + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + pokemon.resetStatus(false); + pokemon.updateInfo(); + } + } + + return true; + } +} + /** Attempt to copy the stat changes on an ally pokemon */ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { @@ -2398,17 +2441,33 @@ export class PreSetStatusAbAttr extends AbAttr { } } -export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { +/** + * Provides immunity to status effects to specified targets. + */ +export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { private immuneEffects: StatusEffect[]; + /** + * @param immuneEffects - The status effects to which the Pokémon is immune. + */ constructor(...immuneEffects: StatusEffect[]) { super(); this.immuneEffects = immuneEffects; } + /** + * Applies immunity to supplied status effects. + * + * @param pokemon - The Pokémon to which the status is being applied. + * @param passive - n/a + * @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, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.immuneEffects.length || this.immuneEffects.indexOf(effect) > -1) { + if (this.immuneEffects.length < 1 || this.immuneEffects.includes(effect)) { cancelled.value = true; return true; } @@ -2430,13 +2489,28 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } } +/** + * Provides immunity to status effects to the user. + * @extends PreSetStatusEffectImmunityAbAttr + */ +export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } + +/** + * Provides immunity to status effects to the user's field. + * @extends PreSetStatusEffectImmunityAbAttr + */ +export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } + export class PreApplyBattlerTagAbAttr extends AbAttr { applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; } } -export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to specified targets. + */ +export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { private immuneTagType: BattlerTagType; constructor(immuneTagType: BattlerTagType) { @@ -2463,6 +2537,18 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { } } +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to the user. + * @extends PreApplyBattlerTagImmunityAbAttr + */ +export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } + +/** + * Provides immunity to BattlerTags {@linkcode BattlerTag} to the user's field. + * @extends PreApplyBattlerTagImmunityAbAttr + */ +export class UserFieldBattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } + export class BlockCritAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; @@ -4722,10 +4808,10 @@ export function initAbilities() { new Ability(Abilities.REFRIGERATE, 6) .attr(MoveTypeChangeAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL), new Ability(Abilities.SWEET_VEIL, 6) - .attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP) + .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .ignorable() - .partial(), + .partial(), // Mold Breaker ally should not be affected by Sweet Veil new Ability(Abilities.STANCE_CHANGE, 6) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) @@ -5020,7 +5106,8 @@ export function initAbilities() { .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .partial(), new Ability(Abilities.PASTEL_VEIL, 8) - .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) + .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) + .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), new Ability(Abilities.HUNGER_SWITCH, 8) .attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 0 : 1) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 9b586d235c6..b4c6598efb5 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -23,7 +23,7 @@ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoo import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, WeakenMoveScreenTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr } from "../data/ability"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -1779,6 +1779,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return (this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.getFieldIndex() ? 0 : 1]; } + /** + * Gets the Pokémon on the allied field. + * + * @returns An array of Pokémon on the allied field. + */ + getAlliedField(): Pokemon[] { + return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); + } + /** * Calculates the accuracy multiplier of the user against a target. * @@ -2236,6 +2245,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const cancelled = new Utils.BooleanHolder(false); applyPreApplyBattlerTagAbAttrs(PreApplyBattlerTagAbAttr, this, newTag, cancelled); + const userField = this.getAlliedField(); + userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, newTag, cancelled)); + if (!cancelled.value && newTag.canAdd(this)) { this.summonData.tags.push(newTag); newTag.onAdd(this); @@ -2644,6 +2656,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const cancelled = new Utils.BooleanHolder(false); applyPreSetStatusAbAttrs(StatusEffectImmunityAbAttr, this, effect, cancelled, quiet); + const userField = this.getAlliedField(); + userField.forEach(pokemon => applyPreSetStatusAbAttrs(UserFieldStatusEffectImmunityAbAttr, pokemon, effect, cancelled, quiet)); + if (cancelled.value) { return false; } diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts new file mode 100644 index 00000000000..f19b395677f --- /dev/null +++ b/src/test/abilities/pastel_veil.test.ts @@ -0,0 +1,79 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { StatusEffect } from "#app/data/status-effect.js"; +import { allAbilities } from "#app/data/ability.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; + +describe("Abilities - Pastel Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD]); + }); + + it("prevents the user and its allies from being afflicted by poison", async () => { + await game.startBattle([Species.GALAR_PONYTA, Species.MAGIKARP]); + const ponyta = game.scene.getPlayerField()[0]; + + vi.spyOn(ponyta, "getAbility").mockReturnValue(allAbilities[Abilities.PASTEL_VEIL]); + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.GALAR_PONYTA]); + const ponyta = game.scene.getParty().find(p => p.species.speciesId === Species.GALAR_PONYTA); + + vi.spyOn(ponyta, "getAbility").mockReturnValue(allAbilities[Abilities.PASTEL_VEIL]); + + expect(ponyta.hasAbility(Abilities.PASTEL_VEIL)).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getPlayerField().some(p => p.status?.effect === StatusEffect.POISON)).toBe(true); + + const poisonedMon = game.scene.getPlayerField().find(p => p.status?.effect === StatusEffect.POISON); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, (poisonedMon.getBattlerIndex() as BattlerIndex.PLAYER | BattlerIndex.PLAYER_2), Moves.SPLASH)); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); +}); diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts new file mode 100644 index 00000000000..5a8022958ad --- /dev/null +++ b/src/test/abilities/sweet_veil.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + MoveEffectPhase, + MovePhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; + +describe("Abilities - Sweet Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.REST]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([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]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("causes Rest to fail when used by the user or its allies", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.REST)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); + + it("causes Yawn to fail if used on the user or its allies", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerField().every(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(false); + }); + + it("prevents the user and its allies already drowsy due to Yawn from falling asleep.", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIKACHU); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + // First pokemon move + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(true); + + // Second pokemon move + await game.phaseInterceptor.to(MovePhase, false); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(true); + + expect(game.scene.getPlayerField().some(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(true); + + await game.phaseInterceptor.to(TurnEndPhase); + + const drowsyMon = game.scene.getPlayerField().find(p => !!p.getTag(BattlerTagType.DROWSY)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, (drowsyMon.getBattlerIndex() as BattlerIndex.PLAYER | BattlerIndex.PLAYER_2), Moves.SPLASH)); + game.doSwitchPokemon(2); + + expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + }); +}); From 0b9d9b563833a7408a6038db8b75eb9005864c38 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Tue, 30 Jul 2024 07:09:09 -0700 Subject: [PATCH 079/321] [Bug] Update vite-minify-json-plugin.ts (#3238) Fix minify Jain plugin running in vite serve mode --- src/plugins/vite/vite-minify-json-plugin.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/vite/vite-minify-json-plugin.ts b/src/plugins/vite/vite-minify-json-plugin.ts index 9a0da184e1e..57130669075 100644 --- a/src/plugins/vite/vite-minify-json-plugin.ts +++ b/src/plugins/vite/vite-minify-json-plugin.ts @@ -35,6 +35,7 @@ export function minifyJsonPlugin(basePath: string | string[], recursive?: boolea return { name: "flx-minify-json", + apply: "build", configResolved(config) { buildDir = config.build.outDir; // Read the build output directory from Vite config }, From d6a01155c5cd09ea228d50cfcfa86be184f72644 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Tue, 30 Jul 2024 16:12:51 +0200 Subject: [PATCH 080/321] [Localization] Update French bypassSpeedChanceApply (#3243) --- src/locales/fr/modifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts index 4047aa078ec..368b186a07b 100644 --- a/src/locales/fr/modifier.ts +++ b/src/locales/fr/modifier.ts @@ -10,5 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaure un peu ses PV !", - "bypassSpeedChanceApply": "{{itemName}} {{pokemonName}} lui permettent d’agir plus vite que d’habitude !", + "bypassSpeedChanceApply": "{{itemName}} de {{pokemonName}}\nlui permet d’agir plus vite que d’habitude !", } as const; From 07b1cf8382b5877a9a979d8c1dd30ff9ef2c6d82 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 30 Jul 2024 23:17:00 +0900 Subject: [PATCH 081/321] [QoL] Update shiny icons in the starter select filter (#3246) --- src/ui/starter-select-ui-handler.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a20b04a825d..813766ddfe8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -347,11 +347,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterBar.defaultTypeVals = this.filterBar.getVals(DropDownColumn.TYPES); // Unlocks filter - const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny1Sprite.setOrigin(0.15, 0.2); + shiny1Sprite.setScale(0.6); + shiny1Sprite.setFrame(getVariantIcon(0)); shiny1Sprite.setTint(getVariantTint(0)); - const shiny2Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + const shiny2Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny2Sprite.setOrigin(0.15, 0.2); + shiny2Sprite.setScale(0.6); + shiny2Sprite.setFrame(getVariantIcon(1)); shiny2Sprite.setTint(getVariantTint(1)); - const shiny3Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + const shiny3Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + shiny3Sprite.setOrigin(0.15, 0.2); + shiny3Sprite.setScale(0.6); + shiny3Sprite.setFrame(getVariantIcon(2)); shiny3Sprite.setTint(getVariantTint(2)); const unlocksOptions = [ From f7459f24b0ee03ff2aeb09f5ff0587356b7003a4 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:02:12 -0400 Subject: [PATCH 082/321] [Localization] Add more Italian translations (#3250) --- src/locales/it/achv.ts | 10 +++++----- src/locales/it/battle-info.ts | 2 +- src/locales/it/battle.ts | 20 ++++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/locales/it/achv.ts b/src/locales/it/achv.ts index 0ec9ad3f98a..50baae41790 100644 --- a/src/locales/it/achv.ts +++ b/src/locales/it/achv.ts @@ -10,7 +10,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "MoneyAchv": { - description: "Accumula ₽{{moneyAmount}} PokéDollari", + description: "Accumula {{moneyAmount}} PokéDollari", }, "10K_MONEY": { name: "Benestante", @@ -191,19 +191,19 @@ export const PGMachv: AchievementTranslationEntries = { description: "Completa la modalità sfida di quinta generazione.", }, "MONO_GEN_SIX": { - name: "Quasi Reali", + name: "Vita e Morte", description: "Completa la modalità sfida di sesta generazione.", }, "MONO_GEN_SEVEN": { - name: "Solo In Teoria", + name: "Troppo amichevoli?", description: "Completa la modalità sfida di settima generazione.", }, "MONO_GEN_EIGHT": { - name: "È Champion-time!", + name: "It's champion time!", description: "Completa la modalità sfida di ottava generazione.", }, "MONO_GEN_NINE": { - name: "Non si Stava Impegnando...", + name: "Paradossalmente sbalorditivi", description: "Completa la modalità sfida di nona generazione.", }, diff --git a/src/locales/it/battle-info.ts b/src/locales/it/battle-info.ts index 195ad0616e0..00f72e60f6c 100644 --- a/src/locales/it/battle-info.ts +++ b/src/locales/it/battle-info.ts @@ -1,5 +1,5 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleInfo: SimpleTranslationEntries = { - "generation": "Generazione {{generation}}", + "generation": "{{generation}} generazione", } as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index d728e624ae3..954f52e4a7f 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -14,9 +14,9 @@ export const battle: SimpleTranslationEntries = { "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", "moneyWon": "Hai vinto {{moneyAmount}}₽", - "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", + "moneyPickedUp": "Hai raccolto ₽{{moneyAmount}}!", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", - "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", + "addedAsAStarter": "{{pokemonName}} è stato\naggiunto agli starter!", "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", @@ -28,7 +28,7 @@ export const battle: SimpleTranslationEntries = { "attackFailed": "Ma ha fallito!", "attackMissed": "{{pokemonNameWithAffix}}\nevita l’attacco!", "attackHitsCount": "Colpito {{count}} volta/e!", - "rewardGain": "You received\n{{modifierName}}!", + "rewardGain": "Ricevi\n{{modifierName}}!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", @@ -71,8 +71,8 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", - "statsAnd": "and", - "stats": "Stats", + "statsAnd": "e", + "stats": "statistiche", "statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", "statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", @@ -89,7 +89,7 @@ export const battle: SimpleTranslationEntries = { "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", - "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "transformedIntoType": "{{pokemonName}} diventa\ndi tipo {{type}} type!", "retryBattle": "Vuoi riprovare dall'inizio della lotta?", "unlockedSomething": "{{unlockedThing}}\nè stato/a sbloccato/a.", "congratulations": "Congratulazioni!", @@ -141,19 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", "battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", - "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} è al centro\ndell’attenzione!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!", "battlerTagsHighestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!", "battlerTagsHighestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!", - "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", - "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} si solleva in aria\na causa dell’elettromagnetismo!", + "battlerTagsMagnetRisenOnRemove": "L’effetto dell’elettromagnetismo di {{pokemonNameWithAffix}}\nè terminato!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", - "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!" } as const; From cce68f6ef706500bfb5c776a37f40bf9503c4639 Mon Sep 17 00:00:00 2001 From: allen925 <62000482+allen925@users.noreply.github.com> Date: Tue, 30 Jul 2024 08:40:25 -0700 Subject: [PATCH 083/321] [Bug] Fix sprite problem after player pokemon faint after enemy pokemon before/after trainer fight (#3211) --- src/battle-scene.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0ac3f9c6245..0855a86bffa 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1140,7 +1140,7 @@ export default class BattleScene extends SceneBase { } if (resetArenaState) { this.arena.resetArenaEffects(); - playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); + playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { // Only trigger form change when Eiscue is in Noice form @@ -1153,7 +1153,7 @@ export default class BattleScene extends SceneBase { applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - this.unshiftPhase(new ShowTrainerPhase(this)); + this.pushPhase(new ShowTrainerPhase(this)); } for (const pokemon of this.getParty()) { From 0ad4986fa5be633f524833e4c02108f49ea797c8 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Wed, 31 Jul 2024 01:13:17 +0900 Subject: [PATCH 084/321] [Enhancement] improve `passive` and `win` filters by applying new Tri-state toggle dropdown in the starter select UI (#3252) * split unlocks filter into shiny and passive * update tri state dropdown. apply it to passive and win dropdown --- src/ui/dropdown.ts | 119 ++++++++++++++++++++++------ src/ui/filter-bar.ts | 38 +++++---- src/ui/starter-select-ui-handler.ts | 64 +++++++++------ 3 files changed, 158 insertions(+), 63 deletions(-) diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 15830773b98..4f330de0588 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -6,12 +6,15 @@ import i18next from "i18next"; export enum DropDownState { ON = 0, - OFF + OFF = 1, + INCLUDE = 2, + EXCLUDE = 3, } export enum DropDownType { MULTI = 0, - SINGLE + SINGLE = 1, + TRI = 2 } export enum SortDirection { @@ -26,11 +29,30 @@ export class DropDownOption extends Phaser.GameObjects.Container { public sprite?: Phaser.GameObjects.Sprite; public val: any; public dir: SortDirection = SortDirection.ASC; + public offStateLabel: string; // label for OFF state in TRI dropdown + public includeStateLabel: string; // label for INCLUDE state in TRI dropdown + public excludeStateLabel: string; // label for EXCLUDE state in TRI dropdown + private onColor = 0x55ff55; + private offColor = 0x272727; + private includeColor = 0x55ff55; + private excludeColor = 0xff5555; - constructor(scene: SceneBase, val: any, text: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + + constructor(scene: SceneBase, val: any, text: string | string[], sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { super(scene); this.val = val; + this.state = state; if (text) { + if (Array.isArray(text)) { + this.offStateLabel = text[0]; + this.includeStateLabel = text[1]; + this.excludeStateLabel = text[2]; + text = text[0]; + } else { + this.offStateLabel = undefined; + this.includeStateLabel = undefined; + this.excludeStateLabel = undefined; + } this.text = addTextObject(scene, 0, 0, text, TextStyle.TOOLTIP_CONTENT); this.text.setOrigin(0, 0.5); this.add(this.text); @@ -40,11 +62,10 @@ export class DropDownOption extends Phaser.GameObjects.Container { this.sprite = sprite.setOrigin(0, 0.5); this.add(this.sprite); } - this.state = state; } public setupToggle(type: DropDownType): void { - if (type === DropDownType.MULTI) { + if (type === DropDownType.MULTI || type === DropDownType.TRI) { this.toggle = this.scene.add.sprite(0, 0, "candy"); this.toggle.setScale(0.3); this.toggle.setOrigin(0, 0.5); @@ -57,18 +78,54 @@ export class DropDownOption extends Phaser.GameObjects.Container { this.add(this.toggle); } - public setOptionState(state: DropDownState): DropDownState { - this.state = state % 2; - if (this.state === DropDownState.OFF) { - this.toggle.setTint(0x272727); - } else { - this.toggle.setTint(0x55ff55); + public setOptionState(type: DropDownType, state: DropDownState): DropDownState { + this.state = state; + // if type is MULTI or SINGLE, set the color of the toggle based on the state + if (type === DropDownType.MULTI || type === DropDownType.SINGLE) { + if (this.state === DropDownState.OFF) { + this.toggle.setTint(this.offColor); + } else if (this.state === DropDownState.ON) { + this.toggle.setTint(this.onColor); + } + } else if (type === DropDownType.TRI) { + if (this.state === DropDownState.OFF) { + this.text.setText(this.offStateLabel); + this.toggle.setTint(this.offColor); + } else if (this.state === DropDownState.INCLUDE) { + this.text.setText(this.includeStateLabel); + this.toggle.setTint(this.includeColor); + } else if (this.state === DropDownState.EXCLUDE) { + this.text.setText(this.excludeStateLabel); + this.toggle.setTint(this.excludeColor); + } } return this.state; } - public toggleOptionState(): DropDownState { - return this.setOptionState(this.state + 1); + public toggleOptionState(type: DropDownType): DropDownState { + if (type === DropDownType.TRI) { + switch (this.state) { + case DropDownState.OFF: + this.state = DropDownState.INCLUDE; + break; + case DropDownState.INCLUDE: + this.state = DropDownState.EXCLUDE; + break; + case DropDownState.EXCLUDE: + this.state = DropDownState.OFF; + break; + } + } else { + switch (this.state) { + case DropDownState.ON: + this.state = DropDownState.OFF; + break; + case DropDownState.OFF: + this.state = DropDownState.ON; + break; + } + } + return this.setOptionState(type, this.state); } public setDirection(dir: SortDirection): void { @@ -117,7 +174,7 @@ export class DropDown extends Phaser.GameObjects.Container { if (type === DropDownType.SINGLE && option.state === DropDownState.OFF) { option.toggle.setVisible(false); } - option.setOptionState(option.state); + option.setOptionState(type, option.state); option.width = optionWidth; option.y = index * optionHeight + index * optionSpacing + optionPaddingY; @@ -130,8 +187,13 @@ export class DropDown extends Phaser.GameObjects.Container { option.sprite.x = cursorOffset + optionPaddingX + 3 + 8; option.sprite.y = optionHeight / 2; } - option.toggle.x = cursorOffset + optionPaddingX + 3 + (type === DropDownType.MULTI ? 0 : 3); - option.toggle.y = optionHeight / 2 + (type === DropDownType.MULTI ? 0 : 1); + if (type === DropDownType.SINGLE) { + option.toggle.x = cursorOffset + optionPaddingX + 3 + 3; + option.toggle.y = optionHeight / 2 + 1; + } else { + option.toggle.x = cursorOffset + optionPaddingX + 3; + option.toggle.y = optionHeight / 2; + } }); this.window = addWindow(scene, 0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, null, null, WindowVariant.XTHIN); this.add(this.window); @@ -164,37 +226,39 @@ export class DropDown extends Phaser.GameObjects.Container { toggleOptionState(): void { if (this.dropDownType === DropDownType.MULTI) { - const newState = this.options[this.cursor].toggleOptionState(); - + const newState = this.options[this.cursor].toggleOptionState(this.dropDownType); if (this.cursor === 0) { this.options.forEach((option, index) => { if (index !== this.cursor) { - option.setOptionState(newState); + option.setOptionState(this.dropDownType, newState); } }); } else { if (this.checkForAllOff()) { - this.options[0].setOptionState(DropDownState.OFF); + this.options[0].setOptionState(this.dropDownType, DropDownState.OFF); } else if (this.checkForAllOn()) { - this.options[0].setOptionState(DropDownState.ON); + this.options[0].setOptionState(this.dropDownType, DropDownState.ON); } else { - this.options[0].setOptionState(DropDownState.OFF); + this.options[0].setOptionState(this.dropDownType, DropDownState.OFF); } } - } else { + } else if (this.dropDownType === DropDownType.SINGLE) { if (this.options[this.cursor].state === DropDownState.OFF) { this.options.forEach((option) => { - option.setOptionState(DropDownState.OFF); + option.setOptionState(this.dropDownType, DropDownState.OFF); option.setDirection(SortDirection.ASC); option.toggle.setVisible(false); }); - this.options[this.cursor].setOptionState(DropDownState.ON); + this.options[this.cursor].setOptionState(this.dropDownType, DropDownState.ON); this.options[this.cursor].setDirection(this.lastDir); this.options[this.cursor].toggle.setVisible(true); } else { this.options[this.cursor].toggleDirection(); this.lastDir = this.options[this.cursor].dir; } + } else if (this.dropDownType === DropDownType.TRI) { + this.options[this.cursor].toggleOptionState(this.dropDownType); + this.autoSize(); } this.onChange(); } @@ -220,6 +284,11 @@ 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); + // in TRI dropdown, if state is ON, return the "ON" with the value, if state is OFF, return the "OFF" with the value, if state is TRI, return the "TRI" with the value + } else if (this.dropDownType === DropDownType.TRI) { + return this.options.filter((option, i) => option.state === DropDownState.OFF || option.state === DropDownState.INCLUDE || option.state === DropDownState.EXCLUDE).map((option) => { + return {val: option.val, state: option.state}; + }); } else { return this.options.filter((option, i) => option.state === DropDownState.ON).map((option) => { return {val: option.val, dir: option.dir}; diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index cc4723799d5..fd661901c78 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -7,8 +7,9 @@ import { addWindow, WindowVariant } from "./ui-theme"; export enum DropDownColumn { GEN, TYPES, + SHINY, UNLOCKS, - WIN, + MISC, SORT } @@ -22,8 +23,9 @@ export class FilterBar extends Phaser.GameObjects.Container { private lastCursor: number = -1; public defaultGenVals: any[] = []; public defaultTypeVals: any[] = []; - public defaultUnlockVals: any[] = []; - public defaultWinVals: any[] = []; + public defaultShinyVals: any[] = []; + public defaultUnlocksVals: any[] = []; + public defaultMiscVals: any[] = []; public defaultSortVals: any[] = []; constructor(scene: BattleScene, x: number, y: number, width: number, height: number) { @@ -57,43 +59,51 @@ export class FilterBar extends Phaser.GameObjects.Container { updateFilterLabels(): void { const genVals = this.getVals(DropDownColumn.GEN); const typeVals = this.getVals(DropDownColumn.TYPES); - const unlockVals = this.getVals(DropDownColumn.UNLOCKS); - const winVals = this.getVals(DropDownColumn.WIN); + const shinyVals = this.getVals(DropDownColumn.SHINY); + const unlocksVals = this.getVals(DropDownColumn.UNLOCKS); + const miscVals = this.getVals(DropDownColumn.MISC); const sortVals = this.getVals(DropDownColumn.SORT); // onColor is Yellow, offColor is White const onColor = 0xffef5c; const offColor = 0xffffff; - // if genVals and defaultGenVals has same elements, set the label to White else set it to Green + // if genVals and defaultGenVals has same elements, set the label to offColor else set it to onColor if (genVals.length === this.defaultGenVals.length && genVals.every((value, index) => value === this.defaultGenVals[index])) { this.labels[DropDownColumn.GEN].setTint(offColor); } else { this.labels[DropDownColumn.GEN].setTint(onColor); } - // if typeVals and defaultTypeVals has same elements, set the label to White else set it to Green + // if typeVals and defaultTypeVals has same elements, set the label to offColor else set it to onColor if (typeVals.length === this.defaultTypeVals.length && typeVals.every((value, index) => value === this.defaultTypeVals[index])) { this.labels[DropDownColumn.TYPES].setTint(offColor); } else { this.labels[DropDownColumn.TYPES].setTint(onColor); } - // if unlockVals and defaultUnlockVals has same elements, set the label to White else set it to Green - if (unlockVals.length === this.defaultUnlockVals.length && unlockVals.every((value, index) => value === this.defaultUnlockVals[index])) { + // if shinyVals and defaultShinyVals has same elements, set the label to offColor else set it to onColor + if (shinyVals.length === this.defaultShinyVals.length && shinyVals.every((value, index) => value === this.defaultShinyVals[index])) { + this.labels[DropDownColumn.SHINY].setTint(offColor); + } else { + this.labels[DropDownColumn.SHINY].setTint(onColor); + } + + // if unlocksVals and defaultUnlocksVals has same elements, set the label to offColor else set it to onColor + if (unlocksVals.every((value, index) => value["val"] === this.defaultUnlocksVals[index]["val"] && value["state"] === this.defaultUnlocksVals[index]["state"])) { this.labels[DropDownColumn.UNLOCKS].setTint(offColor); } else { this.labels[DropDownColumn.UNLOCKS].setTint(onColor); } - // if winVals and defaultWinVals has same elements, set the label to White else set it to Green - if (winVals.length === this.defaultWinVals.length && winVals.every((value, index) => value === this.defaultWinVals[index])) { - this.labels[DropDownColumn.WIN].setTint(offColor); + // if miscVals and defaultMiscVals has same elements, set the label to offColor else set it to onColor + if (miscVals.every((value, index) => value["val"] === this.defaultMiscVals[index]["val"] && value["state"] === this.defaultMiscVals[index]["state"])) { + this.labels[DropDownColumn.MISC].setTint(offColor); } else { - this.labels[DropDownColumn.WIN].setTint(onColor); + this.labels[DropDownColumn.MISC].setTint(onColor); } - // if sortVals and defaultSortVals has same value and dir, set the label to White else set it to Green + // if sortVals and defaultSortVals has same value and dir, set the label to offColor else set it to onColor if (sortVals[0]["dir"] === this.defaultSortVals[0]["dir"] && sortVals[0]["val"] === this.defaultSortVals[0]["val"]) { this.labels[DropDownColumn.SORT].setTint(offColor); } else { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 813766ddfe8..5d7e030ad86 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -327,7 +327,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // set gen filter to all off except for the I GEN for (const option of genOptions) { if (option.val !== 1) { - option.setOptionState(DropDownState.OFF); + option.setOptionState(DropDownType.MULTI ,DropDownState.OFF); } } @@ -346,7 +346,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterBar.addFilter(i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.MULTI, 0.5)); this.filterBar.defaultTypeVals = this.filterBar.getVals(DropDownColumn.TYPES); - // Unlocks filter + // shiny filter const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); shiny1Sprite.setOrigin(0.15, 0.2); shiny1Sprite.setScale(0.6); @@ -363,24 +363,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { shiny3Sprite.setFrame(getVariantIcon(2)); shiny3Sprite.setTint(getVariantTint(2)); - const unlocksOptions = [ + const shinyOptions = [ new DropDownOption(this.scene, "SHINY3", null, shiny3Sprite), new DropDownOption(this.scene, "SHINY2", null, shiny2Sprite), new DropDownOption(this.scene, "SHINY", null, shiny1Sprite), new DropDownOption(this.scene, "NORMAL", i18next.t("filterBar:normal")), new DropDownOption(this.scene, "UNCAUGHT", i18next.t("filterBar:uncaught")), - new DropDownOption(this.scene, "PASSIVEUNLOCKED", i18next.t("filterBar:passiveUnlocked")), - new DropDownOption(this.scene, "PASSIVELOCKED", i18next.t("filterBar:passiveLocked"))]; + ]; - this.filterBar.addFilter(i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.MULTI)); - this.filterBar.defaultUnlockVals = this.filterBar.getVals(DropDownColumn.UNLOCKS); + this.filterBar.addFilter("Owned", new DropDown(this.scene, 0, 0, shinyOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.defaultShinyVals = this.filterBar.getVals(DropDownColumn.SHINY); - // win filter - const winOptions = [ - new DropDownOption(this.scene, "WIN", i18next.t("filterBar:hasWon")), - new DropDownOption(this.scene, "NOTWIN", i18next.t("filterBar:hasNotWon"))]; - this.filterBar.addFilter(i18next.t("filterBar:winFilter"), new DropDown(this.scene, 0, 0, winOptions, this.updateStarters, DropDownType.MULTI)); - this.filterBar.defaultWinVals = this.filterBar.getVals(DropDownColumn.WIN); + + // unlocks filter + const unlocksOptions = [ + new DropDownOption(this.scene, "PASSIVE", ["Passive", i18next.t("filterBar:passiveUnlocked"), i18next.t("filterBar:passiveLocked")], null, DropDownState.OFF), + ]; + + this.filterBar.addFilter(i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.TRI)); + this.filterBar.defaultUnlocksVals = this.filterBar.getVals(DropDownColumn.UNLOCKS); + + // misc filter + const miscOptions = [ + new DropDownOption(this.scene, "WIN", ["Win", "Win - Yes", "Win - No"], null, DropDownState.OFF), + ]; + this.filterBar.addFilter("Misc", new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.TRI)); + this.filterBar.defaultMiscVals = this.filterBar.getVals(DropDownColumn.MISC); // sort filter const sortOptions = [ @@ -1956,11 +1964,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isCaught = !!(caughtVariants & DexAttr.NON_SHINY); const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0; - + const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; + const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; + const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); - const fitsShiny = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(variant => { + + const fitsShiny = this.filterBar.getVals(DropDownColumn.SHINY).some(variant => { if (variant === "SHINY3") { return isVariant3Caught; } else if (variant === "SHINY2") { @@ -1973,22 +1985,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return isUncaught; } }); - const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(variant => { - if (variant === "PASSIVEUNLOCKED") { + + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.INCLUDE) { return isPassiveUnlocked; - } else if (variant === "PASSIVELOCKED") { + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { return !isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + return true; } }); - const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; - const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; - const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; - const fitsWin = this.filterBar.getVals(DropDownColumn.WIN).some(win => { - if (win === "WIN") { + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (container.species.speciesId < 10) { + } + if (misc.val === "WIN" && misc.state === DropDownState.INCLUDE) { return isWin; - } else if (win === "NOTWIN") { + } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { return isNotWin || isUndefined; + } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + return true; } }); From ebbdc334e93cdcbc3b7b651c67bf98bd0d71066b Mon Sep 17 00:00:00 2001 From: Mumble Date: Tue, 30 Jul 2024 09:16:04 -0700 Subject: [PATCH 085/321] [Tests] Test for Ability Magic Guard (#3253) * Drafted testable conditions for Magic Guard * Weather Test * Update src/test/abilities/magic_guard.test.ts InnerThunder Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Implemented checks for poison/toxic/burn * Added tests for recoil moves and volatile status * Added tests for entry hazards * Moved overrides to top * Gave player Pokemon the passive Unnerve to prevent random berry interference * Added tests for ability interactions * Added reference link --------- Co-authored-by: Frutescens Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> --- src/test/abilities/magic_guard.test.ts | 509 +++++++++++++++++++++++++ 1 file changed, 509 insertions(+) create mode 100644 src/test/abilities/magic_guard.test.ts diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts new file mode 100644 index 00000000000..60a3cda3b08 --- /dev/null +++ b/src/test/abilities/magic_guard.test.ts @@ -0,0 +1,509 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { TurnEndPhase, MoveEffectPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { WeatherType } from "#app/data/weather.js"; +import { StatusEffect, getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { BattlerTagType } from "#enums/battler-tag-type"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout + +describe("Abilities - Magic Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + /** Player Pokemon overrides */ + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + /** Enemy Pokemon overrides */ + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) + + it( + "ability should prevent damage caused by weather", + async () => { + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + 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()); + }, TIMEOUT + ); + + 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 + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + 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); + }, TIMEOUT + ); + + it( + "ability effect should not persist when the ability is replaced", + async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED]); + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + 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()); + }, TIMEOUT + ); + + + it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", + async () => { + vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.BURN); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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); + }, TIMEOUT + ); + + it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", + async () => { + vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.TOXIC); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const toxicStartCounter = enemyPokemon.status.turnCount; + //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.turnCount).toBeGreaterThan(toxicStartCounter); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status.effect)).toBe(1.5); + }, TIMEOUT + ); + + + 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]); + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard does not prevent poison from Toxic Spikes", async () => { + //Adds and applies Spikes to both sides of the arena + const playerTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.PLAYER); + const enemyTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.ENEMY); + game.scene.arena.tags.push(playerTag); + game.scene.arena.tags.push(enemyTag); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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(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()); + }, TIMEOUT + ); + + it("Magic Guard prevents against damage from volatile status effects", + async () => { + await game.startBattle([Species.DUSKULL]); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect (leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CURSE)); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + 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()); + }, TIMEOUT + ); + + it("Magic Guard prevents crash damage", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HIGH_JUMP_KICK]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HIGH_JUMP_KICK)); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValueOnce(false); + + 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(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from recoil", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAKE_DOWN]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAKE_DOWN)); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard does not prevent damage from Struggle's recoil", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STRUGGLE)); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + //This tests different move attributes than the recoil tests above + it("Magic Guard prevents self-damage from attacking moves", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEEL_BEAM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STEEL_BEAM)); + + 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(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + /* + it("Magic Guard does not prevent self-damage from confusion", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + await game.phaseInterceptor.to(TurnEndPhase); + }); +*/ + + it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BELLY_DRUM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + + 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(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async() => { + //Tests the ability Bad Dreams + vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + //enemy pokemon is given Spore just in case player pokemon somehow awakens during test + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BAD_DREAMS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + 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(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.status.effect).toBe(StatusEffect.SLEEP); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async() => { + //Tests the abilities Innards Out/Aftermath + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AFTERMATH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + enemyPokemon.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + 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(enemyPokemon.hp).toBe(0); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async() => { + //Tests the abilities Iron Barbs/Rough Skin + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.IRON_BARBS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + 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(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async() => { + //Tests the ability Liquid Ooze + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIQUID_OOZE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ABSORB)); + 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(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); + + it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async() => { + //Tests the abilities Solar Power/Dry Skin + vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SOLAR_POWER); + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SUNNY); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }, TIMEOUT + ); +}); From d3dba2ebe2428f2a337f4840520b3e9ddd33c440 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Tue, 30 Jul 2024 09:33:13 -0700 Subject: [PATCH 086/321] [Bug] Fix blinds animation (#3254) so the blinds animation is not broken when using Save & Quit --- src/battle-scene.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0855a86bffa..93b05a39ecb 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -387,7 +387,6 @@ export default class BattleScene extends SceneBase { duration: 1250, }); transition.once("complete", () => { - this.textures.remove("loading_bg"); transition.destroy(); }); From 3fbab84642689b565e32c6d17b15b85b4c985d67 Mon Sep 17 00:00:00 2001 From: scott <5673551+scottarrr@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:12:50 -0400 Subject: [PATCH 087/321] [Bug] block input while waiting for transition to prevent changing starter during move select and in nature menu (#2342) * block input while waiting for transition * block input while waiting for the nature menu --- src/ui/starter-select-ui-handler.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5d7e030ad86..6693db0e9a4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1239,6 +1239,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); 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(() => { ui.showText(i18next.t("starterSelectUiHandler:selectMoveSwapOut"), null, () => { this.moveInfoOverlay.show(allMoves[moveset[0]]); @@ -1248,6 +1251,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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); @@ -1282,6 +1286,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); return true; @@ -1307,6 +1312,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { maxOptions: 8, yOffset: 19 }); + this.blockInput = false; }); }); }; @@ -1324,6 +1330,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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 = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); @@ -1341,6 +1350,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); // set nature for starter this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, n, undefined); + this.blockInput = false; return true; } }; @@ -1350,6 +1360,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { this.clearText(); ui.setMode(Mode.STARTER_SELECT); + this.blockInput = false; return true; } }), From 74064d03d83dc84ba78abf6d077ccb5cf4977125 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Tue, 30 Jul 2024 19:19:11 +0200 Subject: [PATCH 088/321] [Localization] Add missing curly braces in localization strings (#3258) * Add missing } in the german localization strings * Checked all languages --- src/locales/de/ability-trigger.ts | 2 +- src/locales/de/arena-tag.ts | 2 +- src/locales/fr/move-trigger.ts | 2 +- src/locales/pt_BR/ability-trigger.ts | 2 +- src/locales/zh_CN/ability-trigger.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 68930fbee21..0285866307b 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -56,7 +56,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", "postSummonVesselOfRuin": "Unheilsgefäß von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", - "postSummonSwordOfRuin": "Unheilsschwert von {{pokemonNameWithAffix}} schwächt {{statName} aller Pokémon im Umkreis!", + "postSummonSwordOfRuin": "Unheilsschwert von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", } as const; diff --git a/src/locales/de/arena-tag.ts b/src/locales/de/arena-tag.ts index ea6105c09ef..cc0a821aade 100644 --- a/src/locales/de/arena-tag.ts +++ b/src/locales/de/arena-tag.ts @@ -6,7 +6,7 @@ export const arenaTag: SimpleTranslationEntries = { "arenaOnRemove": "Der Effekt von {{moveName}} lässt nach!", "arenaOnRemovePlayer": "Der Effekt von {{moveName}} lässt auf deiner Seite nach!", "arenaOnRemoveEnemy": "Der Effekt von {{moveName}} lässt auf der Seite des Gegners nach!", - "mistOnAdd": "Pokémon, die auf der Seite von {{pokemonNameWithAffix} kämpfen, werden in Weißnebel gehüllt!!", + "mistOnAdd": "Pokémon, die auf der Seite von {{pokemonNameWithAffix}} kämpfen, werden in Weißnebel gehüllt!!", "mistApply": "Der Weißnebel verhindert die Senkung von Statuswerten!", "reflectOnAdd": "Reflektor stärkt Pokémon gegen physische Attacken!", "reflectOnAddPlayer": "Reflektor stärkt Pokémon auf deiner Seite gegen physische Attacken!", diff --git a/src/locales/fr/move-trigger.ts b/src/locales/fr/move-trigger.ts index 7d57fa87335..7f6d25459da 100644 --- a/src/locales/fr/move-trigger.ts +++ b/src/locales/fr/move-trigger.ts @@ -20,7 +20,7 @@ export const moveTriggers: SimpleTranslationEntries = { "loweredItsHead": "{{pokemonName}}\nbaisse la tête !", "isGlowing": "{{pokemonName}} est entouré\nd’une lumière intense !", "bellChimed": "Un grelot sonne !", - "foresawAnAttack": "{{pokemonName}\nprévoit une attaque !", + "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !", "hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !", "soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !", "sprangUp": "{{pokemonName}}\nse propulse dans les airs !", diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index ab845a23d4a..43413284404 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -22,7 +22,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "postDefendAbilityGive": "{{pokemonNameWithAffix}} deu a seu alvo\na habilidade {{abilityName}}!", "postDefendMoveDisable": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!", "pokemonTypeChange": "{{pokemonNameWithAffix}} se transformou no tipo {{moveType}}!", - "postAttackStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {defenderName}}!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {{defenderName}}!", "postDefendStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {{attackerName}}!", "copyFaintedAllyAbility": "A habilidade {{abilityName}} de {{pokemonNameWithAffix}} foi tomada!", "intimidateImmunity": "{{abilityName}} de {{pokemonNameWithAffix}} previniu-o(a) de ser intimidado(a)!", diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index 9cc1d94847b..dc64f75a217 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -36,7 +36,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "forewarn": "{{pokemonNameWithAffix}}读取了\n{{moveName}}!", "frisk": "{{pokemonNameWithAffix}}察觉到了\n{{opponentName}}的{{opponentAbilityName}}!", "postWeatherLapseHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", - "postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{abilityName}}而受到了伤害!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{{abilityName}}而受到了伤害!", "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}\n收获了{{berryName}}!", "postTurnHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", "fetchBall": "{{pokemonNameWithAffix}}\n捡回了{{pokeballName}}!", From 49f4e5fc2eca16d8ed81fd811be3fc2995503400 Mon Sep 17 00:00:00 2001 From: MadridPawmot <42167718+Alekemon@users.noreply.github.com> Date: Tue, 30 Jul 2024 23:06:25 +0200 Subject: [PATCH 089/321] [Localization] Added some Spanish translation (#2004) --- src/locales/es/dialogue.ts | 164 ++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/src/locales/es/dialogue.ts b/src/locales/es/dialogue.ts index c1b23b57fe0..d19acc3ec0f 100644 --- a/src/locales/es/dialogue.ts +++ b/src/locales/es/dialogue.ts @@ -106,85 +106,85 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "fisherman_female": { "encounter": { - 1: "Woah! I've hooked a big one!", - 2: "Line's in, ready to reel in success!", - 3: "Ready to make waves!" + 1: "¡Eh! ¡He pescado uno grande!", + 2: "¡La caña está lista, para pescar la victoria!", + 3: "¡Lista para hacer olas!" }, "victory": { - 1: "I'll be back with a stronger hook.", - 2: "I'll reel in victory next time.", - 3: "I'm just sharpening my hooks for the comeback!" + 1: "Volveré con un pez más grande.", + 2: "Pescaré la victoria a la siguiente...", + 3: "¡Estoy afilando mis anzuelos para la próxima!" }, }, "swimmer": { "encounter": { - 1: "Time to dive in!", - 2: "Let's ride the waves of victory!", - 3: "Ready to make a splash!", + 1: "¡Listo para bucear!", + 2: "¡Montemos las olas de la victoria!", + 3: "¡Listo para darme un chapuzón!", }, "victory": { - 1: "Drenched in defeat!", - 2: "A wave of defeat!", - 3: "Back to shore, I guess.", + 1: "¡Empapado en la derrota!", + 2: "¡Las olas de la derrota!", + 3: "Vuelta a la costa, supongo.", }, }, "backpacker": { "encounter": { - 1: "Pack up, game on!", - 2: "Let's see if you can keep pace!", - 3: "Gear up, challenger!", - 4: "I've spent 20 years trying to find myself… But where am I?" + 1: "¡Recoge y vámonos!", + 2: "¡Veamos si puedes mantener la velocidad!", + 3: "¡Sube la marcha, entrenador!", + 4: "Traté de encontrarme un sentido durante 20 años… ¿Pero dónde estoy?" }, "victory": { - 1: "Tripped up this time!", - 2: "Oh, I think I'm lost.", - 3: "Dead end!", - 4: "Wait up a second! Hey! Don't you know who I am?" + 1: "¡Tropecé esta vez!", + 2: "Oh, creo que me perdí.", + 3: "¡Punto muerto!", + 4: "¡Un segundo! ¡Ey! ¿No sabes quién soy?" }, }, "ace_trainer": { "encounter": { - 1: "You seem quite confident.", - 2: "Your Pokémon… Show them to me…", - 3: "Because I'm an Ace Trainer, people think I'm strong.", - 4: "Are you aware of what it takes to be an Ace Trainer?" + 1: "Pareces muy seguro en ti mismo.", + 2: "Enséñame tus Pokémon…", + 3: "Como soy un Entrenador Guay, la gente cree que soy fuerte.", + 4: "¿Sabes lo que toma ser un Entrenador Guay?" }, "victory": { - 1: "Yes… You have good Pokémon…", - 2: "What?! But I'm a battling genius!", - 3: "Of course, you are the main character!", - 4: "OK! OK! You could be an Ace Trainer!" + 1: "Sí, tienes buenos Pokémon…", + 2: "¡¿Cómo?! ¡Si soy un genio combatiendo!", + 3: "Claro, ¡tienes el poder del guión!", + 4: "¡OK! ¡OK! ¡Puedes ser un Entrenador Guay!" }, "defeat": { - 1: "I am devoting my body and soul to Pokémon battles!", - 2: "All within my expectations… Nothing to be surprised about…", - 3: "I thought I'd grow up to be a frail person who looked like they would break if you squeezed them too hard.", - 4: "Of course I'm strong and don't lose. It's important that I win gracefully." + 1: "¡Doy mi cuerpo y alma para los combates Pokémon.", + 2: "Según mis expectativas… Nada de qué sorprenderse…", + 3: "Pensé que crecería como persona frágil que parece que rompe a llorar si le hacen daño muy fuerte.", + 4: "Por supuesto que soy fuerte y no pierdo. Es importante que gane con gracia." } }, "parasol_lady": { "encounter": { - 1: "Time to grace the battlefield with elegance and poise!", + 1: "¡Tiempo de agradar al campo de batalla con elegancia y esmero!", }, "victory": { - 1: "My elegance remains unbroken!", + 1: "¡Mi elegancia es indestructible!", } }, "twins": { "encounter": { - 1: "Get ready, because when we team up, it's double the trouble!", - 2: "Two hearts, one strategy – let's see if you can keep up with our twin power!", - 3: "Hope you're ready for double trouble, because we're about to bring the heat!" + 1: "¡Prepárate, porque cuando somos juntas el problema es doble!", + 2: "Dos almas, una estrategia – ¡veamos si eres capaz de seguir nuestro poder gemelo!", + 3: "¡Espero que estés listo para el doble problema, porque traeremos mucha emoción!" }, "victory": { - 1: "We may have lost this round, but our bond remains unbreakable!", - 2: "Our twin spirit won't be dimmed for long.", - 3: "We'll come back stronger as a dynamic duo!" + 1: "¡Aunque hayamos perdido esta ronda, nuestra unión es indestructible!", + 2: "Nuestro espíritu gemelo no seguirá así por mucho tiempo.", + 3: "¡Volveremos más fuertes como un dúo dinámico!" }, "defeat": { - 1: "Twin power reigns supreme!", - 2: "Two hearts, one triumph!", - 3: "Double the smiles, double the victory dance!" + 1: "¡El poder gemelo triunfa como ninguno!", + 2: "¡Dos almas, un triunfo!", + 3: "¡Doble sonrisa, doble baile de victoria!" } }, "cyclist": { @@ -565,73 +565,73 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "brock": { "encounter": { - 1: "My expertise on Rock-type Pokémon will take you down! Come on!", - 2: "My rock-hard willpower will overwhelm you!", - 3: "Allow me to show you the true strength of my Pokémon!" + 1: "Mi conocimiento en Pokémon tipo Roca te aplastará. ¡Dalo todo!", + 2: "¡Mi determinación tipo Roca te sorprenderá!", + 3: "¡Permíteme enseñarte la verdadera fuerza de mis Pokémon!" }, "victory": { - 1: "Your Pokémon's strength have overcome my rock-hard defenses!", - 2: "The world is huge! I'm glad to have had a chance to battle you.", - 3: "Perhaps I should go back to pursuing my dream as a Pokémon Breeder…" + 1: "¡La fuerza de mis Pokémon superó mi defensa dura como una roca!", + 2: "¡El mundo es enorme! Me encantó tener una oportunidad para combatir contigo.", + 3: "A lo mejor tendría que volver a mi sueño de ser un Criapokémon…" }, "defeat": { - 1: "The best offense is a good defense!\nThat's my way of doing things!", - 2: "Come study rocks with me next time to better learn how to fight them!", - 3: "Hah, all my traveling around the regions is paying off!" + 1: "¡La mejor ofensa es una buena defensa!\n¡Esa es mi manera de hacer las cosas!", + 2: "¡Ven preparado sobre las rocas para saber cómo luchar contra las mías!", + 3: "Ja, ¡todos mis viajes por regiones se notan!" } }, "misty": { "encounter": { - 1: "My policy is an all out offensive with Water-type Pokémon!", - 2: "Hiya, I'll show you the strength of my aquatic Pokémon!", - 3: "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?" + 1: "¡Mi política es muy ofensiva con Pokémon tipo Agua!", + 2: "Oye, ¡te enseñaré la auténtica fuerza de mis Pokémon tipo Agua!", + 3: "Mi sueño era viajar conociendo Entrenadores fuertes…\n¿Serás suficiente desafío?" }, "victory": { - 1: "You really are strong… I'll admit that you are skilled…", - 2: "Grrr… You know you just got lucky, right?!", - 3: "Wow, you're too much! I can't believe you beat me!" + 1: "Eres muy fuerte… Admito tu talento…", + 2: "Grrr… ¡¿Solo tuviste suerte, sabes?!", + 3: "¡Guau, eres demasiado! ¡No me creo que me hayas vencido!" }, "defeat": { - 1: "Was the mighty Misty too much for you?", - 2: "I hope you saw my Pokémon's elegant swimming techniques!", - 3: "Your Pokémon were no match for my pride and joys!" + 1: "¿Fue la valiente Misty demasiado para ti?", + 2: "¡Espero que hayas visto la elegancia en las técnicas de nado de mis Pokémon!", + 3: "¡Tus Pokémon no fueron rival para mi orgullo y felicidad!" } }, "lt_surge": { "encounter": { - 1: "My Electric Pokémon saved me during the war! I'll show you how!", - 2: "Ten-hut! I'll shock you into surrender!", - 3: "I'll zap you just like I do to all my enemies in battle!" + 1: "¡Mis Pokémon eléctricos me salvaron en la guerra! ¡Te enseñaré cómo!", + 2: "¡10 voltios! ¡Te electrocutaré hasta la derrota!", + 3: "¡Te electrocutaré como a todos mis enemigos en combate!" }, "victory": { - 1: "Whoa! Your team's the real deal, kid!", - 2: "Aaargh, you're strong! Even my electric tricks lost against you.", - 3: "That was an absolutely shocking loss!" + 1: "¡Guau! ¡Tu equipo es lo mejor de lo mejor, chaval!", + 2: "¡Aaargh, eres fuerte! Incluso mis trucos electrizantes fallaron.", + 3: "¡Fue una derrota electrizante!" }, "defeat": { - 1: "Oh yeah! When it comes to Electric-type Pokémon, I'm number one in the world!", - 2: "Hahaha! That was an electrifying battle, kid!", - 3: "A Pokémon battle is war, and I have showed you first-hand combat!" + 1: "¡Oh sí! Cuando se trata de Pokémon tipo Eléctrico, ¡soy el número uno!", + 2: "¡Jajaja! ¡Menuda batalla electrizante, chaval!", + 3: "Un combate Pokémon es la guerra, ¡y te he enseñado lo esencial, chaval!" } }, "erika": { "encounter": { - 1: "Ah, the weather is lovely here…\nOh, a battle? Very well then.", - 2: "My Pokémon battling skills rival that of my flower arranging skills.", - 3: "Oh, I hope the pleasant aroma of my Pokémon doesn't put me to sleep again…", - 4: "Seeing flowers in a garden is so soothing." + 1: "El tiempo es maravilloso aquí…\n¿Oh un combate? Perfecto, entonces.", + 2: "Mis dotes como Entrenadora rivalizan mis dotes como florista.", + 3: "Espero que el dulce aroma de mis Pokémon no me dé sueño…", + 4: "Ver flores en un jardín es tan relajante." }, "victory": { - 1: "Oh! I concede defeat.", - 2: "That match was most delightful.", - 3: "Ah, it appears it is my loss…", - 4: "Oh, my goodness." + 1: "¡Oh! Reconozco mi derrota.", + 2: "Este combate fue agradable.", + 3: "Ah, es mi derrota…", + 4: "Oh Dios mío." }, "defeat": { - 1: "I was afraid I would doze off…", - 2: "Oh my, it seems my Grass Pokémon overwhelmed you.", - 3: "That battle was such a soothing experience.", - 4: "Oh… Is that all?" + 1: "Tenía miedo de dormirme…", + 2: "Oh, parece que mis Pokémon tipo planta te sobrecargaron.", + 3: "Este combate fue una experiencia muy relajante.", + 4: "Oh… ¿Eso es todo?" } }, "janine": { From 2900f222894dcc65ae1f847e171a8a52419cf338 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Tue, 30 Jul 2024 17:15:08 -0400 Subject: [PATCH 090/321] [Enhancement] Add Fee Waiving Overrides (#2266) --- src/overrides.ts | 4 ++++ src/phases.ts | 22 ++++++++++++++-------- src/ui/modifier-select-ui-handler.ts | 6 ++++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index abc67095bd4..9dd394354aa 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -53,6 +53,10 @@ class DefaultOverrides { readonly XP_MULTIPLIER_OVERRIDE: number = null; /** default 1000 */ readonly STARTING_MONEY_OVERRIDE: integer = 0; + /** Sets all shop item prices to 0 */ + readonly WAIVE_SHOP_FEES_OVERRIDE: boolean = false; + /** Sets reroll price to 0 */ + readonly WAIVE_ROLL_FEE_OVERRIDE: boolean = false; readonly FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; readonly POKEBALL_OVERRIDE: { active: boolean; pokeballs: PokeballCounts } = { active: false, diff --git a/src/phases.ts b/src/phases.ts index 9f927b0fcc1..6f4f796cea4 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5166,9 +5166,11 @@ export class SelectModifierPhase extends BattlePhase { this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); this.scene.ui.clearText(); this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } this.scene.playSound("buy"); } break; @@ -5209,7 +5211,7 @@ export class SelectModifierPhase extends BattlePhase { break; } - if (cost && this.scene.money < cost) { + if (cost && (this.scene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { this.scene.ui.playError(); return false; } @@ -5219,9 +5221,11 @@ export class SelectModifierPhase extends BattlePhase { if (cost) { result.then(success => { if (success) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= cost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } this.scene.playSound("buy"); (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { @@ -5301,7 +5305,9 @@ export class SelectModifierPhase extends BattlePhase { getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { let baseValue = 0; - if (lockRarities) { + if (Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + return baseValue; + } else if (lockRarities) { const tierValues = [50, 125, 300, 750, 2000]; for (const opt of typeOptions) { baseValue += tierValues[opt.type.tier]; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index b3718b8854c..b10bcbb18f6 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -10,6 +10,7 @@ import {Button} from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; import { allMoves } from "../data/move"; import * as Utils from "./../utils"; +import Overrides from "#app/overrides"; import i18next from "i18next"; export const SHOP_OPTIONS_ROW_LIMIT = 6; @@ -726,9 +727,10 @@ class ModifierOption extends Phaser.GameObjects.Container { updateCostText(): void { const scene = this.scene as BattleScene; - const textStyle = this.modifierTypeOption.cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; + const cost = Overrides.WAIVE_ROLL_FEE_OVERRIDE ? 0 : this.modifierTypeOption.cost; + const textStyle = cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; - const formattedMoney = Utils.formatMoney(scene.moneyFormat, this.modifierTypeOption.cost); + const formattedMoney = Utils.formatMoney(scene.moneyFormat, cost); this.itemCostText.setText(i18next.t("modifierSelectUiHandler:itemCost", { formattedMoney })); this.itemCostText.setColor(getTextColor(textStyle, false, scene.uiTheme)); From 64ca6dd827d760551941219761bcc22f4af8ba55 Mon Sep 17 00:00:00 2001 From: Carson <59876651+CarsonVB@users.noreply.github.com> Date: Tue, 30 Jul 2024 17:24:01 -0400 Subject: [PATCH 091/321] [Move] Psycho Shift treats Comatose as Sleep (#1780) * comotose + psycho_shift * condensed conditional for psycho shift --------- Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> --- src/data/move.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index fdf2efcd13f..3754b0acd3b 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1917,7 +1917,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const statusToApply: StatusEffect = user.status?.effect; + const statusToApply: StatusEffect = user.status?.effect ?? (user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined); if (target.status) { return false; @@ -1925,7 +1925,9 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { const statusAfflictResult = target.trySetStatus(statusToApply, true, user); if (statusAfflictResult) { - user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); + if (user.status) { + user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); + } user.resetStatus(); user.updateInfo(); } @@ -7033,12 +7035,13 @@ export function initMoves() { .unimplemented(), new StatusMove(Moves.PSYCHO_SHIFT, Type.PSYCHIC, 100, 10, -1, 0, 4) .attr(PsychoShiftEffectAttr) - .condition((user, target, move) => (user.status?.effect === StatusEffect.BURN - || user.status?.effect === StatusEffect.POISON - || user.status?.effect === StatusEffect.TOXIC - || user.status?.effect === StatusEffect.PARALYSIS - || user.status?.effect === StatusEffect.SLEEP) - && target.canSetStatus(user.status?.effect, false, false, user) + .condition((user, target, move) => { + let statusToApply = user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined; + if (user.status?.effect && isNonVolatileStatusEffect(user.status.effect)) { + statusToApply = user.status.effect; + } + return statusToApply && target.canSetStatus(statusToApply, false, false, user); + } ), new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) .makesContact() From 78c3906088f0947ec60f4604c056e03102f7af3e Mon Sep 17 00:00:00 2001 From: drew9696 Date: Tue, 30 Jul 2024 17:44:40 -0400 Subject: [PATCH 092/321] [Bug] Fix Toxic Chain applying for non-damaging moves (#1814) * Fix Toxic Chain applying for non-damaging moves * Addressing code review to change a boolean to a PokemonAttackCondition * Adding comments to introduced methods * Update src/data/ability.ts --------- Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> --- src/data/ability.ts | 48 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 8f01e98e2be..a811da27b9f 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1531,23 +1531,50 @@ export class BattleStatMultiplierAbAttr extends AbAttr { } 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)) { + super(); + + this.attackCondition = attackCondition; + } + + /** + * Please override {@link applyPostAttackAfterMoveTypeCheck} instead of this method. 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. + */ applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { + // 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, 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, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { return false; } } export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { - private condition: PokemonAttackCondition; + private stealCondition: PokemonAttackCondition; - constructor(condition?: PokemonAttackCondition) { + constructor(stealCondition?: PokemonAttackCondition) { super(); - this.condition = condition; + this.stealCondition = stealCondition; } - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { return new Promise(resolve => { - if (hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, defender, move))) { + if (hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferrable); if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; @@ -1583,7 +1610,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { /**Status 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 && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; @@ -1614,7 +1641,7 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, 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)]; @@ -2414,7 +2441,8 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { private effects: StatusEffect[]; constructor(...effects: StatusEffect[]) { - super(); + /** This effect does not require a damaging move */ + super((user, target, move) => true); this.effects = effects; } /** @@ -2427,7 +2455,7 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { * @param args [0] {@linkcode StatusEffect} applied by move * @returns true if defender is confused */ - applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3,2), move.id, defender.id); } @@ -4273,7 +4301,7 @@ export const allAbilities = [ new Ability(Abilities.NONE, 3) ]; export function initAbilities() { allAbilities.push( new Ability(Abilities.STENCH, 3) - .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.category !== MoveCategory.STATUS && !move.hasAttr(FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED), + .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.hasAttr(FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED), new Ability(Abilities.DRIZZLE, 3) .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), From 54ee2f3f10be3bb3ca13b33ef275e720aa2040ed Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:09:50 -0700 Subject: [PATCH 093/321] [Refactor] Remove single-use `EndureAttr` (#3260) --- src/data/move.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 3754b0acd3b..5ccafa5017f 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4427,12 +4427,6 @@ export class ProtectAttr extends AddBattlerTagAttr { } } -export class EndureAttr extends ProtectAttr { - constructor() { - super(BattlerTagType.ENDURING); - } -} - export class IgnoreAccuracyAttr extends AddBattlerTagAttr { constructor() { super(BattlerTagType.IGNORE_ACCURACY, true, false, 2); @@ -6549,7 +6543,7 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2) - .attr(EndureAttr), + .attr(ProtectAttr, BattlerTagType.ENDURING), new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) .attr(StatChangeAttr, BattleStat.ATK, -2), new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) From 495284ad4746e12b539c20c51951da8f50de3c8e Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:11:43 -0700 Subject: [PATCH 094/321] [Refactor] Consolidate the switch cases in `IvyCudgelTypeAttr` (#3261) --- src/data/move.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 5ccafa5017f..f90aef585d6 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3837,26 +3837,18 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Wellspring Mask - move.type = Type.WATER; - break; - case 2: // Hearthflame Mask - move.type = Type.FIRE; - break; - case 3: // Cornerstone Mask - move.type = Type.ROCK; - break; - case 4: // Teal Mask Tera - move.type = Type.GRASS; - break; case 5: // Wellspring Mask Tera move.type = Type.WATER; break; + case 2: // Hearthflame Mask case 6: // Hearthflame Mask Tera move.type = Type.FIRE; break; + case 3: // Cornerstone Mask case 7: // Cornerstone Mask Tera move.type = Type.ROCK; break; + case 4: // Teal Mask Tera default: move.type = Type.GRASS; break; From 59a4546a3f56a9fbfd3469990360967bbde64c5a Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Wed, 31 Jul 2024 16:52:01 +0800 Subject: [PATCH 095/321] add missing changes to sweet veil(#3265) --- 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 a811da27b9f..491a14ba621 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2540,6 +2540,7 @@ export class PreApplyBattlerTagAbAttr extends AbAttr { */ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { private immuneTagType: BattlerTagType; + private battlerTag: BattlerTag; constructor(immuneTagType: BattlerTagType) { super(); @@ -2550,6 +2551,7 @@ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (tag.tagType === this.immuneTagType) { cancelled.value = true; + this.battlerTag = tag; return true; } @@ -2560,7 +2562,7 @@ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { return i18next.t("abilityTriggers:battlerTagImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName, - battlerTagName: (args[0] as BattlerTag).getDescriptor() + battlerTagName: this.battlerTag.getDescriptor() }); } } @@ -4837,7 +4839,7 @@ export function initAbilities() { .attr(MoveTypeChangeAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL), new Ability(Abilities.SWEET_VEIL, 6) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) - .attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) + .attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .ignorable() .partial(), // Mold Breaker ally should not be affected by Sweet Veil new Ability(Abilities.STANCE_CHANGE, 6) From e416a26cfc74d25c47c71139009dc0e35e62cb68 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:44:12 +0800 Subject: [PATCH 096/321] add missing changes from Sweet Veil PR part 2 (#3267) --- 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 b4c6598efb5..71e89d60cbd 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -23,7 +23,7 @@ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoo import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, WeakenMoveScreenTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr } from "../data/ability"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -2243,7 +2243,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const newTag = getBattlerTag(tagType, turnCount, sourceMove, sourceId); const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(PreApplyBattlerTagAbAttr, this, newTag, cancelled); + applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, newTag, cancelled); const userField = this.getAlliedField(); userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, newTag, cancelled)); From 7f8ddb514dfb7c2ed13017df9226af13094a9cd2 Mon Sep 17 00:00:00 2001 From: Enoch Date: Wed, 31 Jul 2024 22:00:24 +0900 Subject: [PATCH 097/321] [Localization] Localize prevent berry ability phase and translate (#3231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * localization prevent berry phase (unnerve) * Update src/locales/fr/ability-trigger.ts Co-authored-by: Lugiad' * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/zh_CN/ability-trigger.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_TW/ability-trigger.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/pt_BR/ability-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/de/ability-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/it/ability-trigger.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Update src/locales/es/ability-trigger.ts --------- Co-authored-by: 송지원 Co-authored-by: Lugiad' Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> --- src/locales/de/ability-trigger.ts | 1 + src/locales/en/ability-trigger.ts | 1 + src/locales/es/ability-trigger.ts | 1 + src/locales/fr/ability-trigger.ts | 1 + src/locales/it/ability-trigger.ts | 1 + src/locales/ko/ability-trigger.ts | 1 + src/locales/pt_BR/ability-trigger.ts | 1 + src/locales/zh_CN/ability-trigger.ts | 1 + src/locales/zh_TW/ability-trigger.ts | 1 + src/phases.ts | 4 ++-- 10 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 0285866307b..88dc9f9f027 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "Unheilsschwert von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!", } as const; diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index 8e35ea4deb9..ce41a964922 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!", } as const; diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index d5d487235e9..6b1f66a11e3 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "preventBerryUse": "{{pokemonNameWithAffix}} está muy nervioso y no puede comer bayas!", } as const; diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index b063a2aca68..f6b9c306cd1 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "L’Épée du Fléau de {{pokemonNameWithAffix}}\naffaiblit la {{statName}} des Pokémon alentour !", "postSummonTabletsOfRuin": "Le Bois du Fléau de {{pokemonNameWithAffix}}\naffaiblit l’{{statName}} des Pokémon alentour !", "postSummonBeadsOfRuin": "Les Perles du Fléau de {{pokemonNameWithAffix}}\naffaiblissent la {{statName}} des Pokémon alentour !", + "preventBerryUse": "{{pokemonNameWithAffix}} est tendu\net ne peut plus manger de Baies !", } as const; diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 4e965eacf32..37472dbdeab 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!", } as const; diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 2c28704fc24..61be21bc7ec 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}의 재앙의검에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!", } as const; diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index 43413284404..f5d9511f3f6 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "Sword of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", "postSummonTabletsOfRuin": "Tablets of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", "postSummonBeadsOfRuin": "Beads of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", + "preventBerryUse": "{{pokemonNameWithAffix}} está nervoso\ndemais para comer frutas!", } as const; diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index dc64f75a217..0f2201049d2 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}的灾祸之剑\n令周围的宝可梦的{{statName}}减弱了!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!", + "preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果!", } as const; diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index c0b253933ca..baa20614a44 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -59,4 +59,5 @@ export const abilityTriggers: SimpleTranslationEntries = { "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果!", } as const; diff --git a/src/phases.ts b/src/phases.ts index 6f4f796cea4..c41ad333b9d 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -20,7 +20,7 @@ import { ModifierTier } from "./modifier/modifier-tier"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; -import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; +import { getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; @@ -2410,7 +2410,7 @@ export class BerryPhase extends FieldPhase { pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); if (cancelled.value) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is too\nnervous to eat berries!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:preventBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } else { this.scene.unshiftPhase( new CommonAnimPhase(this.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM) From 9531e64c0d06ba86fb41b455fc7bd22926b1188b Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:00:46 +0900 Subject: [PATCH 098/321] [Enhancement] Optimize updateScroll function in starter select UI (#3268) * optimize updateScroll function to update only the container within the screen * fix eslint --- src/ui/starter-select-ui-handler.ts | 123 +++++++++++++++------------- 1 file changed, 65 insertions(+), 58 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 6693db0e9a4..e0f895b89c4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2057,76 +2057,83 @@ export default class StarterSelectUiHandler extends MessageUiHandler { updateScroll = () => { const maxColumns = 9; const maxRows = 9; + const onScreenFirstIndex = this.scrollCursor * 9; + const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + 81); this.starterSelectScrollBar.setPage(this.scrollCursor); let pokerusCursorIndex = 0; this.filteredStarterContainers.forEach((container, i) => { - const pos = calcStarterPosition(i, this.scrollCursor); - container.setPosition(pos.x, pos.y); - - if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - container.setVisible(true); - } else { + if (i < onScreenFirstIndex || i > onScreenLastIndex) { container.setVisible(false); - } - - if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + return; + } else { + const pos = calcStarterPosition(i, this.scrollCursor); + container.setPosition(pos.x, pos.y); if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + container.setVisible(true); } else { - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); - } - pokerusCursorIndex++; - } - - if (this.starterSpecies.includes(container.species)) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); - - if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); - } else { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); - } - } - - const speciesId = container.species.speciesId; - this.updateStarterValueLabel(container); - - container.label.setVisible(true); - const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.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)); - } - } - - container.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[speciesId].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); - container.classicWinIcon.setVisible(this.scene.gameData.starterData[speciesId].classicWinCount > 0); - - // 'Candy Icon' mode - if (this.scene.candyUpgradeDisplay === 0) { - - if (!starterColors[speciesId]) { - // Default to white if no colors are found - starterColors[speciesId] = [ "ffffff", "ffffff" ]; + container.setVisible(false); } - // Set the candy colors - container.candyUpgradeIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][0]))); - container.candyUpgradeOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - this.setUpgradeIcon(container); - } else if (this.scene.candyUpgradeDisplay === 1) { - container.candyUpgradeIcon.setVisible(false); - container.candyUpgradeOverlayIcon.setVisible(false); + if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + } else { + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); + } + pokerusCursorIndex++; + } + + if (this.starterSpecies.includes(container.species)) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + + if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); + } else { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); + } + } + + const speciesId = container.species.speciesId; + this.updateStarterValueLabel(container); + + container.label.setVisible(true); + const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY + ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.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)); + } + } + + container.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[speciesId].passiveAttr); + container.hiddenAbilityIcon.setVisible(!!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); + container.classicWinIcon.setVisible(this.scene.gameData.starterData[speciesId].classicWinCount > 0); + + // 'Candy Icon' mode + if (this.scene.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(Utils.rgbHexToRgba(starterColors[speciesId][0]))); + container.candyUpgradeOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); + + this.setUpgradeIcon(container); + } else if (this.scene.candyUpgradeDisplay === 1) { + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); + } } }); }; From bfc44ea35ebd01c8dd7e78b8005dc5c2491f3bd7 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Wed, 31 Jul 2024 12:06:49 -0400 Subject: [PATCH 099/321] [Bug] Make mbh transferrable again --- src/modifier/modifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 9c47867d931..230ebc9251d 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2334,7 +2334,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { - readonly isTransferrable: boolean = false; + readonly isTransferrable: boolean = true; constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); } From e30b9607c5fa695df7805c6649c8eaf855c24b28 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:56:01 -0700 Subject: [PATCH 100/321] [Misc] Removes the temporary save-fix code that swaps abilities (#3274) --- src/system/game-data.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index bbc74ee13e3..6b8f183e94a 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -41,7 +41,6 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; -import { Abilities } from "#app/enums/abilities.js"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -852,14 +851,6 @@ export class GameData { const handleSessionData = async (sessionDataStr: string) => { try { const sessionData = this.parseSessionData(sessionDataStr); - for (let i = 0; i <= 5; i++) { - const speciesToCheck = getPokemonSpecies(sessionData.party[i]?.species); - if (sessionData.party[i]?.abilityIndex === 1) { - if (speciesToCheck.ability1 === speciesToCheck.ability2 && speciesToCheck.abilityHidden !== Abilities.NONE && speciesToCheck.abilityHidden !== speciesToCheck.ability1) { - sessionData.party[i].abilityIndex = 2; - } - } - } resolve(sessionData); } catch (err) { reject(err); From fdbdb862bcf8e52fac55bda13b8f813a7300a6b7 Mon Sep 17 00:00:00 2001 From: Opaque02 <66582645+Opaque02@users.noreply.github.com> Date: Thu, 1 Aug 2024 11:50:47 +1000 Subject: [PATCH 101/321] [QoL] Making the transfer button show which pokemon can have items be transferred to them (#2503) * Basic version of code for updating party ui name to be red when at max stack * Updated text to be red when pokemon is at max stack * Removed some comments and fixed a private property issue * Fixed a const instead of a let statement, and added some comments on the logic * Accidentally broke last commit. Intentionally fixed this commit * Updated the code to not have red text for pokemon name as that was too confusing with fainted pokemon. Now the party slot has a descriptor label which can be used to set the text to show if the pokemon is able/not able to receive the transfer items * Updated transfer logic to use new isTransferrable property instead of getTransferrable method and merged with latest --- src/ui/party-ui-handler.ts | 116 ++++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 28 deletions(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 9bb8162ce2a..80ce318532b 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -288,6 +288,36 @@ export default class PartyUiHandler extends MessageUiHandler { const pokemon = this.scene.getParty()[this.cursor]; if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode && option !== PartyOption.CANCEL) { this.startTransfer(); + + let ableToTransfer: string; + for (let p = 0; p < this.scene.getParty().length; p++) { // this fore look goes through each of the party pokemon + const newPokemon = this.scene.getParty()[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) => + this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).isTransferrable && (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 = newPokemon.scene.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(this.scene) === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" + ableToTransfer = "Not able"; + } else { // if the pokemon isn't at max stack, make the label "Able" + ableToTransfer = "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 = "Able"; + } + } 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); + partySlot.slotHpOverlay.setVisible(false); + partySlot.slotHpText.setVisible(false); + partySlot.slotDescriptionLabel.setText(ableToTransfer); + partySlot.slotDescriptionLabel.setVisible(true); + } + this.clearOptions(); ui.playSelect(); return true; @@ -947,6 +977,12 @@ export default class PartyUiHandler extends MessageUiHandler { this.transferMode = false; this.transferAll = false; this.partySlots[this.transferCursor].setTransfer(false); + for (let i = 0; i < this.partySlots.length; i++) { + this.partySlots[i].slotDescriptionLabel.setVisible(false); + this.partySlots[i].slotHpBar.setVisible(true); + this.partySlots[i].slotHpOverlay.setVisible(true); + this.partySlots[i].slotHpText.setVisible(true); + } } doRelease(slotIndex: integer): void { @@ -1041,6 +1077,12 @@ class PartySlot extends Phaser.GameObjects.Container { private slotBg: Phaser.GameObjects.Image; private slotPb: Phaser.GameObjects.Sprite; + public slotName: Phaser.GameObjects.Text; + public slotHpBar: Phaser.GameObjects.Image; + public slotHpOverlay: Phaser.GameObjects.Sprite; + 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; @@ -1057,6 +1099,10 @@ class PartySlot extends Phaser.GameObjects.Container { this.setup(partyUiMode, tmMoveId); } + getPokemon(): PlayerPokemon { + return this.pokemon; + } + setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); @@ -1095,19 +1141,19 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); - const slotName = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); - slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); - slotName.setOrigin(0, 0); + this.slotName = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); + this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); + this.slotName.setOrigin(0, 0); const slotLevelLabel = this.scene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(slotName, 8, 12); + slotLevelLabel.setPositionRelative(this.slotName, 8, 12); slotLevelLabel.setOrigin(0, 0); const slotLevelText = addTextObject(this.scene, 0, 0, this.pokemon.level.toString(), this.pokemon.level < (this.scene as BattleScene).getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); slotLevelText.setPositionRelative(slotLevelLabel, 9, 0); slotLevelText.setOrigin(0, 0.25); - slotInfoContainer.add([ slotName, slotLevelLabel, slotLevelText ]); + slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText ]); const genderSymbol = getGenderSymbol(this.pokemon.getGender(true)); @@ -1118,7 +1164,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); } else { - slotGenderText.setPositionRelative(slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); + slotGenderText.setPositionRelative(this.slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); } slotGenderText.setOrigin(0, 0.25); @@ -1132,7 +1178,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5); } else { - splicedIcon.setPositionRelative(slotName, 76, 3.5); + splicedIcon.setPositionRelative(this.slotName, 76, 3.5); } slotInfoContainer.add(splicedIcon); @@ -1152,7 +1198,7 @@ class PartySlot extends Phaser.GameObjects.Container { const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); - shinyStar.setPositionRelative(slotName, -9, 3); + shinyStar.setPositionRelative(this.slotName, -9, 3); shinyStar.setTint(getVariantTint(!doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant)); slotInfoContainer.add(shinyStar); @@ -1167,24 +1213,40 @@ class PartySlot extends Phaser.GameObjects.Container { } } + this.slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); + 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 = this.scene.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(this.scene, 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.setOrigin(1, 0); + this.slotHpText.setVisible(false); + + this.slotDescriptionLabel = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE); + 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]); + if (partyUiMode !== PartyUiMode.TM_MODIFIER) { - const slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); - slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); - slotHpBar.setOrigin(0, 0); - - const hpRatio = this.pokemon.getHpRatio(); - - const slotHpOverlay = this.scene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); - slotHpOverlay.setPositionRelative(slotHpBar, 16, 2); - slotHpOverlay.setOrigin(0, 0); - slotHpOverlay.setScale(hpRatio, 1); - - const slotHpText = addTextObject(this.scene, 0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - slotHpText.setPositionRelative(slotHpBar, slotHpBar.width - 3, slotHpBar.height - 2); - slotHpText.setOrigin(1, 0); - - slotInfoContainer.add([ slotHpBar, slotHpOverlay, slotHpText ]); + this.slotDescriptionLabel.setVisible(false); + this.slotHpBar.setVisible(true); + this.slotHpOverlay.setVisible(true); + this.slotHpText.setVisible(true); } else { + this.slotHpBar.setVisible(false); + this.slotHpOverlay.setVisible(false); + this.slotHpText.setVisible(false); let slotTmText: string; switch (true) { case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1): @@ -1198,11 +1260,9 @@ class PartySlot extends Phaser.GameObjects.Container { break; } - const slotTmLabel = addTextObject(this.scene, 0, 0, slotTmText, TextStyle.MESSAGE); - slotTmLabel.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 94 : 32, this.slotIndex >= battlerCount ? 16 : 46); - slotTmLabel.setOrigin(0, 1); + this.slotDescriptionLabel.setText(slotTmText); + this.slotDescriptionLabel.setVisible(true); - slotInfoContainer.add(slotTmLabel); } } From 1d616d075601b0be1371c839ce5f8bdffc2785b7 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Thu, 1 Aug 2024 03:52:11 +0200 Subject: [PATCH 102/321] [Localization] Some missing French translations in menu-ui-handler and achv (#3276) * Update menu-ui-handler.ts * Update achv.ts --- src/locales/fr/achv.ts | 281 +++++++++++++++++++++++++++++- src/locales/fr/menu-ui-handler.ts | 8 +- 2 files changed, 276 insertions(+), 13 deletions(-) diff --git a/src/locales/fr/achv.ts b/src/locales/fr/achv.ts index 4ff9bf20f51..bc6a862942d 100644 --- a/src/locales/fr/achv.ts +++ b/src/locales/fr/achv.ts @@ -22,7 +22,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Banquier", }, "10M_MONEY": { - name: "Évadé·e fiscal·e", + name: "Évadé fiscal", }, "DamageAchv": { @@ -45,7 +45,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", }, "250_HEAL": { - name: "Infirmier·ère", + name: "Infirmier", }, "1000_HEAL": { name: "Médecin", @@ -74,19 +74,19 @@ export const PGMachv: AchievementTranslationEntries = { description: "Accumuler un total de {{ribbonAmount}} Rubans", }, "10_RIBBONS": { - name: "Maitre·sse de la Ligue", + name: "Maitre de la Ligue", }, "25_RIBBONS": { - name: "Super Maitre·sse de la Ligue", + name: "Super Maitre de la Ligue", }, "50_RIBBONS": { - name: "Hyper Maitre·sse de la Ligue", + name: "Hyper Maitre de la Ligue", }, "75_RIBBONS": { - name: "Rogue Maitre·sse de la Ligue", + name: "Rogue Maitre de la Ligue", }, "100_RIBBONS": { - name: "Master Maitre·sse de la Ligue", + name: "Master Maitre de la Ligue", }, "TRANSFER_MAX_BATTLE_STAT": { @@ -166,7 +166,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Avoir des IV parfaits sur un Pokémon", }, "CLASSIC_VICTORY": { - name: "Invaincu·e", + name: "Invaincu", description: "Terminer le jeu en mode classique", }, @@ -267,4 +267,267 @@ export const PGMachv: AchievementTranslationEntries = { } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) -export const PGFachv: AchievementTranslationEntries = PGMachv; +export const PGFachv: AchievementTranslationEntries = { + "Achievements": { + name: "Succès", + }, + "Locked": { + name: "Verrouillé", + }, + + "MoneyAchv": { + description: "Récolter un total de {{moneyAmount}} ₽", + }, + "10K_MONEY": { + name: "Épargnante", + }, + "100K_MONEY": { + name: "Je possède des thunes", + }, + "1M_MONEY": { + name: "Banquière", + }, + "10M_MONEY": { + name: "Évadée fiscale", + }, + + "DamageAchv": { + description: "Infliger {{damageAmount}} de dégâts en un coup", + }, + "250_DMG": { + name: "Caïd", + }, + "1000_DMG": { + name: "Boxeuse", + }, + "2500_DMG": { + name: "Distributrice de pains", + }, + "10000_DMG": { + name: "One Punch Woman", + }, + + "HealAchv": { + description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", + }, + "250_HEAL": { + name: "Infirmière", + }, + "1000_HEAL": { + name: "Médecin", + }, + "2500_HEAL": { + name: "Clerc", + }, + "10000_HEAL": { + name: "Centre Pokémon", + }, + + "LevelAchv": { + description: "Monter un Pokémon au N.{{level}}", + }, + "LV_100": { + name: "Et c’est pas fini !", + }, + "LV_250": { + name: "Élite", + }, + "LV_1000": { + name: "Vers l’infini et au-delà", + }, + + "RibbonAchv": { + description: "Accumuler un total de {{ribbonAmount}} Rubans", + }, + "10_RIBBONS": { + name: "Maitresse de la Ligue", + }, + "25_RIBBONS": { + name: "Super Maitresse de la Ligue", + }, + "50_RIBBONS": { + name: "Hyper Maitresse de la Ligue", + }, + "75_RIBBONS": { + name: "Rogue Maitresse de la Ligue", + }, + "100_RIBBONS": { + name: "Master Maitresse de la Ligue", + }, + + "TRANSFER_MAX_BATTLE_STAT": { + name: "Travail d’équipe", + description: "Utiliser Relais avec au moins une statistique montée à fond", + }, + "MAX_FRIENDSHIP": { + name: "Copinage", + description: "Atteindre le niveau de bonheur maximal avec un Pokémon", + }, + "MEGA_EVOLVE": { + name: "Mégamorph", + description: "Méga-évoluer un Pokémon", + }, + "GIGANTAMAX": { + name: "Kaijū", + description: "Gigamaxer un Pokémon", + }, + "TERASTALLIZE": { + name: "J’aime les STAB", + description: "Téracristalliser un Pokémon", + }, + "STELLAR_TERASTALLIZE": { + name: "Le type enfoui", + description: "Téracristalliser un Pokémon en type Stellaire", + }, + "SPLICE": { + name: "Infinite Fusion", + description: "Fusionner deux Pokémon avec le Pointeau ADN", + }, + "MINI_BLACK_HOLE": { + name: "Item-stellar", + description: "Obtenir un Mini Trou Noir", + }, + "CATCH_MYTHICAL": { + name: "Fabuleux", + description: "Capturer un Pokémon fabuleux", + }, + "CATCH_SUB_LEGENDARY": { + name: "(Semi-)Légendaire", + description: "Capturer un Pokémon semi-légendaire", + }, + "CATCH_LEGENDARY": { + name: "Légendaire", + description: "Capturer un Pokémon légendaire", + }, + "SEE_SHINY": { + name: "Chromatique", + description: "Trouver un Pokémon sauvage chromatique", + }, + "SHINY_PARTY": { + name: "Shasseuse", + description: "Avoir une équipe exclusivement composée de Pokémon chromatiques", + }, + "HATCH_MYTHICAL": { + name: "Œuf fabuleux", + description: "Obtenir un Pokémon fabuleux dans un Œuf", + }, + "HATCH_SUB_LEGENDARY": { + name: "Œuf semi-légendaire", + description: "Obtenir un Pokémon semi-légendaire dans un Œuf", + }, + "HATCH_LEGENDARY": { + name: "Œuf légendaire", + description: "Obtenir un Pokémon légendaire dans un Œuf", + }, + "HATCH_SHINY": { + name: "Œuf chromatique", + description: "Obtenir un Pokémon chromatique dans un Œuf", + }, + "HIDDEN_ABILITY": { + name: "Potentiel enfoui", + description: "Capturer un Pokémon possédant un talent caché", + }, + "PERFECT_IVS": { + name: "Certificat d’authenticité", + description: "Avoir des IV parfaits sur un Pokémon", + }, + "CLASSIC_VICTORY": { + name: "Invaincue", + description: "Terminer le jeu en mode classique", + }, + + "MONO_GEN_ONE": { + name: "Le rival originel", + description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", + }, + "MONO_GEN_TWO": { + name: "Entre tradition et modernité", + description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", + }, + "MONO_GEN_THREE": { + name: "Too much water ?", + description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", + }, + "MONO_GEN_FOUR": { + name: "Réellement la plus difficile ?", + description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", + }, + "MONO_GEN_FIVE": { + name: "Recast complet", + description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", + }, + "MONO_GEN_SIX": { + name: "Aristocrate", + description: "Terminer un challenge avec uniquement des Pokémon de 6e génération.", + }, + "MONO_GEN_SEVEN": { + name: "Seulement techniquement", + description: "Terminer un challenge avec uniquement des Pokémon de 7e génération.", + }, + "MONO_GEN_EIGHT": { + name: "L’heure de gloire", + description: "Terminer un challenge avec uniquement des Pokémon de 8e génération.", + }, + "MONO_GEN_NINE": { + name: "Ça va, c’était EZ", + description: "Terminer un challenge avec uniquement des Pokémon de 9e génération.", + }, + + "MonoType": { + description: "Terminer un challenge en monotype {{type}}.", + }, + "MONO_NORMAL": { + name: "Extraordinairement banal", + }, + "MONO_FIGHTING": { + name: "Je connais le kung-fu", + }, + "MONO_FLYING": { + name: "Angry Birds", + }, + "MONO_POISON": { + name: "Touche moi je t’empoisonne !", + }, + "MONO_GROUND": { + name: "Prévisions : Séisme", + }, + "MONO_ROCK": { + name: "Comme un roc", + }, + "MONO_BUG": { + name: "Une chenille !", + }, + "MONO_GHOST": { + name: "SOS Fantômes", + }, + "MONO_STEEL": { + name: "De type Acier !", + }, + "MONO_FIRE": { + name: "Allumer le feu", + }, + "MONO_WATER": { + name: "Vacances en Bretagne", + }, + "MONO_GRASS": { + name: "Ne pas toucher !", + }, + "MONO_ELECTRIC": { + name: "À la masse", + }, + "MONO_PSYCHIC": { + name: "Grocervo", + }, + "MONO_ICE": { + name: "Froid comme la glace", + }, + "MONO_DRAGON": { + name: "Légendes du club, ou presque", + }, + "MONO_DARK": { + name: "Ça va lui passer", + }, + "MONO_FAIRY": { + name: "Hey ! Listen !", + }, +} as const; diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 70cf05fe984..1270ce6d361 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -18,10 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", "importData": "Importer données", "exportData": "Exporter données", - "linkDiscord": "Link Discord", - "unlinkDiscord": "Unlink Discord", - "linkGoogle": "Link Google", - "unlinkGoogle": "Unlink Google", + "linkDiscord": "Lier à Discord", + "unlinkDiscord": "Délier Discord", + "linkGoogle": "Lier à Google", + "unlinkGoogle": "Délier Google", "cancel": "Retour", "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !" From 7dda6f5cc2d207fe04241a190ff95efc485ea70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Fleury=20Oliveira?= Date: Wed, 31 Jul 2024 22:57:20 -0300 Subject: [PATCH 103/321] [Localization] Update pt_br arena-tag.ts and fixed typo in modifier.ts (#3277) --- src/locales/pt_BR/arena-tag.ts | 92 +++++++++++++++++----------------- src/locales/pt_BR/modifier.ts | 2 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/locales/pt_BR/arena-tag.ts b/src/locales/pt_BR/arena-tag.ts index 8bc2302368a..0d3b8ff587f 100644 --- a/src/locales/pt_BR/arena-tag.ts +++ b/src/locales/pt_BR/arena-tag.ts @@ -1,50 +1,50 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const arenaTag: SimpleTranslationEntries = { - "yourTeam": "your team", - "opposingTeam": "the opposing team", - "arenaOnRemove": "{{moveName}}'s effect wore off.", - "arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", - "arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", - "mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", - "mistApply": "The mist prevented\nthe lowering of stats!", - "reflectOnAdd": "Reflect reduced the damage of physical moves.", - "reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", - "reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", - "lightScreenOnAdd": "Light Screen reduced the damage of special moves.", - "lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", - "lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", - "auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", - "auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", - "auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", - "conditionalProtectOnAdd": "{{moveName}} protected team!", - "conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", - "conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", - "conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", - "matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", - "wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", - "mudSportOnAdd": "Electricity's power was weakened!", - "mudSportOnRemove": "The effects of Mud Sport\nhave faded.", - "waterSportOnAdd": "Fire's power was weakened!", - "waterSportOnRemove": "The effects of Water Sport\nhave faded.", - "spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", - "spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", - "toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", - "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", - "stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", - "stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", - "stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", - "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", - "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", - "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", - "gravityOnAdd": "Gravity intensified!", - "gravityOnRemove": "Gravity returned to normal!", - "tailwindOnAdd": "The Tailwind blew from behind team!", - "tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", - "tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", - "tailwindOnRemove": "Team's Tailwind petered out!", - "tailwindOnRemovePlayer": "Your team's Tailwind petered out!", - "tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", - "happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", - "happyHourOnRemove": "The atmosphere returned to normal.", + "yourTeam": "sua equipe", + "opposingTeam": "a equipe adversária", + "arenaOnRemove": "O efeito de {{moveName}} acabou.", + "arenaOnRemovePlayer": "O efeito de {{moveName}} acabou\nem sua equipe.", + "arenaOnRemoveEnemy": "O efeito de {{moveName}} acabou\nna equipe adversária.", + "mistOnAdd": "A equipe de {{pokemonNameWithAffix}} está protegida\npela névoa!", + "mistApply": "A névoa previne\na diminuição de atributos!", + "reflectOnAdd": "Reflect reduziu o dano de movimentos físicos.", + "reflectOnAddPlayer": "Reflect reduziu o dano de movimentos físicos em sua equipe.", + "reflectOnAddEnemy": "Reflect reduziu o dano de movimentos físicos na equipe adversária.", + "lightScreenOnAdd": "Light Screen reduziu o dano de movimentos especiais.", + "lightScreenOnAddPlayer": "Light Screen reduziu o dano de movimentos especiais em sua equipe.", + "lightScreenOnAddEnemy": "Light Screen reduziu o dano de movimentos especiais na equipe adversária.", + "auroraVeilOnAdd": "Aurora Veil reduziu o dano de movimentos.", + "auroraVeilOnAddPlayer": "Aurora Veil reduziu o dano de movimentos em sua equipe.", + "auroraVeilOnAddEnemy": "Aurora Veil reduziu o dano de movimentos na equipe adversária.", + "conditionalProtectOnAdd": "{{moveName}} protegeu a equipe!", + "conditionalProtectOnAddPlayer": "{{moveName}} protegeu sua equipe!", + "conditionalProtectOnAddEnemy": "{{moveName}} protegeu a\nequipe adversária!", + "conditionalProtectApply": "{{moveName}} protegeu {{pokemonNameWithAffix}}!", + "matBlockOnAdd": "{{pokemonNameWithAffix}} pretende levantar um tapete\npara bloquear ataques!", + "wishTagOnAdd": "O desejo de {{pokemonNameWithAffix}}\nfoi concedido!", + "mudSportOnAdd": "O poder de movimentos elétricos foi enfraquecido!", + "mudSportOnRemove": "Os efeitos de Mud Sport\nsumiram.", + "waterSportOnAdd": "O poder de movimentos de fogo foi enfraquecido!", + "waterSportOnRemove": "Os efeitos de Water Sport\nsumiram.", + "spikesOnAdd": "{{moveName}} foram espalhados\nno chão ao redor de {{opponentDesc}}!", + "spikesActivateTrap": "{{pokemonNameWithAffix}} foi ferido\npelos espinhos!", + "toxicSpikesOnAdd": "{{moveName}} foram espalhados\nno chão ao redor de {{opponentDesc}}!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorveu os {{moveName}}!", + "stealthRockOnAdd": "Pedras pontiagudas estão flutuando\nao redor de {{opponentDesc}}!", + "stealthRockActivateTrap": "{{pokemonNameWithAffix}} foi atingido\npor pedras pontiagudas!", + "stickyWebOnAdd": "Uma {{moveName}} foi espalhada no chão ao redor da equipe adversária!", + "stickyWebActivateTrap": "{{pokemonName}} adversário foi pego por uma Sticky Web!", + "trickRoomOnAdd": "{{pokemonNameWithAffix}} distorceu\nas dimensões!", + "trickRoomOnRemove": "As dimensões distorcidas\nretornaram ao normal!", + "gravityOnAdd": "A gravidade aumentou!", + "gravityOnRemove": "A gravidade retornou ao normal!", + "tailwindOnAdd": "O Tailwind soprou de trás de sua equipe!", + "tailwindOnAddPlayer": "O Tailwind soprou de trás de\nsua equipe!", + "tailwindOnAddEnemy": "O Tailwind soprou de trás da\nequipe adversária!", + "tailwindOnRemove": "O Tailwind de sua equipe acabou!", + "tailwindOnRemovePlayer": "O Tailwind de sua equipe acabou!", + "tailwindOnRemoveEnemy": "O Tailwind da equipe adversária acabou!", + "happyHourOnAdd": "Todos foram envolvidos por uma atmosfera alegre!", + "happyHourOnRemove": "A atmosfera retornou ao normal.", } as const; diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts index eef08db25ae..168665205c3 100644 --- a/src/locales/pt_BR/modifier.ts +++ b/src/locales/pt_BR/modifier.ts @@ -10,5 +10,5 @@ export const modifier: SimpleTranslationEntries = { "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestaurou um pouco de seus PS!", - "bypassSpeedChanceApply": "{{pokemonName}} se move mais rápido que o normal graças a sua {{itemName}}!", + "bypassSpeedChanceApply": "{{pokemonName}} se move mais rápido que o normal graças à sua {{itemName}}!", } as const; From b0f8f0e9011c4d74cfc5a218e0d26a63ff511af4 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Thu, 1 Aug 2024 10:25:50 -0400 Subject: [PATCH 104/321] [Sprite] Add female Ursaring variant palettes (#3282) * [Sprite] Female Ursaring variant fronts Taken from male counterpart * [Sprite] Female Ursaring variant backs Taken from male counterpart * [Sprite] Female Ursaring variants --- .../images/pokemon/variant/_masterlist.json | 10 ++++ .../pokemon/variant/back/female/217.json | 38 ++++++++++++++ public/images/pokemon/variant/female/217.json | 50 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 public/images/pokemon/variant/back/female/217.json create mode 100644 public/images/pokemon/variant/female/217.json diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index c936fc8d0a1..d03d8d7f1f5 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -3265,6 +3265,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, @@ -6658,6 +6663,11 @@ 1, 1 ], + "217": [ + 1, + 1, + 1 + ], "229": [ 0, 1, diff --git a/public/images/pokemon/variant/back/female/217.json b/public/images/pokemon/variant/back/female/217.json new file mode 100644 index 00000000000..7ce80e163b6 --- /dev/null +++ b/public/images/pokemon/variant/back/female/217.json @@ -0,0 +1,38 @@ +{ + "0": { + "422919": "112114", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "2f6324", + "ffffff": "ffffff", + "634229": "1d3d26", + "b5b5bd": "b5b5bd", + "f7c563": "fecd85", + "c59c4a": "cd9343", + "dedede": "dedede" + }, + "1": { + "422919": "2d0e1f", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "8c2a37", + "ffffff": "ffffff", + "634229": "6b1d38", + "b5b5bd": "b5b5bd", + "f7c563": "f2cab8", + "c59c4a": "c48e81", + "dedede": "dedede" + }, + "2": { + "422919": "111433", + "7b7b8c": "7b7b8c", + "101010": "101010", + "945221": "323760", + "ffffff": "ffffff", + "634229": "1e2249", + "b5b5bd": "b5b5bd", + "f7c563": "5ccaf2", + "c59c4a": "45a2f9", + "dedede": "dedede" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/217.json b/public/images/pokemon/variant/female/217.json new file mode 100644 index 00000000000..e09efa5de60 --- /dev/null +++ b/public/images/pokemon/variant/female/217.json @@ -0,0 +1,50 @@ +{ + "0": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "1d3d26", + "ffffff": "ffffff", + "945221": "2f6324", + "422919": "112114", + "dedede": "dedede", + "bd7342": "6a8a46", + "ffef84": "f7ffa5", + "b5b5bd": "b5b5bd", + "c59c4a": "ceb552", + "f7c563": "f7de7b", + "841931": "a52942", + "de3a5a": "ef526b" + }, + "1": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "6b1d38", + "ffffff": "ffffff", + "945221": "8c2a37", + "422919": "2d0e1f", + "dedede": "dedede", + "bd7342": "b74543", + "ffef84": "f9eddb", + "b5b5bd": "b5b5bd", + "c59c4a": "c48e81", + "f7c563": "f2cab8", + "841931": "841931", + "de3a5a": "de3a5a" + }, + "2": { + "7b7b8c": "7b7b8c", + "101010": "101010", + "634229": "1e2249", + "ffffff": "ffffff", + "945221": "323760", + "422919": "111433", + "dedede": "dedede", + "bd7342": "46527a", + "ffef84": "adf2f7", + "b5b5bd": "b5b5bd", + "c59c4a": "45a2f9", + "f7c563": "5ccaf2", + "841931": "a52942", + "de3a5a": "ef526b" + } +} \ No newline at end of file From c1595bf2b76d887cafac43eb7fb955e5c1ee2548 Mon Sep 17 00:00:00 2001 From: allen925 <62000482+allen925@users.noreply.github.com> Date: Thu, 1 Aug 2024 09:35:11 -0700 Subject: [PATCH 105/321] [Bug] fix stuck/sprite issue with double battle player pokemon both died same turn then wins battle with one bench pokemon only (#3266) --- src/phases.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index c41ad333b9d..d77ff7c29df 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -3789,11 +3789,10 @@ export class FaintPhase extends PokemonPhase { const nonFaintedPartyMemberCount = nonFaintedLegalPartyMembers.length; if (!nonFaintedPartyMemberCount) { this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !nonFaintedLegalPartyMembers[0].isActive(true))) { - this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); - } - if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) { + } else if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) { this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount()) { + this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); } } else { this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); From 69e4ed9284b3889760e868de8e7a12f26214ecd4 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:57:36 +0900 Subject: [PATCH 106/321] [Bug] Fix bug of remaining pokerus and starter cursor on scrolling (#3293) --- src/ui/starter-select-ui-handler.ts | 59 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index e0f895b89c4..0b9210af646 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1025,16 +1025,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + const maxColumns = 9; + const maxRows = 9; const numberOfStarters = this.filteredStarterContainers.length; - const numOfRows = Math.ceil(numberOfStarters / 9); - const currentRow = Math.floor(this.cursor / 9); - const onScreenFirstIndex = this.scrollCursor * 9; // this is first starter index on the screen - const onScreenLastIndex = Math.min(onScreenFirstIndex + 9*9, numberOfStarters) - 1; // this is the last starter index on the screen + 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 onScreenNumberOfStarters = onScreenLastIndex - onScreenFirstIndex + 1; - const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / 9); - // const onScreenFirstRow = Math.floor(onScreenFirstIndex / 9); - const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / 9); - + const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / maxColumns); + // const onScreenFirstRow = Math.floor(onScreenFirstIndex / maxColumns); + const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / maxColumns); // console.log("this.cursor: ", this.cursor, "this.scrollCursor" , this.scrollCursor, "numberOfStarters: ", numberOfStarters, "numOfRows: ", numOfRows, "currentRow: ", currentRow, "onScreenFirstIndex: ", onScreenFirstIndex, "onScreenLastIndex: ", onScreenLastIndex, "onScreenNumberOfStarters: ", onScreenNumberOfStarters, "onScreenNumberOfRow: ", onScreenNumberOfRows, "onScreenCurrentRow: ", onScreenCurrentRow); @@ -2057,45 +2058,41 @@ export default class StarterSelectUiHandler extends MessageUiHandler { updateScroll = () => { const maxColumns = 9; const maxRows = 9; - const onScreenFirstIndex = this.scrollCursor * 9; - const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + 81); + const onScreenFirstIndex = this.scrollCursor * maxColumns; + const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns -1); this.starterSelectScrollBar.setPage(this.scrollCursor); let pokerusCursorIndex = 0; this.filteredStarterContainers.forEach((container, i) => { + const pos = calcStarterPosition(i, this.scrollCursor); + container.setPosition(pos.x, pos.y); if (i < onScreenFirstIndex || i > onScreenLastIndex) { container.setVisible(false); - return; - } else { - const pos = calcStarterPosition(i, this.scrollCursor); - container.setPosition(pos.x, pos.y); - - if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - container.setVisible(true); - } else { - container.setVisible(false); - } if (this.pokerusSpecies.includes(container.species)) { this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - - if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); - } else { - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); - } + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); pokerusCursorIndex++; } if (this.starterSpecies.includes(container.species)) { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); + } + return; + } else { + container.setVisible(true); - if (i < (maxRows + this.scrollCursor) * maxColumns && i >= this.scrollCursor * maxColumns) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); - } else { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); - } + 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); } const speciesId = container.species.speciesId; From 17cc8b5c5e067113f1efe87b43022f01a196fad6 Mon Sep 17 00:00:00 2001 From: cam Date: Thu, 1 Aug 2024 22:01:09 -0400 Subject: [PATCH 107/321] [Sprite] Victreebil's stem not connected to the head (#3292) * [Fix][Sprite] 4083 Galarian Farfetch'd exp Fixed cropped feet on exp for default & shiny. Rearranged spritesheet to fit new size. Both sritesheets have identical sprite framing. Both json are identical. * [Sprite] 71- Fixed missing stem fixed missing stem segment on victreebil's head default and shiny png positions are identical json are identical --- public/images/pokemon/back/71.json | 1834 ++++----------------- public/images/pokemon/back/71.png | Bin 6995 -> 7433 bytes public/images/pokemon/back/shiny/71.json | 1836 ++++------------------ public/images/pokemon/back/shiny/71.png | Bin 6994 -> 7433 bytes 4 files changed, 609 insertions(+), 3061 deletions(-) diff --git a/public/images/pokemon/back/71.json b/public/images/pokemon/back/71.json index b3f5a0792db..195188d13e7 100644 --- a/public/images/pokemon/back/71.json +++ b/public/images/pokemon/back/71.json @@ -1,1532 +1,306 @@ { - "textures": [ - { - "image": "71.png", - "format": "RGBA8888", - "size": { - "w": 333, - "h": 333 - }, - "scale": 1, - "frames": [ - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:751712009fd74222715d70b43a4283e8:5955b5b390b7b5ccf4dce1abfcc58af2:699363ed1732140836e97f90bcfd26b2$" - } + "textures": + [ + { + "image": "71.png", + "format": "RGB8888", + "size": { "w": 338, + "h": 269 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0002.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0003.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0004.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0005.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0006.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0007.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0008.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0009.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0010.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0011.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0012.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0013.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0014.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0015.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0016.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0017.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0018.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0019.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0020.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0021.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0022.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0023.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0024.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0025.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0026.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0027.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0028.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0029.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0030.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0031.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0032.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0033.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0034.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0035.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0036.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 }} + ], + + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } } +] +} \ No newline at end of file diff --git a/public/images/pokemon/back/71.png b/public/images/pokemon/back/71.png index 3e3424c865eceb3abcd7f4164741936c111022aa..24a546f61662b304d8444a19c206ba6921600323 100644 GIT binary patch literal 7433 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 L*92Ls?GpQcGA{Cd diff --git a/public/images/pokemon/back/shiny/71.json b/public/images/pokemon/back/shiny/71.json index d40924360b0..7407c0befe1 100644 --- a/public/images/pokemon/back/shiny/71.json +++ b/public/images/pokemon/back/shiny/71.json @@ -1,1532 +1,306 @@ { - "textures": [ - { - "image": "71.png", - "format": "RGBA8888", - "size": { - "w": 333, - "h": 333 - }, - "scale": 1, - "frames": [ - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 69, - "y": 0, - "w": 69, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 138, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 205, - "y": 0, - "w": 67, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 0, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 69 - }, - "frame": { - "x": 69, - "y": 70, - "w": 69, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 138, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 206, - "y": 70, - "w": 68, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 68, - "h": 69 - }, - "frame": { - "x": 0, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 68, - "h": 69 - }, - "frame": { - "x": 68, - "y": 139, - "w": 68, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 67, - "h": 68 - }, - "frame": { - "x": 136, - "y": 139, - "w": 67, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 203, - "y": 139, - "w": 66, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 66, - "h": 69 - }, - "frame": { - "x": 136, - "y": 207, - "w": 66, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 202, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 268, - "y": 208, - "w": 64, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 64, - "h": 67 - }, - "frame": { - "x": 269, - "y": 139, - "w": 64, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 0, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 69, - "h": 70 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 66, - "h": 68 - }, - "frame": { - "x": 66, - "y": 208, - "w": 66, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f8d42fbc7e4634a1aafab7a9441fe58f:13cd2160ec05982d017bab80e7a8b69a:699363ed1732140836e97f90bcfd26b2$" - } -} + "textures": + [ + { + "image": "71.png", + "format": "RGB8888", + "size": { "w": 338, + "h": 269 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0002.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 272, "y": 0, "w": 66, "h": 68 } + }, + { + "filename": "0003.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0004.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 0, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0005.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0006.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 128, "y": 136, "w": 64, "h": 67 } + }, + { + "filename": "0007.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0008.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 263, "y": 135, "w": 64, "h": 68 } + }, + { + "filename": "0009.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0010.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 128, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0011.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0012.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 65, "h": 67 }, + "frame": { "x": 198, "y": 135, "w": 65, "h": 67 } + }, + { + "filename": "0013.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0014.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 198, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0015.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0016.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 0, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0017.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0018.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 68, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0019.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0020.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 68, "h": 68 }, + "frame": { "x": 136, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0021.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0022.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 68, "h": 68 }, + "frame": { "x": 204, "y": 0, "w": 68, "h": 68 } + }, + { + "filename": "0023.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0024.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 66, "h": 67 }, + "frame": { "x": 264, "y": 68, "w": 66, "h": 67 } + }, + { + "filename": "0025.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0026.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 0, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0027.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0028.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 62, "h": 66 }, + "frame": { "x": 256, "y": 203, "w": 62, "h": 66 } + }, + { + "filename": "0029.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0030.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 64, "h": 68 }, + "frame": { "x": 64, "y": 136, "w": 64, "h": 68 } + }, + { + "filename": "0031.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0032.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 64, "h": 67 }, + "frame": { "x": 192, "y": 202, "w": 64, "h": 67 } + }, + { + "filename": "0033.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0034.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 66, "h": 68 }, + "frame": { "x": 66, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0035.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 } + }, + { + "filename": "0036.png", + "sourceSize": { "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 66, "h": 68 }, + "frame": { "x": 132, "y": 68, "w": 66, "h": 68 }} + ], + + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } + } + ] + } \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/71.png b/public/images/pokemon/back/shiny/71.png index 03244865da7b80be0f693c3f36fac7497dff2199..99663f744aca3fa385adabc9a6ef77d5f9bef4b3 100644 GIT binary patch literal 7433 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 O1<+L2Mb@ZVMgAXcG|&0~ From 89d38a3b6bae56d8e4e86a29ddad33908a9b3b56 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:10:43 -0700 Subject: [PATCH 108/321] [Bug] fixed switch out bug when fainted single -> double (#3288) Mirror of PR #1333. Thanks to 0zuzu (https://github.com/0zuzu) for providing the original fix. Co-authored-by: 0zuzu <63069680+0zuzu@users.noreply.github.com> --- src/phases.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index d77ff7c29df..dfadcaf2767 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -4449,9 +4449,10 @@ export class SwitchPhase extends BattlePhase { start() { super.start(); + const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()); // Skip modal switch if impossible - if (this.isModal && !this.scene.getParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { + if (this.isModal && (!availablePartyMembers.filter(p => !p.isActive(true)).length || (!this.scene.currentBattle.started && availablePartyMembers.length === 1))) { return super.end(); } @@ -4461,7 +4462,7 @@ export class SwitchPhase extends BattlePhase { } // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once - const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? this.fieldIndex : 0; + const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || availablePartyMembers.length > 1 ? this.fieldIndex : 0; this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { From aeafe0fddd85fa46c1d7df256dda9276a18c409d Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Thu, 1 Aug 2024 22:20:27 -0400 Subject: [PATCH 109/321] [Refactor/Bug] Use Bit Shifting & Masking (#3278) --- src/data/pokemon-species.ts | 2 +- src/field/pokemon.ts | 4 +-- src/modifier/modifier.ts | 4 +-- src/system/game-data.ts | 24 +++++++-------- src/ui/pokemon-info-container.ts | 12 ++++---- src/ui/starter-select-ui-handler.ts | 6 ++-- src/utils.ts | 46 ++++++++--------------------- 7 files changed, 39 insertions(+), 59 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 3b09f8f7698..bd13dd75473 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -435,7 +435,7 @@ 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 & Math.pow(2, eggMoveIndex)) { + if (eggMoveIndex > -1 && (eggMoves & (1 << eggMoveIndex))) { continue; } } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 71e89d60cbd..2ed1b7e7355 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1389,8 +1389,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } - const rand1 = Utils.binToDec(Utils.decToBin(this.id).substring(0, 16)); - const rand2 = Utils.binToDec(Utils.decToBin(this.id).substring(16, 32)); + const rand1 = (this.id & 0xFFFF0000) >>> 16; + const rand2 = (this.id & 0x0000FFFF); const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId; const F = rand1 ^ rand2; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 230ebc9251d..91041dc7564 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1576,11 +1576,11 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { const pokemon = args[0] as Pokemon; pokemon.natureOverride = this.nature; let speciesId = pokemon.species.speciesId; - pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1); + pokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); while (pokemonPrevolutions.hasOwnProperty(speciesId)) { speciesId = pokemonPrevolutions[speciesId]; - pokemon.scene.gameData.dexData[speciesId].natureAttr |= Math.pow(2, this.nature + 1); + pokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); } return true; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 6b8f183e94a..161b5a2c49b 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -349,7 +349,7 @@ export class GameData { this.scene.ui.savingIcon.show(); const data = this.getSystemSaveData(); - const maxIntAttrValue = Math.pow(2, 31); + const maxIntAttrValue = 0x80000000; 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)); @@ -1163,7 +1163,7 @@ export class GameData { } const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); - const maxIntAttrValue = Math.pow(2, 31); + const maxIntAttrValue = 0x80000000; const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)) : this.getSystemSaveData(); const request = { @@ -1368,7 +1368,7 @@ export class GameData { const entry = data[defaultStarterSpecies[ds]] as DexEntry; entry.seenAttr = defaultStarterAttr; entry.caughtAttr = defaultStarterAttr; - entry.natureAttr = Math.pow(2, defaultStarterNatures[ds] + 1); + entry.natureAttr = 1 << (defaultStarterNatures[ds] + 1); for (const i in entry.ivs) { entry.ivs[i] = 10; } @@ -1435,10 +1435,10 @@ export class GameData { dexEntry.caughtAttr |= dexAttr; if (speciesStarters.hasOwnProperty(species.speciesId)) { this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 - ? Math.pow(2, pokemon.abilityIndex) + ? 1 << pokemon.abilityIndex : AbilityAttr.ABILITY_HIDDEN; } - dexEntry.natureAttr |= Math.pow(2, pokemon.nature + 1); + dexEntry.natureAttr |= 1 << (pokemon.nature + 1); const hasPrevolution = pokemonPrevolutions.hasOwnProperty(species.speciesId); const newCatch = !caughtAttr; @@ -1474,7 +1474,7 @@ export class GameData { } if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg)) { - this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, 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)); } } @@ -1545,7 +1545,7 @@ export class GameData { this.starterData[speciesId].eggMoves = 0; } - const value = Math.pow(2, eggMoveIndex); + const value = 1 << eggMoveIndex; if (this.starterData[speciesId].eggMoves & value) { resolve(false); @@ -1637,7 +1637,7 @@ export class GameData { getSpeciesDefaultNature(species: PokemonSpecies): Nature { const dexEntry = this.dexData[species.speciesId]; for (let n = 0; n < 25; n++) { - if (dexEntry.natureAttr & Math.pow(2, n + 1)) { + if (dexEntry.natureAttr & (1 << (n + 1))) { return n as Nature; } } @@ -1645,7 +1645,7 @@ export class GameData { } getSpeciesDefaultNatureAttr(species: PokemonSpecies): integer { - return Math.pow(2, this.getSpeciesDefaultNature(species)); + return 1 << (this.getSpeciesDefaultNature(species)); } getDexAttrLuck(dexAttr: bigint): integer { @@ -1655,7 +1655,7 @@ export class GameData { getNaturesForAttr(natureAttr: integer): Nature[] { const ret: Nature[] = []; for (let n = 0; n < 25; n++) { - if (natureAttr & Math.pow(2, n + 1)) { + if (natureAttr & (1 << (n + 1))) { ret.push(n); } } @@ -1697,7 +1697,7 @@ export class GameData { } getFormAttr(formIndex: integer): bigint { - return BigInt(Math.pow(2, 7 + formIndex)); + return BigInt(1 << (7 + formIndex)); } consolidateDexData(dexData: DexData): void { @@ -1707,7 +1707,7 @@ export class GameData { entry.hatchedCount = 0; } if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) { - entry.natureAttr = this.defaultDexData[k].natureAttr || Math.pow(2, Utils.randInt(25, 1)); + entry.natureAttr = this.defaultDexData[k].natureAttr || (1 << Utils.randInt(25, 1)); } } } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 1e958ae53b7..b2ee5a9164a 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -216,7 +216,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonGenderText.setShadowColor(getGenderColor(pokemon.gender, true)); this.pokemonGenderText.setVisible(true); - const newGender = BigInt(Math.pow(2, pokemon.gender)) * DexAttr.MALE; + const newGender = BigInt(1 << pokemon.gender) * DexAttr.MALE; this.pokemonGenderNewText.setText("(+)"); this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); @@ -229,7 +229,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { if (pokemon.species.forms?.[pokemon.formIndex]?.formName) { this.pokemonFormLabelText.setVisible(true); this.pokemonFormText.setVisible(true); - const newForm = BigInt(Math.pow(2, pokemon.formIndex)) * DexAttr.DEFAULT_FORM; + const newForm = BigInt(1 << pokemon.formIndex) * DexAttr.DEFAULT_FORM; if ((newForm & caughtAttr) === BigInt(0)) { this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -266,7 +266,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { */ const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; - const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + const opponentPokemonAbilityAttr = 1 << opponentPokemonAbilityIndex; const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; @@ -281,7 +281,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, this.scene.uiTheme)); const dexNatures = pokemon.scene.gameData.dexData[pokemon.species.speciesId].natureAttr; - const newNature = Math.pow(2, pokemon.nature + 1); + const newNature = 1 << (pokemon.nature + 1); if (!(dexNatures & newNature)) { this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); @@ -305,8 +305,8 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); - const newShiny = BigInt(Math.pow(2, (pokemon.shiny ? 1 : 0))); - const newVariant = BigInt(Math.pow(2, pokemon.variant + 4)); + const newShiny = BigInt(1 << (pokemon.shiny ? 1 : 0)); + const newVariant = BigInt(1 << (pokemon.variant + 4)); this.pokemonShinyNewIcon.setText("(+)"); this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 0b9210af646..08111908dda 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2611,7 +2611,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] > 0 && lm[0] <= 5).map(lm => lm[1])); if (speciesEggMoves.hasOwnProperty(species.speciesId)) { for (let em = 0; em < 4; em++) { - if (this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) { + if (this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) { this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]); } } @@ -2623,7 +2623,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ? speciesMoveData as StarterMoveset : (speciesMoveData as StarterFormMoveData)[formIndex] : null; - const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) : []); + const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.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) { @@ -2680,7 +2680,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 && this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); + const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em); this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } diff --git a/src/utils.ts b/src/utils.ts index 467d7601d38..ede0a4bd78a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -165,40 +165,20 @@ export function getPlayTimeString(totalSeconds: integer): string { return `${days.padStart(2, "0")}:${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}:${seconds.padStart(2, "0")}`; } -export function binToDec(input: string): integer { - const place: integer[] = []; - const binary: string[] = []; - - let decimalNum = 0; - - for (let i = 0; i < input.length; i++) { - binary.push(input[i]); - place.push(Math.pow(2, i)); - decimalNum += place[i] * parseInt(binary[i]); - } - - return decimalNum; -} - -export function decToBin(input: integer): string { - let bin = ""; - let intNum = input; - while (intNum > 0) { - bin = intNum % 2 ? `1${bin}` : `0${bin}`; - intNum = Math.floor(intNum * 0.5); - } - - return bin; -} - -export function getIvsFromId(id: integer): integer[] { +/** + * Generates IVs from a given {@linkcode id} by extracting 5 bits at a time + * starting from the least significant bit up to the 30th most significant bit. + * @param id 32-bit number + * @returns An array of six numbers corresponding to 5-bit chunks from {@linkcode id} + */ +export function getIvsFromId(id: number): number[] { return [ - binToDec(decToBin(id).substring(0, 5)), - binToDec(decToBin(id).substring(5, 10)), - binToDec(decToBin(id).substring(10, 15)), - binToDec(decToBin(id).substring(15, 20)), - binToDec(decToBin(id).substring(20, 25)), - binToDec(decToBin(id).substring(25, 30)) + (id & 0x3E000000) >>> 25, + (id & 0x01F00000) >>> 20, + (id & 0x000F8000) >>> 15, + (id & 0x00007C00) >>> 10, + (id & 0x000003E0) >>> 5, + (id & 0x0000001F) ]; } From 5d3458b38ee3a2373f309ab2f2fa5a26c76ec88f Mon Sep 17 00:00:00 2001 From: Enoch Date: Fri, 2 Aug 2024 11:45:02 +0900 Subject: [PATCH 110/321] [Localization] Localize pokemon form change message and translate (#3275) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * localize form change message (test required) * Update src/locales/fr/pokemon-form.ts Co-authored-by: Lugiad' * Update src/locales/pt_BR/pokemon-form.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/zh_CN/pokemon-form.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/pokemon-form.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/de/pokemon-form.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/it/pokemon-form.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> --------- Co-authored-by: Lugiad' Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> --- src/data/pokemon-forms.ts | 14 +++++++------- src/data/pokemon-species.ts | 2 +- src/locales/de/config.ts | 3 ++- src/locales/de/pokemon-form.ts | 10 +++++++++- src/locales/en/config.ts | 3 ++- src/locales/en/pokemon-form.ts | 11 +++++++++-- src/locales/es/config.ts | 3 ++- src/locales/es/pokemon-form.ts | 11 +++++++++-- src/locales/fr/config.ts | 3 ++- src/locales/fr/pokemon-form.ts | 11 +++++++++-- src/locales/it/config.ts | 3 ++- src/locales/it/pokemon-form.ts | 11 +++++++++-- src/locales/ko/config.ts | 3 ++- src/locales/ko/pokemon-form.ts | 11 +++++++++-- src/locales/pt_BR/config.ts | 3 ++- src/locales/pt_BR/pokemon-form.ts | 12 ++++++++++-- src/locales/zh_CN/config.ts | 3 ++- src/locales/zh_CN/pokemon-form.ts | 11 +++++++++-- src/locales/zh_TW/config.ts | 3 ++- src/locales/zh_TW/pokemon-form.ts | 11 +++++++++-- 20 files changed, 108 insertions(+), 34 deletions(-) diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 7391a92005f..93781063061 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -9,6 +9,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { getPokemonNameWithAffix } from "#app/messages.js"; +import i18next from "i18next"; export enum FormChangeItem { NONE, @@ -357,22 +358,21 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string { const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; const isGmax = formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1; - const isEmax = formChange.formKey.indexOf("eternamax") > -1; + const isEmax = formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1; const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; - const prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? "Foe " : "Wild " : "Your "; if (isMega) { - return `${prefix}${preName} Mega Evolved\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:megaChange", { preName, pokemonName: pokemon.name }); } if (isGmax) { - return `${prefix}${preName} Gigantamaxed\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:gigantamaxChange", { preName, pokemonName: pokemon.name }); } if (isEmax) { - return `${prefix}${preName} Eternamaxed\ninto ${pokemon.name}!`; + return i18next.t("battlePokemonForm:eternamaxChange", { preName, pokemonName: pokemon.name }); } if (isRevert) { - return `${prefix}${getPokemonNameWithAffix(pokemon)} reverted\nto its original form!`; + return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) }); } - return `${prefix}${preName} changed form!`; + return i18next.t("battlePokemonForm:formChange", { preName }); } /** diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index bd13dd75473..77134cca190 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -630,7 +630,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } if (key) { - return i18next.t(`pokemonForm:${key}`, {pokemonName: this.name}); + return i18next.t(`battlePokemonForm:${key}`, {pokemonName: this.name}); } } return this.name; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index b01f8343b29..d0779c9eec4 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const deConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/de/pokemon-form.ts b/src/locales/de/pokemon-form.ts index ee4e3a8f9be..53ecc310411 100644 --- a/src/locales/de/pokemon-form.ts +++ b/src/locales/de/pokemon-form.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { +export const battlePokemonForm: SimpleTranslationEntries = { // Battle forms "mega": "Mega-{{pokemonName}}", "mega-x": "Mega-{{pokemonName}} X", @@ -9,6 +9,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "G-Dyna-{{pokemonName}}", "eternamax": "U-Dyna-{{pokemonName}}", + "megaChange": "{{preName}} hat sich zu {{pokemonName}} mega-entwickelt!", + "gigantamaxChange": "{{preName}} hat sich zu {{pokemonName}} gigadynamaximiert!", + "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", + "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", + "formChange": "{{preName}} hat seine Form geändert!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Cosplay", diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index ee180163eb1..a98dd750fbe 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -39,7 +39,7 @@ import { nature } from "./nature"; import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const enConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/en/pokemon-form.ts b/src/locales/en/pokemon-form.ts index b80819d5c64..e8d6fb8df4a 100644 --- a/src/locales/en/pokemon-form.ts +++ b/src/locales/en/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "G-Max {{pokemonName}}", "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}} Mega Evolved\ninto {{pokemonName}}!", + "gigantamaxChange": "{{preName}} Gigantamaxed\ninto {{pokemonName}}!", + "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", + "revertChange": "{{pokemonName}} reverted\nto its original form!", + "formChange": "{{preName}} changed form!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Cosplay", diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index ed2477aa14d..ce9ad19aac3 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const esConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/es/pokemon-form.ts b/src/locales/es/pokemon-form.ts index 415593b0446..96e40bcfbbd 100644 --- a/src/locales/es/pokemon-form.ts +++ b/src/locales/es/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "G-Max {{pokemonName}}", "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}} Mega Evolved\ninto {{pokemonName}}!", + "gigantamaxChange": "{{preName}} Gigantamaxed\ninto {{pokemonName}}!", + "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", + "revertChange": "{{pokemonName}} reverted\nto its original form!", + "formChange": "{{preName}} changed form!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Coqueta", diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 153e9edcf1d..246ae9a073f 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const frConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/fr/pokemon-form.ts b/src/locales/fr/pokemon-form.ts index 09714f80f3b..f96931fd0e9 100644 --- a/src/locales/fr/pokemon-form.ts +++ b/src/locales/fr/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Méga-{{pokemonName}}", "mega-x": "Méga-{{pokemonName}} X", "mega-y": "Méga-{{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "{{pokemonName}} Gigamax", "eternamax": "{{pokemonName}} Infinimax", + "megaChange": "{{preName}} méga-évolue\nen {{pokemonName}} !", + "gigantamaxChange": "{{preName}} se gigamaxe\nen {{pokemonName}} !", + "eternamaxChange": "{{preName}} devient\n{{pokemonName}} !", + "revertChange": "{{pokemonName}} retourne\nà sa forme initiale !", + "formChange": "{{preName}} change de forme !", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Cosplayeur", diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index a6cb95c20eb..ceb52665796 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const itConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/it/pokemon-form.ts b/src/locales/it/pokemon-form.ts index 1831e1f600e..eb5d132bacd 100644 --- a/src/locales/it/pokemon-form.ts +++ b/src/locales/it/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "GigaMax {{pokemonName}}", "eternamax": "EternaMax {{pokemonName}}", + "megaChange": "{{preName}} si evolve\nin {{pokemonName}}!", + "gigantamaxChange": "{{preName}} si Gigamaxxizza\nin {{pokemonName}}!", + "eternamaxChange": "{{preName}} si Dynamaxxa infinitamente\nin {{pokemonName}}!", + "revertChange": "{{pokemonName}} è tornato\nalla sua forma originaria!", + "formChange": "{{preName}} ha cambiato forma!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Cosplay", diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index f3017dd350e..114950a4d35 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -1,4 +1,3 @@ -import { pokemonForm } from "./pokemon-form"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { arenaFlyout } from "./arena-flyout"; @@ -37,6 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const koConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/ko/pokemon-form.ts b/src/locales/ko/pokemon-form.ts index 06bc743f1a1..78c9a762233 100644 --- a/src/locales/ko/pokemon-form.ts +++ b/src/locales/ko/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "메가{{pokemonName}}", "mega-x": "메가{{pokemonName}}X", "mega-y": "메가{{pokemonName}}Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "거다이맥스 {{pokemonName}}", "eternamax": "무한다이맥스 {{pokemonName}}", + "megaChange": "{{preName}}[[는]]\n{{pokemonName}}[[로]] 메가진화했다!", + "gigantamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", + "eternamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", + "revertChange": "{{pokemonName}}[[는]]\n원래 모습으로 되돌아왔다!", + "formChange": "{{preName}}[[는]]\n다른 모습으로 변화했다!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "옷갈아입기", diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index ce4576646c2..5f7582dca63 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -39,7 +39,7 @@ import { nature } from "./nature"; import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const ptBrConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/pt_BR/pokemon-form.ts b/src/locales/pt_BR/pokemon-form.ts index 04d362e7538..6c7c649862a 100644 --- a/src/locales/pt_BR/pokemon-form.ts +++ b/src/locales/pt_BR/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,15 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "G-Max {{pokemonName}}", "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}} Mega Evoluiu\npara {{pokemonName}}!", + "gigantamaxChange": "{{preName}} Gigantamaxou\npara {{pokemonName}}!", + "eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!", + "revertChange": "{{pokemonName}} voltou\npara sua forma original!", + "formChange": "{{preName}} mudou de forma!", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { + // Starters forms // 1G "pikachuCosplay": "Cosplay", diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 8f00168c58c..24c8b870ffa 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const zhCnConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/zh_CN/pokemon-form.ts b/src/locales/zh_CN/pokemon-form.ts index 9cba58838b6..8fb82712e64 100644 --- a/src/locales/zh_CN/pokemon-form.ts +++ b/src/locales/zh_CN/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "超极巨{{pokemonName}}", "eternamax": "无极巨{{pokemonName}}", + "megaChange": "{{preName}}超级进化成了\n{{pokemonName}}!", + "gigantamaxChange": "{{preName}}超极巨化成了\n{{pokemonName}}!", + "eternamaxChange": "{{preName}}无极巨化成了\n{{pokemonName}}!", + "revertChange": "{{pokemonName}}变回了\n原本的样子!", + "formChange": "{{preName}}变成其他样子了。", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "服装", diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 7a974d58fc3..004ed1da1ab 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -36,7 +36,7 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm } from "./pokemon-form"; +import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -62,6 +62,7 @@ export const zhTwConfig = { battle: battle, battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlePokemonForm: battlePokemonForm, battlerTags: battlerTags, berry: berry, bgmName: bgmName, diff --git a/src/locales/zh_TW/pokemon-form.ts b/src/locales/zh_TW/pokemon-form.ts index 2ab936b36da..aa30840fcc0 100644 --- a/src/locales/zh_TW/pokemon-form.ts +++ b/src/locales/zh_TW/pokemon-form.ts @@ -1,7 +1,6 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; -export const pokemonForm: SimpleTranslationEntries = { - // Battle forms +export const battlePokemonForm: SimpleTranslationEntries = { "mega": "Mega {{pokemonName}}", "mega-x": "Mega {{pokemonName}} X", "mega-y": "Mega {{pokemonName}} Y", @@ -9,6 +8,14 @@ export const pokemonForm: SimpleTranslationEntries = { "gigantamax": "G-Max {{pokemonName}}", "eternamax": "E-Max {{pokemonName}}", + "megaChange": "{{preName}}超級進化成了\n{{pokemonName}}!", + "gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}!", + "eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}!", + "revertChange": "{{pokemonName}}變回了\n原本的樣子!", + "formChange": "{{preName}}變為其他樣子了。", +} as const; + +export const pokemonForm: SimpleTranslationEntries = { // Starters forms // 1G "pikachuCosplay": "Cosplay", From e042dafcec5813b79ca0c0abfda8a0984617c13b Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Fri, 2 Aug 2024 11:46:04 +0900 Subject: [PATCH 111/321] [Bug] fix sort by cost bug in starter select (#3294) --- src/ui/starter-select-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 08111908dda..4b1da435d52 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1966,6 +1966,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterContainer.forEach(container => { container.setVisible(false); + container.cost = this.scene.gameData.getSpeciesStarterValue(container.species.speciesId); + // First, ensure you have the caught attributes for the species else default to bigint 0 const caughtVariants = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); From 9655ddc11792cc3f6d958007385d2f65db71d1cb Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 1 Aug 2024 21:50:09 -0700 Subject: [PATCH 112/321] [Test] Remove held items and abilities from test (#3295) --- src/test/moves/octolock.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 6d5f404d2f4..8ef161d2131 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -8,7 +8,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { removeEnemyHeldItems, SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Octolock", () => { describe("integration tests", () => { @@ -32,15 +32,16 @@ describe("Moves - Octolock", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyMoveset(SPLASH_ONLY); - game.override.enemyAbility(Abilities.NONE); + game.override.enemyAbility(Abilities.BALL_FETCH); game.override.startingLevel(2000); game.override.moveset([Moves.OCTOLOCK, Moves.SPLASH]); - game.override.ability(Abilities.NONE); + game.override.ability(Abilities.BALL_FETCH); }); it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => { await game.startBattle([Species.GRAPPLOCT]); + removeEnemyHeldItems(game.scene); const enemyPokemon = game.scene.getEnemyField(); @@ -62,6 +63,7 @@ describe("Moves - Octolock", () => { it("Traps the target pokemon", { timeout: 10000 }, async () => { await game.startBattle([Species.GRAPPLOCT]); + removeEnemyHeldItems(game.scene); const enemyPokemon = game.scene.getEnemyField(); From ffb7f17be1303b7c4f07df5ca3c222b9d3bda547 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Thu, 1 Aug 2024 21:51:18 -0700 Subject: [PATCH 113/321] [Documentation] Document `EnemyCommandPhase` and Enemy AI functions (#3092) * Create enemy-ai.md * Finish enemy-ai doc * Fix outspeed logic + document enemy command functions * Fix errors in target score formula * Add example section and implementation guidelines * Add info on matchup score range * Fix GitHub rendering issues (maybe) * Add types to function comments * Trying to fix GitHub rendering issues again * Use images for "cases" equations instead --- docs/enemy-ai.md | 224 +++++++++++++++++++++++++++++++++++++++++++ src/field/pokemon.ts | 88 +++++++++++++++-- src/phases.ts | 19 ++++ 3 files changed, 321 insertions(+), 10 deletions(-) create mode 100644 docs/enemy-ai.md diff --git a/docs/enemy-ai.md b/docs/enemy-ai.md new file mode 100644 index 00000000000..f53a8511893 --- /dev/null +++ b/docs/enemy-ai.md @@ -0,0 +1,224 @@ +# EnemyCommandPhase: How Enemy Pokémon Decide What to Do + +## Step 1: Should the Enemy Pokémon Switch? + +When battling an enemy Trainer, the first decision the enemy needs to make is whether or not to switch an active Pokémon with another Pokémon in their party. This decision is primarily made by comparing **matchup scores** between each Pokémon in the enemy's party. + +### Calculating Matchup Scores + +The core function for matchup score calculation can be found in `src/field/pokemon.ts`, within the `Pokemon` class: + +```ts +getMatchupScore(pokemon: Pokemon): number; +``` + +This computes the source Pokémon's matchup score against the Pokémon passed by argument using the formula + +$$\text{MUScore} = (\text{atkScore}+\text{defScore}) * \text{hpDiffRatio} $$ + +where +- $\text{atkScore}$ is the combined effectiveness of the source Pokémon's types against the opposing Pokémon's defensive typing: $\prod_{\text{types}} \text{typeEffectiveness}(\text{type}, \text{oppPokemon})$. $\text{typeEffectiveness}$ is 1 when the type deals neutral damage to the opposing Pokémon's defensive typing, 2 when the type deals super effective damage, and so on. $atkScore$ is also increased by 25 percent if the source Pokémon has a higher Speed stat than the opposing Pokémon. +- $\text{defScore}$ is the inverse of the opposing Pokémon's $\text{atkScore}$ against the source Pokémon's defensive typing, or $(\prod_{\text{types}} \text{typeEffectiveness}(\text{type}, \text{sourcePokemon}))^{-1}$. Unlike $\text{atkScore}$, $\text{defScore}$ is capped at a maximum score of 4. +- $\text{hpDiffRatio}= \text{sourceHpRatio}-\text{oppHpRatio}+1$. This is further multiplied by 1.5 if the source Pokémon has a higher Speed stat than the opposing Pokémon; however, $\text{hpDiffRatio}$ cannot be higher than 1. + +The maximum possible matchup score a Pokémon could have against a single opponent is $(16+16)\times 2=64$, which occurs when +- the Pokémon hits its opponent for 4x super effective damage with both of its types. +- the Pokémon is immune to or resists both of the opponent's types by 4x. +- the Pokémon is at max HP while the opponent's HP ratio is near zero. + +In most situations, though, a Pokémon's matchup score against an opponent will be at most 16, which is equivalent to having two super effective types and resisting both of the opponent's types with the same HP ratios as before. + +The minimum possible matchup score a Pokémon could have against a single opponent is near zero, which occurs when the Pokémon's HP ratio is near zero while the opponent is at max HP. However, a Pokémon's matchup score can also be very low when its type(s) are 4x weak to and/or resisted by its opponent's types. + +### Determining Switches in EnemyCommandPhase + +The `EnemyCommandPhase` follows this process to determine whether or not an enemy Pokémon should switch on each turn during a Trainer battle. + +1. If the Pokémon has a move already queued (e.g. they are recharging after using Hyper Beam), or they are trapped (e.g. by Bind or Arena Trap), skip to resolving a `FIGHT` command (see next section). +2. For each Pokémon in the enemy's party, [compute their matchup scores](#calculating-matchup-scores) against the active player Pokémon. If there are two active player Pokémon in the battle, add their matchup scores together. +3. Take the party member with the highest matchup score and apply a multiplier to the score that reduces the score based on how frequently the enemy trainer has switched Pokémon in the current battle. + - The multiplier scales off of a counter that increments when the enemy trainer chooses to switch a Pokémon and decrements when they choose to use a move. +4. Compare the result of Step 3 with the active enemy Pokémon's matchup score. If the party member's matchup score is at least three times that of the active Pokémon, switch to that party member. + - "Boss" trainers only require the party member's matchup score to be at least two times that of the active Pokémon, so they are more likely to switch than other trainers. The full list of boss trainers in the game is as follows: + - All gym leaders, Elite 4 members, and Champions + - All Evil Team leaders + - The last three Rival Fights (on waves 95, 145, and 195) +5. If the enemy decided to switch, send a switch `turnCommand` and end this `EnemyCommandPhase`; otherwise, move on to resolving a `FIGHT` enemy command. + +## Step 2: Selecting a Move + +At this point, the enemy (a wild or trainer Pokémon) has decided against switching and instead will use a move from its moveset. However, it still needs to figure out which move to use and, if applicable, which target to use the move against. The logic for determining an enemy's next move and target is contained within two methods: `EnemyPokemon.getNextMove()` and `EnemyPokemon.getNextTargets()` in `src/field/pokemon.ts`. + +### Choosing a Move with `getNextMove()` + +In `getNextMove()`, the enemy Pokémon chooses a move to use in the following steps: +1. If the Pokémon has a move in its Move Queue (e.g. the second turn of a charging move), and the queued move is still usable, use that move against the given target. +2. Filter out any moves it can't use within its moveset. The remaining moves make up the enemy's **move pool** for the turn. + 1. A move can be unusable if it has no PP left or it has been disabled by another move or effect + 2. If the enemy's move pool is empty, use Struggle. +3. Calculate the **move score** of each move in the enemy's move pool. + 1. A move's move score is equivalent to the move's maximum **target score** among all of the move's possible targets on the field ([more on this later](#calculating-move-and-target-scores)). + 2. A move's move score is set to -20 if at least one of these conditions are met: + - The move is unimplemented (or, more precisely, the move's name ends with " (N)"). + - Conditions for the move to succeed are not met (unless the move is Sucker Punch, Upper Hand, or Thunderclap, as those moves' conditions can't be resolved before the turn starts). + - The move's target scores are 0 or `NaN` for each target. In this case, the game assumes the target score calculation for that move is unimplemented. +4. Sort the move pool in descending order of move scores. +5. From here, the enemy's move selection varies based on its `aiType`. If the enemy is a Boss Pokémon or has a Trainer, it uses the `SMART` AI type; otherwise, it uses the `SMART_RANDOM` AI type. + 1. Let $m_i$ be the *i*-th move in the sorted move pool $M$: + - If `aiType === SMART_RANDOM`, the enemy has a 5/8 chance of selecting $m_0$ and a 3/8 chance of advancing to the next best move $m_1$, where it then repeats this roll. This process stops when a move is selected or the last move in the move pool is reached. + - If `aiType === SMART`, a similar loop is used to decide between selecting the move $m_i$ and advancing to the next iteration with the move $m_{i+1}$. However, instead of using a flat probability, the following conditions need to be met to advance from selecting $m_i$ to $m_{i+1}$: + - $\text{sign}(s_i) = \text{sign}(s_{i+1})$, where $s_i$ is the move score of $m_i$. + - $\text{randInt}(0, 100) < \text{round}(\frac{s_{i+1}}{s_i}\times 50)$. In other words: if the scores of $m_i$ and $m_{i+1}$ have the same sign, the chance to advance to the next iteration with $m_{i+1}$ is proportional to how close the scores are to each other. The probability to advance to the next iteration is at most 50 percent (when $s_i$ and $s_{i+1}$ are equal). +6. The enemy will use the move selected in Step 5 against the target(s) with the highest [**target selection score (TSS)**](#choosing-targets-with-getnexttargets) + +### Calculating Move and Target Scores + +As part of the move selection process, the enemy Pokémon must compute a **target score (TS)** for each legal target for each move in its move pool. The base target score for all moves is a combination of the move's **user benefit score (UBS)** and **target benefit score (TBS)**. + +![equation](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BTS%7D=%5Ctext%7BUBS%7D+%5Ctext%7BTBS%7D%5Ctimes%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D-1&%5Ctext%7Bif%20target%20is%20an%20opponent%7D%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + +A move's UBS and TBS are computed with the respective functions in the `Move` class: + +```ts +getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; +getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; +``` + +Logically, these functions are very similar – they add up their respective benefit scores from each of the move's attributes (as determined by `attr.getUserBenefitScore`, and `attr.getTargetBenefitScore`, respectively) and return the total benefit score. However, there are two key functional differences in how the UBS and TBS of a move are handled: +1. In addition to influencing move selection, a move's TBS also influences target selection for that move, whereas UBS has no influence. +2. When evaluating the target score of a move against an opposing Pokémon, the move's TBS is multiplied by -1, whereas the move's UBS does not change. For this reason, move attributes return negative values for their TBS to reward using the move against an enemy. + +#### Calculating Target Benefit Score (TBS) for Attack Moves + +In addition to the base score from `Move.getTargetBenefitScore()`, attack moves calculate an `attackScore` which influences the move's TBS based on the following properties: +- The move's power (after the move's `VariablePowerAttrs` are applied) +- The move's type effectiveness against the target (note that this also accounts for type immunities from abilities such as Levitate and field effects such as Strong Winds). +- The move's category (Physical/Special), and whether the user has a higher Attack or Special Attack stat. + +More specifically, the following steps are taken to compute the move's `attackScore`: +1. Compute a multiplier based on the move's type effectiveness: + + ![typeMultEqn](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D%5Cbg%7Bwhite%7D%5Ctext%7BtypeMult%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D2&&%5Ctext%7Bif%20move%20is%20super%20effective(or%20better)%7D%5C%5C-2&&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +2. Compute a multiplier based on the move's category and the user's offensive stats: + 1. Compute the user's offensive stat ratio: + + ![statRatioEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BstatRatio%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%5Cfrac%7B%5Ctext%7BuserSpAtk%7D%7D%7B%5Ctext%7BuserAtk%7D%7D&%5Ctext%7Bif%20move%20is%20physical%7D%5C%5C%5Cfrac%7B%5Ctext%7BuserAtk%7D%7D%7B%5Ctext%7BuserSpAtk%7D%7D&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + 2. Compute the stat-based multiplier: + + ![statMultEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BstatMult%7D=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D2&%5Ctext%7Bif%20statRatio%7D%5Cle%200.75%5C%5C1.5&%5Ctext%7Bif%5C;%7D0.75%5Cle%5Ctext%7BstatRatio%7D%5Cle%200.875%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +3. Calculate the move's `attackScore`: + + $\text{attackScore} = (\text{typeMult}\times \text{statMult})+\lfloor \frac{\text{power}}{5} \rfloor$ + +The maximum total multiplier in `attackScore` ($\text{typeMult}\times \text{statMult}$) is 4, which occurs for attacks that are super effective against the target and are categorically aligned with the user's offensive stats (e.g. the move is physical, and the user has much higher Attack than Sp. Atk). The minimum total multiplier of -4 occurs (somewhat confusingly) for attacks that are not super effective but are categorically aligned with the user's offensive stats. + +The attack move's total TBS, then, is $\text{TBS}=\text{baseScore}-\text{attackScore}$, where $\text{baseScore}$ is the result of `Move.getTargetBenefitScore()`. + +#### Calculating Target Score (TS) for Attack Moves + +The final step to calculate an attack move's target score (TS) is to multiply the base target score by the move's type effectiveness and STAB (if it applies): +- If the target is an enemy, the corresponding TS is multiplied by the move's type effectiveness against the enemy (e.g. 2 if the move is super effective), then by 1.5 if the move shares a type with the user. +- If the target is an ally, the TS is divided by these factors instead. +- If $\text{TS}=0$ after these multipliers are applied, the TS is set to -20 for the current target. + +### Choosing Targets with `getNextTargets()` + +The enemy's target selection for single-target moves works in a very similar way to its move selection. Each potential target is given a **target selection score (TSS)** which is based on the move's [target benefit score](#calculating-move-and-target-scores) for that target: + +![TSSEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7D%5Ctext%7BTSS%7D=%5Ctext%7BTBS%7D%5Ctimes%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D-1&%5Ctext%7Bif%20target%20is%20an%20opponent%7D%5C%5C1&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) + +Once the TSS is calculated for each target, the target is selected as follows: +1. Sort the targets (indexes) in decreasing order of their target selection scores (or weights). Let $t_i$ be the index of the *i*-th target in the sorted list, and let $w_i$ be that target's corresponding TSS. +2. Normalize the weights. Let $w_n$ be the lowest-weighted target in the sorted list, then: + + ![normWeightEqn](https://latex.codecogs.com/png.image?%5Cinline%20%5Cdpi%7B100%7D%5Cbg%7Bwhite%7DW_i=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7Dw_i+%7Cw_n%7C&%5Ctext%7Bif%5C;%7Dw_n%5C;%5Ctext%7Bis%20negative%7D%5C%5Cw_i&%5Ctext%7Botherwise%7D%5C%5C%5Cend%7Bmatrix%7D%5Cright.) +3. Remove all weights from the list such that $W_i < \frac{W_0}{2}$ +4. Generate a random integer $R=\text{rand}(0, W_{\text{total}})$ where $W_{\text{total}}$ is the sum of all the remaining weights after Step 3. +5. For each target $(t_i, W_i)$, + 1. if $R \le \sum_{j=0}^{i} W_i$, or if $t_i$ is the last target in the list, **return** $t_i$ + 2. otherwise, advance to the next target $t_{i+1}$ and repeat this check. + +Once the target is selected, the enemy has successfully determined its next action for the turn, and its corresponding `EnemyCommandPhase` ends. From here, the `TurnStartPhase` processes the enemy's commands alongside the player's commands and begins to resolve the turn. + +## An Example in Battle + +Suppose you enter a single battle against an enemy trainer with the following Pokémon in their party: + +1. An [Excadrill](https://bulbapedia.bulbagarden.net/wiki/Excadrill_(Pok%C3%A9mon)) with the Ability Sand Force and the following moveset + 1. Earthquake + 2. Iron Head + 3. Crush Claw + 4. Swords Dance +2. A [Heatmor](https://bulbapedia.bulbagarden.net/wiki/Heatmor_(Pok%C3%A9mon)) with the Ability Flash Fire and the following moveset + 1. Fire Lash + 2. Inferno + 3. Hone Claws + 4. Shadow Claw + +The enemy trainer leads with their Heatmor, and you lead with a [Dachsbun](https://bulbapedia.bulbagarden.net/wiki/Dachsbun_(Pok%C3%A9mon)) with the Ability Well-Baked Body. We'll cover the enemy's behavior over the next two turns. + +### Turn 1 + +To determine whether the enemy should switch Pokémon, it first calculates each party member's matchup scores against the player's Dachsbun: + +$$\text{MUScore} = (\text{atkScore}+\text{defScore}) * \text{hpDiffRatio} $$ +- Defensively, Heatmor's Fire typing resists Dachsbun's Fairy typing, so its `defScore` is 2. However, because of Dachsbun's Fire immunity granted by Well-Baked Body, Heatmor's `atkScore` against Dachsbun is 0. With both Pokémon at maximum HP, Heatmor's total matchup score is 2. +- Excadrill's Steel typing also resists Fairy, so its `defScore` is also 2. In this case, though, Steel is also super effective against Fairy, so Excadrill's base `atkScore` is 2. If Excadrill outspeeds Dachsbun (possibly due to it having a +Spd nature or holding a Carbos), its `atkScore` is further increased to 2.5. Since both Pokémon are at maximum HP, Excadrill's total matchup score is 4 (or 4.5 if it outspeeds). + +Based on the enemy party's matchup scores, whether or not the trainer switches out Heatmor for Excadrill depends on the trainer's type. The difference in matchup scores is enough to cause a switch to Excadrill for boss trainers (e.g. gym leaders) but not for regular trainers. For this example, we'll assume the trainer is a boss and, therefore, decides to switch to Excadrill on this turn. + +### Turn 2 + +Now that the enemy Pokémon with the best matchup score is on the field (assuming it survives Dachsbun's attack on the last turn), the enemy will now decide to have Excadrill use one of its moves. Assuming all of its moves are usable, we'll go through the target score calculations for each move: + +- **Earthquake**: In a single battle, this move is just a 100-power Ground-type physical attack with no additional effects. With no additional benefit score from attributes, the move's base target score against the player's Dachsbun is just the `attackScore` from `AttackMove.getTargetBenefitScore()`. In this case, Earthquake's `attackScore` is given by + + $\text{attackScore}=(\text{typeMult}\times \text{statMult}) + \lfloor \frac{\text{power}}{5} \rfloor = -2\times 2 + 20 = 16$ + + Here, `typeMult` is -2 because the move is not super effective, and `statMult` is 2 because Excadrill's Attack is significantly higher than its Sp. Atk. Accounting for STAB thanks to Excadrill's typing, the final target score for this move is **24** + +- **Iron Head**: This move is an 80-power Steel-type physical attack with an additional chance to cause the target to flinch. With these properties, Iron Head has a user benefit score of 0 and a target benefit score given by + + $\text{TBS}=\text{getTargetBenefitScore(FlinchAttr)}-\text{attackScore}$ + + Under its current implementation, the target benefit score of `FlinchAttr` is -5. Calculating the move's `attackScore`, we get: + + $\text{attackScore}=(\text{typeMult}\times \text{statMult}) + \lfloor \frac{\text{power}}{5} \rfloor = 2\times 2 + 16 = 20$ + + Note that `typeMult` in this case is 2 because Iron Head is super effective (or better) against Dachsbun. With the move's UBS at 0, the base target score calculation against Dachsbun simplifies to + + $\text{TS}=-\text{TBS}=-(-5-20)=25$ + + We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**. + +- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to + + $\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$ + + where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score). + +- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score. + + $\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\text{attackScore}$ + + $\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$ + + $\text{TS}=-\text{TBS}=13$ + + This move is neutral against Dachsbun and isn't boosted by STAB from Excadrill, so we don't need to apply any extra multipliers. The final score for this move is **13**. + +We now have a sorted move pool in decreasing order of move scores: +1. Iron Head (**75**) +2. Earthquake (**24**) +3. Crush Claw (**13**) +4. Swords Dance (**6**) + +Since no other score is at least half that of Iron Head's score, the enemy AI automatically chooses to use Iron Head against Dachsbun at this point. + +## Guidelines for Implementing Benefit Scores + +When implementing a new move attribute, it's important to override `MoveAttr`'s `getUserBenefitScore` and `getTargetBenefitScore` functions to ensure that the enemy AI can accurately determine when and how to use moves with that attribute. Here are a few basic specifications you should adhere to when implementing benefit scores for a new attribute: +- A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive. +- A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies. +- **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario. +- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making. \ No newline at end of file diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 2ed1b7e7355..22d0410233f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1251,19 +1251,39 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return multiplier; } - getMatchupScore(pokemon: Pokemon): number { + /** + * Computes the given Pokemon's matchup score against this Pokemon. + * In most cases, this score ranges from near-zero to 16, but the maximum possible matchup score is 64. + * @param opponent {@linkcode Pokemon} The Pokemon to compare this Pokemon against + * @returns A score value based on how favorable this Pokemon is when fighting the given Pokemon + */ + getMatchupScore(opponent: Pokemon): number { const types = this.getTypes(true); - const enemyTypes = pokemon.getTypes(true, true); - const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, pokemon) : this.getStat(Stat.SPD)) <= pokemon.getBattleStat(Stat.SPD, this); - let atkScore = pokemon.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); - let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], pokemon), 0.25); + const enemyTypes = opponent.getTypes(true, true); + /** Is this Pokemon faster than the opponent? */ + const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, opponent) : this.getStat(Stat.SPD)) >= opponent.getBattleStat(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); + /** + * 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); if (types.length > 1) { - atkScore *= pokemon.getAttackTypeEffectiveness(types[1], this); + atkScore *= opponent.getAttackTypeEffectiveness(types[1], this); } if (enemyTypes.length > 1) { - defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], pokemon), 0.25)); + defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], opponent), 0.25)); } - let hpDiffRatio = this.getHpRatio() + (1 - pokemon.getHpRatio()); + /** + * Based on this Pokemon's HP ratio compared to that of the opponent. + * This ratio is multiplied by 1.5 if this Pokemon outspeeds the opponent; + * however, the final ratio cannot be higher than 1. + */ + let hpDiffRatio = this.getHpRatio() + (1 - opponent.getHpRatio()); if (outspeed) { hpDiffRatio = Math.min(hpDiffRatio * 1.5, 1); } @@ -3665,7 +3685,13 @@ export class EnemyPokemon extends Pokemon { } } + /** + * Determines the move this Pokemon will use on the next turn, as well as + * the Pokemon the move will target. + * @returns this Pokemon's next move in the format {move, moveTargets} + */ getNextMove(): QueuedMove { + // If this Pokemon has a move already queued, return it. const queuedMove = this.getMoveQueue().length ? this.getMoveset().find(m => m.moveId === this.getMoveQueue()[0].move) : null; @@ -3678,11 +3704,15 @@ export class EnemyPokemon extends Pokemon { } } + // Filter out any moves this Pokemon cannot use const movePool = this.getMoveset().filter(m => m.isUsable(this)); + // If no moves are left, use Struggle. Otherwise, continue with move selection if (movePool.length) { + // If there's only 1 move in the move pool, use it. if (movePool.length === 1) { return { move: movePool[0].moveId, targets: this.getNextTargets(movePool[0].moveId) }; } + // 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); @@ -3691,11 +3721,16 @@ export class EnemyPokemon extends Pokemon { } } switch (this.aiType) { - case AiType.RANDOM: + case AiType.RANDOM: // No enemy should spawn with this AI type in-game const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)].moveId; return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: + /** + * 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) ])); for (const m in movePool) { @@ -3712,14 +3747,26 @@ export class EnemyPokemon extends Pokemon { } const target = this.scene.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); 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)) { 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.getAttackMoveEffectiveness(this, pokemonMove); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; @@ -3732,13 +3779,14 @@ export class EnemyPokemon extends Pokemon { targetScore /= 1.5; } } + /** If a move has a base benefit score of 0, its benefit score is assumed to be unimplemented at this point */ if (!targetScore) { targetScore = -20; } } targetScores.push(targetScore); } - + // When a move has multiple targets, its score is equal to the maximum target score across all targets moveScore += Math.max(...targetScores); // could make smarter by checking opponent def/spdef @@ -3747,6 +3795,7 @@ export class EnemyPokemon extends Pokemon { console.log(moveScores); + // Sort the move pool in decreasing order of move score const sortedMovePool = movePool.slice(0); sortedMovePool.sort((a, b) => { const scoreA = moveScores[movePool.indexOf(a)]; @@ -3755,10 +3804,12 @@ 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 && this.scene.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 && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { r++; @@ -3772,15 +3823,25 @@ export class EnemyPokemon extends Pokemon { return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) }; } + /** + * Determines the Pokemon the given move would target if used by this Pokemon + * @param moveId {@linkcode Moves} The move to be used + * @returns The indexes of the Pokemon the given move would target + */ getNextTargets(moveId: Moves): BattlerIndex[] { const moveTargets = getMoveTargets(this, moveId); const targets = this.scene.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()); } const move = allMoves[moveId]; + /** + * 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) ]); @@ -3804,12 +3865,14 @@ export class EnemyPokemon extends Pokemon { let targetWeights = sortedBenefitScores.map(s => s[1]); const lowestWeight = targetWeights[targetWeights.length - 1]; + // If the lowest target weight (i.e. benefit score) is negative, add abs(lowestWeight) to all target weights if (lowestWeight < 1) { for (let w = 0; w < targetWeights.length; w++) { targetWeights[w] += Math.abs(lowestWeight - 1); } } + // 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); if (benefitCutoffIndex > -1) { targetWeights = targetWeights.slice(0, benefitCutoffIndex); @@ -3824,6 +3887,11 @@ export class EnemyPokemon extends Pokemon { return total; }, 0); + /** + * Generate a random number from 0 to (totalWeight-1), + * then select the first target whose cumulative weight (with all previous targets' weights) + * is greater than that random number. + */ const randValue = this.scene.randBattleSeedInt(totalWeight); let targetIndex: integer; diff --git a/src/phases.ts b/src/phases.ts index dfadcaf2767..a7ab9ad6e51 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2168,6 +2168,15 @@ export class CommandPhase extends FieldPhase { } } +/** + * Phase for determining an enemy AI's action for the next turn. + * During this phase, the enemy decides whether to switch (if it has a trainer) + * or to use a move from its moveset. + * + * For more information on how the Enemy AI works, see docs/enemy-ai.md + * @see {@linkcode Pokemon.getMatchupScore} + * @see {@linkcode EnemyPokemon.getNextMove} + */ export class EnemyCommandPhase extends FieldPhase { protected fieldIndex: integer; @@ -2186,6 +2195,15 @@ export class EnemyCommandPhase extends FieldPhase { const trainer = battle.trainer; + /** + * 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(); @@ -2217,6 +2235,7 @@ export class EnemyCommandPhase extends FieldPhase { } } + /** Select a move to use (and a target to use it against, if applicable) */ const nextMove = enemyPokemon.getNextMove(); this.scene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = From 8f9ffabeef038748d8eade28d079e1b907f704ec Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Fri, 2 Aug 2024 14:35:13 +0900 Subject: [PATCH 114/321] [Bug] Fix sprites of Pokemon without variants being weird when removed from party in starter select (#3296) --- src/ui/starter-select-ui-handler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 4b1da435d52..ab28da206d1 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2723,6 +2723,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const props = this.scene.gameData.getSpeciesDexAttrProps(species, currentDexAttr); this.starterIcons[s].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[s].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + this.checkIconId(this.starterIcons[s], species, props.female, props.formIndex, props.shiny, props.variant); if (s >= index) { this.starterCursorObjs[s].setPosition(this.starterCursorObjs[s + 1].x, this.starterCursorObjs[s + 1].y); this.starterCursorObjs[s].setVisible(this.starterCursorObjs[s + 1].visible); From abbf4974fdc209390e587d5076c1d3631dfb39ee Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Fri, 2 Aug 2024 01:50:08 -0400 Subject: [PATCH 115/321] [Sprite] Shiny animated Clawitzer using wrong palette (#3297) * [Sprite] Recolour shiny Clawitzer Palette taken from back counterpart * [Sprite] Recolour shiny Clawitzer Palette taken from back counterpart --- public/images/pokemon/exp/shiny/693.png | Bin 5958 -> 6269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/exp/shiny/693.png b/public/images/pokemon/exp/shiny/693.png index 2212a4a5158ac7da653a2f655c8c1157b22c83ea..328c909b19696098011e2c8886cfb4f5ea768631 100644 GIT binary patch literal 6269 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 literal 5958 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 From 302f1e51a0b20ba2c40ff309e58462b69d841284 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:51:20 -0400 Subject: [PATCH 116/321] [Enhancement] Allow Starters to Remember Egg Moves (#2482) * Allow Starters to Remember Egg Moves * Adjust Documentation * Minor NIT --- src/field/pokemon.ts | 39 +++++++++++++++++++++++++++++++++++--- src/system/pokemon-data.ts | 2 ++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 22d0410233f..f2b0d02e245 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -84,6 +84,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -173,6 +174,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : getPokemonSpecies(dataSource.fusionSpecies); @@ -213,6 +215,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.friendship = species.baseFriendship; this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; + this.metSpecies = species.speciesId; this.pokerus = false; if (level > 1) { @@ -885,11 +888,40 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * All moves that could be relearned by this pokemon at this point. Used for memory mushrooms. - * @returns {Moves[]} The valid moves + * Checks which egg moves have been unlocked for the {@linkcode Pokemon} based + * on the species it was met at or by the first {@linkcode Pokemon} in its evolution + * line that can act as a starter and provides those egg moves. + * @returns an array of {@linkcode Moves}, the length of which is determined by how many + * egg moves are unlocked for that species. + */ + getUnlockedEggMoves(): Moves[] { + const moves: Moves[] = []; + 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 (this.scene.gameData.starterData[species].eggMoves & (1 << i)) { + moves.push(speciesEggMoves[species][i]); + } + } + } + return moves; + } + + /** + * Gets all possible learnable level moves for the {@linkcode Pokemon}, + * excluding any moves already known. + * + * Available egg moves are only included if the {@linkcode Pokemon} was + * in the starting party of the run. + * @returns an array of {@linkcode Moves}, the length of which is determined + * by how many learnable moves there are for the {@linkcode Pokemon}. */ getLearnableLevelMoves(): Moves[] { - return this.getLevelMoves(1, true, false, true).map(lm => lm[1]).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); + let levelMoves = this.getLevelMoves(1, true).map(lm => lm[1]); + if (this.metBiome === -1) { + levelMoves = this.getUnlockedEggMoves().concat(levelMoves); + } + return levelMoves.filter(lm => !this.moveset.some(m => m.moveId === lm)); } /** @@ -4075,6 +4107,7 @@ export class EnemyPokemon extends Pokemon { this.pokeball = pokeballType; this.metLevel = this.level; this.metBiome = this.scene.arena.biomeType; + this.metSpecies = this.species.speciesId; const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); party.push(newPokemon); ret = newPokemon; diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 7e8f1e21c07..ca072c9eec8 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -38,6 +38,7 @@ export default class PokemonData { public friendship: integer; public metLevel: integer; public metBiome: Biome | -1; + public metSpecies: Species; public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; @@ -83,6 +84,7 @@ export default class PokemonData { 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.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; From e5f458d2c079b164f6db0148f2d02652f630e7f3 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Fri, 2 Aug 2024 13:02:49 -0400 Subject: [PATCH 117/321] [Bug] Fix affixes appearing when they shouldn't (#3236) * [Hotfix] Fix interactions of some moves not changing types (#3183) * [Hotfix] Fix wild spawns not having their HA (#3190) * Fix some cases of wrong affixes * There are two trainer send out messages --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/phases.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index a7ab9ad6e51..5916fc882cb 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1437,7 +1437,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { this.scene.time.delayedCall(750, () => this.summon()); } else { const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - const pokemonName = getPokemonNameWithAffix(this.getPokemon()); + const pokemonName = this.getPokemon().getNameToRender(); const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); this.scene.pbTrayEnemy.hide(); @@ -1650,7 +1650,7 @@ export class SwitchSummonPhase extends SummonPhase { i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedPokemon) }) : i18next.t("battle:trainerGo", { trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: getPokemonNameWithAffix(this.getPokemon()) + pokemonName: this.getPokemon().getNameToRender() }) ); // Ensure improperly persisted summon data (such as tags) is cleared upon switching @@ -5038,7 +5038,7 @@ export class AttemptCapturePhase extends PokemonPhase { Promise.all([pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon)]).then(() => { if (this.scene.getParty().length === 6) { const promptRelease = () => { - this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { + this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { this.scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); this.scene.ui.setMode(Mode.CONFIRM, () => { const newPokemon = this.scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); From 52ef92ae78912789540aac8cd1c5e2d0bd402024 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Fri, 2 Aug 2024 13:03:46 -0400 Subject: [PATCH 118/321] [Enhancement] Add female and double grunts (#3280) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add female and double grunts, add localizations * Update src/locales/fr/trainers.ts Co-authored-by: Lugiad' * Update src/locales/it/trainers.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Update src/locales/ko/trainers.ts Co-authored-by: Enoch * Update src/locales/pt_BR/trainers.ts Co-authored-by: José Ricardo Fleury Oliveira * Update trainers.ts --------- Co-authored-by: Lugiad' Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: Enoch Co-authored-by: José Ricardo Fleury Oliveira --- src/battle.ts | 37 ++++++++++++++++++++++++----------- src/locales/en/trainers.ts | 6 ++++++ src/locales/es/trainers.ts | 20 ++++++++++++++++++- src/locales/fr/trainers.ts | 8 +++++++- src/locales/it/trainers.ts | 20 ++++++++++++++++++- src/locales/ko/trainers.ts | 6 ++++++ src/locales/pt_BR/trainers.ts | 6 ++++++ src/locales/zh_CN/trainers.ts | 6 ++++++ src/locales/zh_TW/trainers.ts | 18 ++++++++++++++++- 9 files changed, 112 insertions(+), 15 deletions(-) diff --git a/src/battle.ts b/src/battle.ts index b6ae5354e5a..cbe6dee1a4a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -425,7 +425,13 @@ export class FixedBattleConfig { } } -function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): GetTrainerFunc { +/** + * 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 + * @param randomGender whether or not to randomly (50%) generate a female trainer (for use with evil team grunts) + * @returns the generated trainer + */ +function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], randomGender: boolean = false): GetTrainerFunc { return (scene: BattleScene) => { const rand = Utils.randSeedInt(trainerPool.length); const trainerTypes: TrainerType[] = []; @@ -435,11 +441,20 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get : trainerPoolEntry; trainerTypes.push(trainerType); } - // If the trainer type has a double variant, there's a 33% chance of it being a double battle (for now we only allow tate&liza to be double) - if (trainerConfigs[trainerTypes[rand]].trainerTypeDouble && (trainerTypes[rand] === TrainerType.TATE || trainerTypes[rand] === TrainerType.LIZA)) { - return new Trainer(scene, trainerTypes[rand], Utils.randSeedInt(3) ? TrainerVariant.DOUBLE : TrainerVariant.DEFAULT); + let trainerGender = TrainerVariant.DEFAULT; + if (randomGender) { + trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; } - return new Trainer(scene, trainerTypes[rand], 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]; + const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]); + + if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) { + return new Trainer(scene, trainerTypes[rand], (Utils.randInt(3) === 0) ? TrainerVariant.DOUBLE : trainerGender); + } + + return new Trainer(scene, trainerTypes[rand], trainerGender); }; } @@ -462,21 +477,21 @@ export const classicFixedBattles: FixedBattleConfigs = { [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [35]: 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 ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index b59cfdc4fda..8e0394e0786 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -126,17 +126,23 @@ export const trainerClasses: SimpleTranslationEntries = { "workers": "Workers", "youngster": "Youngster", "rocket_grunt": "Rocket Grunt", + "rocket_grunts": "Rocket Grunts", "rocket_grunt_female": "Rocket Grunt", "magma_grunt": "Magma Grunt", "magma_grunt_female": "Magma Grunt", + "magma_grunts": "Magma Grunts", "aqua_grunt": "Aqua Grunt", "aqua_grunt_female": "Aqua Grunt", + "aqua_grunts": "Aqua Grunts", "galactic_grunt": "Galactic Grunt", "galactic_grunt_female": "Galactic Grunt", + "galactic_grunts": "Galactic Grunts", "plasma_grunt": "Plasma Grunt", "plasma_grunt_female": "Plasma Grunt", + "plasma_grunts": "Plasma Grunts", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", + "flare_grunts": "Flare Grunts", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index d5647f83cf6..133cce0785c 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -117,7 +117,25 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Operario", "worker_female": "Operaria", "workers": "Operarios", - "youngster": "Joven" + "youngster": "Joven", + "rocket_grunt": "Rocket Grunt", + "rocket_grunts": "Rocket Grunts", + "rocket_grunt_female": "Rocket Grunt", + "magma_grunt": "Magma Grunt", + "magma_grunt_female": "Magma Grunt", + "magma_grunts": "Magma Grunts", + "aqua_grunt": "Aqua Grunt", + "aqua_grunt_female": "Aqua Grunt", + "aqua_grunts": "Aqua Grunts", + "galactic_grunt": "Galactic Grunt", + "galactic_grunt_female": "Galactic Grunt", + "galactic_grunts": "Galactic Grunts", + "plasma_grunt": "Plasma Grunt", + "plasma_grunt_female": "Plasma Grunt", + "plasma_grunts": "Plasma Grunts", + "flare_grunt": "Flare Grunt", + "flare_grunt_female": "Flare Grunt", + "flare_grunts": "Flare Grunts", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index fc0639d47b9..bc2a959c428 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -127,16 +127,22 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "Gamin", "rocket_grunt": "Sbire de la Team Rocket", "rocket_grunt_female": "Sbire de la Team Rocket", + "rocket_grunts": "Sbires de la Team Rocket", "magma_grunt": "Sbire de la Team Magma", "magma_grunt_female": "Sbire de la Team Magma", + "magma_grunts": "Sbires de la Team Magma", "aqua_grunt": "Sbire de la Team Aqua", "aqua_grunt_female": "Sbire de la Team Aqua", + "aqua_grunts": "Sbires de la Team Aqua", "galactic_grunt": "Sbire de la Team Galaxie", - "galactic_grunt_female": "Sbire Team Galaxie", + "galactic_grunt_female": "Sbire de la Team Galaxie", + "galactic_grunts": "Sbires de la Team Galaxie", "plasma_grunt": "Sbire de la Team Plasma", "plasma_grunt_female": "Sbire de la Team Plasma", + "plasma_grunts": "Sbires de la Team Plasma", "flare_grunt": "Sbire de la Team Flare", "flare_grunt_female": "Sbire de la Team Flare", + "flare_grunts": "Sbires de la Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 420b9bf9f24..260e44bdca8 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -118,7 +118,25 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Operaio", "worker_female": "Lavoratrice", "workers": "Lavoratori", - "youngster": "Bullo" + "youngster": "Bullo", + "rocket_grunt": "Recluta Team Rocket", + "rocket_grunts": "Reclute Team Rocket", + "rocket_grunt_female": "Recluta Team Rocket", + "magma_grunt": "Recluta Team Magma", + "magma_grunt_female": "Recluta Team Magma", + "magma_grunts": "Reclute Team Magma", + "aqua_grunt": "Recluta Team Idro", + "aqua_grunt_female": "Recluta Team Idro", + "aqua_grunts": "Recluta Team Idro", + "galactic_grunt": "Recluta Team Galassia", + "galactic_grunt_female": "Recluta Team Galassia", + "galactic_grunts": "Reclute Team Galassia", + "plasma_grunt": "Seguace Plasma", + "plasma_grunt_female": "Seguace Plasma", + "plasma_grunts": "Seguaci Plasma", + "flare_grunt": "Recluta Team Flare", + "flare_grunt_female": "Recluta Team Flare", + "flare_grunts": "Reclute Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/ko/trainers.ts b/src/locales/ko/trainers.ts index 429ab13b223..aafe4121442 100644 --- a/src/locales/ko/trainers.ts +++ b/src/locales/ko/trainers.ts @@ -127,16 +127,22 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "반바지 꼬마", "rocket_grunt": "로켓단 조무래기", "rocket_grunt_female": "로켓단 조무래기", + "rocket_grunts": "로켓단 조무래기들", "magma_grunt": "마그마단 조무래기", "magma_grunt_female": "마그마단 조무래기", + "magma_grunts": "마그마단 조무래기들", "aqua_grunt": "아쿠아단 조무래기", "aqua_grunt_female": "아쿠아단 조무래기", + "aqua_grunts": "아쿠아단 조무래기들", "galactic_grunt": "갤럭시단 조무래기", "galactic_grunt_female": "갤럭시단 조무래기", + "galactic_grunts": "갤럭시단 조무래기들", "plasma_grunt": "플라스마단 조무래기", "plasma_grunt_female": "플라스마단 조무래기", + "plasma_grunts": "플라스마단 조무래기들", "flare_grunt": "플레어단 조무래기", "flare_grunt_female": "플레어단 조무래기", + "flare_grunts": "플레어단 조무래기들", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 57fbe220412..61a0be25005 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -127,16 +127,22 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "Jovem", "rocket_grunt": "Recruta da Equipe Rocket", "rocket_grunt_female": "Recruta da Equipe Rocket", + "rocket_grunts": "Recrutas da Equipe Rocket", "magma_grunt": "Recruta da Equipe Magma", "magma_grunt_female": "Recruta da Equipe Magma", + "magma_grunts": "Recrutas da Equipe Magma", "aqua_grunt": "Recruta da Equipe Aqua", "aqua_grunt_female": "Recruta da Equipe Aqua", + "aqua_grunts": "Recrutas da Equipe Aqua", "galactic_grunt": "Recruta da Equipe Galáctica", "galactic_grunt_female": "Recruta da Equipe Galáctica", + "galactic_grunts": "Recrutas da Equipe Galáctica", "plasma_grunt": "Recruta da Equipe Plasma", "plasma_grunt_female": "Recruta da Equipe Plasma", + "plasma_grunts": "Recrutas da Equipe Plasma", "flare_grunt": "Recruta da Equipe Flare", "flare_grunt_female": "Recruta da Equipe Flare", + "flare_grunts": "Recrutas da Equipe Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 534685d05d1..e06f2afe2ec 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -127,16 +127,22 @@ export const trainerClasses: SimpleTranslationEntries = { "youngster": "短裤小子", "rocket_grunt": "火箭队手下", "rocket_grunt_female": "火箭队手下", + "rocket_grunts": "火箭队手下们", "magma_grunt": "熔岩队手下", "magma_grunt_female": "熔岩队手下", + "magma_grunts": "熔岩队手下们", "aqua_grunt": "海洋队手下", "aqua_grunt_female": "海洋队手下", + "aqua_grunts": "海洋队手下们", "galactic_grunt": "银河队手下", "galactic_grunt_female": "银河队手下", + "galactic_grunts": "银河队手下们", "plasma_grunt": "等离子队手下", "plasma_grunt_female": "等离子队手下", + "plasma_grunts": "等离子队手下们", "flare_grunt": "闪焰队手下", "flare_grunt_female": "闪焰队手下", + "flare_grunts": "闪焰队手下们", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 594363ce009..2a6c3eac662 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -118,7 +118,23 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "工人", "worker_female": "工人", "workers": "工人組合", - "youngster": "短褲小子" + "youngster": "短褲小子", + "rocket_grunts": "火箭队手下們", + "magma_grunt": "熔岩队手下", + "magma_grunt_female": "熔岩队手下", + "magma_grunts": "熔岩队手下們", + "aqua_grunt": "海洋队手下", + "aqua_grunt_female": "海洋队手下", + "aqua_grunts": "海洋队手下們", + "galactic_grunt": "银河队手下", + "galactic_grunt_female": "银河队手下", + "galactic_grunts": "银河队手下們", + "plasma_grunt": "等离子队手下", + "plasma_grunt_female": "等离子队手下", + "plasma_grunts": "等离子队手下們", + "flare_grunt": "闪焰队手下", + "flare_grunt_female": "闪焰队手下", + "flare_grunts": "闪焰队手下們", } as const; // Names of special trainers like gym leaders, elite four, and the champion From 3a87c8657fa8c65b306a7b7bc883a834002485c2 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Fri, 2 Aug 2024 18:26:49 +0100 Subject: [PATCH 119/321] Disable egg gacha in rewards (#3304) * chore: Refactor excludedMenus logic in MenuUiHandler * Refactor excludedMenus logic in MenuUiHandler * Update src/ui/menu-ui-handler.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> * Refactor excludedMenus logic in MenuUiHandler * chore: Add setup method to MenuUiHandler * Refactor excludedMenus logic in MenuUiHandler --------- Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/ui/menu-ui-handler.ts | 67 ++++++++++++++++++++++++++++----------- src/ui/ui.ts | 4 +++ 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index a0cea2f78d5..65637689d49 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -40,8 +40,8 @@ export default class MenuUiHandler extends MessageUiHandler { private cursorObj: Phaser.GameObjects.Image; - protected ignoredMenuOptions: MenuOptions[]; - protected menuOptions: MenuOptions[]; + private excludedMenus: () => ConditionalMenu[]; + private menuOptions: MenuOptions[]; protected manageDataConfig: OptionSelectConfig; protected communityConfig: OptionSelectConfig; @@ -52,13 +52,19 @@ export default class MenuUiHandler extends MessageUiHandler { constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); - this.ignoredMenuOptions = !bypassLogin - ? [ ] - : [ MenuOptions.LOG_OUT ]; - this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions).filter(m => !this.ignoredMenuOptions.includes(m)); + this.excludedMenus = () => [ + { 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) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); } - setup() { + setup(): void { const ui = this.getUi(); // wiki url directs based on languges available on wiki const lang = i18next.resolvedLanguage.substring(0,2); @@ -80,10 +86,25 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuOverlay.setOrigin(0,0); this.menuContainer.add(this.menuOverlay); - const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); - menuMessageText.setName("menu-message"); - menuMessageText.setWordWrapWidth(1224); - menuMessageText.setOrigin(0, 0); + this.menuContainer.add(this.bgmBar); + + this.menuContainer.setVisible(false); + + } + + + render() { + const ui = this.getUi(); + this.excludedMenus = () => [ + { condition: ![Mode.COMMAND, Mode.TITLE].includes(ui.getModeChain()[0]), 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) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); this.optionSelectText.setLineSpacing(12); @@ -108,10 +129,12 @@ export default class MenuUiHandler extends MessageUiHandler { menuMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageBox); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); + menuMessageText.setWordWrapWidth(1224); + menuMessageText.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); - this.menuContainer.add(this.bgmBar); - this.message = menuMessageText; this.menuContainer.add(this.menuMessageBoxContainer); @@ -270,16 +293,19 @@ export default class MenuUiHandler extends MessageUiHandler { xOffset: 98, options: communityOptions }; - this.setCursor(0); - - this.menuContainer.setVisible(false); } show(args: any[]): boolean { - + this.render(); super.show(args); + this.menuOptions = Utils.getEnumKeys(MenuOptions) + .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .filter(m => { + return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); + }); + this.menuContainer.setVisible(true); this.setCursor(0); @@ -305,7 +331,7 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; - for (const imo of this.ignoredMenuOptions) { + for (const imo of this.excludedMenus().find(e => e.condition).options.sort()) { if (adjustedCursor >= imo) { adjustedCursor++; } else { @@ -506,3 +532,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.cursorObj = null; } } + +interface ConditionalMenu { + condition: boolean; + options: MenuOptions[]; +} diff --git a/src/ui/ui.ts b/src/ui/ui.ts index b409b7c0d78..6061baf3b4a 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -536,4 +536,8 @@ export default class UI extends Phaser.GameObjects.Container { this.revertMode().then(success => Utils.executeIf(success, this.revertModes).then(() => resolve())); }); } + + public getModeChain(): Mode[] { + return this.modeChain; + } } From 0d406b1092ef10ad44cb8140749cf690a044751c Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Fri, 2 Aug 2024 19:20:17 +0100 Subject: [PATCH 120/321] hotfix cursor selection --- src/ui/menu-ui-handler.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 65637689d49..755267fcede 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -331,11 +331,15 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; - for (const imo of this.excludedMenus().find(e => e.condition).options.sort()) { - if (adjustedCursor >= imo) { - adjustedCursor++; - } else { - break; + const excludedMenu = this.excludedMenus().find(e => e.condition); + if (excludedMenu !== null && excludedMenu.options.length > 0) { + const sortedOptions = excludedMenu.options.sort(); + for (const imo of sortedOptions) { + if (adjustedCursor >= imo) { + adjustedCursor++; + } else { + break; + } } } switch (adjustedCursor) { From 2f83e6e2e1f21bd1e8669330432899fb11a247d6 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Fri, 2 Aug 2024 19:28:05 +0100 Subject: [PATCH 121/321] explicit check for options --- src/ui/menu-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 755267fcede..6d70bb27ae5 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -332,7 +332,7 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; const excludedMenu = this.excludedMenus().find(e => e.condition); - if (excludedMenu !== null && excludedMenu.options.length > 0) { + if (excludedMenu !== null && excludedMenu.options !== undefined && excludedMenu.options.length > 0) { const sortedOptions = excludedMenu.options.sort(); for (const imo of sortedOptions) { if (adjustedCursor >= imo) { From 9f68ba867148f39bd8c707b6afe491ebdceab695 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Fri, 2 Aug 2024 21:02:24 +0100 Subject: [PATCH 122/321] null or undefined? who knows. --- src/ui/menu-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 6d70bb27ae5..4710c575ce9 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -332,7 +332,7 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; const excludedMenu = this.excludedMenus().find(e => e.condition); - if (excludedMenu !== null && excludedMenu.options !== undefined && excludedMenu.options.length > 0) { + if (excludedMenu !== undefined && excludedMenu.options !== undefined && excludedMenu.options.length > 0) { const sortedOptions = excludedMenu.options.sort(); for (const imo of sortedOptions) { if (adjustedCursor >= imo) { From 263924feda3acf78ad1aa67087a747c21ea6c76b Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 2 Aug 2024 17:11:54 -0400 Subject: [PATCH 123/321] [Item] Adjust White Herb weight and add Scope Lens to trainer item pool (#3308) --- src/modifier/modifier-type.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 86014d37a5b..235b48067b1 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1569,7 +1569,7 @@ const modifierPool: ModifierPool = { p => !p.getHeldItems().some(i => i instanceof Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 3 * (weightMultiplier ? 2: 1) + (weightMultiplier ? weightMultiplier - 1 : 0); + return 2 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier : 0); }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), @@ -1637,7 +1637,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, 2) + new WeightedModifierType(modifierTypes.WHITE_HERB, 1) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1666,7 +1666,7 @@ const trainerModifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), new WeightedModifierType(modifierTypes.WHITE_HERB, 1), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; @@ -1684,6 +1684,7 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), + new WeightedModifierType(modifierTypes.SCOPE_LENS, 1), ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) From 03ba575ee592818c4f94a09e0737cf586d95a95f Mon Sep 17 00:00:00 2001 From: cam Date: Fri, 2 Aug 2024 17:12:06 -0400 Subject: [PATCH 124/321] [Sprite] Wo-Chien back sprite (#3307) * [Fix][Sprite] 4083 Galarian Farfetch'd exp Fixed cropped feet on exp for default & shiny. Rearranged spritesheet to fit new size. Both sritesheets have identical sprite framing. Both json are identical. * [Fix][Sprite] 1001 Wo-Chien exp fix cleaned up tips of antlers slightly improved back sprite default + shiny. identical json, identical framing --- public/images/pokemon/exp/back/1001.json | 406 ++++++------------ public/images/pokemon/exp/back/1001.png | Bin 2725 -> 2686 bytes .../images/pokemon/exp/back/shiny/1001.json | 406 ++++++------------ public/images/pokemon/exp/back/shiny/1001.png | Bin 2708 -> 2678 bytes 4 files changed, 274 insertions(+), 538 deletions(-) diff --git a/public/images/pokemon/exp/back/1001.json b/public/images/pokemon/exp/back/1001.json index 7547fbd93bd..e8b2776127c 100644 --- a/public/images/pokemon/exp/back/1001.json +++ b/public/images/pokemon/exp/back/1001.json @@ -1,272 +1,140 @@ { - "textures": [ - { - "image": "1001.png", - "format": "RGBA8888", - "size": { - "w": 237, - "h": 237 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 79, - "h": 72 - }, - "frame": { - "x": 158, - "y": 151, - "w": 79, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2873276355a5ff8fe57d616764a11cb5:5516cfd39964108d480df461b020785f:c8a3fc07f857e38a4f887e43523aab92$" + "textures":[ + { + "image": "1001.png", + "format": "RGBA8888", + "size": { "w": 161, "h": 157 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + } + ]}], + "meta": {"app": "https://www.aseprite.org/","version": "1.3.7-x64" } } diff --git a/public/images/pokemon/exp/back/1001.png b/public/images/pokemon/exp/back/1001.png index 606028b4d162892a22dc37c4a5f2fefbdcb54048..7eead83b5782a3dda69a94816475bfbf03b33209 100644 GIT binary patch delta 2658 zcmV-o3Z3<(75)@1iBL{Q4GJ0x0000DNk~Le0001?0001;2m=5B0P8pCQUCw|0drDE zLIAGL9O;oEIe!jxQchC<|NsC0|NsC0|NsC0|5r-e6aWAT=t)FDRCt`d+lzXmAP@#n z1~eUGgmSymbKL(edpP%fRw)DndgT~r$YE~@0 z@z)@oS~#)z#$SWj0)-RhjS}meGFTML;2Ymq@^3r0kAIi224+R+yL@8lN994c@6Kz2 zdC~Iq)c|wvB9|%QJXjWgtgV3I4f|uCZ@|8T&v?^dNpvquq%DE~1rLJe^}vGY{=Hr= zfcN`tvuA~$^v)O1p%*~-DBvtu65YRl?)7p2a^AYG^twFTpYW65fr*Dr5AqPv=cE$-tv zN<0LSW9{<1nF3p)BW?@ei$({0bgm-Oz<&_>yA_Q+Y!j~XFxV7BgKs#22FeMD|0;?= zbEv0TUOb*k<7RCXY>Vp_L9V&m!h$I?D5Nz;(L+3T)?!B-1luBmTe!~fF+3f-q$`4+ z#W>IJI47^ zxWHDGYvQ_5opA&^=#s;I#d>Vj5?WwVJYI~1B`VGd&TRs2onV(p9S4xZ$KbAIF^sOb zTA@7|leE29=&*Lrfe>1#T*5Aqn}3C$sBwzp7tK-D3K?hm}A{0HtON5BzLuDrS!r>G}K7}fc_mT7=!m9R?$9&CfMu^+1Rfk@C<7X9v*hLREXtETt(-t^7vOGpyMtw~U%aMz;LZ(&@qsP+ z+|SA0%gu~)N_~PQZ%j-_hpkv;;-bf&g5o~S?^lμh)4jo~KDPqD&@=Tj@^RW6kg zaczq@9zbjoeh|-3c{5^lxPJken{G|QX0&)|!rpp%#Z~N>2s8^EGDu|S`g8tt_a?b{ zK5nL<=?#e22*y>We?0FhopUEHM4lc!;M5?)3>A({8gFv9F#1JaC{f8k#@Z^#3lV>M zbiV~}2}!$ciFZ_%OWmTZmkyBSSH9bX4ekA)@js3g-pSNzaaq^n4S$K-HO3ajFzVaP zk*w~_$@^MCe|vKV*Ww5`n?=lzVURdAt9Eraa#7_qg*n|EJ=$R~f`Mm)9( zw@jEs{ArX?peiTtz1YT&SLE32&l>O2Y5D(+cSTT4L&aA9vt--p2m^_YKpvS z<{Q3Z#@)|3U_kEPP&{ZvOSjC*A{X}DV+BuEMahv)_-RLpAXxj+2NgyB-Zj}*)|N|G zg{6DPeZgk|^?yVxYxrP|_b_dZcLFDME1$Y}dMmvRRqnjZLaIW6Sr}wM9sO#TT>O7@Cx9(oZVo(-*HzA;b;=v2XCA z!^%z5LaY9PD1RX#vy80P&MzXDSoU_D%+9o863R4FP(PV`&&2WWsSYtF< zaf!ung>G15I9Xv#Pq;!atTCRfFs2c%&<<Xv@eG%#>uKTo~$sY8m?HC!y4;&RD;Nycn??1kTq{Os=;72t}#ru zys@Z;h}Ce#DB1Q#q8fN~ge!)~&ag&bRD-JA8?NXi$HE#t*YaRoqe*sqT~Q5gl-{^T zAAi~Bt(4HsbWOrEO=!t41Vmn;XN%qG-dZHS4u@$c9 zBL_U0?hhVl%i~S*_aTjNMM`c(vfoR`hH|vR%!VtJ!W!qFgH-zASX|?1UMbyPSG2;6 zge$be8c9?GYBlEBsV7{~BaV0-QH_gihkq-!PqA9W9`A})6r&mmXnVpHmxzC;yM7zi z=!t6F$!1)mOC0g;(Tc)&GZxpli@BM3F#Z8sBU>>Xu4su9VU43&!kKWzQ6aTGGa9aF zW+AjaGajyJWFfS@_RAX~Z#rBd7(M-_C*V}LBKtS)+Mc1;X2KQ4dr8_J zk~857?XZScxI!+%T7A_$ZWge~X)CrIu8{Apa_ZitYKAMcy_8i9SLk^E0S<{;F7d6$ Qi2wiq07*qoM6N<$f{%p+Hvj+t literal 2725 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 diff --git a/public/images/pokemon/exp/back/shiny/1001.json b/public/images/pokemon/exp/back/shiny/1001.json index 1ea21ec6995..cf2dd09815d 100644 --- a/public/images/pokemon/exp/back/shiny/1001.json +++ b/public/images/pokemon/exp/back/shiny/1001.json @@ -1,272 +1,140 @@ { - "textures": [ - { - "image": "1001.png", - "format": "RGBA8888", - "size": { - "w": 237, - "h": 237 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 79, - "h": 78 - }, - "frame": { - "x": 79, - "y": 0, - "w": 79, - "h": 78 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 79, - "h": 76 - }, - "frame": { - "x": 158, - "y": 0, - "w": 79, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 79, - "h": 75 - }, - "frame": { - "x": 158, - "y": 76, - "w": 79, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 78, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 79, - "h": 73 - }, - "frame": { - "x": 0, - "y": 79, - "w": 79, - "h": 73 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 79, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 79, - "h": 72 - }, - "frame": { - "x": 158, - "y": 151, - "w": 79, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:83b74b0673ef1ae8346efab60ae89872:f76c930177bf7a296d3f47eb6294ae4f:c8a3fc07f857e38a4f887e43523aab92$" + "textures":[ + { + "image": "1001.png", + "format": "RGBA8888", + "size": { "w": 161, "h": 157 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 79 }, + "frame": { "x": 80, "y": 78, "w": 79, "h": 79 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 80, "h": 78 }, + "frame": { "x": 0, "y": 79, "w": 80, "h": 78 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 1, "w": 81, "h": 78 }, + "frame": { "x": 80, "y": 0, "w": 81, "h": 78 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 81, "h": 79 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 80, "h": 79 }, + "frame": { "x": 0, "y": 0, "w": 80, "h": 79 } + } + ]}], + "meta": {"app": "https://www.aseprite.org/","version": "1.3.7-x64" } } diff --git a/public/images/pokemon/exp/back/shiny/1001.png b/public/images/pokemon/exp/back/shiny/1001.png index 6d04c70dbb87307be9a7b3f64c11cbd248dc0f9f..2fd3e5fecd9b11a0e5056b616b31af3bf8f31aa0 100644 GIT binary patch literal 2678 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 literal 2708 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 Date: Sat, 3 Aug 2024 04:14:09 +0200 Subject: [PATCH 125/321] [Localization] Small batch of missing French entires (#3309) * Update trainers.ts * Update bgm-name.ts * Update bgm-name.ts --- src/locales/fr/bgm-name.ts | 18 +++++++++--------- src/locales/fr/trainers.ts | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts index c6453a919cf..da344fe001e 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -74,16 +74,16 @@ export const bgmName: SimpleTranslationEntries = { "battle_wild": "NB - Vs. Pokémon sauvage", "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", "end_summit": "PDM ÉSDX - Tour Céleste", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_rocket_grunt": "HGSS Vs. Team Rocket", + "battle_aqua_magma_grunt": "ROSA Vs. Team Aqua/Magma", + "battle_galactic_grunt": "DÉPS Vs. Team Galaxie", "battle_plasma_grunt": "NB - Vs. Team Plasma", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", + "battle_flare_grunt": "XY - Vs. Team Flare", + "battle_rocket_boss": "USUL - Vs. Giovanni", + "battle_aqua_magma_boss": "ROSA - Vs. Max/Arthur", + "battle_galactic_boss": "DÉPS - Vs. Hélio", + "battle_plasma_boss": "N2B2 - Vs. Ghetis", + "battle_flare_boss": "XY - Vs. Lysandre", // Biome Music "abyss": "PDM EdS - Cratère Obscur", diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index bc2a959c428..263c1f6792a 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -271,7 +271,11 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Tarak", "rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages. "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language - + "maxie": "Max", + "archie": "Arthur", + "cyrus": "Hélios", + "ghetsis": "Ghetis", + "lysandre": "Lysandre", // Double Names "blue_red_double": "Blue & Red", From fc8b708785634ee6775f739426464eedb7a9faa7 Mon Sep 17 00:00:00 2001 From: Opaque02 <66582645+Opaque02@users.noreply.github.com> Date: Sat, 3 Aug 2024 12:27:54 +1000 Subject: [PATCH 126/321] [Misc] Tandemaus evolves into 3 family form at a rate of 25% (#2738) --- src/data/pokemon-evolutions.ts | 5 +++ src/data/pokemon-species.ts | 4 +-- src/test/evolutions/evolutions.test.ts | 48 ++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/test/evolutions/evolutions.test.ts diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 696cf006ad0..236d174492f 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1145,6 +1145,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.PAWMOT, 32, null, null) ], [Species.TANDEMAUS]: [ + new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new SpeciesEvolutionCondition(p => { + let ret = false; + p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); + return ret; + })), new SpeciesEvolution(Species.MAUSHOLD, 25, null, null) ], [Species.FIDOUGH]: [ diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 77134cca190..eb2ad358c65 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2459,8 +2459,8 @@ export function initSpecies() { 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.3, 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.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + 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), diff --git a/src/test/evolutions/evolutions.test.ts b/src/test/evolutions/evolutions.test.ts new file mode 100644 index 00000000000..4e38e72bb7c --- /dev/null +++ b/src/test/evolutions/evolutions.test.ts @@ -0,0 +1,48 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#enums/species"; +import * as Utils from "#app/utils"; + +describe("Evolution tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + it("tandemaus evolution form test", async () => { + /* this test checks to make sure that tandemaus will + * evolve into a 3 family maushold 25% of the time + * and a 4 family maushold the other 75% of the time + * This is done by using the getEvolution method in pokemon.ts + * getEvolution will give back the form that the pokemon can evolve into + * It does this by checking the pokemon conditions in pokemon-forms.ts + * For tandemaus, the conditions are random due to a randSeedInt(4) + * 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 + 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 + const threeForm = playerPokemon.getEvolution(); + expect(threeForm.evoFormKey).toBe("three"); // as per pokemon-forms, the evoFormKey for 3 family mausholds is "three" + for (let f = 1; f < 4; f++) { + vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds + const fourForm = playerPokemon.getEvolution(); + expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null + } + }, 5000); +}); From e1812466a839d8edfd442f15bd2696d822a2963e Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 2 Aug 2024 19:29:07 -0700 Subject: [PATCH 127/321] [Bug] Weather should be reset upon arena reset (#3301) * `resetArenaEffects()` should also reset weather * Update function doc --- src/field/arena.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/field/arena.ts b/src/field/arena.ts index efbcdcd6727..cb045cc76ac 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -639,9 +639,13 @@ export class Arena { } /** - * Clears terrain and arena tags when entering new biome or trainer battle. + * Clears weather, terrain and arena tags when entering new biome or trainer battle. */ resetArenaEffects(): void { + // Don't reset weather if a Biome's permanent weather is active + if (this.weather?.turnsLeft !== 0) { + this.trySetWeather(WeatherType.NONE, false); + } this.trySetTerrain(TerrainType.NONE, false, true); this.removeAllTags(); } From 3055d4500fc7dad886190eadcc9f400823d90a38 Mon Sep 17 00:00:00 2001 From: allen925 <62000482+allen925@users.noreply.github.com> Date: Fri, 2 Aug 2024 19:30:50 -0700 Subject: [PATCH 128/321] [Test] added revive function in gameManager & a double-battle test (#3298) * added revive function in gamaManager & a double-battle test * extended timeout of double battle test referencing to battle test * less code, deleted unused param, clearer description of test * add back dbond to move in test * more straight forward testing * reverse back override * polish double battle test a bit --- src/test/battle/double_battle.test.ts | 64 +++++++++++++++++++++++++++ src/test/utils/gameManager.ts | 12 +++++ 2 files changed, 76 insertions(+) create mode 100644 src/test/battle/double_battle.test.ts diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts new file mode 100644 index 00000000000..e2d8dee562c --- /dev/null +++ b/src/test/battle/double_battle.test.ts @@ -0,0 +1,64 @@ +import { + BattleEndPhase, + TurnInitPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition, } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; + +describe("Test Battle Phase", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + // double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully. + // (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(SPLASH_ONLY).moveset(SPLASH_ONLY); + await game.startBattle([ + Species.BULBASAUR, + Species.CHARIZARD, + Species.SQUIRTLE, + ]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + for (const pokemon of game.scene.getPlayerField()) { + expect(pokemon).toBeDefined(); + + pokemon.hp = 0; + pokemon.status = new Status(StatusEffect.FAINT); + expect(pokemon.isFainted()).toBe(true); + } + + await game.doKillOpponents(); + + await game.phaseInterceptor.to(BattleEndPhase); + game.doSelectModifier(); + + const charizard = game.scene.getParty().findIndex(p => p.species.speciesId === Species.CHARIZARD); + game.doRevivePokemon(charizard); + + await game.phaseInterceptor.to(TurnInitPhase); + expect(game.scene.getPlayerField().filter(p => !p.isFainted())).toHaveLength(2); + }, 20000); +}); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index d491e007940..1938d57dfd1 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -35,6 +35,7 @@ import { Button } from "#enums/buttons"; import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import { OverridesHelper } from "./overridesHelper"; +import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type.js"; /** * Class to manage the game state and transitions between phases. @@ -328,4 +329,15 @@ export default class GameManager { (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, pokemonIndex, false); }); } + + /** + * Revive pokemon, currently player's only. + * @param pokemonIndex the index of the pokemon in your party to revive + */ + doRevivePokemon(pokemonIndex: number) { + const party = this.scene.getParty(); + const candidate = new ModifierTypeOption(modifierTypes.MAX_REVIVE(), 0); + const modifier = candidate.type.newModifier(party[pokemonIndex]); + this.scene.addModifier(modifier, false); + } } From ec27c14035a7dcd4112d9b7e79d16f0860a9c49d Mon Sep 17 00:00:00 2001 From: Enoch Date: Sat, 3 Aug 2024 11:41:55 +0900 Subject: [PATCH 129/321] [Localization] add missed move trigger and remove getPokemonMessage (#3281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * localize missed move-trigger message and remove redundant getPokemonMessage * Update src/locales/zh_CN/move-trigger.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/move-trigger.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/move-trigger.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/move-trigger.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_CN/move-trigger.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/fr/move-trigger.ts Co-authored-by: Lugiad' * Update src/locales/it/move-trigger.ts Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> * Revert "Update src/data/move.ts" This reverts commit 4dd6130c3918ade2cda3c61c3529020b779bda38. * fix italian param error * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/move-trigger.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/move-trigger.ts Co-authored-by: José Ricardo Fleury Oliveira --------- Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira --- src/data/move.ts | 20 ++++++++++---------- src/locales/de/move-trigger.ts | 10 +++++++++- src/locales/en/move-trigger.ts | 10 +++++++++- src/locales/es/move-trigger.ts | 10 +++++++++- src/locales/fr/move-trigger.ts | 10 +++++++++- src/locales/it/move-trigger.ts | 10 +++++++++- src/locales/ko/move-trigger.ts | 10 +++++++++- src/locales/pt_BR/move-trigger.ts | 10 +++++++++- src/locales/zh_CN/move-trigger.ts | 10 +++++++++- src/locales/zh_TW/move-trigger.ts | 10 +++++++++- src/messages.ts | 11 ----------- 11 files changed, 91 insertions(+), 30 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index f90aef585d6..09cd03e542e 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2,7 +2,7 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./ import { BattleEndPhase, MoveEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; import { EncoreTag, HelpingHandTag, SemiInvulnerableTag, StockpilingTag, TypeBoostTag } from "./battler-tags"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; import { getTypeResistances, Type } from "./type"; @@ -1388,7 +1388,7 @@ export class HealAttr extends MoveEffectAttr { */ addHealPhase(target: Pokemon, healRatio: number) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, " \nhad its HP restored."), true, !this.showAnim)); + Math.max(Math.floor(target.getMaxHp() * healRatio), 1), i18next.t("moveTriggers:healHp", {pokemonName: getPokemonNameWithAffix(target)}), true, !this.showAnim)); } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { @@ -1482,7 +1482,7 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr { const maxPartyMemberHp = user.scene.getParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0); user.scene.pushPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), - maxPartyMemberHp, getPokemonMessage(user, "'s Healing Wish\nwas granted!"), true, false, false, true), true); + maxPartyMemberHp, i18next.t("moveTriggers:sacrificialFullRestore", {pokemonName: getPokemonNameWithAffix(user)}), true, false, false, true), true); return true; } @@ -2712,7 +2712,7 @@ export class InvertStatsAttr extends MoveEffectAttr { target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere all reversed!")); + target.scene.queueMessage(i18next.t("moveTriggers:invertStats", {pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -2730,7 +2730,7 @@ export class ResetStatsAttr extends MoveEffectAttr { target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere eliminated!")); + target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -4138,7 +4138,7 @@ export class DisableMoveAttr extends MoveEffectAttr { target.summonData.disabledMove = disabledMove.moveId; target.summonData.disabledTurns = 4; - user.scene.queueMessage(getPokemonMessage(target, `'s ${disabledMove.getName()}\nwas disabled!`)); + user.scene.queueMessage(i18next.t("abilityTriggers:postDefendMoveDisable", { pokemonNameWithAffix: getPokemonNameWithAffix(target), moveName: disabledMove.getName()})); return true; } @@ -4445,7 +4445,7 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(getPokemonMessage(target, `\nwill faint in ${this.turnCountMin - 1} turns.`)); + user.scene.queueMessage(i18next.t("moveTriggers:faintCountdown", {pokemonName: getPokemonNameWithAffix(target), turnCount: this.turnCountMin - 1})); return true; } @@ -4685,7 +4685,7 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { } - user.scene.queueMessage( `${getPokemonNameWithAffix(user)} swapped the battle effects affecting each side of the field!`); + user.scene.queueMessage( i18next.t("moveTriggers:swapArenaTags", {pokemonName: getPokemonNameWithAffix(user)})); return true; } } @@ -4917,7 +4917,7 @@ export class CopyTypeAttr extends MoveEffectAttr { user.summonData.types = target.getTypes(true); user.updateInfo(); - user.scene.queueMessage(getPokemonMessage(user, `'s type\nchanged to match ${getPokemonNameWithAffix(target)}'s!`)); + user.scene.queueMessage(i18next.t("moveTriggers:copyType", {pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target)})); return true; } @@ -5598,7 +5598,7 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { target.summonData.abilitySuppressed = true; - target.scene.queueMessage(getPokemonMessage(target, "'s ability\nwas suppressed!")); + target.scene.queueMessage(i18next.t("moveTriggers:suppressAbilities", {pokemonName: getPokemonNameWithAffix(target)})); return true; } diff --git a/src/locales/de/move-trigger.ts b/src/locales/de/move-trigger.ts index 0dc88931282..cc5411af339 100644 --- a/src/locales/de/move-trigger.ts +++ b/src/locales/de/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} verwandelt sich in {{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}} versucht, den Angreifer mit sich zu nehmen!", "addType": "{{pokemonName}} nimmt zusätzlich den Typ {{typeName}} an!", - "cannotUseMove": "{{pokemonName}} kann {{moveName}} nicht einsetzen!" + "cannotUseMove": "{{pokemonName}} kann {{moveName}} nicht einsetzen!", + "healHp": "KP von {{pokemonName}} wurden aufgefrischt!", + "sacrificialFullRestore": "Das Heilopfer von {{pokemonName}} erreicht sein Ziel!", + "invertStats": "Alle Statusveränderungen von {{pokemonName}} wurden invertiert!", + "resetStats": "Die Statusveränderungen von {{pokemonName}} wurden aufgehoben!", + "faintCountdown": "{{pokemonName}} geht nach {{turnCount}} Runden K.O.!", + "copyType": "{{pokemonName}} hat den Typ von {{targetPokemonName}} angenommen!", + "suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!", + "swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!", } as const; diff --git a/src/locales/en/move-trigger.ts b/src/locales/en/move-trigger.ts index 18427f59b59..1d9d6459d83 100644 --- a/src/locales/en/move-trigger.ts +++ b/src/locales/en/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!", "addType": "{{typeName}} was added to\n{{pokemonName}}!", - "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!" + "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!", + "healHp": "{{pokemonName}} had its HP restored.", + "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", + "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", + "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", + "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", + "copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!", + "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", + "swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!", } as const; diff --git a/src/locales/es/move-trigger.ts b/src/locales/es/move-trigger.ts index 18427f59b59..3ff93997cc2 100644 --- a/src/locales/es/move-trigger.ts +++ b/src/locales/es/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!", "addType": "{{typeName}} was added to\n{{pokemonName}}!", - "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!" + "cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!", + "healHp": "{{pokemonName}} had its HP restored.", + "sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!", + "invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!", + "resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!", + "faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.", + "copyType": "{{pokemonName}}'s type\nchanged to match {{targetPokemonName}}'s!", + "suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!", + "swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!", } as const; diff --git a/src/locales/fr/move-trigger.ts b/src/locales/fr/move-trigger.ts index 7f6d25459da..d1fbda50b03 100644 --- a/src/locales/fr/move-trigger.ts +++ b/src/locales/fr/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} prend\nl’apparence de {{targetName}} !", "tryingToTakeFoeDown": "{{pokemonName}} veut entrainer\nson assaillant dans sa chute !", "addType": "{{pokemonName}} gagne\nle type {{typeName}}.", - "cannotUseMove": "{{pokemonName}} ne peut pas\nutiliser la capacité {{moveName}} !" + "cannotUseMove": "{{pokemonName}} ne peut pas\nutiliser la capacité {{moveName}} !", + "healHp": "{{pokemonName}}\nrécupère des PV !", + "sacrificialFullRestore": "Le Vœu Soin est exaucé et profite\nà {{pokemonName}} !", + "invertStats": "Les changements de stats\nde {{pokemonName}} sont inversés !", + "resetStats": "Les changements de stats\nde {{pokemonName}} ont tous été annulés !", + "faintCountdown": "{{pokemonName}}\nsera K.O. dans {{turnCount}} tours !", + "copyType": "{{pokemonName}} prend le type\nde {{targetPokemonName}} !", + "suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !", + "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", } as const; diff --git a/src/locales/it/move-trigger.ts b/src/locales/it/move-trigger.ts index 645d62ef1a6..60679d844c0 100644 --- a/src/locales/it/move-trigger.ts +++ b/src/locales/it/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} assume le sembianze\ndi {{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}} tenta di far subire a chi lo manda KO la sua stessa sorte!", "addType": "Adesso {{pokemonName}} è anche\ndi tipo {{typeName}}!", - "cannotUseMove": "{{pokemonName}} non può usare {{moveName}}!" + "cannotUseMove": "{{pokemonName}} non può usare {{moveName}}!", + "healHp": "{{pokemonName}} ha recuperato dei PS.", + "sacrificialFullRestore": "{{pokemonName}} riceve i benefici\neffetti di Curardore!", + "invertStats": "Le modifiche alle statistiche di {{pokemonName}}\nvengono invertite!", + "resetStats": "Tutte le modifiche alle statistiche sono state annullate!", + "faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.", + "copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!", + "suppressAbilities": "L’abilità di {{pokemonName}}\nperde ogni efficacia!", + "swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!", } as const; diff --git a/src/locales/ko/move-trigger.ts b/src/locales/ko/move-trigger.ts index 437f2fc6d15..9ebf08b1017 100644 --- a/src/locales/ko/move-trigger.ts +++ b/src/locales/ko/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}}[[는]]\n{{targetName}}[[로]] 변신했다!", "tryingToTakeFoeDown": "{{pokemonName}}[[는]] 상대를\n길동무로 삼으려 하고 있다!", "addType": "{{pokemonName}}에게\n{{typeName}}타입이 추가되었다!", - "cannotUseMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 쓸 수 없다!" + "cannotUseMove": "{{pokemonName}}[[는]]\n{{moveName}}[[를]] 쓸 수 없다!", + "healHp": "{{pokemonName}}의\n체력이 회복되었다!", + "sacrificialFullRestore": "{{pokemonName}}의\n치유소원이 이루어졌다!", + "invertStats": "{{pokemonName}}[[는]]\n능력 변화가 뒤집혔다!", + "resetStats": "{{pokemonName}}의 모든 상태가\n원래대로 되돌아왔다!", + "faintCountdown": "{{pokemonName}}[[는]]\n{{turnCount}}턴 후에 쓰러져 버린다!", + "copyType": "{{pokemonName}}[[는]]\n{{targetPokemonName}}[[와]] 같은 타입이 되었다!", + "suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!", + "swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!", } as const; diff --git a/src/locales/pt_BR/move-trigger.ts b/src/locales/pt_BR/move-trigger.ts index 272da44e1f6..c6f35d8f6d1 100644 --- a/src/locales/pt_BR/move-trigger.ts +++ b/src/locales/pt_BR/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}} se transformou\nem um(a) {{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}} está tentando derrubar o atacante com ele!", "addType": "{{pokemonName}} recebeu\no tipo {{typeName}}!", - "cannotUseMove": "{{pokemonName}} não pode usar {{moveName}}!" + "cannotUseMove": "{{pokemonName}} não pode usar {{moveName}}!", + "healHp": "{{pokemonName}} teve seus PS recuperados.", + "sacrificialFullRestore": "O Healing Wish de {{pokemonName}}\nfoi concedido!", + "invertStats": "As mudanças de atributo de {{pokemonName}}\nforam revertidas!", + "resetStats": "As mudanças de atributo de {{pokemonName}}\nforam eliminadas!", + "faintCountdown": "{{pokemonName}}\nirá desmaiar em {{turnCount}} turnos.", + "copyType": "O tipo de {{pokemonName}}\nmudou para combinar com {{targetPokemonName}}!", + "suppressAbilities": "A habilidade de {{pokemonName}}\nfoi suprimida!", + "swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!", } as const; diff --git a/src/locales/zh_CN/move-trigger.ts b/src/locales/zh_CN/move-trigger.ts index 16d49f3f9e1..0efe24f76f0 100644 --- a/src/locales/zh_CN/move-trigger.ts +++ b/src/locales/zh_CN/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}}\n变身成了{{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}}\n想和对手同归于尽!", "addType": "{{pokemonName}}\n增加了{{typeName}}属性!", - "cannotUseMove": "{{pokemonName}}\n无法使用{{moveName}}!" + "cannotUseMove": "{{pokemonName}}\n无法使用{{moveName}}!", + "healHp": "{{pokemonName}}的\n体力回复了!", + "sacrificialFullRestore": "{{pokemonName}}的\n治愈之愿实现了!", + "invertStats": "{{pokemonName}}的\n能力变化颠倒过来了!", + "resetStats": "{{pokemonName}}的\n能力变化复原了!", + "faintCountdown": "{{pokemonName}}\n将在{{turnCount}}回合后灭亡!", + "copyType": "{{pokemonName}}\n变成了{{targetPokemonName}}的属性!", + "suppressAbilities": "{{pokemonName}}的特性\n变得无效了!", + "swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!", } as const; diff --git a/src/locales/zh_TW/move-trigger.ts b/src/locales/zh_TW/move-trigger.ts index 7e5f54538bc..019aa84390c 100644 --- a/src/locales/zh_TW/move-trigger.ts +++ b/src/locales/zh_TW/move-trigger.ts @@ -50,5 +50,13 @@ export const moveTriggers: SimpleTranslationEntries = { "transformedIntoTarget": "{{pokemonName}}\n變身成了{{targetName}}!", "tryingToTakeFoeDown": "{{pokemonName}}\n想和對手同歸於盡!", "addType": "{{pokemonName}}\n增加了{{typeName}}屬性!", - "cannotUseMove": "{{pokemonName}}\n無法使用{{moveName}}!" + "cannotUseMove": "{{pokemonName}}\n無法使用{{moveName}}!", + "healHp": "{{pokemonName}}的\n體力回復了!", + "sacrificialFullRestore": "{{pokemonName}}的\n治癒之願實現了!", + "invertStats": "{{pokemonName}}的\n能力變化顛倒過來了!", + "resetStats": "{{pokemonName}}的\n能力變化復原了!", + "faintCountdown": "{{pokemonName}}\n將在{{turnCount}}回合後滅亡!", + "copyType": "{{pokemonName}}變成了{{targetPokemonName}}的屬性!", + "suppressAbilities": "{{pokemonName}}的特性\n變得無效了!", + "swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!", } as const; diff --git a/src/messages.ts b/src/messages.ts index 2259e78abfc..555a6f30ef1 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -2,17 +2,6 @@ import { BattleSpec } from "#enums/battle-spec"; import Pokemon from "./field/pokemon"; import i18next from "i18next"; -/** - * Builds a message by concatenating the Pokemon name with its potential affix and the given text - * @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance for {@linkcode getPokemonNameWithAffix} - * @param {string} content any text - * @returns {string} ex: "Wild Gengar fainted!", "Ectoplasma sauvage est K.O!" - * @see {@linkcode getPokemonNameWithAffix} for the Pokemon's name and potentiel affix - */ -export function getPokemonMessage(pokemon: Pokemon, content: string): string { - return `${getPokemonNameWithAffix(pokemon)}${content}`; -} - /** * Retrieves the Pokemon's name, potentially with an affix indicating its role (wild or foe) in the current battle context, translated * @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance From cdc482601876b939f73e6d434ac04d997b97eeb9 Mon Sep 17 00:00:00 2001 From: hayuna Date: Sat, 3 Aug 2024 21:09:06 +0200 Subject: [PATCH 130/321] [Localization] Update fr locales in challenge (#3319) --- src/locales/fr/challenges.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index d88960dbe3b..d37ee7dde49 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -2,7 +2,7 @@ import { TranslationEntries } from "#app/interfaces/locales"; export const challenges: TranslationEntries = { "title": "Paramètres du Challenge", - "illegalEvolution": "{{pokemon}} s’est transformé en Pokémon\ninéligible pour ce challenge !", + "illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !", "singleGeneration": { "name": "Mono-génération", "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", From 67babd0e83d47d0cc4af2ba05e1e63f3e1d9292b Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sat, 3 Aug 2024 21:09:58 +0200 Subject: [PATCH 131/321] [Localization] Fresh Start challenge entries added to French locales (#3317) * Update achv.ts * Update challenges.ts * Update achv.ts --- src/locales/fr/achv.ts | 8 ++++++++ src/locales/fr/challenges.ts | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/locales/fr/achv.ts b/src/locales/fr/achv.ts index bc6a862942d..d5b80700493 100644 --- a/src/locales/fr/achv.ts +++ b/src/locales/fr/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Hey ! Listen !", }, + "FRESH_START": { + name: "Du premier coup !", + description: "Terminer un challenge « Nouveau départ »." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) @@ -530,4 +534,8 @@ export const PGFachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Hey ! Listen !", }, + "FRESH_START": { + name: "Du premier coup !", + description: "Terminer un challenge « Nouveau départ »." + } } as const; diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index d37ee7dde49..694cc242e73 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." //type in pokemon-info }, + "freshStart": { + "name": "Nouveau départ", + "desc": "Vous ne pouvez choisir que les starters de base du jeu, comme si vous le recommenciez.", + "value.0": "Non", + "value.1": "Oui", + } } as const; From 32496fa585f79124c69031ed2cf72c305d245382 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Sun, 4 Aug 2024 04:11:05 +0900 Subject: [PATCH 132/321] [Misc] Move victini from gen 4 to gen 5 (#3306) --- src/data/challenge.ts | 9 +-------- src/data/pokemon-species.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 701183e1733..7bea68e36c7 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -406,14 +406,7 @@ export class SingleGenerationChallenge extends Challenge { } applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean): boolean { - /** - * We have special code below for victini because it is classed as a generation 4 pokemon in the code - * despite being a generation 5 pokemon. This is due to UI constraints, the starter select screen has - * no more room for pokemon so victini is put in the gen 4 section instead. This code just overrides the - * normal generation check to correctly treat victini as gen 5. - */ - const starterGeneration = pokemon.speciesId === Species.VICTINI ? 5 : pokemon.generation; - const generations = [starterGeneration]; + const generations = [pokemon.generation]; const checkPokemonEvolutions = checkEvolutions ?? true as boolean; if (soft) { const speciesToCheck = [pokemon.speciesId]; diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index eb2ad358c65..eb73c2f036b 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -312,7 +312,13 @@ export abstract class PokemonSpeciesForm { getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { const variantDataIndex = this.getVariantDataIndex(formIndex); const isVariant = shiny && variantData[variantDataIndex] && variantData[variantDataIndex][variant]; - return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; + const species = getPokemonSpecies(this.speciesId); + /** + * Currently, Victini's icon sprite is located in Gen 4, so we will temporarily bypass this issue with the following code. + * In the future, when Victini's icon sprite is properly moved to Gen 5, the temporary code below should be removed. + */ + const generation = species.speciesId === Species.VICTINI ? 4 : this.generation; + return `pokemon_icons_${generation}${isVariant ? "v" : ""}`; } getIconId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { @@ -1671,7 +1677,7 @@ export function initSpecies() { 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, 324), new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), ), - new PokemonSpecies(Species.VICTINI, 4, 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.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, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), From bb6ec94c02740bf1b977f784bd2c4b32767c8c0f Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:12:32 -0400 Subject: [PATCH 133/321] [Sprite/Misc] Repo Icon cleanup (#3311) * [Sprite] Missing Gen 7 variant icons Taken from current icon spritesheet * [Sprite] Remove non-Gen 6 icon * Delete public/images/pokemon/icons/variant/6/742_3.png * Delete public/images/pokemon/icons/variant/6/743_2.png * Delete public/images/pokemon/icons/variant/6/743_3.png * Delete public/images/pokemon/icons/variant/6/777_2.png * Delete public/images/pokemon/icons/variant/6/777_3.png * Delete public/images/pokemon/icons/variant/6/779_2.png * Delete public/images/pokemon/icons/variant/6/779_3.png * Delete public/images/pokemon/icons/variant/6/354-mega_2.png * Delete public/images/pokemon/icons/variant/6/354-mega_3.png * [Sprite] Missing Mega Banette variant icons Taken from the Gen 6 variant icon folder * [Sprite] Missing Poltchageist/Sinistcha form icons Renamed duplicates of alternate forms --- public/images/pokemon/icons/9/1012-artisan.png | Bin 0 -> 353 bytes public/images/pokemon/icons/9/1012s-artisan.png | Bin 0 -> 359 bytes .../images/pokemon/icons/9/1013-masterpiece.png | Bin 0 -> 346 bytes .../images/pokemon/icons/9/1013s-masterpiece.png | Bin 0 -> 352 bytes .../pokemon/icons/variant/{6 => 3}/354-mega_2.png | Bin .../pokemon/icons/variant/{6 => 3}/354-mega_3.png | Bin .../pokemon/icons/variant/{6 => 7}/742_2.png | Bin .../pokemon/icons/variant/{6 => 7}/742_3.png | Bin .../pokemon/icons/variant/{6 => 7}/743_2.png | Bin .../pokemon/icons/variant/{6 => 7}/743_3.png | Bin .../pokemon/icons/variant/{6 => 7}/777_2.png | Bin .../pokemon/icons/variant/{6 => 7}/777_3.png | Bin .../pokemon/icons/variant/7/778-busted_2.png | Bin 0 -> 471 bytes .../pokemon/icons/variant/7/778-busted_3.png | Bin 0 -> 482 bytes .../pokemon/icons/variant/{6 => 7}/779_2.png | Bin .../pokemon/icons/variant/{6 => 7}/779_3.png | Bin 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/pokemon/icons/9/1012-artisan.png create mode 100644 public/images/pokemon/icons/9/1012s-artisan.png create mode 100644 public/images/pokemon/icons/9/1013-masterpiece.png create mode 100644 public/images/pokemon/icons/9/1013s-masterpiece.png rename public/images/pokemon/icons/variant/{6 => 3}/354-mega_2.png (100%) rename public/images/pokemon/icons/variant/{6 => 3}/354-mega_3.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/742_2.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/742_3.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/743_2.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/743_3.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/777_2.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/777_3.png (100%) create mode 100644 public/images/pokemon/icons/variant/7/778-busted_2.png create mode 100644 public/images/pokemon/icons/variant/7/778-busted_3.png rename public/images/pokemon/icons/variant/{6 => 7}/779_2.png (100%) rename public/images/pokemon/icons/variant/{6 => 7}/779_3.png (100%) diff --git a/public/images/pokemon/icons/9/1012-artisan.png b/public/images/pokemon/icons/9/1012-artisan.png new file mode 100644 index 0000000000000000000000000000000000000000..96a215e47de5e9957386a0bfacd359a7ade64d35 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a?}HSLR=LT z6m~3``Tx&{prD}Q;^Ni|`Hyd3`uk%3|6k9iOqmihC+679c%WJjV*wK&#aj~O7yKUy zFxb9OY6D7~_jGX#vFN=!>7dYI1r8T+M`_=G|EqV;I1|$Qvf{!#Q)5n<_IRQT2}S7SKMuaK*?#%PR@g$SSD#NZJNpb+wr_#3N&mt5(@_M7K@)KJ(G8oi{|! qcjX?r=btEak-(R+8&MZUud9IpCYMq7XXzb~6LdDYf#{%R@T+^%-+j*5J# zf6^?|4w|c+|^_0KGDyfDK_L5=yda7N5IQJ-xqwp|gwuDL2j_v_Io z7F(nia&LIX=fbP46#re|^dZIk?)D&vGNb<$UXo@4NI^>bP0l+XkKtCXJa literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/9/1013-masterpiece.png b/public/images/pokemon/icons/9/1013-masterpiece.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5ee1fddd13c795c6ded324a9c3f3c2dc74a409 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#R9*LR=LU z6@!9;{@Vku{+&8Nil-#VFZe$KFbLg0 zcMd3i#?!?y#G?1?C2ye?1s;|QB}pCgf8Q^UDp}>Ga;hk4r-IEarm49bp3Gn1QT}nQ zX29E%)*%bjtpj#X^z}ZXcJ-wwm)hJjaSJsb?|D~iz02g>UMJVg7p$MMl)ib~Po2n9 zBof~d7AG9LI4!J$$IH<`_fY1+Pw_XM7VUj7GFHsvr+zRJpvFS8UdGOA- zZZX-{@(H zu`y-r3@d7D*)fUR@AAcmAGlbloMGPUuwUw`n5J)9 z$AbPZ+=WxFyC}Y$DI3M2xVUQ8svWK-ljAL&+}8%=2ybMV^=ru%hnJ}`PG^&r-#TN_ zpr>2CO7^I#ovCs4f~#>d@#huKYW)sA{kCfvQ`}+x=vMuhj8oO0fj(pKboFyt=akR{0C5hK%>V!Z literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/variant/6/354-mega_2.png b/public/images/pokemon/icons/variant/3/354-mega_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/354-mega_2.png rename to public/images/pokemon/icons/variant/3/354-mega_2.png diff --git a/public/images/pokemon/icons/variant/6/354-mega_3.png b/public/images/pokemon/icons/variant/3/354-mega_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/354-mega_3.png rename to public/images/pokemon/icons/variant/3/354-mega_3.png diff --git a/public/images/pokemon/icons/variant/6/742_2.png b/public/images/pokemon/icons/variant/7/742_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/742_2.png rename to public/images/pokemon/icons/variant/7/742_2.png diff --git a/public/images/pokemon/icons/variant/6/742_3.png b/public/images/pokemon/icons/variant/7/742_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/742_3.png rename to public/images/pokemon/icons/variant/7/742_3.png diff --git a/public/images/pokemon/icons/variant/6/743_2.png b/public/images/pokemon/icons/variant/7/743_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/743_2.png rename to public/images/pokemon/icons/variant/7/743_2.png diff --git a/public/images/pokemon/icons/variant/6/743_3.png b/public/images/pokemon/icons/variant/7/743_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/743_3.png rename to public/images/pokemon/icons/variant/7/743_3.png diff --git a/public/images/pokemon/icons/variant/6/777_2.png b/public/images/pokemon/icons/variant/7/777_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/777_2.png rename to public/images/pokemon/icons/variant/7/777_2.png diff --git a/public/images/pokemon/icons/variant/6/777_3.png b/public/images/pokemon/icons/variant/7/777_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/777_3.png rename to public/images/pokemon/icons/variant/7/777_3.png diff --git a/public/images/pokemon/icons/variant/7/778-busted_2.png b/public/images/pokemon/icons/variant/7/778-busted_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee05ae0a64aa3c1f8cbff0a94ace5f1a30e5bd6 GIT binary patch literal 471 zcmV;|0Vw{7P)X0004=NklX2v+yR6TUhtWeGWNKNqc|@M zA-uX>B*&6|r$WC|q3x9SijGR;l`3)F!I*|)0nqFX0mzzZrtZq`8^_UD4hCsB7Fjb5 zK;15)+>PUCq?PS+FUZ^L`_6r9F!8SsaWoZ0V36C#XXfsLs$C*q$b1o`oSdzv6GC`l zMIKz@ZTGTfn(|qZxw{~1rs)pGJALbR(HE=4NhytAb5My>+}&INP_;`uOkVu`SL=;9 zF^_2tCb1(Y)<<%Ab1KKlR(D?n+A@hIUX0;kBJI&EAlzU7~82fK9Z_ z0z>Hv>rf6Vaf*B)#`|_8jckZrB@t8_>=r}dQt5X00050Nkl6HJ1`L7mlG4<{gt$1^K?#EsgQFo##=*(e@8HbhH!#LHF*qHh{1teDX6jbsxEz|{<*f#{oeNNK}1AEL_|cye-hKZfe>OedrV5HeP6|# z&c#BAQC8&W4GoIrD#db@f?fJlIw*l>s^seJ7TX(n0M2i&05H-Cy8Wg*Rwq%d1ZUaa z$YZ1v0AxiDm99>rfoAqudb6~i+Ee=tdF^ihB+-Q+g0tK{+~ITv*rtV*F+T{YB$IIm z7*Eiz8x;oG1#Ur+9 z0h89EN~j2{S^G**$tkRi$>r7(Fm5f$xPz23R;yP4LT%Q*1icU6y?>h$^$PWd1~5rA z41AYC34GP}U@Yb>^`E|jQp%VRjFbqB%j=a&#;3>Y%0YlX$#<(4bw11$O{j#ql8Fd| YcdtjV?E2tq6#xJL07*qoM6N<$f;h(DnE(I) literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/variant/6/779_2.png b/public/images/pokemon/icons/variant/7/779_2.png similarity index 100% rename from public/images/pokemon/icons/variant/6/779_2.png rename to public/images/pokemon/icons/variant/7/779_2.png diff --git a/public/images/pokemon/icons/variant/6/779_3.png b/public/images/pokemon/icons/variant/7/779_3.png similarity index 100% rename from public/images/pokemon/icons/variant/6/779_3.png rename to public/images/pokemon/icons/variant/7/779_3.png From a2a1f3ec24e70c8c62a89ef6f3f0328810380ac6 Mon Sep 17 00:00:00 2001 From: Alex Van Liew Date: Sat, 3 Aug 2024 12:13:42 -0700 Subject: [PATCH 134/321] [Refactor] Refactored duplicated code into a common Pokemon#leaveField() function (#3310) * refactor duplicated code into leaveField function * replace bugfix code --- src/data/move.ts | 19 +++++-------------- src/field/pokemon.ts | 39 ++++++++++++++++++++++++++------------- src/phases.ts | 42 ++++++++++++++++++------------------------ 3 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 09cd03e542e..6e0be52047c 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -13,10 +13,9 @@ import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; import { allAbilities } from "./ability"; import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier"; -import { BattlerIndex } from "../battle"; +import { BattlerIndex, BattleType } from "../battle"; import { Stat } from "./pokemon-stat"; import { TerrainType } from "./terrain"; -import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms"; import { ModifierPoolType } from "#app/modifier/modifier-type"; import { Command } from "../ui/command-ui-handler"; import i18next from "i18next"; @@ -1817,13 +1816,10 @@ export class MultiHitAttr extends MoveAttr { } case MultiHitType._2: return 2; - break; case MultiHitType._3: return 3; - break; case MultiHitType._10: return 10; - break; case MultiHitType.BEAT_UP: const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); // No status means the ally pokemon can contribute to Beat Up @@ -4780,19 +4776,14 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { if (switchOutTarget.hp > 0) { applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); // switchOut below sets the UI to select party(this is not a separate Phase), then adds a SwitchSummonPhase with selected 'mon - (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); + (switchOutTarget as PlayerPokemon).switchOut(this.batonPass).then(() => resolve(true)); } else { resolve(false); } return; - } else if (user.scene.currentBattle.battleType) { - // Switch out logic for the battle type - switchOutTarget.resetTurnData(); - switchOutTarget.resetSummonData(); - switchOutTarget.hideInfo(); - switchOutTarget.setVisible(false); - switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.triggerPokemonFormChange(switchOutTarget, SpeciesFormChangeActiveTrigger, true); + } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { + // Switch out logic for trainer battles + switchOutTarget.leaveField(!this.batonPass); if (switchOutTarget.hp > 0) { // for opponent switching out diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f2b0d02e245..1bd9f8db491 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3161,6 +3161,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.randSeedInt((max - min) + 1, min); } + /** + * Causes a Pokemon to leave the field (such as in preparation for a switch out/escape). + * @param clearEffects Indicates if effects should be cleared (true) or passed + * to the next pokemon, such as during a baton pass (false) + */ + leaveField(clearEffects: boolean = true) { + this.resetTurnData(); + if (clearEffects) { + this.resetSummonData(); + this.resetBattleData(); + } + this.hideInfo(); + this.setVisible(false); + this.scene.field.remove(this); + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); + } + destroy(): void { this.battleInfo?.destroy(); super.destroy(); @@ -3272,25 +3289,21 @@ export class PlayerPokemon extends Pokemon { return true; } - switchOut(batonPass: boolean, removeFromField: boolean = false): Promise { + /** + * Causes this mon to leave the field (via {@linkcode leaveField}) and then + * opens the party switcher UI to switch a new mon in + * @param batonPass Indicates if this switch was caused by a baton pass (and + * thus should maintain active mon effects) + */ + switchOut(batonPass: boolean): Promise { return new Promise(resolve => { - this.resetTurnData(); - if (!batonPass) { - this.resetSummonData(); - } - this.hideInfo(); - this.setVisible(false); + this.leaveField(!batonPass); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { this.scene.prependToPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass), MoveEndPhase); } - if (removeFromField) { - this.setVisible(false); - this.scene.field.remove(this); - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); - } - this.scene.ui.setMode(Mode.MESSAGE).then(() => resolve()); + this.scene.ui.setMode(Mode.MESSAGE).then(resolve); }, PartyUiHandler.FilterNonFainted); }); } diff --git a/src/phases.ts b/src/phases.ts index 5916fc882cb..14c8e53aa73 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1392,10 +1392,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { // First check if they're somehow still in play, if so remove them. if (partyMember.isOnField()) { - partyMember.hideInfo(); - partyMember.setVisible(false); - this.scene.field.remove(partyMember); - this.scene.triggerPokemonFormChange(partyMember, SpeciesFormChangeActiveTrigger, true); + partyMember.leaveField(); } const party = this.getParty(); @@ -1611,7 +1608,7 @@ export class SwitchSummonPhase extends SummonPhase { }) ); this.scene.playSound("pb_rel"); - pokemon.hideInfo(); + pokemon.hideInfo(); // this is also done by pokemon.leaveField(), but needs to go earlier for animation purposes pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); this.scene.tweens.add({ targets: pokemon, @@ -1619,9 +1616,9 @@ export class SwitchSummonPhase extends SummonPhase { ease: "Sine.easeIn", scale: 0.5, onComplete: () => { - pokemon.setVisible(false); - this.scene.field.remove(pokemon); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + // 250ms delay on leaveField is necessary to avoid calling hideInfo() twice + // and double-animating the stats panel slideout + this.scene.time.delayedCall(250, () => pokemon.leaveField(!this.batonPass)); this.scene.time.delayedCall(750, () => this.switchAndSummon()); } }); @@ -1629,25 +1626,25 @@ export class SwitchSummonPhase extends SummonPhase { switchAndSummon() { const party = this.player ? this.getParty() : this.scene.getEnemyParty(); - const switchedPokemon = party[this.slotIndex]; + const switchedInPokemon = party[this.slotIndex]; this.lastPokemon = this.getPokemon(); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); - if (this.batonPass && switchedPokemon) { - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedPokemon.id)); - if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { + if (this.batonPass && switchedInPokemon) { + (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id)); + if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; - if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { - this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedPokemon, false); + if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { + this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false); } } } - if (switchedPokemon) { + if (switchedInPokemon) { party[this.slotIndex] = this.lastPokemon; - party[this.fieldIndex] = switchedPokemon; + party[this.fieldIndex] = switchedInPokemon; const showTextAndSummon = () => { this.scene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedPokemon) }) : + i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedInPokemon) }) : i18next.t("battle:trainerGo", { trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), pokemonName: this.getPokemon().getNameToRender() @@ -1655,8 +1652,8 @@ export class SwitchSummonPhase extends SummonPhase { ); // Ensure improperly persisted summon data (such as tags) is cleared upon switching if (!this.batonPass) { - party[this.fieldIndex].resetBattleData(); - party[this.fieldIndex].resetSummonData(); + switchedInPokemon.resetBattleData(); + switchedInPokemon.resetSummonData(); } this.summon(); }; @@ -1876,14 +1873,11 @@ export class TurnInitPhase extends FieldPhase { this.scene.unshiftPhase(new GameOverPhase(this.scene)); } else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.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(false, true); + p.switchOut(false); } else { // If there are no pokemon in the back but we're not game overing, just hide the pokemon. // This should only happen in double battles. - p.hideInfo(); - p.setVisible(false); - this.scene.field.remove(p); - this.scene.triggerPokemonFormChange(p, SpeciesFormChangeActiveTrigger, true); + p.leaveField(); } if (allowedPokemon.length === 1 && this.scene.currentBattle.double) { this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); From 800abc47671a0dd8444ba8a040ec27929b891bd8 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Sun, 4 Aug 2024 04:14:42 +0900 Subject: [PATCH 135/321] [QoL] Auto filter for challenge mode in starter select (#3312) --- src/ui/starter-select-ui-handler.ts | 34 ++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ab28da206d1..2f5197a2d2c 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -151,8 +151,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private filterBarContainer: Phaser.GameObjects.Container; private filterBar: FilterBar; private shinyOverlay: Phaser.GameObjects.Image; - private starterContainer: StarterContainer[] = []; + private starterContainers: StarterContainer[] = []; private filteredStarterContainers: StarterContainer[] = []; + private validStarterContainers: StarterContainer[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -536,7 +537,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const starterContainer = new StarterContainer(this.scene, species).setVisible(false); this.iconAnimHandler.addOrUpdate(starterContainer.icon, PokemonIconAnimMode.NONE); - this.starterContainer.push(starterContainer); + this.starterContainers.push(starterContainer); starterBoxContainer.add(starterContainer); } @@ -820,7 +821,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(true); this.allSpecies.forEach((species, s) => { - const icon = this.starterContainer[s].icon; + const icon = this.starterContainers[s].icon; const dexEntry = this.scene.gameData.dexData[species.speciesId]; if (dexEntry.caughtAttr) { @@ -1956,14 +1957,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { updateStarters = () => { this.scrollCursor = 0; this.filteredStarterContainers = []; + this.validStarterContainers = []; this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); this.starterCursorObjs.forEach(cursor => cursor.setVisible(false)); this.filterBar.updateFilterLabels(); + // pre filter for challenges + if (this.scene.gameMode.modeId === GameModes.CHALLENGE) { + console.log("this.scene.gameMode.modeId", this.scene.gameMode.modeId); + this.starterContainers.forEach(container => { + const isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(container.species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); + if (isValidForChallenge.value) { + this.validStarterContainers.push(container); + } else { + container.setVisible(false); + } + }); + } else { + this.validStarterContainers = this.starterContainers; + } + // filter - this.starterContainer.forEach(container => { + this.validStarterContainers.forEach(container => { container.setVisible(false); container.cost = this.scene.gameData.getSpeciesStarterValue(container.species.speciesId); @@ -2275,12 +2293,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); - const lastSpeciesIcon = this.starterContainer[speciesIndex].icon; + const lastSpeciesIcon = this.starterContainers[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.starterContainer[speciesIndex].icon; + const icon = this.starterContainers[speciesIndex].icon; this.scene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); } @@ -2376,7 +2394,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Pause the animation when the species is selected const speciesIndex = this.allSpecies.indexOf(species); - const icon = this.starterContainer[speciesIndex].icon; + const icon = this.starterContainers[speciesIndex].icon; if (this.isUpgradeAnimationEnabled()) { this.scene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); @@ -2813,7 +2831,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /** Used to detect if this pokemon is registered in starter */ const speciesStarterDexEntry = this.scene.gameData.dexData[this.allSpecies[s].speciesId]; /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ - const speciesSprite = this.starterContainer[s].icon; + const speciesSprite = this.starterContainers[s].icon; /** * If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select. From d20b7553ef7ee0d57a4460cd5678bbbc36935d92 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Sun, 4 Aug 2024 04:16:29 +0900 Subject: [PATCH 136/321] [Enhancement] Add confirm exit popup in starter select UI (#3316) * add confirmExit popup * add translation entries for `confirmExit` * Update src/ui/starter-select-ui-handler.ts Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --- src/locales/de/starter-select-ui-handler.ts | 1 + src/locales/en/starter-select-ui-handler.ts | 1 + src/locales/es/starter-select-ui-handler.ts | 1 + src/locales/fr/starter-select-ui-handler.ts | 1 + src/locales/it/starter-select-ui-handler.ts | 1 + src/locales/ko/starter-select-ui-handler.ts | 1 + .../pt_BR/starter-select-ui-handler.ts | 1 + .../zh_CN/starter-select-ui-handler.ts | 1 + .../zh_TW/starter-select-ui-handler.ts | 1 + src/ui/starter-select-ui-handler.ts | 35 ++++++++++++++----- 10 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index caade5c524d..e8ae4ed201e 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Mit diesen Pokémon losziehen?", + "confirmExit": "Do you want to exit?", "invalidParty": "Das ist kein gültiges Team!", "gen1": "I", "gen2": "II", diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index 6d7b7f7cfb2..deb4236c8ba 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Begin with these Pokémon?", + "confirmExit": "Do you want to exit?", "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 583e302bfeb..d7c203f49c4 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "¿Comenzar con estos Pokémon?", + "confirmExit": "Do you want to exit?", "invalidParty": "¡Este equipo no es válido!", "gen1": "I", "gen2": "II", diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index ce5959062ac..ef685598158 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Commencer avec ces Pokémon ?", + "confirmExit": "Do you want to exit?", "invalidParty": "Cette équipe de départ est invalide !", "gen1": "1G", "gen2": "2G", diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 9b0197e48ab..6f43b9415e0 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Vuoi iniziare con questi Pokémon?", + "confirmExit": "Do you want to exit?", "invalidParty": "Questo squadra iniziale non è valida!", "gen1": "1ª", "gen2": "2ª", diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index 8fe66e0d58a..c57a37788fa 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", + "confirmExit": "Do you want to exit?", "invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!", "gen1": "1세대", "gen2": "2세대", diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index d1038630c8c..a6407b5368d 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Começar com esses Pokémon?", + "confirmExit": "Do you want to exit?", "invalidParty": "Essa equipe de iniciais não é válida!", "gen1": "G1", "gen2": "G2", diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 45327bab55b..b8c491288e1 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "使用这些宝可梦开始游戏吗?", + "confirmExit": "Do you want to exit?", "invalidParty": "初始队伍不可用!", "gen1": "I", "gen2": "II", diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index 0ea1e2d0415..1202bf45f0e 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "使用這些寶可夢開始嗎?", + "confirmExit": "Do you want to exit?", "invalidParty": "此為無效隊伍!", "gen1": "I", "gen2": "II", diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 2f5197a2d2c..ff7b7c19e47 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1063,14 +1063,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; this.updateInstructions(); } else { - this.blockInput = true; - this.scene.clearPhaseQueue(); - if (this.scene.gameMode.isChallenge) { - this.scene.pushPhase(new SelectChallengePhase(this.scene)); - } else { - this.scene.pushPhase(new TitlePhase(this.scene)); - } - this.scene.getCurrentPhase().end(); + this.tryExit(); success = true; } } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected @@ -2880,6 +2873,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return true; } + tryExit(): boolean { + this.blockInput = true; + const ui = this.getUi(); + + const cancel = () => { + ui.setMode(Mode.STARTER_SELECT); + this.clearText(); + this.blockInput = false; + }; + ui.showText(i18next.t("starterSelectUiHandler:confirmExit"), null, () => { + ui.setModeWithoutClear(Mode.CONFIRM, () => { + ui.setMode(Mode.STARTER_SELECT); + this.scene.clearPhaseQueue(); + if (this.scene.gameMode.isChallenge) { + this.scene.pushPhase(new SelectChallengePhase(this.scene)); + } else { + this.scene.pushPhase(new TitlePhase(this.scene)); + } + this.clearText(); + this.scene.getCurrentPhase().end(); + }, cancel, null, null, 19); + }); + + return true; + } + tryStart(manualTrigger: boolean = false): boolean { if (!this.starterSpecies.length) { return false; From cd1c810c5aa2162b83fef88d651adc2a3589c56d Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:18:03 -0400 Subject: [PATCH 137/321] [Balance] Give Dipplin Dragon Cheer as a relearn move, give Applin Matcha Gotcha as egg move instead (#3291) * Change Relearn Move * Change Egg Move --- src/data/egg-moves.ts | 2 +- src/data/pokemon-level-moves.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts index 64e75113dbc..1f893a0c522 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -438,7 +438,7 @@ export const speciesEggMoves = { [Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.ZIPPY_ZAP ], [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], - [Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], + [Species.APPLIN]: [ Moves.MATCHA_GOTCHA, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ], [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ], diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 2ba8ccdf463..b23c43ef215 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -17287,7 +17287,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.DIPPLIN]: [ [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], - [ RELEARN_MOVE, Moves.INFESTATION ], + [ RELEARN_MOVE, Moves.DRAGON_CHEER ], // Custom [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], From 3fa2088f5beca417c1a6445185c88714851d343e Mon Sep 17 00:00:00 2001 From: Mumble Date: Sat, 3 Aug 2024 12:20:19 -0700 Subject: [PATCH 138/321] [Refactor] Merged implementation of CutHpStatBoostAttr moves (#3255) * Merged implementation of CutHpStatBoostAttr moves * Fixed failure check * Fixed Belly Drum details * Moved comment * Tests for involved moves * Fixed belly drum reference * Added localization * Manual merge * Fixed issues discovered by Temp * Updated moveset overrides to match new format * Implementing Torranx's fixes * Localized Belly Drum message to Belly Drum's initialization * Post Caffeine Activation * Actual Caffeine Fix-TypeDoc Test --------- Co-authored-by: Frutescens --- src/data/move.ts | 36 ++----- src/test/moves/belly_drum.test.ts | 115 +++++++++++++++++++++ src/test/moves/clangorous_soul.test.ts | 136 +++++++++++++++++++++++++ src/test/moves/fillet_away.test.ts | 124 ++++++++++++++++++++++ 4 files changed, 385 insertions(+), 26 deletions(-) create mode 100644 src/test/moves/belly_drum.test.ts create mode 100644 src/test/moves/clangorous_soul.test.ts create mode 100644 src/test/moves/fillet_away.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 6e0be52047c..b8593ede356 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2627,36 +2627,15 @@ export class GrowthStatChangeAttr extends StatChangeAttr { } } -export class HalfHpStatMaxAttr extends StatChangeAttr { - constructor(stat: BattleStat) { - super(stat, 12, true, null, false); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(this.stats[BattleStat.ATK])})); - resolve(ret); - }); - }); - } - - getCondition(): MoveConditionFunc { - return (user, target, move) => user.getHpRatio() > 0.5 && user.summonData.battleStats[this.stats[BattleStat.ATK]] < 6; - } - - // TODO: Add benefit score that considers HP cut -} - export class CutHpStatBoostAttr extends StatChangeAttr { private cutRatio: integer; + private messageCallback: ((user: Pokemon) => void) | undefined; - constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer) { + constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) { super(stat, levels, true, null, true); this.cutRatio = cutRatio; + this.messageCallback = messageCallback; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { @@ -2664,13 +2643,16 @@ export class CutHpStatBoostAttr extends StatChangeAttr { user.damageAndUpdate(Math.floor(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); }); }); } getCondition(): MoveConditionFunc { - return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio; + return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio && this.stats.some(s => user.summonData.battleStats[s] < 6); } } @@ -6477,7 +6459,9 @@ export function initMoves() { new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2) .attr(ConfuseAttr), new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2) - .attr(HalfHpStatMaxAttr, BattleStat.ATK), + .attr(CutHpStatBoostAttr, [BattleStat.ATK], 12, 2, (user) => { + user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(BattleStat.ATK)})); + }), new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.POISON) .ballBombMove(), diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts new file mode 100644 index 00000000000..5a9ddd41f0f --- /dev/null +++ b/src/test/moves/belly_drum.test.ts @@ -0,0 +1,115 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 2; +// PREDAMAGE : Amount of extra HP lost +const PREDAMAGE = 15; + +describe("Moves - BELLY DRUM", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.moveset([Moves.BELLY_DRUM]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) + + test("Belly Drum raises the user's Attack to its max, at the cost of 1/2 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum will still take effect if an uninvolved stat is at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + // Here - BattleStat.ATK -> -3 and BattleStat.SPATK -> 6 + leadPokemon.summonData.battleStats[BattleStat.ATK] = -3; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum fails if the pokemon's attack stat is at its maximum", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + }, TIMEOUT + ); + + test("Belly Drum fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts new file mode 100644 index 00000000000..1b3d16f402f --- /dev/null +++ b/src/test/moves/clangorous_soul.test.ts @@ -0,0 +1,136 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 3; +// PREDAMAGE : Amount of extra HP lost +const PREDAMAGE = 15; + +describe("Moves - CLANGOROUS_SOUL", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.moveset([Moves.CLANGOROUS_SOUL]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) + + test("Clangorous Soul raises the user's Attack, Defense, Special Attack, Special Defense and Speed by one stage each, at the cost of 1/3 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1); + }, TIMEOUT + ); + + test("Clangorous Soul will still take effect if one or more of the involved stats are not at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4 + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.DEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 4; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(5); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1); + }, TIMEOUT + ); + + test("Clangorous Soul fails if all stats involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.DEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPD] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6); + }, TIMEOUT + ); + + test("Clangorous Soul fails if the user's health is less than 1/3", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts new file mode 100644 index 00000000000..161bba2c284 --- /dev/null +++ b/src/test/moves/fillet_away.test.ts @@ -0,0 +1,124 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattleStat } from "#app/data/battle-stat"; + +const TIMEOUT = 20 * 1000; +// RATIO : HP Cost of Move +const RATIO = 2; +// PREDAMAGE : Amount of extra HP lost +const PREDAMAGE = 15; + +describe("Moves - FILLET AWAY", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.moveset([Moves.FILLET_AWAY]); + game.override.enemyMoveset([Moves.SPLASH]); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) + + test("Fillet Away raises the user's Attack, Special Attack, and Speed by two stages each, at the cost of 1/2 of its maximum HP", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2); + }, TIMEOUT + ); + + test("Fillet Away will still take effect if one or more of the involved stats are not at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //Here - BattleStat.SPD -> 0 and BattleStat.SPATK -> 3 + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 3; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(5); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2); + }, TIMEOUT + ); + + test("Fillet Away fails if all stats involved are at max", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; + leadPokemon.summonData.battleStats[BattleStat.SPD] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6); + }, TIMEOUT + ); + + test("Fillet Away fails if the user's health is less than 1/2", + async() => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0); + }, TIMEOUT + ); +}); From 153d8ba5572021557caa1a831369ec4d8755e305 Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:03:59 -0500 Subject: [PATCH 139/321] [Sprite] Move Victini graphics to Generation 5 atlases (#3320) * Move Victini graphics to Generation 5 atlases * Minor change --- public/images/pokemon/icons/{4 => 5}/494.png | Bin public/images/pokemon/icons/{4 => 5}/494s.png | Bin .../pokemon/icons/variant/{4 => 5}/494_2.png | Bin .../pokemon/icons/variant/{4 => 5}/494_3.png | Bin public/images/pokemon_icons_4.json | 5202 ++++++----- public/images/pokemon_icons_4.png | Bin 54686 -> 54115 bytes public/images/pokemon_icons_4v.json | 3374 ++++--- public/images/pokemon_icons_4v.png | Bin 29855 -> 29492 bytes public/images/pokemon_icons_5.json | 8114 +++++++++-------- public/images/pokemon_icons_5.png | Bin 65335 -> 64514 bytes public/images/pokemon_icons_5v.json | 3948 ++++---- public/images/pokemon_icons_5v.png | Bin 32058 -> 31807 bytes src/data/pokemon-species.ts | 10 +- 13 files changed, 10321 insertions(+), 10327 deletions(-) rename public/images/pokemon/icons/{4 => 5}/494.png (100%) rename public/images/pokemon/icons/{4 => 5}/494s.png (100%) rename public/images/pokemon/icons/variant/{4 => 5}/494_2.png (100%) rename public/images/pokemon/icons/variant/{4 => 5}/494_3.png (100%) diff --git a/public/images/pokemon/icons/4/494.png b/public/images/pokemon/icons/5/494.png similarity index 100% rename from public/images/pokemon/icons/4/494.png rename to public/images/pokemon/icons/5/494.png diff --git a/public/images/pokemon/icons/4/494s.png b/public/images/pokemon/icons/5/494s.png similarity index 100% rename from public/images/pokemon/icons/4/494s.png rename to public/images/pokemon/icons/5/494s.png diff --git a/public/images/pokemon/icons/variant/4/494_2.png b/public/images/pokemon/icons/variant/5/494_2.png similarity index 100% rename from public/images/pokemon/icons/variant/4/494_2.png rename to public/images/pokemon/icons/variant/5/494_2.png diff --git a/public/images/pokemon/icons/variant/4/494_3.png b/public/images/pokemon/icons/variant/5/494_3.png similarity index 100% rename from public/images/pokemon/icons/variant/4/494_3.png rename to public/images/pokemon/icons/variant/5/494_3.png diff --git a/public/images/pokemon_icons_4.json b/public/images/pokemon_icons_4.json index baa804fa2a0..bc32a16f02c 100644 --- a/public/images/pokemon_icons_4.json +++ b/public/images/pokemon_icons_4.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_4.png", "format": "RGBA8888", "size": { - "w": 252, - "h": 663 + "w": 250, + "h": 665 }, "scale": 1, "frames": [ @@ -682,7 +682,7 @@ } }, { - "filename": "399", + "filename": "415", "rotated": false, "trimmed": true, "sourceSize": { @@ -690,16 +690,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 + "x": 9, + "y": 9, + "w": 25, + "h": 18 }, "frame": { "x": 0, "y": 647, - "w": 20, - "h": 16 + "w": 25, + "h": 18 } }, { @@ -829,7 +829,7 @@ } }, { - "filename": "438", + "filename": "415s", "rotated": false, "trimmed": true, "sourceSize": { @@ -837,37 +837,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 12, - "h": 20 + "x": 9, + "y": 9, + "w": 25, + "h": 18 }, "frame": { - "x": 240, - "y": 23, - "w": 12, - "h": 20 - } - }, - { - "filename": "399s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 20, + "x": 25, "y": 647, - "w": 20, - "h": 16 + "w": 25, + "h": 18 } }, { @@ -1459,7 +1438,7 @@ } }, { - "filename": "462", + "filename": "479-mow", "rotated": false, "trimmed": true, "sourceSize": { @@ -1467,16 +1446,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 + "x": 8, + "y": 5, + "w": 24, + "h": 25 }, "frame": { "x": 226, "y": 94, - "w": 26, - "h": 24 + "w": 24, + "h": 25 } }, { @@ -1501,7 +1480,7 @@ } }, { - "filename": "462s", + "filename": "479s-mow", "rotated": false, "trimmed": true, "sourceSize": { @@ -1509,20 +1488,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 26, - "h": 24 + "x": 8, + "y": 5, + "w": 24, + "h": 25 }, "frame": { "x": 226, - "y": 118, - "w": 26, - "h": 24 + "y": 119, + "w": 24, + "h": 25 } }, { - "filename": "482", + "filename": "426", "rotated": false, "trimmed": true, "sourceSize": { @@ -1530,20 +1509,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 8, "y": 4, - "w": 26, + "w": 24, "h": 24 }, "frame": { "x": 226, - "y": 142, - "w": 26, + "y": 144, + "w": 24, "h": 24 } }, { - "filename": "450", + "filename": "450-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -1563,27 +1542,6 @@ "h": 20 } }, - { - "filename": "482s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 226, - "y": 166, - "w": 26, - "h": 24 - } - }, { "filename": "469", "rotated": false, @@ -1732,7 +1690,7 @@ } }, { - "filename": "411", + "filename": "462", "rotated": false, "trimmed": true, "sourceSize": { @@ -1740,37 +1698,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 6, + "y": 4, "w": 26, - "h": 23 + "h": 24 }, "frame": { "x": 172, "y": 150, "w": 26, - "h": 23 - } - }, - { - "filename": "479-wash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 28, - "h": 22 - }, - "frame": { - "x": 198, - "y": 168, - "w": 28, - "h": 22 + "h": 24 } }, { @@ -2131,7 +2068,7 @@ } }, { - "filename": "411s", + "filename": "411", "rotated": false, "trimmed": true, "sourceSize": { @@ -2215,7 +2152,7 @@ } }, { - "filename": "479-mow", + "filename": "462s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2223,62 +2160,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 25 + "x": 6, + "y": 4, + "w": 26, + "h": 24 }, "frame": { "x": 56, "y": 353, - "w": 24, - "h": 25 + "w": 26, + "h": 24 } }, { - "filename": "479s-mow", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 25 - }, - "frame": { - "x": 28, - "y": 454, - "w": 24, - "h": 25 - } - }, - { - "filename": "395s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 479, - "w": 23, - "h": 25 - } - }, - { - "filename": "398", + "filename": "482", "rotated": false, "trimmed": true, "sourceSize": { @@ -2288,58 +2183,58 @@ "spriteSourceSize": { "x": 10, "y": 4, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 504, - "w": 23, - "h": 25 - } - }, - { - "filename": "398s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 23, - "h": 25 - }, - "frame": { - "x": 28, - "y": 529, - "w": 23, - "h": 25 - } - }, - { - "filename": "426", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, + "w": 26, "h": 24 }, "frame": { "x": 56, - "y": 378, - "w": 24, + "y": 377, + "w": 26, "h": 24 } }, + { + "filename": "482s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 26, + "h": 24 + }, + "frame": { + "x": 28, + "y": 454, + "w": 26, + "h": 24 + } + }, + { + "filename": "411s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 28, + "y": 478, + "w": 26, + "h": 23 + } + }, { "filename": "455", "rotated": false, @@ -2355,8 +2250,8 @@ "h": 23 }, "frame": { - "x": 53, - "y": 402, + "x": 28, + "y": 501, "w": 27, "h": 23 } @@ -2376,119 +2271,14 @@ "h": 23 }, "frame": { - "x": 53, - "y": 425, + "x": 28, + "y": 524, "w": 27, "h": 23 } }, { - "filename": "426s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 28, - "y": 554, - "w": 24, - "h": 24 - } - }, - { - "filename": "409", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 28, - "y": 578, - "w": 25, - "h": 23 - } - }, - { - "filename": "409s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 25, - "h": 23 - }, - "frame": { - "x": 28, - "y": 601, - "w": 25, - "h": 23 - } - }, - { - "filename": "466", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 28, - "y": 624, - "w": 26, - "h": 23 - } - }, - { - "filename": "492-land", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 40, - "y": 647, - "w": 18, - "h": 16 - } - }, - { - "filename": "416", + "filename": "471", "rotated": false, "trimmed": true, "sourceSize": { @@ -2497,15 +2287,78 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 26, - "h": 21 + "y": 5, + "w": 27, + "h": 23 }, "frame": { - "x": 172, - "y": 173, - "w": 26, - "h": 21 + "x": 28, + "y": 547, + "w": 27, + "h": 23 + } + }, + { + "filename": "471s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 28, + "y": 570, + "w": 27, + "h": 23 + } + }, + { + "filename": "464", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 28, + "y": 593, + "w": 27, + "h": 22 + } + }, + { + "filename": "464s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 28, + "y": 615, + "w": 27, + "h": 22 } }, { @@ -2635,7 +2488,7 @@ } }, { - "filename": "471", + "filename": "479-wash", "rotated": false, "trimmed": true, "sourceSize": { @@ -2643,58 +2496,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 141, - "y": 218, - "w": 27, - "h": 23 - } - }, - { - "filename": "471s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 112, - "y": 262, - "w": 27, - "h": 23 - } - }, - { - "filename": "437", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, + "x": 8, "y": 6, - "w": 27, - "h": 21 + "w": 28, + "h": 22 }, "frame": { - "x": 141, - "y": 241, - "w": 27, - "h": 21 + "x": 170, + "y": 174, + "w": 28, + "h": 22 } }, { @@ -2712,14 +2523,35 @@ "h": 22 }, "frame": { - "x": 139, - "y": 262, + "x": 198, + "y": 168, "w": 28, "h": 22 } }, { - "filename": "464", + "filename": "426s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 226, + "y": 168, + "w": 24, + "h": 24 + } + }, + { + "filename": "466", "rotated": false, "trimmed": true, "sourceSize": { @@ -2728,19 +2560,187 @@ }, "spriteSourceSize": { "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 141, + "y": 218, + "w": 26, + "h": 23 + } + }, + { + "filename": "466s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 23 + }, + "frame": { + "x": 112, + "y": 262, + "w": 26, + "h": 23 + } + }, + { + "filename": "473", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, "y": 6, "w": 27, "h": 22 }, "frame": { "x": 170, - "y": 194, + "y": 196, "w": 27, "h": 22 } }, { - "filename": "450-f", + "filename": "473s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 167, + "y": 218, + "w": 27, + "h": 22 + } + }, + { + "filename": "416", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 26, + "h": 21 + }, + "frame": { + "x": 141, + "y": 241, + "w": 26, + "h": 21 + } + }, + { + "filename": "409", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 138, + "y": 262, + "w": 25, + "h": 23 + } + }, + { + "filename": "428", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 167, + "y": 240, + "w": 26, + "h": 22 + } + }, + { + "filename": "409s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 25, + "h": 23 + }, + "frame": { + "x": 163, + "y": 262, + "w": 25, + "h": 23 + } + }, + { + "filename": "429", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 50, + "y": 637, + "w": 19, + "h": 28 + } + }, + { + "filename": "450", "rotated": false, "trimmed": true, "sourceSize": { @@ -2761,448 +2761,7 @@ } }, { - "filename": "464s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 81, - "y": 308, - "w": 27, - "h": 22 - } - }, - { - "filename": "466s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 23 - }, - "frame": { - "x": 81, - "y": 330, - "w": 26, - "h": 23 - } - }, - { - "filename": "473", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 80, - "y": 353, - "w": 27, - "h": 22 - } - }, - { - "filename": "473s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 80, - "y": 375, - "w": 27, - "h": 22 - } - }, - { - "filename": "428", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 397, - "w": 26, - "h": 22 - } - }, - { - "filename": "428s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 419, - "w": 26, - "h": 22 - } - }, - { - "filename": "416s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 26, - "h": 21 - }, - "frame": { - "x": 80, - "y": 441, - "w": 26, - "h": 21 - } - }, - { - "filename": "437s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 21 - }, - "frame": { - "x": 53, - "y": 448, - "w": 27, - "h": 21 - } - }, - { - "filename": "450s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 52, - "y": 469, - "w": 28, - "h": 20 - } - }, - { - "filename": "430", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 80, - "y": 462, - "w": 26, - "h": 22 - } - }, - { - "filename": "430s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 51, - "y": 489, - "w": 26, - "h": 22 - } - }, - { - "filename": "431", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 51, - "y": 511, - "w": 26, - "h": 22 - } - }, - { - "filename": "479-fan", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 51, - "y": 533, - "w": 26, - "h": 21 - } - }, - { - "filename": "413-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 52, - "y": 554, - "w": 24, - "h": 23 - } - }, - { - "filename": "429", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 53, - "y": 577, - "w": 19, - "h": 28 - } - }, - { - "filename": "408", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 53, - "y": 605, - "w": 21, - "h": 19 - } - }, - { - "filename": "391", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 23 - }, - "frame": { - "x": 54, - "y": 624, - "w": 22, - "h": 23 - } - }, - { - "filename": "492s-land", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 58, - "y": 647, - "w": 18, - "h": 16 - } - }, - { - "filename": "429s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 72, - "y": 577, - "w": 19, - "h": 28 - } - }, - { - "filename": "391s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 23 - }, - "frame": { - "x": 76, - "y": 554, - "w": 22, - "h": 23 - } - }, - { - "filename": "408s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 21, - "h": 19 - }, - "frame": { - "x": 74, - "y": 605, - "w": 21, - "h": 19 - } - }, - { - "filename": "475", + "filename": "395s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3212,13 +2771,76 @@ "spriteSourceSize": { "x": 10, "y": 3, - "w": 22, + "w": 23, "h": 25 }, "frame": { - "x": 76, - "y": 624, - "w": 22, + "x": 81, + "y": 308, + "w": 23, + "h": 25 + } + }, + { + "filename": "414", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 81, + "y": 333, + "w": 25, + "h": 20 + } + }, + { + "filename": "398", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 25 + }, + "frame": { + "x": 82, + "y": 353, + "w": 23, + "h": 25 + } + }, + { + "filename": "398s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 23, + "h": 25 + }, + "frame": { + "x": 82, + "y": 378, + "w": 23, "h": 25 } }, @@ -3244,7 +2866,7 @@ } }, { - "filename": "431s", + "filename": "413-sandy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,15 +2874,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 9, + "y": 5, + "w": 24, + "h": 23 }, "frame": { "x": 226, - "y": 190, - "w": 26, + "y": 192, + "w": 24, + "h": 23 + } + }, + { + "filename": "450s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 197, + "y": 210, + "w": 28, + "h": 20 + } + }, + { + "filename": "467", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 225, + "y": 215, + "w": 25, "h": 22 } }, @@ -3279,159 +2943,12 @@ "h": 19 }, "frame": { - "x": 197, - "y": 210, + "x": 194, + "y": 230, "w": 28, "h": 19 } }, - { - "filename": "434", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 26, - "h": 19 - }, - "frame": { - "x": 225, - "y": 212, - "w": 26, - "h": 19 - } - }, - { - "filename": "475s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 91, - "y": 577, - "w": 22, - "h": 25 - } - }, - { - "filename": "387s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 95, - "y": 602, - "w": 18, - "h": 22 - } - }, - { - "filename": "402", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 98, - "y": 624, - "w": 20, - "h": 24 - } - }, - { - "filename": "434s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 26, - "h": 19 - }, - "frame": { - "x": 80, - "y": 484, - "w": 26, - "h": 19 - } - }, - { - "filename": "480", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 77, - "y": 503, - "w": 26, - "h": 22 - } - }, - { - "filename": "480s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 77, - "y": 525, - "w": 26, - "h": 22 - } - }, { "filename": "468s", "rotated": false, @@ -3447,14 +2964,77 @@ "h": 19 }, "frame": { - "x": 112, - "y": 285, + "x": 222, + "y": 237, "w": 28, "h": 19 } }, { - "filename": "479s-fan", + "filename": "437", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 21 + }, + "frame": { + "x": 193, + "y": 249, + "w": 27, + "h": 21 + } + }, + { + "filename": "437s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 21 + }, + "frame": { + "x": 220, + "y": 256, + "w": 27, + "h": 21 + } + }, + { + "filename": "416s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 26, + "h": 21 + }, + "frame": { + "x": 188, + "y": 270, + "w": 26, + "h": 21 + } + }, + { + "filename": "428s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3463,19 +3043,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 7, + "y": 6, "w": 26, - "h": 21 + "h": 22 }, "frame": { - "x": 140, - "y": 284, + "x": 214, + "y": 277, "w": 26, - "h": 21 + "h": 22 } }, { - "filename": "414", + "filename": "475", "rotated": false, "trimmed": true, "sourceSize": { @@ -3484,57 +3064,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 25, - "h": 20 + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 111, - "y": 304, - "w": 25, - "h": 20 - } - }, - { - "filename": "414s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 136, - "y": 305, - "w": 25, - "h": 20 - } - }, - { - "filename": "415", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 25, - "h": 18 - }, - "frame": { - "x": 108, - "y": 324, - "w": 25, - "h": 18 + "x": 104, + "y": 308, + "w": 22, + "h": 25 } }, { @@ -3552,12 +3090,243 @@ "h": 23 }, "frame": { - "x": 107, - "y": 342, + "x": 112, + "y": 285, "w": 24, "h": 23 } }, + { + "filename": "430", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 136, + "y": 285, + "w": 26, + "h": 22 + } + }, + { + "filename": "430s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 162, + "y": 285, + "w": 26, + "h": 22 + } + }, + { + "filename": "431", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 188, + "y": 291, + "w": 26, + "h": 22 + } + }, + { + "filename": "388", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 106, + "y": 333, + "w": 22, + "h": 21 + } + }, + { + "filename": "429s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 105, + "y": 354, + "w": 19, + "h": 28 + } + }, + { + "filename": "388s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 105, + "y": 382, + "w": 22, + "h": 21 + } + }, + { + "filename": "431s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 214, + "y": 299, + "w": 26, + "h": 22 + } + }, + { + "filename": "475s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 126, + "y": 308, + "w": 22, + "h": 25 + } + }, + { + "filename": "480", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 148, + "y": 307, + "w": 26, + "h": 22 + } + }, + { + "filename": "391", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 333, + "w": 22, + "h": 23 + } + }, + { + "filename": "480s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 124, + "y": 356, + "w": 26, + "h": 22 + } + }, { "filename": "476", "rotated": false, @@ -3573,138 +3342,12 @@ "h": 23 }, "frame": { - "x": 107, - "y": 365, + "x": 150, + "y": 329, "w": 24, "h": 23 } }, - { - "filename": "415s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 25, - "h": 18 - }, - "frame": { - "x": 133, - "y": 325, - "w": 25, - "h": 18 - } - }, - { - "filename": "467", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 343, - "w": 25, - "h": 22 - } - }, - { - "filename": "467s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 365, - "w": 25, - "h": 22 - } - }, - { - "filename": "403", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 107, - "y": 388, - "w": 24, - "h": 21 - } - }, - { - "filename": "470", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 131, - "y": 387, - "w": 25, - "h": 22 - } - }, - { - "filename": "470s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 106, - "y": 409, - "w": 25, - "h": 22 - } - }, { "filename": "476s", "rotated": false, @@ -3720,8 +3363,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 431, + "x": 150, + "y": 352, "w": 24, "h": 23 } @@ -3741,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 106, - "y": 454, + "x": 127, + "y": 378, "w": 23, "h": 23 } @@ -3762,12 +3405,222 @@ "h": 23 }, "frame": { - "x": 106, - "y": 477, + "x": 150, + "y": 375, "w": 23, "h": 23 } }, + { + "filename": "439", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 174, + "y": 307, + "w": 14, + "h": 21 + } + }, + { + "filename": "434", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 26, + "h": 19 + }, + "frame": { + "x": 188, + "y": 313, + "w": 26, + "h": 19 + } + }, + { + "filename": "439s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 174, + "y": 328, + "w": 14, + "h": 21 + } + }, + { + "filename": "434s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 26, + "h": 19 + }, + "frame": { + "x": 188, + "y": 332, + "w": 26, + "h": 19 + } + }, + { + "filename": "467s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 214, + "y": 321, + "w": 25, + "h": 22 + } + }, + { + "filename": "440", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 174, + "y": 349, + "w": 14, + "h": 19 + } + }, + { + "filename": "479-fan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 188, + "y": 351, + "w": 26, + "h": 21 + } + }, + { + "filename": "470", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 214, + "y": 343, + "w": 25, + "h": 22 + } + }, + { + "filename": "414s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 214, + "y": 365, + "w": 25, + "h": 20 + } + }, + { + "filename": "479s-fan", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 56, + "y": 401, + "w": 26, + "h": 21 + } + }, { "filename": "419", "rotated": false, @@ -3783,14 +3636,14 @@ "h": 21 }, "frame": { - "x": 131, - "y": 409, + "x": 82, + "y": 403, "w": 25, "h": 21 } }, { - "filename": "402s", + "filename": "470s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,20 +3651,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 + "x": 8, + "y": 6, + "w": 25, + "h": 22 }, "frame": { - "x": 103, - "y": 503, - "w": 20, - "h": 24 + "x": 53, + "y": 422, + "w": 25, + "h": 22 } }, { - "filename": "388", + "filename": "391s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3820,141 +3673,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 103, - "y": 527, - "w": 22, - "h": 21 - } - }, - { - "filename": "419s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 98, - "y": 548, - "w": 25, - "h": 21 - } - }, - { - "filename": "448-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 123, - "y": 500, - "w": 19, - "h": 24 - } - }, - { - "filename": "448s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 125, - "y": 524, - "w": 19, - "h": 24 - } - }, - { - "filename": "388s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 123, - "y": 548, - "w": 22, - "h": 21 - } - }, - { - "filename": "451", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, "y": 6, - "w": 24, - "h": 22 + "w": 22, + "h": 23 }, "frame": { - "x": 113, - "y": 569, - "w": 24, - "h": 22 - } - }, - { - "filename": "451s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 113, - "y": 591, - "w": 24, - "h": 22 + "x": 107, + "y": 403, + "w": 22, + "h": 23 } }, { @@ -3972,8 +3699,8 @@ "h": 23 }, "frame": { - "x": 137, - "y": 569, + "x": 129, + "y": 401, "w": 22, "h": 23 } @@ -3993,14 +3720,14 @@ "h": 23 }, "frame": { - "x": 137, - "y": 592, + "x": 151, + "y": 398, "w": 22, "h": 23 } }, { - "filename": "390", + "filename": "419s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4008,20 +3735,62 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 10, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 78, + "y": 424, + "w": 25, + "h": 21 + } + }, + { + "filename": "403", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 103, + "y": 426, + "w": 24, + "h": 21 + } + }, + { + "filename": "451", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, "y": 6, - "w": 19, + "w": 24, "h": 22 }, "frame": { - "x": 118, - "y": 613, - "w": 19, + "x": 54, + "y": 444, + "w": 24, "h": 22 } }, { - "filename": "400", + "filename": "451s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4029,57 +3798,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 7, "y": 6, - "w": 22, + "w": 24, "h": 22 }, "frame": { - "x": 137, - "y": 615, - "w": 22, - "h": 22 - } - }, - { - "filename": "390s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 118, - "y": 635, - "w": 19, - "h": 22 - } - }, - { - "filename": "400s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 137, - "y": 637, - "w": 22, + "x": 54, + "y": 466, + "w": 24, "h": 22 } }, @@ -4098,159 +3825,12 @@ "h": 21 }, "frame": { - "x": 170, - "y": 216, + "x": 78, + "y": 445, "w": 24, "h": 21 } }, - { - "filename": "413-plant", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 168, - "y": 237, - "w": 22, - "h": 23 - } - }, - { - "filename": "449", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 194, - "y": 229, - "w": 24, - "h": 18 - } - }, - { - "filename": "449-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 218, - "y": 231, - "w": 24, - "h": 18 - } - }, - { - "filename": "449s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 190, - "y": 247, - "w": 24, - "h": 18 - } - }, - { - "filename": "449s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 24, - "h": 18 - }, - "frame": { - "x": 214, - "y": 249, - "w": 24, - "h": 18 - } - }, - { - "filename": "439", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 238, - "y": 249, - "w": 14, - "h": 21 - } - }, - { - "filename": "413s-plant", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 168, - "y": 260, - "w": 22, - "h": 23 - } - }, { "filename": "423-east", "rotated": false, @@ -4266,8 +3846,8 @@ "h": 22 }, "frame": { - "x": 190, - "y": 265, + "x": 78, + "y": 466, "w": 23, "h": 22 } @@ -4287,33 +3867,12 @@ "h": 22 }, "frame": { - "x": 213, - "y": 267, + "x": 102, + "y": 447, "w": 23, "h": 22 } }, - { - "filename": "412-trash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 236, - "y": 270, - "w": 16, - "h": 23 - } - }, { "filename": "423s-east", "rotated": false, @@ -4329,14 +3888,14 @@ "h": 22 }, "frame": { - "x": 167, - "y": 283, + "x": 101, + "y": 469, "w": 23, "h": 22 } }, { - "filename": "423s-west", + "filename": "413-plant", "rotated": false, "trimmed": true, "sourceSize": { @@ -4344,62 +3903,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 190, - "y": 287, - "w": 23, - "h": 22 - } - }, - { - "filename": "432", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 213, - "y": 289, - "w": 23, - "h": 21 - } - }, - { - "filename": "412s-trash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, + "x": 9, "y": 5, - "w": 16, + "w": 22, "h": 23 }, "frame": { - "x": 236, - "y": 293, - "w": 16, + "x": 55, + "y": 488, + "w": 22, "h": 23 } }, { - "filename": "432s", + "filename": "413s-plant", "rotated": false, "trimmed": true, "sourceSize": { @@ -4407,37 +3924,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 23, - "h": 21 + "x": 9, + "y": 5, + "w": 22, + "h": 23 }, "frame": { - "x": 161, - "y": 305, - "w": 23, - "h": 21 - } - }, - { - "filename": "433", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 158, - "y": 326, - "w": 23, - "h": 19 + "x": 77, + "y": 488, + "w": 22, + "h": 23 } }, { @@ -4455,8 +3951,8 @@ "h": 23 }, "frame": { - "x": 156, - "y": 345, + "x": 55, + "y": 511, "w": 22, "h": 23 } @@ -4476,12 +3972,33 @@ "h": 23 }, "frame": { - "x": 156, - "y": 368, + "x": 77, + "y": 511, "w": 22, "h": 23 } }, + { + "filename": "423s-west", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 55, + "y": 534, + "w": 23, + "h": 22 + } + }, { "filename": "457", "rotated": false, @@ -4497,75 +4014,12 @@ "h": 23 }, "frame": { - "x": 156, - "y": 391, + "x": 55, + "y": 556, "w": 22, "h": 23 } }, - { - "filename": "433s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 156, - "y": 414, - "w": 23, - "h": 19 - } - }, - { - "filename": "444", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 184, - "y": 309, - "w": 23, - "h": 21 - } - }, - { - "filename": "444s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 207, - "y": 310, - "w": 23, - "h": 21 - } - }, { "filename": "457s", "rotated": false, @@ -4581,33 +4035,12 @@ "h": 23 }, "frame": { - "x": 230, - "y": 316, + "x": 55, + "y": 579, "w": 22, "h": 23 } }, - { - "filename": "489", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 181, - "y": 330, - "w": 23, - "h": 17 - } - }, { "filename": "463", "rotated": false, @@ -4623,12 +4056,33 @@ "h": 23 }, "frame": { - "x": 178, - "y": 347, + "x": 55, + "y": 602, "w": 22, "h": 23 } }, + { + "filename": "400", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 78, + "y": 534, + "w": 22, + "h": 22 + } + }, { "filename": "463s", "rotated": false, @@ -4644,14 +4098,77 @@ "h": 23 }, "frame": { - "x": 178, - "y": 370, + "x": 77, + "y": 556, "w": 22, "h": 23 } }, { - "filename": "474", + "filename": "400s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 77, + "y": 579, + "w": 22, + "h": 22 + } + }, + { + "filename": "402", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 77, + "y": 601, + "w": 20, + "h": 24 + } + }, + { + "filename": "402s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 99, + "y": 491, + "w": 20, + "h": 24 + } + }, + { + "filename": "408", "rotated": false, "trimmed": true, "sourceSize": { @@ -4660,15 +4177,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, + "y": 9, "w": 21, - "h": 21 + "h": 19 }, "frame": { - "x": 178, - "y": 393, + "x": 99, + "y": 515, "w": 21, - "h": 21 + "h": 19 } }, { @@ -4686,33 +4203,12 @@ "h": 22 }, "frame": { - "x": 179, - "y": 414, + "x": 100, + "y": 534, "w": 20, "h": 22 } }, - { - "filename": "489s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 204, - "y": 331, - "w": 23, - "h": 17 - } - }, { "filename": "460", "rotated": false, @@ -4728,8 +4224,8 @@ "h": 23 }, "frame": { - "x": 200, - "y": 348, + "x": 99, + "y": 556, "w": 21, "h": 23 } @@ -4749,12 +4245,117 @@ "h": 22 }, "frame": { - "x": 200, - "y": 371, + "x": 99, + "y": 579, "w": 21, "h": 22 } }, + { + "filename": "432", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 97, + "y": 601, + "w": 23, + "h": 21 + } + }, + { + "filename": "432s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 69, + "y": 625, + "w": 23, + "h": 21 + } + }, + { + "filename": "433", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 69, + "y": 646, + "w": 23, + "h": 19 + } + }, + { + "filename": "448-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 119, + "y": 491, + "w": 19, + "h": 24 + } + }, + { + "filename": "448s-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 120, + "y": 515, + "w": 19, + "h": 24 + } + }, { "filename": "460s", "rotated": false, @@ -4770,285 +4371,12 @@ "h": 23 }, "frame": { - "x": 199, - "y": 393, + "x": 120, + "y": 539, "w": 21, "h": 23 } }, - { - "filename": "418", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 199, - "y": 416, - "w": 21, - "h": 20 - } - }, - { - "filename": "412-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 221, - "y": 348, - "w": 15, - "h": 23 - } - }, - { - "filename": "478", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 236, - "y": 339, - "w": 16, - "h": 22 - } - }, - { - "filename": "478s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 236, - "y": 361, - "w": 16, - "h": 22 - } - }, - { - "filename": "412s-sandy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 221, - "y": 371, - "w": 15, - "h": 23 - } - }, - { - "filename": "448", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 236, - "y": 383, - "w": 16, - "h": 21 - } - }, - { - "filename": "448s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 220, - "y": 394, - "w": 16, - "h": 21 - } - }, - { - "filename": "421-overcast", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 236, - "y": 404, - "w": 16, - "h": 20 - } - }, - { - "filename": "421s-overcast", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 220, - "y": 415, - "w": 16, - "h": 20 - } - }, - { - "filename": "425", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 - }, - "frame": { - "x": 236, - "y": 424, - "w": 15, - "h": 22 - } - }, - { - "filename": "394", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 129, - "y": 454, - "w": 17, - "h": 22 - } - }, - { - "filename": "394s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 129, - "y": 476, - "w": 17, - "h": 22 - } - }, - { - "filename": "421-sunshine", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 130, - "y": 433, - "w": 20, - "h": 21 - } - }, { "filename": "454s", "rotated": false, @@ -5064,8 +4392,8 @@ "h": 22 }, "frame": { - "x": 150, - "y": 433, + "x": 120, + "y": 562, "w": 21, "h": 22 } @@ -5085,14 +4413,77 @@ "h": 22 }, "frame": { - "x": 146, - "y": 455, + "x": 120, + "y": 584, "w": 21, "h": 22 } }, { - "filename": "474s", + "filename": "387s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 124, + "y": 469, + "w": 18, + "h": 22 + } + }, + { + "filename": "390", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 125, + "y": 447, + "w": 19, + "h": 22 + } + }, + { + "filename": "421-sunshine", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 127, + "y": 426, + "w": 20, + "h": 21 + } + }, + { + "filename": "408s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5101,19 +4492,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, + "y": 9, "w": 21, - "h": 21 + "h": 19 }, "frame": { - "x": 146, - "y": 477, + "x": 120, + "y": 606, "w": 21, - "h": 21 + "h": 19 } }, { - "filename": "492s-sky", + "filename": "433s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5121,20 +4512,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 + "x": 12, + "y": 9, + "w": 23, + "h": 19 }, "frame": { - "x": 142, - "y": 498, - "w": 21, - "h": 22 + "x": 97, + "y": 622, + "w": 23, + "h": 19 } }, { - "filename": "407s", + "filename": "444", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 92, + "y": 641, + "w": 23, + "h": 21 + } + }, + { + "filename": "418", "rotated": false, "trimmed": true, "sourceSize": { @@ -5143,36 +4555,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 20, - "h": 22 + "y": 8, + "w": 21, + "h": 20 }, "frame": { - "x": 144, - "y": 520, - "w": 20, - "h": 22 - } - }, - { - "filename": "441", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 145, - "y": 542, - "w": 20, - "h": 22 + "x": 120, + "y": 625, + "w": 21, + "h": 20 } }, { @@ -5190,8 +4581,8 @@ "h": 20 }, "frame": { - "x": 171, - "y": 436, + "x": 115, + "y": 645, "w": 22, "h": 20 } @@ -5211,14 +4602,14 @@ "h": 20 }, "frame": { - "x": 193, - "y": 436, + "x": 137, + "y": 645, "w": 22, "h": 20 } }, { - "filename": "441s", + "filename": "412-sandy", "rotated": false, "trimmed": true, "sourceSize": { @@ -5226,104 +4617,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 167, - "y": 456, - "w": 20, - "h": 22 + "x": 138, + "y": 491, + "w": 15, + "h": 23 } }, { - "filename": "418s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 187, - "y": 456, - "w": 21, - "h": 20 - } - }, - { - "filename": "410", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 167, - "y": 478, - "w": 20, - "h": 20 - } - }, - { - "filename": "461", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 163, - "y": 498, - "w": 19, - "h": 22 - } - }, - { - "filename": "421s-sunshine", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 187, - "y": 476, - "w": 20, - "h": 21 - } - }, - { - "filename": "427", + "filename": "412-trash", "rotated": false, "trimmed": true, "sourceSize": { @@ -5332,14 +4639,119 @@ }, "spriteSourceSize": { "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 139, + "y": 514, + "w": 16, + "h": 23 + } + }, + { + "filename": "390s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 18, + "w": 19, "h": 22 }, "frame": { - "x": 164, - "y": 520, - "w": 18, + "x": 142, + "y": 469, + "w": 19, + "h": 22 + } + }, + { + "filename": "394", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 144, + "y": 447, + "w": 17, + "h": 22 + } + }, + { + "filename": "412s-sandy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 147, + "y": 424, + "w": 15, + "h": 23 + } + }, + { + "filename": "412s-trash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 141, + "y": 537, + "w": 16, + "h": 23 + } + }, + { + "filename": "394s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 141, + "y": 560, + "w": 17, "h": 22 } }, @@ -5358,138 +4770,12 @@ "h": 22 }, "frame": { - "x": 165, - "y": 542, + "x": 141, + "y": 582, "w": 17, "h": 22 } }, - { - "filename": "442", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 564, - "w": 21, - "h": 20 - } - }, - { - "filename": "442s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 584, - "w": 21, - "h": 20 - } - }, - { - "filename": "459", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 604, - "w": 21, - "h": 20 - } - }, - { - "filename": "459s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 21, - "h": 20 - }, - "frame": { - "x": 159, - "y": 624, - "w": 21, - "h": 20 - } - }, - { - "filename": "443", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 159, - "y": 644, - "w": 19, - "h": 19 - } - }, - { - "filename": "443s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 178, - "y": 644, - "w": 19, - "h": 19 - } - }, { "filename": "401s", "rotated": false, @@ -5505,14 +4791,35 @@ "h": 22 }, "frame": { - "x": 208, - "y": 456, + "x": 141, + "y": 604, "w": 17, "h": 22 } }, { - "filename": "410s", + "filename": "443", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 141, + "y": 626, + "w": 19, + "h": 19 + } + }, + { + "filename": "418s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5522,18 +4829,18 @@ "spriteSourceSize": { "x": 10, "y": 8, - "w": 20, + "w": 21, "h": 20 }, "frame": { - "x": 207, - "y": 478, - "w": 20, + "x": 159, + "y": 645, + "w": 21, "h": 20 } }, { - "filename": "422-east", + "filename": "407s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5541,20 +4848,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 + "x": 10, + "y": 6, + "w": 20, + "h": 22 }, "frame": { - "x": 215, - "y": 436, - "w": 19, - "h": 20 + "x": 153, + "y": 491, + "w": 20, + "h": 22 } }, { - "filename": "427s", + "filename": "427", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 234, - "y": 446, + "x": 155, + "y": 513, "w": 18, "h": 22 } @@ -5589,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 182, - "y": 498, + "x": 157, + "y": 535, "w": 17, "h": 22 } @@ -5610,14 +4917,35 @@ "h": 22 }, "frame": { - "x": 182, - "y": 520, + "x": 158, + "y": 557, "w": 17, "h": 22 } }, { - "filename": "461s", + "filename": "427s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 158, + "y": 579, + "w": 18, + "h": 22 + } + }, + { + "filename": "441", "rotated": false, "trimmed": true, "sourceSize": { @@ -5627,18 +4955,18 @@ "spriteSourceSize": { "x": 10, "y": 6, - "w": 19, + "w": 20, "h": 22 }, "frame": { - "x": 182, - "y": 542, - "w": 19, + "x": 158, + "y": 601, + "w": 20, "h": 22 } }, { - "filename": "494", + "filename": "441s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5646,62 +4974,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 10, "y": 6, - "w": 18, + "w": 20, "h": 22 }, "frame": { - "x": 180, - "y": 564, - "w": 18, + "x": 160, + "y": 623, + "w": 20, "h": 22 } }, { - "filename": "494s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 180, - "y": 586, - "w": 18, - "h": 22 - } - }, - { - "filename": "422s-east", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 180, - "y": 608, - "w": 19, - "h": 20 - } - }, - { - "filename": "436", + "filename": "425", "rotated": false, "trimmed": true, "sourceSize": { @@ -5710,19 +4996,19 @@ }, "spriteSourceSize": { "x": 13, - "y": 12, - "w": 13, - "h": 16 + "y": 7, + "w": 15, + "h": 22 }, "frame": { - "x": 180, - "y": 628, - "w": 13, - "h": 16 + "x": 162, + "y": 421, + "w": 15, + "h": 22 } }, { - "filename": "456", + "filename": "440s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5730,20 +5016,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 13, "y": 9, - "w": 20, - "h": 18 + "w": 14, + "h": 19 }, "frame": { - "x": 199, - "y": 498, - "w": 20, - "h": 18 + "x": 174, + "y": 368, + "w": 14, + "h": 19 } }, { - "filename": "456s", + "filename": "449-f", "rotated": false, "trimmed": true, "sourceSize": { @@ -5751,15 +5037,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 20, + "x": 8, + "y": 10, + "w": 24, "h": 18 }, "frame": { - "x": 199, - "y": 516, - "w": 20, + "x": 188, + "y": 372, + "w": 24, "h": 18 } }, @@ -5778,12 +5064,369 @@ "h": 22 }, "frame": { - "x": 219, - "y": 498, + "x": 173, + "y": 387, "w": 15, "h": 22 } }, + { + "filename": "444s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 188, + "y": 390, + "w": 23, + "h": 21 + } + }, + { + "filename": "449", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 212, + "y": 385, + "w": 24, + "h": 18 + } + }, + { + "filename": "446", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 236, + "y": 385, + "w": 14, + "h": 19 + } + }, + { + "filename": "449s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 211, + "y": 403, + "w": 24, + "h": 18 + } + }, + { + "filename": "446s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 235, + "y": 404, + "w": 14, + "h": 19 + } + }, + { + "filename": "461", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 161, + "y": 447, + "w": 19, + "h": 22 + } + }, + { + "filename": "461s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 161, + "y": 469, + "w": 19, + "h": 22 + } + }, + { + "filename": "478", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 173, + "y": 491, + "w": 16, + "h": 22 + } + }, + { + "filename": "478s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 173, + "y": 513, + "w": 16, + "h": 22 + } + }, + { + "filename": "492s-sky", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 174, + "y": 535, + "w": 21, + "h": 22 + } + }, + { + "filename": "421s-sunshine", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 175, + "y": 557, + "w": 20, + "h": 21 + } + }, + { + "filename": "474", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 176, + "y": 578, + "w": 21, + "h": 21 + } + }, + { + "filename": "474s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 178, + "y": 599, + "w": 21, + "h": 21 + } + }, + { + "filename": "410", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 620, + "w": 20, + "h": 20 + } + }, + { + "filename": "410s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 640, + "w": 20, + "h": 20 + } + }, + { + "filename": "421-overcast", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 195, + "y": 411, + "w": 16, + "h": 20 + } + }, + { + "filename": "449s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 10, + "w": 24, + "h": 18 + }, + "frame": { + "x": 211, + "y": 421, + "w": 24, + "h": 18 + } + }, { "filename": "420", "rotated": false, @@ -5799,8 +5442,8 @@ "h": 18 }, "frame": { - "x": 234, - "y": 468, + "x": 177, + "y": 411, "w": 18, "h": 18 } @@ -5820,12 +5463,117 @@ "h": 18 }, "frame": { - "x": 234, - "y": 486, + "x": 177, + "y": 429, "w": 18, "h": 18 } }, + { + "filename": "421s-overcast", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 195, + "y": 431, + "w": 16, + "h": 20 + } + }, + { + "filename": "489", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 211, + "y": 439, + "w": 23, + "h": 17 + } + }, + { + "filename": "448", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 16, + "h": 21 + }, + "frame": { + "x": 234, + "y": 439, + "w": 16, + "h": 21 + } + }, + { + "filename": "436", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 13, + "h": 16 + }, + "frame": { + "x": 235, + "y": 423, + "w": 13, + "h": 16 + } + }, + { + "filename": "393", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 180, + "y": 447, + "w": 13, + "h": 19 + } + }, { "filename": "447", "rotated": false, @@ -5841,12 +5589,327 @@ "h": 18 }, "frame": { - "x": 234, - "y": 504, + "x": 193, + "y": 451, "w": 18, "h": 18 } }, + { + "filename": "489s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 211, + "y": 456, + "w": 23, + "h": 17 + } + }, + { + "filename": "448s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 16, + "h": 21 + }, + "frame": { + "x": 234, + "y": 460, + "w": 16, + "h": 21 + } + }, + { + "filename": "393s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 180, + "y": 466, + "w": 13, + "h": 19 + } + }, + { + "filename": "447s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 193, + "y": 469, + "w": 18, + "h": 18 + } + }, + { + "filename": "442", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 211, + "y": 473, + "w": 21, + "h": 20 + } + }, + { + "filename": "492-land", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 232, + "y": 481, + "w": 18, + "h": 16 + } + }, + { + "filename": "442s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 189, + "y": 487, + "w": 21, + "h": 20 + } + }, + { + "filename": "459", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 189, + "y": 507, + "w": 21, + "h": 20 + } + }, + { + "filename": "459s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 21, + "h": 20 + }, + "frame": { + "x": 210, + "y": 493, + "w": 21, + "h": 20 + } + }, + { + "filename": "422-east", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 231, + "y": 497, + "w": 19, + "h": 20 + } + }, + { + "filename": "399", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 210, + "y": 513, + "w": 20, + "h": 16 + } + }, + { + "filename": "456", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 20, + "h": 18 + }, + "frame": { + "x": 230, + "y": 517, + "w": 20, + "h": 18 + } + }, + { + "filename": "438", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 12, + "h": 20 + }, + "frame": { + "x": 195, + "y": 527, + "w": 12, + "h": 20 + } + }, + { + "filename": "456s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 20, + "h": 18 + }, + "frame": { + "x": 207, + "y": 529, + "w": 20, + "h": 18 + } + }, + { + "filename": "422s-east", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 195, + "y": 547, + "w": 19, + "h": 20 + } + }, { "filename": "422-west", "rotated": false, @@ -5862,14 +5925,14 @@ "h": 20 }, "frame": { - "x": 201, - "y": 534, + "x": 214, + "y": 547, "w": 17, "h": 20 } }, { - "filename": "439s", + "filename": "443s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5940,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 + "x": 11, + "y": 9, + "w": 19, + "h": 19 }, "frame": { - "x": 219, - "y": 520, - "w": 14, - "h": 21 + "x": 231, + "y": 535, + "w": 19, + "h": 19 } }, { @@ -5904,8 +5967,8 @@ "h": 18 }, "frame": { - "x": 233, - "y": 522, + "x": 231, + "y": 554, "w": 19, "h": 18 } @@ -5925,12 +5988,54 @@ "h": 18 }, "frame": { - "x": 233, - "y": 540, + "x": 197, + "y": 567, "w": 19, "h": 18 } }, + { + "filename": "406", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 216, + "y": 567, + "w": 12, + "h": 18 + } + }, + { + "filename": "399s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 228, + "y": 572, + "w": 20, + "h": 16 + } + }, { "filename": "422s-west", "rotated": false, @@ -5946,12 +6051,33 @@ "h": 20 }, "frame": { - "x": 201, - "y": 554, + "x": 199, + "y": 585, "w": 17, "h": 20 } }, + { + "filename": "438s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 12, + "h": 20 + }, + "frame": { + "x": 216, + "y": 585, + "w": 12, + "h": 20 + } + }, { "filename": "458", "rotated": false, @@ -5967,8 +6093,8 @@ "h": 17 }, "frame": { - "x": 198, - "y": 574, + "x": 228, + "y": 588, "w": 20, "h": 17 } @@ -5988,96 +6114,12 @@ "h": 17 }, "frame": { - "x": 198, - "y": 591, + "x": 200, + "y": 605, "w": 20, "h": 17 } }, - { - "filename": "447s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 199, - "y": 608, - "w": 18, - "h": 18 - } - }, - { - "filename": "440", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 541, - "w": 14, - "h": 19 - } - }, - { - "filename": "440s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 560, - "w": 14, - "h": 19 - } - }, - { - "filename": "446", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 218, - "y": 579, - "w": 14, - "h": 19 - } - }, { "filename": "453", "rotated": false, @@ -6093,8 +6135,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 558, + "x": 200, + "y": 622, "w": 17, "h": 17 } @@ -6114,8 +6156,8 @@ "h": 17 }, "frame": { - "x": 232, - "y": 575, + "x": 220, + "y": 605, "w": 17, "h": 17 } @@ -6135,14 +6177,14 @@ "h": 16 }, "frame": { - "x": 193, - "y": 628, + "x": 237, + "y": 605, "w": 13, "h": 16 } }, { - "filename": "446s", + "filename": "492s-land", "rotated": false, "trimmed": true, "sourceSize": { @@ -6150,100 +6192,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 + "x": 12, + "y": 12, + "w": 18, + "h": 16 }, "frame": { - "x": 197, - "y": 644, - "w": 14, - "h": 19 - } - }, - { - "filename": "406", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 206, - "y": 626, - "w": 12, - "h": 18 - } - }, - { - "filename": "393", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 211, - "y": 644, - "w": 13, - "h": 19 - } - }, - { - "filename": "393s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 218, - "y": 598, - "w": 13, - "h": 19 - } - }, - { - "filename": "438s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 12, - "h": 20 - }, - "frame": { - "x": 218, - "y": 617, - "w": 12, - "h": 20 + "x": 217, + "y": 622, + "w": 18, + "h": 16 } }, { @@ -6261,8 +6219,8 @@ "h": 18 }, "frame": { - "x": 231, - "y": 598, + "x": 200, + "y": 639, "w": 12, "h": 18 } @@ -6273,6 +6231,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d81cce65ebf0d5fbab1f9b7dbc080d4a:2eeffac5a7c6cd09ee563c646d89e345:3f74c54ad2b3085ce7282c3466535f4a$" + "smartupdate": "$TexturePacker:SmartUpdate:840d25653028f4586676114238d98794:576800da918eeca99e7b1b1a0d84af42:3f74c54ad2b3085ce7282c3466535f4a$" } } diff --git a/public/images/pokemon_icons_4.png b/public/images/pokemon_icons_4.png index 5dcfffb557936ef23d8d6e2091b836fb3fc0bac4..9a3fb2cefa9e61d10ee9fafe1a7b24e6af14efd6 100644 GIT binary patch literal 54115 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 literal 54686 zcmXtfbyQSe)HWd?Eeax1N{E0klpx(8E!`pA9RounA|)a%F?4s=&>=Z=$Iu`H3^2fu z^YMG%@BQPhd+u8I?!C_4&ppq6_SrY`i>f>^!D|8x3=Cq0&oUa1=Q|7xtdytNkE8g- z`5g=lY>Y3;TC&P^ZjBYX=Y>w(++63oejShw4-d~bZ{BEVXrR$(4-bouJV^%!bMzw5 zoP~5(XMJ;+-ervBRT8^*KRP_z69n?l@Rxmni?3dydvf&BLZ_$tOzrHP|E%1dc%+~e zgu+4hS=pHeUTMAky m{h653NwkPx6;w;_79J^+vW7Bqh_Mx)^GI`46;uru?j=*d zDbI6ofC`utEJ zy;T?bGVA{07g}GXwJWzYRZTT<(nBNFBp~!=!+dmXP$OAqJpD~!g2=-(xTl)O)<6Xv zTasTu8u$m@Q|EGdWe*zY`T8qwSJm@YHATqSyi8K^>gx1vBOxgrX_M6w7>+HTCF@#x ze~;+8ujQ2x7yDJXFubE27(&xqF&OxmaaYEjB_96gaZqQU0M-RUOxz z=GCeJ%s&IFR=FlRJ_(13bea5R@%8Mdj#98Yy6|;>ivB>{DfmnRg_>&Tfw{~ zrXA8&b-SiAGT~>5;fYh9e^@8Wep}-{%r?9qZrBi?2>;jUQL($VBo;q(rP|c7f$+|B zRz{;H*0y_m>*i0JFfB~(TRw*Utv1PT!9=%SK14ev=~oYg&;L>oOw6!+T{4gIk97Us z&|-sK-Cn={6N9|$6(sZ@TdCJXR&F{A2)%%pU`bma+|APwk;7|!hpyg&lUyB!x9{9iemf87x~^;y$y*#`#ojn{tNt z_(@=TYN%>rNbD|HKVIOwe%ANEz##ql-+@^yUSx-X@diUdMp6s7)CVDSO`dH)(?10` zh_-h`{$hWcl>P2w^3-?t)0gVmWZRsbZ^@%1NQnsE>J)!emiweV8Iw%^ltws->Ik0= zh^)#47e6)FauuRYvsc@?lM#-RkJvoWYiKCCoH-CgpBR9|p>^Qp^k+inptEXw7deCGK*1-@!yuD4Z?*r`=R|*KS`ecb7Hh;)&u2YPq{9Gy_KIU z%jB4VX1uPrR}@w$qF_IxTxhX1sU(gd`_F4O*0VRQS8KUDA(lhuh+-qowpoP}M(pWWH-*T4h9@xF#Y!wnsUb>n>Qz_ADfqo0vETuQw5RP^@xVmB|y6QxMTjHXDfJ(QmsgcF|V%AVyKOOID+0(cZ z_r1Av!;5eUv2*Lj*N74u0K))tP#^(trq{!9{dK7LV1;@~DcSB~ky_Jh?|8J1s#Vn@ zO2UgcFz5M0q&i;Wvpej#^=Q*8MZtf;Q8n_TLKCB2*^O{+lnxo+xhgIwWu|X5-DWL@ z`nu}6k}uqZMVgQQvOhCv$j&4A1`z@m zeZGcl+0#=ZK?QefAbNVrf)vv1xR1}>hiJi1oF}h+62;D_3{J5yY)01D5WKONKlX7l z_PE5a4vHAg>2@`Xu%aowKFM!1kYL@AW#hHwL`+E>W1T3P{7`2=xRWACtE+DjQZeo! zDWEIGmTDFmz;Mxi<$$IhR3?HVGYFU(dmv2TQ!LVCP|$?HZ2MtUEc+lT>aYtEW%KLp za4!gH`UvY}k`WIrhoz~q`zs@!3F^*odwf6?|M0(%Q@;^06#f49`V=&%ViO`S8w2vs zdw>7w=k13awd&i~If|s0UXF=br1USZ_Qa06GbLPhGG|IVPOLYs#CwaN7taDp#VR8} zyQ691AbuGa1Cblof}EHBB*b93>ekOf9CPD+PQ}d?+}(SEgG72=d*QSl5W?kU=LWojpdEL(GoXxmP0U-t=NA=U_uZ z)Zp8jC4-EE33Fjduh|y(^lU z%hb5Z`uGJ+cV?`JL3+7I$b=S(Frp`t!4)oR%d4hmC6$aEv|VrC3a%PY+8|~0g|^FZ zY<<71xcmg82b+8skJ)x$C8kqz6i}n#|4{D#D|%(;Y%OGROMDZFHJkFiQpt#}9&Ece zo|%i&L5}ZyEU1|P6)o~3JrW4#!XwxK)2lxVq3&%m7Ml&_uWs@+zb)L7HdGnGXxS4v zEH9Ns6cbG(JiLetUMZSa^sV?o7bwq_xJUp8f@xcu_8plD&FfIB7d;?9w-%E^@a zVSz2w<*?yiZ zr4eM>>6szAjPc%13u6TCW%lk~1ilgyG>@uRGN_Ese;bV%*%`cgDmf^Ek$dTrpEBKP3l&J&16+s@K@ zB=S7xavBHX-iq=)I+3}(o>{A0g$j&(nnBryxxShKK55UKa7ah@($l>wl4hba#aU;b zTc4e!IEd|Dw3BvWf;JWul~r+ypha$DR|U<3H?byJ)Ue@>vzp#glkAFgq3R8O7cbfkE&>?!lX@D0G7K3QR>72yiZ*bAUr!zey z(_>0Uf&oT}(Pg}F+uZ>L-~2dsIkdHKBHa>nG%c(%2o(|ZRM>}Uf81dP>M)x{q7}%p zpBH;T6AorXZk`9z=}}b8;F7wqC&6OcKlmF~{j}9WOl|frqVY`yX@7)?vUDizvuco7 zux!Y8;)#C~G_YnfVSN`L(FKU$e3Gz9I$kJ?A6pQoz zrnv1Q;9=N=-QP=UR2v|hI?qdVx4YFddO%jMyngkU zxXo!dax)(L25hsmrKfzNKg41<7jj?#R1B&3Z~DxgG6oF_7YC3uEj0;%J*jdtp3#`y>0z z19LOmbE7zlW?1U?*1#$dFh&9ie*eE@6`C^n<&dbf zx{0){E*F`#p{vM}tBm=CSDH#M=H-oAVsXD`MrFio*O10l@y0IS8qm&PZDV7C?>^oC zfKv9JiwGs~EHwehCb>|rHDknY4g>m+!m>zKS8PZ^p7Xr=QrLU2Ze0f|ful`-n_O#B zBzKVb30)aY3HR?vr=b<6I}M#D?I8uP-f-k?w%`JkG^dBnR!QN@R~Q$2dAEqI?m*5h zAN!RKJugR=X{ilWqf|4SoFWHj*6&qFw-GKoW(91ZNl%1j3TEbY2;M#sIWe*ve#Wkz zxcfwmwHIYtjsHnj7F zMh(8-yyFnXrlmZ8%kFxDI<0Vo(N3n9mDoMpy(3(Iuo|F@O6l*bQs(JiI*hCa+g|9hJch2*)!L3JQujUp%V!>VDw+PcGt2WbbFhU=VlHGl_!h1Zkwh zAFPI;u=OuMI*Pg{;zK=u@CgkV4p*a-hPeDJ_s{nw=v#zdlU|$HAfP z|CN;lIY6DhTS2Vr&;HiIBkooRLo#qKUuMO%B|z_0r~U6=%wg;`DJPovXST#Z0#iCiQZOF=Dy&zk z7=z@QvMkm>F;nxnRt*-RJRvFUD5MnlcbTwR9m^K8GXSyYcal-&26FT3_&04aY@*&B zr)~SfoVjDfatG7Y#Kbvt>sjX~^wHO~p($SSt{47Z$UsJkUqUo%#V0>sUkvypnXtp! z)&sWMTwVc(w1A`ZS$$ynpSI*I!O)~xMg87)x!e{5->jreP~z%0iAI@oLmRzc{KS;m ze8rssSA#*T;p<6PZ1vY7gK=F)!zWllg7tJ4Rj1ZK(97<_`)Yj*F6n!m^#o8cK_~GW zyX`eprAeM#Bmvg}{d?>?uC#w|YS_iFG6%<+-gPPIS0u-VjBo9xsJy6=J}puY_I)FZ zuqS!mL@#c#d5J-?dAavpRSlMdY-^7qI7K;bJ#TZ}(BH9Kp@+BABw_e{rMx;J%HM-h zf&ojDmd$R^OHd9{@i5?uxXY9$YO%**?DIb4@;(X1Dy4OZ!9 zr|APvtok|=N4R}+ptLCY;rq)bhTTq>ki<|kq|sxGxTbo!8B*H#j)u+A6d>p+>Sr3Zjx$ms=@lMHIW% z-N!yo_>|yy-ENca_n8lO)3q=1$Ttbjvl4&u$c<^?M&gl+_1OvMBoblQ`i0veguP|?*CYm2#MbKw$TuOJHOqr*tm6A2E|gLV zVLQi&S3oGk(iXWtse}?TNJD z-?@1z_~$3h|0E^TFLXR#3WkX>1j=TSSVgRl@C-1@KH(`;^X4t)WvgPiTGW(24;VPc z_xMpI{{mNI3*3(yKL$jqX_EwwxzM<;0l;-RG6#J$VT1`6ly9 zhtc7oIqde&>p<(AtqvKtUb`OwmUvl6!m;ygdO((H<~r>61!b#@yJ2f zIo=gZ?C>!6gIS*C6D4I*+V1*EvWcl1F4G;wHa0N3V^#L30Iho1o7D@MCGLrDL+TR~ zHeNoYJqtLGUtarJL*=}IewrJ!t=1&^`bcH!8(}JkP>1haIX;g?b(hIo=rvX#IUfnr zis?fw@sFo>SZReqF5RKNkr}v0i_^;kgC$KB6-`Y7$uC?foUtY@ep7x*oy08gbie)_ zC7NKhITXJvu}-6eTWucH*L(_g#=d8aZ*isk6~> z5fZLD3HTCtEf`1Zhub>31Y6@`sb*YkMUd&_qAAitE5|Z`b|8x-pB9gQd*OCi&vP*uh?+V3Ata%&KdOkS$ z*PY=dxX|zD1av`z)(A3#$k)s7w%eaB*o^greG5E(V*S))u;&BZaba=`?>b!rCn>38 zdv7Q=+9hJ2eJ`F@S9Xz^CHNL}34eQ@fEA9-PaQo^h%D2v#!KX#70BN{n;hqcJ`ocU zZKs8K6cZO(ufwhED1x5&1O0%)U7bId%>06~YWrfNhfB4G z?5K8(OaX5EQ7tm&^{2SvgYI|}E)E%&M?%XSlGH8;Q=1m-efbN_xSK;q&Qz|AP{I$Q zh_{zQj6g;|V6*q%bs^us5RH8tx2$SHkw8iKULYuI*mxy`{6uivB>jD0m3)@f2}QRs z0p4X8o_+vFJ~V?|Bqv83>E6aUewsXSo#wT9wy@H-kKL2hOeyxKt zGBEl81B2)uOjhhVAE@&*v2d z-H9?Wp(FZ)G5RH_`)Zr6v?roT5Obkr`-ubq4smK6++xqz7tOe1&vnJKkj88OF7tGU zBMD*zD{FTznx+}Bu!%ZQiU#nb`33RKZiD0ckOlpe=|Nh9AH3v7oN!=Q<@lT;SvtlQ zwA5cIK>*4G(q1F~n|hSLZ@BMw>Z^LpnB6B@4{zJFKXt~>Uy1$Yj%LX_J4-G_z7+GA zsF-eBPxkwpnl?T)3)1=*B2~qUIZ#RBl)P4!r6bBAbZA)Mvd!t8QRP`USljGpxBuHM&)^Y4IELIADK=!GWk zgNkmBnO{G#g%_UI6BZgjQ=}uNZo)Pd$0_fq%^*DPvwhh@4K!hWSg(KRJ_muW^wM~5 zNz^Egv&&rZOclbeUcVNZydemoyg557Ju7c<(!x8_`ys+l^Zr4(DWXi-6JPxS_fiAPdYz_*-ur20`=x0D>Lb_fW z=7n@)lo5bjmJ&1@l)d(`4(!Fok0yZCgui5Ptv{JEomv4t;WRa7wV-*PCcS?x)$vPt zf7Gzrof&CtFS#n#@838feJu?XQM+3qJIQ9FdEKUZ+@5`orReEu(6=Lb8~OV6>z?HA zxa4I@#`$7j^S`+QnfwH2Pp_cqNn~31$BGMqAEKBzokKneHws~RDv~UMK+G&}oQ!>+ zQ308?nr&ck46rM3=dpO@hnZr^pP?gZ^ARE-WIm;{5o%x6x-{~XL_;#14!bUp1j%)e z6PY15GvC-CD2S<^W|JR48QzOjDoJFpcPM9WrLlLOx5j+jLwd0hIs-`SU zt>?L+%XC{10~$$(@tsV7nuXl_Joz7Qu;DbL=l>O@z>#+n0QmFugBZ04cVShj`N2Up zgTd?aAyS~93%3WA*AC* zDp+|SK2G)JsVzjWaToEW4D@TFhB$d^=?>&#?lbk6Busulan-t-{*uo6d;tdXu=0cp zoXl>A9YE6atkNM3>5rrSF{{r6?QZ7%?C;t}adB7Z(8Ff@&Bude>BL!P5yyrBSJSd-rw=8?bw}(&e+w}4e@wtfK7#uP0nXJQXJV_ZVYP&|r*H}CWsvQ4*Ng&lY2u`V; zuXp6|q!Z|Lbemy%35t!z_DDPI83EVr5(u-fTkF=FGgv7xSTWzpdxXc&Cwa3!H_>;s z35)wn7dQAq=a_uWKG`_ZUZd#hAyy#I(TNMvq<(-FCUK>q+J$iR$^Q>cg<&D0 zr8ekgf?j)SaZL?3A7u!=7A|lXou$O2|Dig))>yGqpg0xM))S?li)_NNYU02j8E-RL zI9Lv%8JeBlHD%X6a5*3SPW0gDT6ds_dvg*5UMS{H?MaX5-*cEMx^n*B?_zS8g5RFn zCtjw&C$;Bxu7ZWo;17I;?fde-*P;x=OFBx5(r*J>Zu;qQV~H2T`B_1p&nJH~EA`Z# zKcEJ6p9F3%(G5?OUpx@E8Hhlb%Qopw|lVgYN>XN4XDVQGVra1 zDD?R3joTVV#0NZXW;Sb%lR>o4HN^{7P$El?qk^9G3he^aWB2MwT{q!DU3ZB{t9ss@ zKFQ+-)d>8YnA*A!q2nNIN}INJm~yYOeBCMgPQWlhk0{!7C6$ZvD?LBuOL1LMI_5`| zI&d zq1Tu^$KzD^L!rJ{q5gx;quA6JD&t!F>Y*&g3q5hg2~p z1k84wLORq=6o2tnjL)moaRzmp-Cw8m@fv;raS$j<{`!ju=}-?XUllqSoAFu^ex!DLjbmJA<733Ped8 zz~tcLi0@*T;GSVA>o`^A4x^>kb@uz5pfvkrKY3|0>@XJ3f4rkO#%(Q)hFR~I>2*dq zm-_41S<}grIdYhl6N;gp>NTIOdkc(@DL4j63@Q6x0CAM%H7riCKP< z^Ugs!{n-uzta*-a)J=Wz9o)k#YTfw?odEK^4(&6%Y<^)`dvFGH3 z_#bn0R&|XqM-+wtJo^uDKnB5NIO`jKko5Q7}3bEd)Wn~ZmAo2%mSOIJ( z!2z)@&shwcUNE;mc*8Ysz2r9~$DZ`k1ocpz(*fGFplrN)>gESL%CjLswgf&kl*U%J zCgCzce7pYE*vmRC1yiU}jG>L$T7XC~0$hsF3^(zon>aX0s1%wW9qD4Lfc|xk9N!%~ z-A;sy4N2fy2Y&7s`tH~cx!iV>b;1UQTf_z*D5>dWh~q|QqDU( zbM&FQ#mK6_Rny8-->X_ZPdGn%V7)Cmzf4DF1UL0Rdy_wJv~2&c7octO?{S-SV>`8s zw^FgmfbNB36K-Xq!dw#7VW#ZS{aSz;-^1FL*VU8Lt5#e6%%XQ`ReGm?~#>`A!?hoV*~RunCdGma{--#ooC zImWd1v2QI^e7S*$dSm=i_FxZ>|5K1+s`0hNK__Kmz)4s&T&vz(mDu;6))%|6$=cnw zq#q+xIi4@BZpwM%yQh%+l&GR?siHiz(LIS~0`#IlKJlKjQJ-5CAE{=Hl6remMzc^E zzmEMst^sK@UObt^qxXN7ELwmJB4*pIQVXXz|22g+{Br3+DyTXZ3-2I|4)RfYw#ZB- zqAYF2$zP@W?LLEnR)sp~B&7e!v#6--pV_Gwd#EP`teex~zui->fBc6#jm#rK&je@nJ4uno*V}VtO5Y-+kM=d5jNK#Ls?A?$kO;#VPRQmeP-2gfu)ID@20$( z0<=9NxF3vq!)Sb=6|V?-uf8ki4G3Q96z1G=gbY`Qr33<#7iT}j|GruOa+|e=^qi&s za@$&J>5a3m*|$5*1CT&VIEsBV_9A#0^sfY|=4dnFNZU6e}O9gHp-g4BFI|PJ4pC zef66s5}jtf106mXUszP6(t|a+2icCw3@&G_DMVx$+YHxeJ#o{MfAyNE$3I5Nck(z3 zj=GI%MS3P>DOxxo$cpc6_b4a{+Bwn*8^mj7A5EYav_?Ia#>FX1>Z<~0)pQkv(Y7%Z zHzrf)#rd})3s#47+Z+0YU_+*?Mut2Sxd{GG;e}kW-uWPg54XW$Wt z?>WrsKr%v?8SlnKaeJ&}Df&G61V=*14p2>%S7s#iYwG=NMDkfh!N<7S;^8Ye|8? zxy7O~T&$}56$UF(;y1=SgGXBkT~p(DXc2wZ1)9^?s}K=TR92`Q-+Uii(+q*Da;DGy zvuqe-h_JaAozm{7Oh~#5V5_JKfBGk03P58#wvzaHC2Ik$4p>gnks*OTGL|;|a;C9L zNqWJOgJb7)bWvGx<>wVK5s|XZ8V?3SR_Ht9*+Fj`4Zj8>Ycbcig1(mUg%39}1r#c} z_@HM^U>@16OU*mX_hPA0CZ6~GQBjnP(sP)FWtQkjqxhroCq|3%!(?j9ic3Py}_fRC~Q|e`6oGg?0MDGhrv|DTD*oN=v(KrU6$X!S0 z=dZMG&RaeCe-?J1`eAm`as`h-%QHV<6Vz$dE;?*>H5(juK$u1?a+coY%Dm0NcT2+BQ(kB>E9IB6RQ?X7F*SP zxi04V$KIXDntSm3YiWX($P>*$uNirevO{8^>95~QP46C;oeHEl{&3)#r=CudX2}*$ zQZ|Ck$AD_`wbWRGf2OhF-_HpF)9&&RKiOTGuKczkW_NMu&vjU9`zHjW3SXD`VP z#l>stD2^U!{d5;?f)n!z_yFi6TT~<0_5?~XWC6?x-ILR zd+G)#>sO9-UFj8uC6BLcg}N;C3d_~#h@@R>3BFjDbl>?mQ*K|zJLQx|tGk%XRYucM zeB?_s){Opl%I@(i*cr&1+&GFRKVK{)Z3n1g-)heYkYAkMIQ_-ocj4N?cDViaDoM(P zWXnm%hdGyY(aMp8mR_l)hRtWg#RU-E109&QCcMKv?^~qiUjTiz^wIiIOC7r$jXt+R z=6*0;j7 z{UrD=3*RPW6&9r>%Wq89Mh=us=a^B#QC#<>ZK`L8ea+-5#Sugf7 zZ2Zx|_^n9g(t$jN9@2D$%w_PU!kyfc&i#=_a1lhTxYOcp;tCF2noj%K4{oiHQmbqB zm$X#9nh@m%v!H&plKeC8H7McZ18UffJREl3V4u{n;B?x?qkyP3+34(h+av#*AMCVG z+o#R6tXRiIg{l>tYn|kfI=hj!FJ(A+iqN^}fAXztW@uS|d5h{!lvS?Ir2ktT9Hzkd z-_*y%OrtBhD4{l{!sD8v`xFvK^CUT0ueB-R7UdAr{Pg*`nGa{#4_EEQ)?X}b!gKY@ zMyI+19($&BDoW(|JZ%>uU6+zfS9~I*)eIY->0`zxM79k?O^)xZ~-A=(OZlfMnwmSv?5)IsL zNMDP5-IJdvA|JvA&un)G%1ggJ`50`n%Z&Z_qk`DCd04vLah{X&AFI;|BRC(leyaQD z4BqrLd3aHl+V;Cub6mgYJnQiQrs+>SOe3e{6)nZM+3db+zI(*9H%~>e93lRbgl+P^ zE=t%kq<&8y#7s}ajQ;ct-duiN;`C3rRUpscQS@2XV7Gr8p@AvJ0J_PKIAu1R^Da`k z?aJ{QL2Ci`0d})(k&bwN&*s2OFG1A>X=}QTYr_NlmHOR z%^T^XNGbrt6aDQCjCt8!UU7NJTaB+E?CRmrEP8zJ{CW?prtaUGT%`>>E=(KOR*1T^f9sL|7li%RV=cf@_W4nl9yFcpkye2F?6#lTLXzQ^~1-e73V=YlgV~H@Pp~Wrt7Ky*)0nJm`zG-PqQB z1Dq&>K`?0MSujN|qNbv&cvGmJn+&J88$Mm1{EMO*IyL|@26_3N5;t7lT}wl6Masyez>#+hLTs)8U5&N4+|)K+nM!gt~O9dmJWY-S`c1zrKC`$Cp= z16M96Q)ZQ@i`a=jNh8eSx~G*0oc38@f%U$2nzqv7WLJy@OMSjrC%!QB6K#n=!ff@R z&u9&ZC7XDM0vh4e@nyex>*oO01obMTRd_(XdcbvNp2X3|NwLI~*WMjl9R&K?WX{17kNM~O8drxj!s!Vh(2tR4b)@3J>U!+l>s7@=V?Peq za%-A2koL%Ln}UF(ZIpwHP(bG4d0qPEV0J_+qFk|aM(Z<-BBnQ?Wr6CP??h4Yf!S)E zJ^3m(Eh|Zr0_o?4blcao$5-!n`~;3JO`cXx-{|U(mtO8 zya&lIkZ*Ftz+?~CffmRkO=kf{;j`H_m+gpJUXFYjmVB2D4(q1u7{O8>^-wxa5?GH| zh{uxe)nx~{KTY!|Q5pR4aln0<2XMvAZvVT~A+ZR}8Vmvo0J>eTuHt4b_ieX$K*&Pmkji~s3v5e!WHjuh+ z`=-+GR9>p76cd7&i5E%oc7}ROyFG;W6AHgNdXxm@_wn!o{y1nK0UBtHLRtR?oiuNe zw6Dr*+9h(W+TxyrLOlG9$4#WeHSUrzRwUmsmtqKAJYruwa9Q#!LTLspzv7ka1ob&usv zWZ{)V!jN_oJH$#@A*i>~Srx`UIYGUVo|Kj+YFu#nUHOWvE@C5&P9@UK^j~q)z5Za|f|J0gI?dl}Hqbf0S817~l6E@c6RXal9VXVO#&kbW z-FSEHPZOW<*b3A)-B+10?>^>2>_^QzdA3}2Y$1546;8kGgQF=f`8}Dfupv;dv|m@#I!jg{_jV^r@sZWKOyNPFav&p~&JAgljMc%| zVm5CWJXM|B6`R(En>zg1D|KC%Q|`wEIPQKcqeR4~RHJ^5w8u8$W_2CHMboCA^_cpC zvnkKACU{R4Fj1G$+Nhp?zPKH$ui9HNh;2!b8JKKbD)?7=%3TRx!f0`tFV( zaM#0Uknn1nF0itqg4qf7e%|&SJUOWa@elD5klcL#v;Uds{#(>7k?_Rf;Yn>Si`};D z<;7VX=7~2p%h+?^`!ChWZ|$@DU~3#bK}n2=^L4%nrQ~1ICpzE4_k>T{r)#mZFqBO4 z?8+kKH*K+Z}m0zFxOyUjNe* zJz5*nIcpL^DiJ}}WD^?tYQDdM)Jk7wU<(UL&ip*t;PI)M?5aCFE%0bVnKveLI?);{ zAB51L0@Y~6RDP&#fVs9|-^{j>6DDgDq<>}*6<&?Fo#A*?ep;OH@C+e)X!UBc7pYur zIwq0rl)0x3By0yDm|a?tGh(5>-@4ZAa^iC0(p6oIwvy!Ji)OTMV z=h13cbp&>4Mf4pp%Ej2axZvGpz826z@wA6~YP|vShE;Gc&6BOsQjXw#^8R3a#_#HM z59uLg6XwuF?Ww-`t(h6ddiPi+9ZjeuReL_8-O zDe&Fk2&-S)XtU1U^VA-H%7<~DYEWGL`p`8`TRY}jWjSP&iREpO#d$3AR}cB&aRyg0 zTsvc<^1T8i7J&Dk+9CNv*u-_%i_jWoSi$IYE#sq#&cH5Y?!I}R&QxcdUGhh*&gbM^ zYm$#gra=98*g7`aS^gwE00@jkgs)BB2L&lcEb87&3rBLQbJl?+R0#K*ScrFTUhs-y>uyZ*a zuZ{9j8>5B^@x*(IC9<}688Zu!epl(l=w^Z8f*aa|o4bzb6Twfyv)A#2UJjATdWRS7 zxZ=*#x~#HBQ*82-L=agY?yxwc~>^7`LvK(l2^@&aX4SP%qxA6v|UvGKtZHnbf)p;$pn2E%;(kp zh@~1)+YxzSHa&T|+Hy0_zI@-V6P0!Xz*AH=K(Ree-m%W8&FAFjQhQJIuAf!QhSic~ z2{o4*wIt*Bv_|O(W_C&UzfT2wg-U|G=duFGP4*jXqUp7!)PQL{=wQ{2AhS>cu|~IO z(J)v(fmkX#BgM)}Omd}xs!n8GdilGG>>cd%?%vQc7-FeV?&1Ol zQ!>8!bT4wj`*%tA6O*7_sf;xfN)tso)%}-7M2ISxHiuD}1$(H@>#DW*S?8lMl@GO| z&t+4R#f`YJ;`UA!^2f!(V5)Y=bM5EtCf2CkmY2rYO5?}E??(s3w3>ByB z?(Ui$f4Stpth0ft;)il@-`Qaj4eB0u z;QP7lt~vT4)DEM_QGY9`zMk*N@YpV9K8xDf|=wh6n$xW{_0krQ)1 zk1QlC`Mfc2j+bo-FaU1i2lklMv~;A5nJ~^F%GiZR}6x755&+Uo+CdJYv`KwID@=JI`eyT=6mQZvGf)pgtCH zf!v#G4{-!#4+1<}Hq$=7r9_c2zCu{4rfUIha0_e8u!v^G|Jp)K?g{__2k%|Pqk8g| zv0I2tjviA2rPb7Qq{8#HY<96NVK)D;N>pcW6Ttt^r+5#ZD=`)9AKmvI1Yl!eYfKWT zQH?%L&iLOQP2AkA1#B__z~pj8TATIIT`Pp*m+|e$`MD53p;URu}wl)T=Vo`~mYM&5QRE zqB1sSq5laLim*}iI=b!teRCYolOW`K`AhaQ&AqT4qYo%yz~m&^nNN-nb-$R> zfsICOy)^y!MkhtB9Xhwa9GG4GYYwEGJ{6(RT`~mBXpXv1r+!Leix^-Zl8sIFBuU<_8 zX+lem4hVArd!#+)Elt*!$v1w|(DA5OBCsg-V0eqYb*2ud5 zN7GjZMA<}bix!n0 zMmXWn2#QdNXW8wwc(029IdZxbS9kot;YsYhWzq_j$AMKv%M5hgs(dif{%^pvAj-HD zSRrv)H{JViXZ}z_0N#2;NlOxP-`-!1|2w}GfZhfm+8(|B!lf2a{1+!Hdp4&sClw(t zAPF9B!qSqTiQf907~>R#KF~}Dt+UE7M_^?^DYjPD@@5Dc8=JP{PFPkJjt`?st@s z(?7ra*P|t2hk`fyH1xnT_WKXegNl%1Rs9#aoGrD^ri36DZ1Z-FBX>wp{FluRqAJ@i zi6!vf_sbGBvHxFQhd)}&jjafroZ9RkuncS=dch`MK`gcmg3#MmDD*`$-{nY#V7K-^ zpNzbY-GhMv!{hCZXK^)ItEJ`Q@y`@2ikFb09x>C`?BKsgGhJ&*-@&_9;`lc8v^bBu z#((S<1;DAUjplG!<4dyZ-!_Y^lr37WwRgu}l1ww}`LK{G4Lwv?bv1`jRYv>AO^UW8 zabx6dc`Py1!U8*KM(|hS%xseE?OLZw1yS1=1ftV#e=*b<)mia7YJ{6-Wdv!ve#k6A z9NUHb4iz5a@`#0(Ctfzt2aUs%9LuyVo#ODvhZe3-Erh$W<@V07nDa=44I_wZpw-fK z+RAsWJNge!ulAVbOBgX$MGbAq(zIZ-)ZJfYlh^J4wzd#u@bY{>D?M|oW4g5u>=5O3 z((;>kRgt_!^Zd$pL(|DZCa^L2CQO|P(9*=GdAGiC@hr}JnDA#>y)N&PFW*#HrW9g;>P}pRy`J?SAG%t}y%ymv)h@$BrHwpz!o{#oB8D}O_0&j) zliH5CwwvbbJ?B+0>t{pOZb-{dxyKmPa6?kbMWr)NQ_6?Xs-%)NYBZ&KC$Ur#91QW6qM8in}wI0;-K%KyN1!-FeMt8Xs1`M(-|8yjKa;w?X-woca5%9PdT{ zs*$nkM6J9=nNdw9^CzUVc6^ed+D7Y#nGIdj(MZ= zsNT^AEJe*67uTKL<{$>K45lTrc5iTOEq-FygnbSf9=9%L(;=!lOJcCsnh>R6;?F_EEh|oIT@VsAV3O}{XE29p)Z#$rz&9n?wJ!W; z00t;2azLRS1eeSAs0(i6NGCx-Ux>f?sA%D7;Sas75!aq$PRfY`-bhP$RPJNmE38e+ zMU5+FH8s9({=M*x)#ID1!S-k_1AJJ<1ugx&d5|H@ZC|mt1S zQfAtAC85&gmGcaLdBn+ql9m{ z!CT#{4RTo*^SaEKt2dtWkDiqI$UcRNfTix;++py~abg1qcXu*90q4wL(|`0Sx%s=r>$PbCr^8`QPZ60IzMRyF?B zD)3E7O_W(rsY-V53fuH{CV*v2=jQjSn(t^?yc;7S?qU0&!S@w@;r79aGeal-Wpmgv$jKZ9R4pfmViucpkU>!GMdf-P`kTQJ$ z_xcZfG{yIi>cAZX$&zuK)((ni2_-zaylhjMZs7iKJz_@cU#G=Ti^!tuEuh-im?pM0 zVqzMdVP}C|4wP!_uxVZS0z5@5j`p3bIkfESeUrLh)-@*oAVkxgyt%R0F8VMz!)e_N zJ!wRQc+JE9nd5tRqz4HJr5RXFO9W70(g;R1HM%OrWwNS3% zd8BpT7+%EMY_YT@xCJuu6F&YChO>e-#9d6lxz*?Yskukor$%q+Ky+alrIP(tWKE?r zp!d9RHU$sk5BNloY||?rkwy>gpO46@ZBU&o_;fazT*5E_psE_-0H}b)njsK{X?*L~ zqu-Ud3;I5X^IPn)KBvAsdA%NP!isc#KrZ}Z`-oLO+fUX;bzTa~qpf(KSBD@BuRse( zh9?V@btz=Ui*)!ma_H5vCvcqXCnl#wSeVc00D_M%fVRDF(;9Zc=AkK6nSco*)vEK(`;aKJhi zVlk~w$NIgV%Lz#K4Yiza#3ViEHU`yKs`83Q@5;wIX>VITVQ1zF_xCvRH?klK|D2fx{#TspzQw5Oo6y?*O6w(S=Oy5)oZ;t7)C>3 zvrCOOr#s`e3p5y+c|&c?-jm_Ka0IPbA|W!w;9XPVnx3&N88{2?_eoY9aDMIR-L&6K^`W+>;D$$k9sQeJDhB0UEaAezc4qLgl|06v?!`zmqxm zD-w{z+}??9{#V$;( zlIWW2SvzmZ+4XBg&Up@|NbA!-mjC!P@UlQjmS^arFVx#j(Zo`X67JM$3Z1g~4{)WZ z)|tm|kcJ6CSoR<|u7po(4Yy8^ORvbdI~(uH2wqy=4`Sq`E0zt(HU5K`ER$uN13hWV zYBO|nD$l=HW_r1JA;}5hJShQe{o-=*TJNB6W_Pz@tFN}YHOHhQ(I;@fWxB!>RK%`j5rAUt3I^b?-9%Dp_+m^9R@^?d{%`(HK^)PxGoN}BV12TG?inT#`TtcCbTHCtz!MZ-F5dKBb`w>Bm%H;Ts<$c^X()@ z>7%`ygA=-vxFot}aHf=Mx&aG7f8m5RN|bZ6BVBZTzX^qn)=R-ACScm!H#LhC?-?MR zevLbEicxNPh@cf)J*oXoz^;zH>yVl&Z#jf@J7NV)xXx_`+D`x|hi<%AUX16^yZO4H zb<^pee~$5(6+%m#Rf_DGNZ&ZZO@Xn~HqPMc(Ia_UwAbcWyE}!14eOUocwiG7*mT!k zQY8K77cZduQ{1-`(l5=6>-m_%HaiE4e|&}b%3IYR%g0+0?)3Fr&- z`O$ApZeB23G>wmF#p@KC{L&;4Hp~!DJ@-epqovc$&KWC<= zeAQO#xTk)6cnHZAQq;&5a`=*(T6(a+_O2}R-g-q0=|mf_k#u}W<=QwfaS|E;yE+V& zH*m2Dwb9#jSp)MdzZv&^Vi4RrKuq&d{Hx_l^F4LJF#k5bu+5(V8GUn8TOO~gPA4*_ zN68YrKT%1j1=h?_5JHJjfXjgF1MzWx`JoTgTTH z8fBTH;EaIivCTcdxdd@KW%=#ksV)CsQ#(KBciveE;@;W&vJ*0`lkd&R>TY9`3_FvW1-*7I#;k10w&L~Yw%Vk!v?wkw3*6GxAvHLA z=&K^dZ`1sr71NJ(WMTxN9tqc5V8h+yAMTiDOi_*1qrn;xY31OwA%_OiX=ev3(i~cvVSYu+k2tfb!taJYBxBA$wZ0^c~GiZ&E z;&HgzoIl|D1&O|HOhlyBKOm*~DllR&dgJ{CdR8T+uo72lF^DKL`518Ihq{ft32P^~ zSFt#vovJF=41|D}fBmv{`O7L1=r=%Lp8JYjT)1hauljI5;_66PuvJ%HJ@0IO| zJWzdE$QwYBPC@e_((e0jxaU@UA{7Z}Ko-MKPd_2n>be#} zJ~kURTu5^p8J(Zw(%IoTS(s+KI~ILl{<8Nk^n7vE>#SO1-(97_s;|3+08&~U5I6Np z(*Qd&1GZ4+2jDpnyR))q_uS%Ub0^0ZU$x)-n@R16q8i`(iB+{P4&P0~U-B%ive(6X zAtA}6Ret2*WZAe6UKn|_d4552;jp&6R~Jqp7yU7m<+O9`;_nwY)z!`=xopJL{Tp9N z8HgouH`*ti7S*N3r4ZDO0?|BnF24ovgYL&V8*20PEmTQ6hithdfC`S`VQp*10}&q~ z(w{_&^3hkj7c^S=!i76&8&g<{V!*;ww;Q%%suCjy!FP*q63g@Jlv4ejOc#?+x)Wx8 zjhCWoiHIsDO6yVuY@k|B!T~^tN}4T20IauTi{Y?(cZo>w8HxzC-CGtOq-*TCNdKJ| za&-26j~#L(Q26V`m}+J#5KU5SvA*SM{D<_9HdR+o8JM(HHg;$4*bP$LveMi%Zy{Pl#lQOUl@C zq^&gOPwEb1Zd*=ce+O1P+cq!xL@hLMA1yp(Kas~Ora!vbmlaJQHM@le@j6?2)?{0G zgyH3|Z~d|)k5!b*dC7R|Subw@I;Wo;%QJLZH3z3mLJ!Qg{j%tH>G{$zcaPF61tRFa zu)AHq2!KsbfU_FZIu3Bk2Dr#bHxQb8odmZ%C6UzAKeM0w8l0BvT`~U!tM)S&DMy@@ zTs1nY8c0bU72uR0%&os&&?#j;dGPq1d?SgIAr)PbZAC7I_GDIw#Iw$$<#ujo)hrfZ zVO8(dn?m-LzxKIuTUrT~^&jf(jJR6wPL(FK6h^a>z@$}ja}?ouf^I%Z?v0m8hj)DK zgKDZPkML_}v3}uWd8t|LGZlEstM}jRF#nxI3*7f*sGGL~wR>C;Pd&5}fK2AT-2Res zn5w`Rp@%JU(ie5>j!CLO_zg=fgb=z!P%!({i!{%{%j1XT>kb7xeKLQqGZVfmORRX7 zMb0lwOeb27?4pkO)Q+YV_$NR6PUFY(CcfvFhS0`_*Ok{;$@dHF1-zm~4$f=(*Wmjy zd-C+JmMkrJxUOl)!c(L#-2w~yuRT^KD!$j4QOO61%tzRp=JWCmZ$E2q6r^`6Aa#A0 zkfz^=j~t3=F;9$|6j<2l8pQq9nnnTGSrBTWH55#~zB{Kub!1mDf1V9H9|ni*m7Xoy z*vVi1{w?N~65G5ec-FbD zRo&J4LoFuVgN$scjp&;8z+B2F#xx_~y7ILqjA= z5Upzo4>&Qq=TW@=^Zp*gRN27$M;wZP*0r(taa88r77J~eggK+Cxno3RgoUsB$=>AR zu_+*!Zc(V(sOQH{_b>6H>Pd&;<-U;vi)-hH9Y5?9uFghCbUA%rnb2+jDz-8THO6bAN1w6$in`WVm+pwap=hnY|fTZ z(y{(?-Ba>5z7+gYPV1LxQ~xN#kYt79nP7o<>xO-(eIxuy!BWK~8K#qs%)~X#tgxHZ zV(Q@Gs>WP=7~;8%Jtcdl<{|uAn8`$AL*TONm8V#AFVoH2ww`F-~6>+Ad*dHIXWzWMCs|CsT(37%Z0T29g&+GSq~O7FBuJPYX&Tb@c1 zcic+~So)pcw#NL$IZZS)6SlJbBn`agkFzXx%r*~r7~Ep(?STE-NZ|zWYeZaJN-kTm zEm|k`@C2>wy=+J<_ZivjNfWM5dFOHPOFIjf;wF z^-Gf7@RAkn#d)AMW8qrpZH_K|-KA6RQ(~8?Eyy%IDBgakq72lsry2MUv#HqtlXHn5 z5IVV+-T?g$_utrF;Aa)@s0V4=T|Dx0!5)R*`%VuBvEH;r5MHf!CKFdzOz4`#>##6Q z>oe-t(f@|ALx-OHCX(+Cp}UmWiSA-yza{6%lcJj?Z^4^COnFXz2W&k{h>9cD#ia3^ zYO&V%m$d#v)G&ArE&3!xR(l$aq%qP`p8o!&N%Fq6P*hxB3pcz%_XX#mh}lQ~nI=p{daxw13;^}K+4<-y<0Nb)z?%8rX8{_}Z|+>AjeIlvK) zQ8_wFzaeU_=f#5#8*KkKYygG~H<^C#B^>Lb^H!=~=vr`6-s^p11i)jG4DEaseMUBc zu98=F1Tpfx&azjSrc}FoO%8k5))iQv)S@(^s5&1&tyKl!$zDVQUbHqjxUY$LQNEj5 zK*Rfy&ijtL<`XzW5_IDE#{Sos`wI1(hmWcxs)Ho%KUlPQ&7R$sXuWVn;N&Dh*Wk=Q zzMrcbVG~^C=jTD|(odAph**e%`1^)K?~#R)%A#gZkRm_LD%@HjWzE5KQ8s}s6eC_0 zr)6`7v1T%HQSEMubD-E-uwQ;;)`r^v}-y4GYv?Ar+q^+#&U)yY(Y zOPr}zt|gM=Lg*ehX6|M$p%2Q)Lr_pKd|I+h(8XcjAY1Yge{qCP)Olzk{O}xKwP_5b zbrVILuj1=%K84&H)S8uzBt>n%6JORh0aSlEA0tDXd~s@VFIy?Wp!OJkL8D#jN7`~^ z&XW#w1NZitAHtq@cptJo^uBjOAIsVI#q7K;Y(j>yH zVX^Mnf51UEdJ-2yG_)FIEzm1gR8fAGA(rEsM|Zm5@96 zt8Z*PSUxueV!tl&Mj?!_1Aue=O!4IeN-GveMwiScH5}j|VKkI&#=XFZtu8JS?8Cv; zbv4wJL7MWmTeRC=mVxeY#2FLrCS!2iWiEsv*6CC}kzlE=w5jr#TOBHEmbR}}S|y1{ zkX7$JpO?CpIiqPkmSTT*D;jeTncet(Qt*IQabbZ|gzRnyqMNoBnk$YKj=za*KX|Gi zuWp9~V%?E=Wg!K9#0cjh5V7m6FGqXBK4;;G?kAC3a&ELpx?DdWTARCNm!@3R7}c^k zarmRe9{W|Y?|4wUT=Zob6p{}vV19c0=^h0Y6eR>p~`!M|ffw#W~y$lYJ{!2;CMYO|5zN!myf(Z8{{m+B$c` zCTs4~STgSh`iOI*Co+AI^L^<_fI{S$6TSZQ*xM%cK|<4=s=qvD3hIz?<1LL>!e&{2 zS6(+226Q9^M0&pe_?Am`uk9=$mO&23CS&I6Y=`{CyZmhD!O(Sje#k=5Bcj*r>ofH~Ts~cunh|f83MZ+z9m7 zZXFut92Q4b%CP?Ob|3FL-h7_SKGXbhbKcJS!Fpemt$wkaUJWqdcgA>5 z+I*w;)~91mRgi=+Uih}I*}mMIqVygG{#{w1(GV}I$GubIeo3i1g`eop&Bx{(-_T5H&c#%L2HgUX60dZh7z2PcDoQU1d=&}qgn`1xx)147h63lD!;-&nr zzTY`A4po1gl$B$BOJjQHT5daGUD0-@5BKAk*x5^Q@8kWskO{W6!TK?}9Fd>Oe~ORk zo-{jc{L=-mgTNTHhq6e&k+W#mKN$~*V5EqA0IX(G>yq-Lc^~Z~5XH>1QRpmyfHy+7 zFSq0{qXoS@yALF9#t9 z9Fyh^F>WIT@jWcdi?F}8du`Boy?Pi(_A%WZwG-yG>3Fa*^}d(}u@p|qe4dq=(CYb! zt;L@?eMThyFuP(faxg1}xN_Uh)pvFyBNscmLSP==emd#mpvMzic4c|fN(+|KMtr#X zR?as-{}q3J)%S4qEIrf6`*NPsr8_Y_N;6r+z$1r ze62fTE3g_g_9+dBz{zebOJ`i=`k7j6Y>MJiK{3$NZz_*@EoxKf7!1FM)-MfZ^9{S?qQVL~`*8 zAQ89yvradb0g1*p!%IK=XxlzlNtVTV-#djou=78`H9%8N)~>60T=su?opBW>z-loU zx4l_ZLbUOl0B+oY^P>vn$z$QZg&>Zy6UM~WkP-N=6!9xWI0?t ziQF*~_h!Un@hLFqr)fxnkwk;9NbR0*D3jUfF-%NU_~U3(eg#;l{TV$3L{hrKuIlc&^2x4?b-sr zzq#OC5R|L9G}%T$r)4zb8o+a6P%LB@dTYpjRF3r<;N#pdvnw#SnD zW{}s3p#E|nqx8nsZ9rYz91baxQ2@}Q_xSpPnPj->vOTY=z7af2lz56*@46=Ooy?7j zvdU*}z0t~^)$ut?N<@FiU4>K(ex&$WZv<9cAmbITy4Lq>rgV; z?P)Trn1ENqug2Z?ZY^t8O1zY;V4@uOz}fQc-YclWJvko1mlcn-8RX}zG9oZ3Piqt& zDMHywTXN#&{S01#eVK2KP2%cwO%HAGc{m%)4{~RRO+1vbvhrNZ@pAjMcuNl5JK1B6 zSJ}Ms81ELVYLh&dkm7BY(RJVbDM+~#LPoqVZKK!z8$hINus_?!YR-FUrV&+dX+Y z2Z}VfZ>#JOSp-qn%x=cx`qN&alTlo(JAZ7$=-bE}eDXw0a}C?}UfNe|J#mIFfqSpb zRwE0U)D}~U`)NM)i_E#-%TRre!lxK#Ar8l(t|FIO2ieFAf72;m!75WhXtd0LUHRU4 zEXKpoz5AMBZw$}f5j|~LBl(C<7p4$*zt*%?nP$lb7Q2HK`UuAtEyV7< zE2n{&M{gh2Y25awFoz0Nx*1wI?{#b&0?*tW8S1^)N1U9pdZCHKY#+|`8aTRwjJygy z2Y!Z=`W6bXGcd~&z^p4Dn80O^jK@x&;Sc%<$%pc;wZ$`43AYz6Ehw% zWs`qXa-949OyAzpHFqQk$gq5zeJmk|(q2vjvy$#zK%O#`JP|JKg^kkA#m8|;vct>2 zIFa;@N*BtsqCpb9ZW~4 zb4Q$7pwkVyW2F@HHKzZ%o(**kaXyE-1Doq&XnI4(84@S^PznvNtx9H1y!q{0`reSy zx`#J9Bh)}Ydyj|_Q-#EQsx}!VOyET#ZzEUH6tWD~YCqbrVqHE z@$Irhb9HNc)34YHx5XR(5O=OhYDS?=TtcnV6YQGfgQn2zx8x9b-l=jNb+hSD(@vOe zCG`vIa2TlnKHz+QbVYS!F{3omy+tja1$22)Jjl!Viu{1C?;;~l@qNcG1%y@0bFNu_ zO*M4I|DJ8GjY6e(3;RKId$CSv=1oqE`xOoge!JJz+g5C(VUqqmxA-_-FPAZ$cDqL6 zNZSLyZt4l}A!hlH^HvgzOCVG_b}Xs?=8-g8aPmjeZc}o&9_xshC($p1JeZbd%MXW* zO?&a(2DPuZ8eOW~d~_Ns8h204pd4<(YL)t`FAoDpPSQ7fDX}tSkj>^X!ZU_zrd8Ag z2EAU!#tywAv-ea#c9C)VJ>th6Ia|5 z08VDa#Wnc~#whAnMWNxT>Ti|6PxfWPf3e-~y*S@H08yWU=G)0+MZKT>Y{5j)Lek$^ z9StmXjH0%KJTI(5(gz1UQzsZ&{p!eu_kXODLF@QNE8HI3a5D=E3vQm~dk2SGx!^ZG zzLfSZ(H{x*YgrF{s`EESm?{sU{l@=|XiTmwi;k{6oKGSgU-{a;9$gFSLS&VecU;IE?QY3_m*R3mZj zrF<#~=@Vua^5@DsR6A<4*Lgwj#4F8ZlHq2t-iGFRcIRJ6GK%XG;>&)%bFz2JAf3;o zTH*4{c>;Gg9dh}iGT%N`JTpmTMoeoWE9T8gZ=Nh>IpvfvqYC(;S7L)m2bRrbh2#9 zupK~$XFI}{UG#YLENC+pXig(PS@YK^dF`$19nz1?^XnVMo$KQcS>wihb!h!ng1`I3 zLQMtjqon=QRRsn?xa3RzEP=AX^J9Dqv6}bW)1#!t#y$Z?&gEng?mX3B2fr%!zY&hZ zZ>`msbME52MNn*TZ9RngNq#)q#j>fgH433c`oYLrDT`ds6uJfB7MGg*U8FfVy>wgb zgG*xj>M-U}mt)zmDM5RT{=o*!ddw~Wo;hQr>(%e0f`2lVu^j2#)=7#bn;SU~Loqc@G z%J$rfyMU^Pp4Ca$g*X;~g=FLG8F$n4t+OzCVH@c$KC&R$Tj|``d^ma3m)|La1xlV~ zkJ!zOSG@vUj!rne{{+xCucLP~a^0UOxVeX_{&3I453y4%IoPR5`V04LS{Ec74L6Wl zb)0)=oqh~y2gZrkTk=y2ocvQLM4d5Ye6U+@Q>zst?E7#R*Vkkl&o1}n=u;0I5QZ_6R<_Ah3H9Mo^oNx4Gz zl?n?$Q3-zf2;9!O!K>OeU=+=w>Uuxrr$=D?KhD45FZ?TKr>qqheL@@<+U?2t_TkQR zDXEW=@<8ltb)UfmKl2)x1-R=24rn0d69FkF2G74Jj#th6exVccb7lYu(hjiyAuq-f2BTRdtR$V@M~wGyxaZn-c?$=kXmSGl#9+ZO z`2s=oG&8T1SyjSyte_NmVxt7SAJMZp(=KL%ne`F4y)^;Ue{Al1u}>Pg=4I@(cID_- z5f#DGH9bHK1rM1Awba|MENX3QeaelZF~<{qsC%abq~Y6Rci~-#gONHj4P~?J=Ot12 z{#XT0TNlz`q?c!5_+|gRl3qXyQ3?Xsk@IU>ye7C69D?F!)1zhUZ#<^> z)wj5+?Sj{uoFf&)Q6VztEmHv@o=wX_Ctl`{4=u^=^Iq?siwW8xEw^?=Qei2F`K3R~ z!JPW}4ir#)e!2p4!$L9i(=eNsL8#ciO5=Ivqmux zXO(76B!&vlF=dx`s>|o^Sfk5JI6C{&Ab=Dg^4HIjPU`Xc15_tP94zJiUI`#?Sw(C^ zR~hKr^7$zs<=LfdYiqbK6dO4;#ivoL&ptbnCS22h?6m(iXq?!J#PtsIRqS7q)7VXQ zM}+oTym$u^IjKq@F_lqoQ-j>HNjot+QGa}R?{KoZS{FR=$HFkvbiFMGGQHJ**G<8% z0Y+^s=9LnP0)5(Y=qazKSQhFAQ)t5JMCp{jI@^sdRbn8N?f;r$b&aGm7iQFUH2YJ$ z+^0g1Q$d1@Tv7EZo`Jtvxj@tm6R^A47`bOAI3nt*fvs$k32F2T6YWSvHv~Wt#KZPO z+7fD0Bce4M_Ycuzf;eU)Kt+sTbKcXtpo|;HCRfx7ysd4|z9101VPc#WVlY3NB&q7? zuAXbNh`=vAn(N@%BCFDM=3SkxtR8GA`Z<(r>%7@~On7iok|jJ&ePau&3sD4mc4%0& zewomUCsDPPo9u#2BfUl3p=mH4GXrc;)xUt0M9mogXlJMS{3PnTjQ-$bsl!9(p6;j+ zVMJilS7#jujf@^4+}jl{wXL8kQ}2}A{?7)+V&c#*s)}F6DpP+S$YX;`v)pp7(zTLc zek-#+_XN&|F?AD?w1uU#lA`j!`zY5tS9RxUPa^UI`dDHW3GErPzFq*-)&|>nNi~&^=(_3yA7=8+V#u=G_ zk0dLUnkdUT1gY}IkQq!gXF9~_V)>q*dEMY_|057wdBinsVK0W^@;n70nG!?k zN+kSxn7AC*hM5_E=^_**y~Qi?aaeX`z@ZL*ga$UL1=+n0SBm@Nr^V(@yQD~}5<8EX zM#?>Y#|h`Vjq45_;*uytQ^ZJJ;)46~N`1WkM7Slv;)-E!cDNdAUe0(myNZYm`?r#0 z&hIIe(dE^TwZB0X@8oDAovSTul`t2k%B86!r>zy|;=NdYcotUqCz%rcQ^n4$e~T;1 z2ZA@?ST#j`YP9q#C`ISZ>R|D@KVju*YGSy6q=io^2UH+_93?CTvl!$YDhg!B;hd%F5J7@yuCV&}Z68)om}ut^MArL#7biOAM+OrP*&9(8@PpO4!Pu$+s#^{fYNMjQaea)@&O0e-yQVsxMr6hBsIHBdE$OKds6oC??Qy zfikhY_DS`txI)Q6a}{Z2$osiE=25(1e2>M?v)E96YN$P?EplG8B+sHe;vm6*k0~w~7s9YttagKWPcor3z?B&|{wP)P zZ-z^P-Y?j_@O+KNW$8t*S&AEcQkBG0grmVU)tGzE9-w6ZMC^m++-(aQDx>t(M4!BG zB4n|DvJXsLGUQalHwoH$Qg=7mf6}`?_~U#45B-g8FsRiHUed^Fg{-VVnK_`$NMXO$O`z((s(P`g)Muhx7thW4*LQhQIh)jP`bG?pP$-g#Vie5cs_3yn@_JZy|JE<=^k0tsu*G45D;og7Y z<-VX-xKv0HdWvmnFfJAc6-A?j-CF>p+?G~OJYoX#+XXExmhl(>N9-`I+|LYK^$NRi zmKFBrxG*nb8@KMxj4ed|54+h{?%B#FK>hRVTsbDR$B6Qr=PA7+28kGH9E|HyH@><| z8@q_0tx65XAR%bWYxW2=`}(S;QG}{7Q4LM23T%u1DICZ=*hs>sw!=l)TLNFk(i_*nPhQ-27Jj4_xEqWkZxoWU^yX{q2e0fg{wzTpVi@(yAIFLB z{|uXNj$IsCA1yl=aOKpiWVa_JlEmGgK8go^2}=ttBNCGy^@whdK6!H^^6O$B zQVZ8!DMe6AMC{sb9u)y^un9i1M2~!k>vh7ZI4jBil50lYLhjJ(Wdf{pNzVIG4@pE1 zEA)@`_@b|55xHYlo4K3-#AYoLWg6p-V9ftk94)YD2!OH3VIpYO-gKv{^u&{iXc~$E z`cST4J!pRNGQiVi_#t+o=-5?l|K zBoCuIc28WAn!e!k9pta5V@RT?1TfYuD9&6@eZMJNWE! z$vOAaPUt(}PVH8m;2-jy9&O2!H@|2iA-NQ0>k{CjmhPK(NmIC6#&vW7>DexGg8p^& zjvarH!KPajt^ADW1oRdKc>2!I$xluE_$I&BmiLB6Nd_$c%bf}`%yPzvYjN5w(ahx(E8$Mi25 zc`ty5IfO%w?Amqr(X_qqeZNmHx~D?dnRx7E_1Pz6+Dpw@1i0_~G7NfI~q1=22q@ z`pL$;4G#82+itf}p;ukY&kkDqseCIRq**X3OmEowQ+Q6|Clqi*|;%G+QZ&TpS_n0 zsa3`pT&cZ+2~MXZ+TlH!zwV17vLz?a8DP8n`+@7AoES_<3tMHfDA#r!2-h2^-^K8q+zF~>T|t>RBO9yHVZA0FPMx0_$l z5H#(MG|HHkYzc`~B zqCkTg@MpOYkTd$9;-^Fg*p1~(s(&G^u z-ntGX5`y0^RX)>&WK4Ag21^watMi2({Va^nP`s55u;8rDC%!d6&P~p+^bHu`Wvx&>jzQ7MEA~ zRKP;ljdxe>+5OP3JQBg|9L@e8O=lg~v_Fi2oY!#%a(KC%4iue z)=@h^U`V>)C;9?IVWlHbuL}Pnq~DEvQqrF=8U0seszW!Ml2mPW zOp34N@U@$5?-;AkD?3KOm1Fa3b6~T2rnjaMcK(Of+cf`Snj#jW`>bE8BK zo~<`B6Y$=GWVXp7Th6Pv(<}$^UfacD_Oy*bn3Fgz+D}NNx z5rcgM<4IEzCKqm<2;3% z=KLQEpcx)GT}!KF)HO@k8YOFIsw=&c*uuu31ar#!bs~ml&Sy@<4B|E}AD9P(apti!D z8NW6DPT^8C#$#CY8DJ?4v6B}4`PWgg%Fd!>MMCmoiUd)Q`7`mi(ePkfw+Dw!bq~g_ zg+MIV+j9C`W?sQLRY`sw!Q`3V246hQQCY0+7xPV=0334SeYoVaNkAaiJCU5>h%BB( z^QY?F;q#gXL>t$<#~ZcGRFXX4U%435t1(@<?MirEVzNT4}FnbX1qBkKLn~@!WLxH* zE4pYI&Q!4iilkRdrLTwy?u1zV5~`A9GmHG>e^ezEGyUSF+Mg+A`c(b%G5hx&fX=^i zERAcKOq1u3UYnrU9NN~!UD_)b)5%GogQ~N|q;?Vz%Gj1Rr-3;|emSkgNIR^E?v;8@ z;mbEikxEC%Sncf&{)pNG*^iEItGMtOH`lxKI0utXYJUUlakX)7GD~}WFY_Zq%Oj=i zwzKv|DXG^IpaFRY{E9Ah=TXj%{!(U!;ZM!I~y~Sk%^Ab4r__;Jz`O?aIHSlSjM$yw!k@XHUT=K83xcs(B z9skfq*bE+LJaIKYe25nv9K}2B3vFAH1H#GBuxh6qpW{gP z6&rRj7gCh(P+h7!!Nx8x0!|D18i<@nugi8+%0V%z~aKR9i4 zFtaKWNj<~O*vcjrNKP$_R6K)A$CW%cz>WJ@>sQnS~)ov$MzQy|St?$9eC zDe_RG-`Xp~OCc44?ICLen+o#eSk}!?KEw2{zkvrPIu)V~FtK3yOB!H$d0yelydkx! z5$B1$Glxwe^Y!!Lc0**Sj1-f{x+LMG@wj_!SaEq`vaW_EOITCzZNSBq=9tV$OcWqP zFe~$~Cn1)LrG26+nc>jD{L2wWy~E!-lF}I}~fYzT{%B_a<#mEGg+wo0}R^ zbqG@m8r8;;^pfa9a{oZ&y9^rPwdD4YiuKd#TLjNbR|T?EIN>2csR1%{FdbCV9D>m(nnnlwv<*{ z{#@Lnlq%m&lNc!R?F1GiwD`L_f4KK*@S^|+gSyiX5zuA8M~?exy7@G9+_{`> z_6e3NtylClLckw?EkZ`KRfY$bM>S4n$HukR0ApVu^j#rZ()?GqH|j15Ga@qjBehnN z`7R2KW_NP}0s?m4SG;s5%{|wq2)^JEmJumL*8Z=k14qDVj3?}ij{Q|%mB}%R2|~3m zk&kfMs~VrV*Iv9uH!)7)|J(H~AGXoh9YM zXL%z}4#oBg(dFy>Nh$ZW@?no;YkW!dOSGLnU5X!%1%BweW^x`Mu1O~>koifs-%|H4 znW&3a#w>NAUg7Ob`JvXs4sc)%vDVINCUSqgeor)y*G?*Q@OMi97~d4DLRz9E!2nfpGW#<(9)Ca#?Sk;$;k_x>x&V9rWg_ww^s z({}HJu@@rz%e6jBnsS~A=CAYQs~TM&#NLxx!rf6e_^;=c^M7ka;WLjoM*l0g|IOCm zm01zG*secHd4e}@=F(r;{Qco#2c^01m8{5CWP6JkV5=^ivXF%YW!LdLjUKDtR4n>T`lEL117bL%;smFRd#JL3iS1Aafd3$3K8=2Iq$ zKd;TGug+3qROCX4EI$kaRBO}S>ZbexOY-z%$fmt0Ku=p~v_I64?^PuUJ2k#TUAztU z@!8073A@W`2sy++n;%kFFOd;d+vxAT0x+95MW)82KETBl&Xb-~D&xL>#j`dGVo3ZY zvHizyak_Wo4W03;q#CLdZgW<%R~0LHI62kU(n__qpsLBkO~|IMA!bBE>NxLw>%&_w zv#900Ipgg7bY#wuX;@Cji|8wkK2({>1=C_keCtZ(tw+JDee8g$Y|Ed#Yy+Bzs-l1F zDWE}$X6u;lI#dT2_W#pI~T1>xC1qQjMPS zM02L@={23e3ItZRv<_@*VG24blAAc4+C!M|3j8s06R}z^#@jWuU3k zTU^Vi4ez4;L^r9*{#5|ZK0)@N682u*HCL;JI}A9-3K7I_`R4hdD|#Mx^}RY%>xDmc z-_acfto47kIuM>lN#O9sEJRJ5ubbDOmV`J%FPpkw=-6^2i3o6fx#roH@Kh?GY8g8& zuW(W>VBf4h!qDdz`Q7Xpm(x6}oIN})sNHovn^UjUd_`ztu!l*m|1FUF!oTeN&e|;D zDSw?zdu&2<%*xSl0G{_3f5X&pqfi1HDD`ibr=hUSdo1k@FEwdiF1Tfr-5-iDT=SfI zg==?!sNl2s%sXmkdVd`%r$2Q*6dj|Y({05W+ti}hI|B&o{FU69EUE3TmDnOY^muoDYcv--?+#IJXZc#h+dTW7WLU=I0snn0y$`qR%@e$n1 zH066ctw(f22d~F#jz^q;-s(sI*d_WGLsqDT?CwG8Ee1Jdidl~sle!66hBiOKS}J`+ zEfqmr#($SwrjxRpr);xQEhTiD`=;jZtDS78kEj<*>t0!X#M(V@!A0)5XNQZKh?Ay? zc0D$bD;kwNhJWzYnC)t7tA%I#3v=a-vT_ia?@U#+KIUD5d!U-t zojh5|ns(QR{$Dbj87KcFH+_;ksZAw|eTZx}9(GJbcA$#0Ff?IfyKnOMYP^HEuQPD6 zN<`cP*5;pDrX&V4zGSA&R1wEl@kF+{m{LkHnxwQ>RX7IZTa{QZbWT_H%LG2CT9WRC z8wT)CF`h_>@c7fIKUn%M@+qQP^wH!&!gxAWz-fp@w2LAdQPEJIy1lEJ9ND=naqHQD zQrca(y5Qf|gK_l3#mpW}g!(6R4AJORyEgB%Yz?(m+A6M!p#9GxYDw3|i2&pMH9x^` za#{>4kX-_IgzgS`H+FI=>=-KVT?&!Eh?jD+;%=JyYW@e2!`(X zqFSaHJ6g{vw}X55XoSH`{ishmKEcxl9!Cwuru}9jnVq|>O7VE_iV^fD7Vk?`&-eB$ z@KP4kq8-JhUF!cWN9Y}be$UEptj^(4d(l<1SN*b6cR@Z6d^#?UcA71UD&R@^MyUXb zH??J4KmVdo{FW=gjD*?4yGoy%Tq<5ZcTd)Drp6@OqWXaB>{Nj3U%s<^o~F`aOr;+u z-TeTopNZVtfq@~nL=X%c z2v4Upvrauw^Y{f<;xul@a%jyzzw)H-GXFsqFwWO{>8+1*aBfUjLEA>$Ce4n+e>+VZ z?PMN_8aG$FlmcOKCVOVQn;Jq)?x-TqQfN4NJ~2!U@8`mzLwo*Sb(r|F0sU66B&I+2 zs6WnTRA!^7JSM}aE9W-cZKVCR*&cLZ_AbWFLy^FJ70*GVcs+&zQeB$oOyBb*{tXMU z=VRnyFX^X`uJ{52iYS!0g3un{`+IWKXcpDeQxa0T?{&z>e}Fh2GP9Zbbqw6_Jly|- zB?dJ!_7lQ=7Wd$6u^?k;bl#F}WVwygc)JT;wDqzG*)#c$*GmtS3eg~5xucpSw=NaP zf#I#wt-vmAT#1XzpM!W3-K8E$3)--V^9RxT-Z8-5_%W%kd>dm^*I^|RLe9VEMl0C- zF$x7FUbnrwWK~cf={tTC59Z!g4R-m)=BE!fVhY{4_(Nz%^nJfkQ1Xxb@>VC#jp`8h z{ev&1hRcSvd6&{XA5W{p z-PStjX=$CaTpNi=Xszd_^oECS#oBiooiGx%EoqIuk=P>^50TARU2*Zypxa@8kJSmh zOb)X!#->tB^`Uww>5krA{y0$=|ALHxa~0j4zcxEP%xd*a#lD^pZeu(3^gDYyd`t(W z^v;_R-p`e%Lrx|U z#oAokxlK*R5uZpk>h}6;1gBZU7lJ`o!itK=2(f*-zT2VEXZoH{heiSU3Ez+l32t9f zxHDzOF86`rFE0ZQ^U84fq!c5FFU!ctnZL7)@8nPaFh7|at z!?>-$O+vgLO7RkwPyRNfbb;4nJ6Y>fu}KUz_6Hl^8wrHGwdZ;VIoBt15&%u7yK_`L zs&!*Iayh1`hjL~OUwu|+9FO6K2(2n%Xdc@AQ3=5Mq2KRQ)vz{*k2p7$`-#?fVfhOG zAJHrp<0>(9iM*RDQ9+!{g2D?uOKJwDa~dwhvnKB=5~y`G+)wQE+b(^wCeh%SRNsIa z;Mt^MR<~y=ORKulub>5uF_!(5W|9OyNTsHHDy?_=4be`<&_L+a3As<^bqwiPNt(9+ zt4!Zb8;R|hPcI~W`90X=SE+(0Ax0n%QXQT7%-jDmg-0gb9d0NsyyoM0T=sXX@1Wwr z`OZ|i|5bK994h@Pzl7Ke7P72H6Pg2TXUNlEPHR3zk?Oj7>Dj(*4_r9M^R{xX=;Mwz z`%}*>=nVXdPew1xV?y!-nPrVDGM(NQr2~h0XEMv$6fx2l1n<#lK!Wm`1(aYzR`7#x z@{{b0NI|WoCT1JN-R-%Hga2XnR)%2ni^FgF8;S@j?NK^hIzlD0>T-gN+OOLg?XfW` zC)}hoZE`P_;D-F~&%?Bu95H$7jt1AK4Jc$B&$-ET=zP71#IUwO=wOe5QMnuD)7?Zo z4u44;J&ERT`!#HPX;_a*=;}Yk`;Bf3SQ&C%QI=BS?u8E5yCT{(_ZkGI@bRs6f)(EY z<6A!CX|batHDYd5|KnVge%{0>EeHDXxU|9~u$dokgL&UT&W46}p4rTKbPvKxR?h|e z4got)JvZ}&h_n0A?xsXz-R7^X_gAtUp0!FWjK|?R)Ya6J4qh0?Wd5Zpxqgpr+l$Tp z?jPcLJtRM)UY}x74SZ3Qb$-#NcB~w!U3o;IbzXVUl}gXFolX0!P*kuk9ELd>-b*-c z!iO6gsQ98kN8!QrZ$T!6gP1CuEB4<0e#ZD|dw80^`LF4}s6UEZM!(}F_;KkL3!U&h zRBO)N^)@}&$&vn}e@PA9N-0(sSd*Zyy=OdFaJ;d7zC| zO}Jan^2!sd{^k607>c`KzA8gN;ss> z@+r^QFENmPQ&X?d0sVJ~&5T+*V7ozza76!Eb31^t`Ibi+^6>I?63HbDE1+Kqj$cX} zXgJYBhc32HozmTTBkT!pu0wq<(2C(J#MF3>c1=xH;qI9cW&5n&3il2h{S6wgl38#= zQ8yRo2rkmLrFX(D6J=(OO!Cc~HHxYIK8(GzMU+wd(JVLqVvn*$)S+h(ramX9DdONG zXVQZE;XdHi)nRj)$fWUx`tOhDJ}Uc(%`#n^L~DuW!wPvOo^yjFxJ8}<;F``04^UigI!wQ@HbGOJ2G&I&WIUFsC#JCu$u>z1#nw;AYsDfGD~{F@qk zb{D3M&+f{+?&^JPg9rK|PI!}&YWEr)nXq61Bk-S*)aaEMHH+cD4^irL+EF8I7i=M90~Drc^G$ z-u0EEGVhPq20Q8Ig6?;FqA$BlsAW=ze!_5iI00fS0FWQG&fU8-#`OhUg~v>E!WbH_@aj| z+{-b2Ym#79*~exYm@|fN=0JU>PKcP`5&M>;8gISPnJAx^(B5;H%M>zEmi*+0%%O}8 zE-7}|iAZ3T;qd+WMdVHM1(;{Ga!=xl6^;nJyh4OR1MVPl?3*j(W`aa_62V3d5?0F* zRW4%@RUbK6lwH=Z_0(QwE~vz1w>YF`gAiruH{BWdM|5hg_3{|F+56I!@z1Q#)>EMu$oZltAIlVOZzkJSa z6QB}aqoUg@`DmH&zo7-4&un~#7MTVrTfR39{d`Hab%|*=G=As?zkN}86nJe_7k(>t zixs z$&$6>j&Cbtx)U9sQN*osWn|S!KFp~~c{wedNQq{7a`(lZA}$j6(ri!e$(+Ls86I(% zPEnpwc~Fg^`dkG&oJTfoxdwaR5dV$&V*y5|%WM|Iy}=QDTrZO9IFx!Cc`X{`%MuA|dM z@3fktnYPC&U?(srMJHmWx+dR2R%WEsTmE_V^CWr{kGGK7DWUQ;HzcI^t2=FW-i%ci zm385t6_2yc(cl4_kCa4!VOiFxPXo??o2mX%k5YwcO?0CN{o5yR|a|-4Gi|xtJT1H}l`5`U>jGsmIysM0QU3zjyYmF$m&;yBiN-s9e zZ+6zrZ=wP=odDE57>!4=uX4>NUstr@q=0s{#&2Ss9thpYsUt^Jm@NV}5+$OUBG~8d zEG7*Jyr6O)=I7@mlM~(J;>NTM#9{n*cRyYy3KA-lV9Q(+;QhHB1QMMKVD*j-^IJW1 z*YX&ql#5^MhKn<(L{h|Wgy)4UfC7+DOZ`n>udZ{!b4vW@4L1Q`s(CHy0jB8luRDW% zGfh#Lq&LiluU$P&FnMbK)oyZTv=fP>BV?%O7VdN5BE#zMEi@Wpz9Hj=W z+!GUlr7AD*I^wROtu)Y; zf7^xSKU=R|?}IazMd^8Pfugih*A?jS;zf8H|HZl4ru@m0BIhm=JycS^08j6*JpMD?Ed)mtB!@?bx$rdO=BThC3c z1>c0tT2PKsXLwAhqO1+YKL2g;##`&hg7PrT#}p%Un6`p|r{|v?4z)s|XS7n_eRq7! zu0vTZqF`${qdWdZTmdkg z4_29YC)E}haB+e{oAWUT9*J5 zQj2;MG4$xcnonkk>dSZ2NB`o6#c7on6Ywp{qn)t>5iAm-kSv_R8I0kucc9zv?^ zEex$V0jOU&@95w7iL@G*4#lQU8a&^;dWhQ$cV;dVK3@@ky`KDBsq-@e&w)BWRg!V&MvIO{E-sW!^XBye0JuEn`oGo@=M~ zc>6o5Ko&>R=V9w>lhlbE0b;}gmR={0VOlGjln9LX7j`&EayxdT@OhGCuIpl?P*N2e zu*u!V$%zBbRF~Hg;us>Bv-~3;I5l&*QBIe1=x{syBH-Mt32zYDhv4Ir=v;qD9Ut z!b7Oa$F3Pgiw35s)=IAKma=M+dU9FUB<>~;P?v6ja?`o0|MF(+yQ^3kcaoL1Je?ZM z1c1a=NLQ5qP44CQT~GHS_53SC)RIh&ZR6l@@OPt-$?A2l@f)wovnsYS>WpaytQtuG z1ka%_wxCn{&($#6vK!~tb$gGO-l2_dQ=J;n=G(osQBzj_N@au(ezhBrx(w#^p#-zc z!6`iNZk}k{YyooA0%#8mZc(jX+ZJV!S?~zY)QZUJPVRu{?v^{zsx9yFbq3m{1EQeh zHYR`ix@+Dd+D%x<-8+Q)-R%RpsBDN1rNMSThCVslH$cfZ>wYWmlBXQD^d$kbxmp$F zy7-6EXW8YiaVuT!SAbsA@MhoX>zZA!t9`LX!X!TqW?S<>YP`VIfghAzfj>|D0>49a zuPI%m2x$ArlKubn0jNqHA=-_K6jFM%FXduN$;foC#D7%j4Vtr7krM2coq`9Mrx$#G zSRqbmjv6E#CJ~hlW)vhtMt1Vv0b4&!0DZlxW0GLpyV^f zS9LRguVbIKC7VmlzUa;%eb8Zv->=)s=2aUJjw-X5u<1#%49e$zOUk#;12E0-J?UE_ zJ6NC(Nw=1cRI4So{#Tvk5}esydO(Am!zFoX=;@NRg~Il~y;%DB+Jbxql}{JYdBJzQ z+T-StFMhEvLrji*y)3 z*zgcMuviOz#a5&e?Kfnqe`gT&Q4-SX&L@`qOpORv;8Oo6CLURo&t~k0HlYu`Mv8FDne+I+i1b0r-8TkjEYm_Zb9?)E6*8HISjRMB2mdQB(Rm2 zWR_C(6wbhd2=DKp(^oF!4Qu1uk?l%xpXK@&Lfu!AF@(sYG-)pe95SudIwV_J_+Tg& z)$(Ea=qJ*%cHvA%myAlsEd2zY)X@I;^o2JTI7B9W@cZGr`Qng3SC_Y`Laa7-rb51v z!0+8DK==`D+Tr|It5nS5up}CC*d}48W59OlEG0wkSqCL_>}8b+B9D74`U3>xqk_sp zxw4K*zHQ<3gl-$r&}&h}>))0C^E{INRhA=2L-&O3(kV zJ?Y86fbR>Yih&oy#7Zdrz`N`5B+{G{W&Y(4G0T0ijQ0@c+Zr~9WZrGXBNAp(snpXUc@a{PvfS zY3b2xcmb2xd$=eK*X$H@N9;`5y4BKJ7_N}k8un*z>oPxm_eoesB6(?V=!(RLUfMJN z_s1tCZo_Yeq8H(numH?yWjX}{B82dhx5Ov#o-8v`D?ZRpY>i$93)1^Snl`Yy?vJw@ zcKSgds|w%urIQX9maC2zAO*Kt$QH7sKdefx*C~$k@lwg5U9JCiJRW4x4}~ROp8H6U z?OoAfjtRS>UGR&xOP^eiwO&6*9|@fUiOz@x(e56=raDc`w9I7|Lb$!v!^hEkE3-wa z%t|GVv#dil_GYny_MEmhBxlhp{a2`|QGq&w9#N!U9>L`|k*s+V`C)FvRE1`_#wR_h zBV^gK)zA*F?#@(R&0jY~3_019%9}JGIAE#533i#(!G?1+&w~cm~;z6J? zrf&H@pwBN=0@>SQ0sB21z5L)-eUm%zq{6=)$RD z2ke0Fcwkn~@_19xzDJwK2v~Xr&WQS1N0l-_zuSc3tz*5R#0#VimGkX0rMqhCn;$y` zH{CQH%5PQ&0Co~2!w0;@V6tbO)zd;J&lZO74UH{32Ryyj zs7?JRO#2P%RMVX5IknOyLGF#F_x=tk!9X`Q}6-J3$y&_j#{}Cfet~z-J~nIbI7$Sjv(gf3pg>8Kscg$rbttb z3_zIR@?^%gSa=|+pOJy#cx{p?h-EvcCG#ZG3~-6>xN6folOs0S07gX^sf#I%ukn{OC#}pEGzW|d%@NNRW|}K6qj4acQ75GvZp*s z>pgt!wtu$nqY($=k4yhqd8P19?4^yduPRl2GA)9R$Ke8Ymx6w)8htMS0w3-*RU@3M3M-%yIHT*}LC;o9 z5}FbFItkBvE1Cj3c`PAjCKiF5P+`$ZH6770rn}VLESUcz*w9knvo*tpUtqEc}udvLp=M2HKlmj8K9 z72s$g_k|=HPKH6d=vkvLT04H;Tk*bYH`wpUkj%eBqd)#hI#~*2F{zpVDCY7{dwffX zT&BEgji@#LJwZd(_3&;|9Z1i{FdpBO;|Eup_#k8VLMT?gP$wdo;O2}w-~Xvx7qso%Wcyenh6gxD zeT&o8qiw{$S?S7s{zJnEkeOb^>up@zKp9|-Z!UD&SfuC>1)Rm%XUHWU24?(3+zZm+ zA)0exfDmI2rhOU!QC2hPLQ_yk-C5UKr2QYG;4PIT?R0{;Z__Nqb8VhebTL?w_+o7% zrJW-TD%l}r0p=cp)O~r{Xyloi^iRZ}pQ)z9kyGv{AmAc^Wx3o#-SW_yDgc&x8OT&&Ox{gLt0_L zl6KRn+vN}QfDCz|oF}bc!S{p>_mx;wq^rF(%L;h_tfH-+Hw(-&+H=nhtzIuWJ;Y=> z0YMU!gNdF~wz$HUV+;}Wmn7U2dxl~#KQl75)$lA^$;iX#MJ#mb`wx)yMq-0+e`R1U zPxU>xOJ-!STqIYQTr*FU*r2&OdsN}7?0JXvFBs-rHO zB5A+z<=otUqj75ILW!VIJt@-Q6&E_=zbqEv&ztYup^%~y_(qU%lDx1M-V1*G;`bl_ zkb$CBd*w=vyak3U$fB2I-w4%p(M$}V-vC#AGazkk6U{%}_MD{;C_e>uJNFCZ1sErF zg_3_QnlwHj3l_oE_;kT3Jjf{GbI(gQvcVaPdrbgJWyL)jhb|bYbkUW*^SFY z{=cg9Cf874K7DynL#@$L=x=nIt9c{#QfrdA4-rQ^)o*J1dmW0XMqDhq-d@264okeF3trV}ql4E%m!?r`;lz|S zH{dg`x{g~0gl}IA{gXC_0Svc7AmR>!$Z72T4a`e78ZM4`oGFwVos|2zRzL>d>OM!2 zYTAy#V@uGJ*6xM34({ac26qdcyBF5P9j>hX7L1+5(l|f%Cjq@gJc@xiozg5h@2hX0 z{xlCzrMhF~ZEhT^5B>Y1S8xB`V{E{p(2=MxxiR*N#vyWjH2binItnKXlf-$z?svpa zd%`}(+q&>_fg{|xa^?Rk&7g2gm2z3tpa4&YEb7Iy_i8BaA@0~eKo-?5fPZ!Uc6iVO zFl?g6FH9qi@FRZ(IVnVDFO2*dNLmCWTox^zj(|1t+FN}H55i4ABl{WAxo>!!I02b{ z78Z9=&C(W^KPR=}1=uUolwTn>S38{ORo}AFWfbu#R-(x)O4Z$%g~@Iw9
vD#!n>co67S zrjq=N*pJc#%f-{8G?Mf7uzLN}c@frKrQHxnwNS!6$m=j#Az%O>d~kf^)ADOT#tH<%%4rh)5BjW z57e23-CzDYBL)wcuUz5a5Ou+lXC@#sde_Vr1Cd+%kJd?C@@yw!uqS*Y&_7}+C-TJAs;L2v?`Gzc@lJf3tpeADNjoNPF z(yVIEm4eT+Pm@^1-EYoJK=AQDxJX$8udNJ9!;z?4VqooS5bh z@6Ubu%NX zE{u^n^R0Zi8F-wWQ)m|2fm2n_YuiaCy0Ux@y;2B>HH`><94OXN_4}EXP#HCd!Q5f) zl>fZP{oA7tv?Vc36@Ni)gN?Lc2D9gLiX^3?vd^!cKVd8>2cHl$;+HSxM{bQ2P#nX> z>Cfi!km3Gw=AvlUo2CbM3^(XS7U&g2G{ozmX}gSMSS+#vEXN#juB{;a@J{%|uvQFd zI8B^`g~NO&(K5ZvK2%S;9E9=CpBvoZ5RV}pBefgTqqc!B`YH1zH_4ImECxSwI|Lv2 zzs{v@7YFS{vR!xtK0celMn1b49}lhZ*mn1L_(dk3<=~?%wT!vfl;PkP!Cm|b3DY$l z?`c-8DW)vfN~Ysj2eI!*BNDN(hE2FXUwBRK19eIH7v{etVWCEwu5Hm>f-Wd-a)?*K zoqGM3iTn=1tJA)Jx^RC$A;QY3R_wJX3tg0-y#m$Y4 z|GXh++m{dW3K6pLvgb6Dm2%D@M9$TvF8L*Mme~8NTlOoiQM@AUHWG>y z8O#zDF4Y&7i>rQ6QvL1By{F}nVNl^r4@>qhFz*Eoz+Yd9L){#I4pP_l?92zZ8}t^o z@QmJQo8T+#Z&ETm>0D3ZQN=RJ2!8HyQLIM)-7mnXe;b{mdNpp7c|J{_{8xmIMQ;{z z+qNCA0ydHU;`q6C5|$@lGzK|Wx3!gG*0_D$OV84&aNkcwC+;#Z!KaxwD#c$-0O!-= zS*dbY(``~vq7X2_77kOc=7_LGxl-bmpR|_4$2>}Y6Z_=%Yn9`AmgJ$ELzlaybO_CI z%61~y5ptf%P}z!UjJm<<1(tHm>%^9RgiH}gqIk;;bM8Dl6;2AAmy!hR$@`638NcZI z_2ySlW22BM<;)FyHnk$C67js)Bqm^cU;IOiYU*`-vb>H}|5hda*$}ndHdfDrNk_VM z4yaLnJni;!ksg=FU)nf!gpyr$mIyx@JK^!Y6qNNU1LVA%2r+9hc3GUEXJKy9^8k-S z(DE4Zspm%Mcv17Lx3Qu0N~>OX@0|o{e9a_0dRx|qtXoftbBPLL&No=;T2aL%Q=Z*p ziYT7yalHxJR-|mJh0ZDsnXX0M zMp)#hgQTt(d-=1}@RD*k_cB=nO`BG=kKu7EQ}=d9-EBC@)rVgjB3FR(!VvlyV2eQ{ zpk#FcD*a@_qKZ~W=dh<4v{>GtGZEbo?-R=FsiYL1vE_lE6Sq7x(ff~ILJubw7iu>3 zJfh??t4`DwJ+_dJP6o2OQO_BriLWOuXHSeOS@{SWZ#jj3E7qAYDwgr~5|SWjs;e=+&n30BFQd0n z?akuB0)*$EwE6;TKfQF*aR;4Mc1kJTYMTTnXXwc$O5%-Dw^K{dr!gQK>`lPyTy!V!x4v`m^(TfOlcoA4XoQZElJo7>h{e;hl==9* z3m+PXe(i0IpBl8eDu|BN2u3}Vt*;B-Q9T-tG?F;G%j+MSC(}J*xBK^Z*K1FY&~~c} zIr&M~$EM4WL!9b2R}+aZt7aENqD5o&sgWi)vF-#P>#a3>PbF?B`hy>*)aI> zq?M#KYMI}j@|+nRsMWyrSlNpg+|uRrtgz+a*xvIC()eyqQcrN=Ub#=g1*uu{;*%F` z`5oKmx7|`(NBxY+1&>wYKj%i#;PF4x$;H#GJL-A@nOsOuTMcFP9?F{7D|dW+Mwm1P z9d8+LU~&yQw*;B;VNY6zUU-rlb(}A+Pfbn5OJ{K--9M^83VTqz2gksLGrd)i(0Y z+r5vcm$#em5b~}8>My=@{V^XFl#Z+<0g3N@pl||f&siK1{J#KC60q$LPuJ%O-gPtB z=LHizQFTLuN}q4M5u<=KMI&quo-f4}zNEmHmQR&*6?_%y*|VpYuA0aEfP}6G3`m8p z+t~8m!sDI3=tr{v01@v=L_t(M`>d}3wD~nBcsU+mMlU`09Q5AMOM#lfVNM`Q>%lyk z>ip*zbgOhr4L*kISZKGK9=760Nt0%S)RJOZc)^TPc!5%y>p1^ zPnimAxOCNQo{d}3Gfr0x7&=tx`7sS$51>>6l2S8b?t@zUl2h@^t`NM5-on4zY3U_& zt=xm}!bcEVmq1vi+jH(lT+g+C<&}<6)X^$2*n8ZW*84DB)iX#}H8cz`@GAJEu%z{M zrSL8H3EL_00}nh9J}8fO&rJK;L0m2UhFJ8b8jZr=6~YU9tMEBTfI3QDAaQf(PHySZ zL+J0!*>PslRkJbTXZLjJDw0wb0|qn*l7y}Ycv%8A?ID8NpE^pEKNU2qtjrW;rp+3? z1-eZ0aUsh{_&If4ogyRn^uD5SCe~`2K@>=H6pug7jrav$6WF;&j_6&w3g|s$%*W}f z2DyOqn0$h(A=MY;h@;ovJHT9<9ld>#mn$n@u6#Lr!-2n9Je&^~jSvtX-9+tEy(J;FD#pvM+gn9{~J-2OK>u zkCYvX|2^GszFce4MamAve@q|LQNk~qi*pOXV$u&RW@Jk=gmNzpd=cmL&11h18tp%N z^eDcPJ9!NhdM!(aPO>pyL-IYo{`$_$Vdhe)#-r(~**ee9j_DsTp=-cH^P|Tev&LYS zl{}AQ6R21&)po7q`2qXjfcPBEYN7AmhUrntT0D1A=Fp$TFAdK@T`I;m82h+c zZLpig0Z>qf47;Q+8EUs_3Oj_XvUi@sB|tSr?B5oKs5|8VRwl zwe|A8{`&7VzNNyFQ>H}J0UJdKPa+41ejYf^*Bjz(U?*SI^@(vtW4;M&bD zbh=7eM4J4V+y-tC1#$2keUDWQW_j=&J!a<#iq-x*t5-`oxHSDCYBhRJ!&$m8@0AVi zluca5ryKK{)Cfvl9TndjN8;%fYKj5b&ED zv<8ZS7xt?-oh8yrGydQE=cS;g4cCYRB?gb`Rpui6Wa@3t`*~`|quQj#KcLs9-GI>d zLjM9?SBr;hK->$7!T!A{`rh~W$had%X1NC+d*CrOjGG_Wyt%;~Aba^c-}%l}SFPrU zm>&v5IEMns)A9b9I+jv5l($A(qd4fG{}JrZ@u60B|7QcI8$Bq7; zSbW?FOE2UyH>jdK7Ds(q$?uO34N{Y^A5!`xJKqWT{aximinpRDy6E2S9* zQ+?%+E0fk{u=d`uRQk6o+e%-gP+ko2*kj=qsXin=9{9gU!Gn;xSV;5#?!TYF{qjTi z(|5iT!*j)_2$h}{|Ma2kK+c2NljWL5)=vG%v;IO8;`lZQf51@*CAls9B}h~ z=>C3}M7i$Y{_VOpioR%o*}jX+Os&xl#~wcTm}hfY50530yvq7RO(MSvDG6ZSYvmP{ z{f|e{aVY;lWsm9Qjz0F-R{a0H)Aq8PgMV8IZuxR|Z_)lmnCe}O7U;~^wUs?;jeQ=^ zdn~`>cczSB=0UurVbo76z^aBG$owRy$URYa|~6;9p6HU_w0w3;}=EocCHLxYAw zgxM7Imiy2@1s_g8Ta>=Ovhug71W$Y4xo_d3Hm_*9iq7AO+d1RHw)hG5ATnKZO%AE; z*5Z4PGS;J}Ch1w#Ft)+y9!mv#%YFrn9~F$@{g$`%-RT@)14*m--%sn&Fxibaq20leEwH`|Xc%nmxSn8h~!aUzF_A7y>fqeY>wmc$kv75J8-S=v@lSJ8#`O80*(kwRmBT@?M@3cojy(z|5ZuEx!ZsIuvh z%wLCq4;S~V^(y#*+#g21zi2+E1fPxJQGvfmjS4nZSz7d>R%W;)U9~%Nx{BzyW0$cH zD_|+Nnj&iy$P~Uf$fr$9!@oO*%#%zl5^Ab6PI`S)1;fb`c&SAJFXxKmo!Ab0Dip&L z@r<0{{pF@9@pJFI^I!S(A+M8Re`Q}WdKwa@tA<3ohxom#Fn`2?*Rj8Ir%?d-T%FAo z*F~}H)22XHCHMO4 z|B7F^4AcB8`~LBdWyRr3%l}i-Ra1r#?cTlHOIL}dV~%z@@iWI;H|a>{&PR^mTW7v} ztF4P-1h4Rv>X7=VULm|%EV%df1+OrsKE<9F!=t?uaN!0({2-Wu3vYXhfsa#iv}_px zeOVE;2fU=K{!`OcyP@;=jMG)!m7aDQbScb#p<_S$NarJGpN;Q)`Q?|}(jWqF*uy>M z80n8noxw3_dY$hp>th#QT|3aH6FmQ4ZRhXWRuaVV1gy-wOJfWtcnAzpV{8oS48bC9 zVtf&KI)sJ5E>gtt;lgl55H3>Y)C5;1V6JkS3%E;Z1VMj6zz2eZbECq4K$@WT<~zIl z-oB@&U%B}4Vp|*k&}V0Mc6N5(OeThBHta!$&mJz{{ZL_QpdCFYLo)OKwce zGJm_OBFa;_jJK;$zqe257dPmOPy;*W*DjVQ_^dLgJ~Qx0@TX0t4J&!RY|9IUr+0jRI2?Lgax<(;>~@u)Ut-MvRPYvw;^Zj4 zL3iwG!(LMGQVgDXM@!~_LE{+@1`l{(d?sY|q-}vm%x`-;8=*U{O^M#p%E}5K1xKkE zp8T23O@`!6THtn@A$hFnA`*5U=55K1XXnDXZdaXGRPerH5{$f>I-vLMs28nxsh7)( zaz!@Ws8Op1DuyAUYePdFrXDXuPZvqXHOk~xpjI9|5n_OW+yUH7xV7}YQ0o6BIwR;zJyu1tw0 z-F~yR$>8l^ig)#R5$)s)ZABu}MQP8A|F9NCLCMvfsbw%$&40x!1SO?4EBTgl|O60@$i#o$uM@KE5EK9DwxV$J!$cv(aXN5jJJvGz375u+C&##KP zhvGjmq9>JmO7zrft?%s-wKAz75IsZqmygKMt1;5q&X!|mo$d5RC93E>v)0RxB->S& zB!j1t+U6FU*WYrAk1vV-ywW_-UqtVh_>Xwpn~$fzH}s78vxb^GICvM^+ZQnT^gPSMIf$FrE1xW!A497UCA4t9Z;(K2Sc$|i5n#bzI$ zw;sfPGzh_M*4duvH3zk|_VWvRA9)V|Zhiw6ky1r2O2;pbKSFK0I-gn?3gwta*<9 z?R@G_Q|iFyR1q2z+0H$(o(Wy&MQ=symc81tnE{AK*oiXiBKRKndgkdZ8p$Fs3o@-Q zQr0J?VwilrdnT*p)H1Al%iZp5sXDXcC@*@e=xphY;Hk{7?a9g{Ap_S9e4Goa2lk$d z-U)st(UYluh+nkmYNAoG=-NUq+PMe?^yEH^9cQ9$SJ?Sh_~$gQRI6$9ws!1CZ%d^T zgzsce9y@c#3E#0xlNCOF?b%Dy#dHKb2xbyJA$DSlpCV*V&N_#BdN6cl(G0r1%r_~z zz2=)*Lu8K=|5otD#f_u4Eiv*fXg+5JFQA=H8eW^~=23OQ4zvSA@kyFHm~Ll)w`uFcXSCn13QJQtBYor$V5(I!orgip)Lw|sQ(Zqu;hZSo-_n+ z$h)p(PRmL)L~m<0dRyHSg>OOW+2}oamYx95DR=_Bi#5iQ?~^@l{Z{Vj@Hh$)uG&)1 zC~>YuC8`Qh?1I~|9;OSgO*t_54zJN$O4v+*iE5&&awumB(0G0#Qq z&B7U-@$&Mautp|!R=A~GzvV|Y} z(TQ-{yAs3k>Xl4zyoj{z&M_Byncz4q;=rscZU!53sAIf9c`ZMNeq`kY`Wj=lE5CML zh`|5GnC+T%BZ#JTa?Bwd3OWJcr-rRx2moqaTv*1py^;X~RZZ z?&QL-uZcg%-m^nZ)>K5S9xfUd7C3S7^oK<3of+)?3;4I@_S%Hn+=)mY6&|UG6aPQk za!2$s(5dXNZFK!g&17vO=AM1_g99pG^YtvrrcHAGl;z23!|QB`o4XadKN3ikKC^Hp zQF=elCnJ8$aqIuTo*i?l>dx86pLd&b+HKl9`wy$#`5&{_ZbJY7002ovPDHLkV1k&M B*;W7m diff --git a/public/images/pokemon_icons_4v.json b/public/images/pokemon_icons_4v.json index 48c1519d88a..44bced3adc7 100644 --- a/public/images/pokemon_icons_4v.json +++ b/public/images/pokemon_icons_4v.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_4v.png", "format": "RGBA8888", "size": { - "w": 124, - "h": 660 + "w": 123, + "h": 656 }, "scale": 1, "frames": [ @@ -135,6 +135,27 @@ "h": 25 } }, + { + "filename": "445_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 0, + "w": 29, + "h": 22 + } + }, { "filename": "445-mega_3", "rotated": false, @@ -150,12 +171,33 @@ "h": 25 }, "frame": { - "x": 94, - "y": 0, + "x": 0, + "y": 81, "w": 30, "h": 25 } }, + { + "filename": "445_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 22, + "w": 29, + "h": 22 + } + }, { "filename": "487-altered_2", "rotated": false, @@ -171,12 +213,33 @@ "h": 24 }, "frame": { - "x": 0, - "y": 81, + "x": 64, + "y": 25, "w": 30, "h": 24 } }, + { + "filename": "445_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 94, + "y": 44, + "w": 29, + "h": 22 + } + }, { "filename": "487-altered_3", "rotated": false, @@ -193,53 +256,11 @@ }, "frame": { "x": 0, - "y": 105, + "y": 106, "w": 30, "h": 24 } }, - { - "filename": "472_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 31, - "h": 22 - }, - "frame": { - "x": 64, - "y": 25, - "w": 31, - "h": 22 - } - }, - { - "filename": "445_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 95, - "y": 25, - "w": 29, - "h": 22 - } - }, { "filename": "487-origin_2", "rotated": false, @@ -256,7 +277,7 @@ }, "frame": { "x": 0, - "y": 129, + "y": 130, "w": 28, "h": 25 } @@ -277,7 +298,7 @@ }, "frame": { "x": 0, - "y": 154, + "y": 155, "w": 28, "h": 25 } @@ -298,7 +319,7 @@ }, "frame": { "x": 0, - "y": 179, + "y": 180, "w": 28, "h": 23 } @@ -319,7 +340,7 @@ }, "frame": { "x": 0, - "y": 202, + "y": 203, "w": 28, "h": 23 } @@ -340,7 +361,7 @@ }, "frame": { "x": 0, - "y": 225, + "y": 226, "w": 25, "h": 26 } @@ -361,7 +382,7 @@ }, "frame": { "x": 0, - "y": 251, + "y": 252, "w": 25, "h": 26 } @@ -382,7 +403,7 @@ }, "frame": { "x": 0, - "y": 277, + "y": 278, "w": 25, "h": 26 } @@ -403,7 +424,7 @@ }, "frame": { "x": 0, - "y": 303, + "y": 304, "w": 25, "h": 26 } @@ -424,7 +445,7 @@ }, "frame": { "x": 0, - "y": 329, + "y": 330, "w": 26, "h": 24 } @@ -445,7 +466,7 @@ }, "frame": { "x": 0, - "y": 353, + "y": 354, "w": 26, "h": 24 } @@ -466,7 +487,7 @@ }, "frame": { "x": 0, - "y": 377, + "y": 378, "w": 26, "h": 24 } @@ -487,7 +508,7 @@ }, "frame": { "x": 0, - "y": 401, + "y": 402, "w": 26, "h": 24 } @@ -508,7 +529,7 @@ }, "frame": { "x": 0, - "y": 425, + "y": 426, "w": 26, "h": 24 } @@ -529,7 +550,7 @@ }, "frame": { "x": 0, - "y": 449, + "y": 450, "w": 26, "h": 23 } @@ -550,7 +571,7 @@ }, "frame": { "x": 0, - "y": 472, + "y": 473, "w": 26, "h": 23 } @@ -571,7 +592,7 @@ }, "frame": { "x": 0, - "y": 495, + "y": 496, "w": 26, "h": 23 } @@ -592,7 +613,7 @@ }, "frame": { "x": 0, - "y": 518, + "y": 519, "w": 27, "h": 23 } @@ -613,7 +634,7 @@ }, "frame": { "x": 0, - "y": 541, + "y": 542, "w": 27, "h": 23 } @@ -634,13 +655,55 @@ }, "frame": { "x": 0, - "y": 564, + "y": 565, "w": 27, "h": 23 } }, { - "filename": "445_2", + "filename": "464_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 0, + "y": 588, + "w": 27, + "h": 22 + } + }, + { + "filename": "464_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 27, + "h": 22 + }, + "frame": { + "x": 0, + "y": 610, + "w": 27, + "h": 22 + } + }, + { + "filename": "426_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -649,19 +712,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 29, - "h": 22 + "y": 4, + "w": 24, + "h": 24 }, "frame": { "x": 0, - "y": 587, - "w": 29, - "h": 22 + "y": 632, + "w": 24, + "h": 24 } }, { - "filename": "445_3", + "filename": "426_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -670,36 +733,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 29, - "h": 22 + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 0, - "y": 609, - "w": 29, - "h": 22 - } - }, - { - "filename": "465_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 29, - "h": 22 - }, - "frame": { - "x": 0, - "y": 631, - "w": 29, - "h": 22 + "x": 24, + "y": 632, + "w": 24, + "h": 24 } }, { @@ -724,49 +766,7 @@ } }, { - "filename": "485_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 33, - "h": 20 - }, - "frame": { - "x": 64, - "y": 47, - "w": 33, - "h": 20 - } - }, - { - "filename": "464_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 97, - "y": 47, - "w": 27, - "h": 22 - } - }, - { - "filename": "472_3", + "filename": "472_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -786,6 +786,69 @@ "h": 22 } }, + { + "filename": "472_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 31, + "h": 22 + }, + "frame": { + "x": 30, + "y": 90, + "w": 31, + "h": 22 + } + }, + { + "filename": "485_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 33, + "h": 20 + }, + "frame": { + "x": 30, + "y": 112, + "w": 33, + "h": 20 + } + }, + { + "filename": "465_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 29, + "h": 22 + }, + "frame": { + "x": 28, + "y": 132, + "w": 29, + "h": 22 + } + }, { "filename": "465_3", "rotated": false, @@ -801,8 +864,8 @@ "h": 22 }, "frame": { - "x": 30, - "y": 90, + "x": 28, + "y": 154, "w": 29, "h": 22 } @@ -822,8 +885,8 @@ "h": 22 }, "frame": { - "x": 30, - "y": 112, + "x": 28, + "y": 176, "w": 29, "h": 22 } @@ -844,7 +907,7 @@ }, "frame": { "x": 28, - "y": 134, + "y": 198, "w": 29, "h": 22 } @@ -864,558 +927,12 @@ "h": 22 }, "frame": { - "x": 28, - "y": 156, + "x": 64, + "y": 49, "w": 29, "h": 22 } }, - { - "filename": "464_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 27, - "h": 22 - }, - "frame": { - "x": 28, - "y": 178, - "w": 27, - "h": 22 - } - }, - { - "filename": "426_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 28, - "y": 200, - "w": 24, - "h": 24 - } - }, - { - "filename": "429_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 225, - "w": 19, - "h": 28 - } - }, - { - "filename": "429_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 253, - "w": 19, - "h": 28 - } - }, - { - "filename": "429_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 19, - "h": 28 - }, - "frame": { - "x": 25, - "y": 281, - "w": 19, - "h": 28 - } - }, - { - "filename": "414_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 25, - "h": 20 - }, - "frame": { - "x": 25, - "y": 309, - "w": 25, - "h": 20 - } - }, - { - "filename": "426_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 26, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "413-sandy_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 353, - "w": 24, - "h": 23 - } - }, - { - "filename": "413-sandy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 376, - "w": 24, - "h": 23 - } - }, - { - "filename": "413-sandy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 26, - "y": 399, - "w": 24, - "h": 23 - } - }, - { - "filename": "475_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 26, - "y": 422, - "w": 22, - "h": 25 - } - }, - { - "filename": "475_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 26, - "y": 447, - "w": 22, - "h": 25 - } - }, - { - "filename": "413-plant_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 26, - "y": 472, - "w": 22, - "h": 23 - } - }, - { - "filename": "413-plant_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 26, - "y": 495, - "w": 22, - "h": 23 - } - }, - { - "filename": "402_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 27, - "y": 518, - "w": 20, - "h": 24 - } - }, - { - "filename": "402_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 27, - "y": 542, - "w": 20, - "h": 24 - } - }, - { - "filename": "388_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 27, - "y": 566, - "w": 22, - "h": 21 - } - }, - { - "filename": "413-plant_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 29, - "y": 587, - "w": 22, - "h": 23 - } - }, - { - "filename": "413-trash_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 29, - "y": 610, - "w": 23, - "h": 23 - } - }, - { - "filename": "413-trash_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 29, - "y": 633, - "w": 23, - "h": 23 - } - }, - { - "filename": "448-mega_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 224, - "w": 19, - "h": 24 - } - }, - { - "filename": "448-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 248, - "w": 19, - "h": 24 - } - }, - { - "filename": "448-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 19, - "h": 24 - }, - "frame": { - "x": 44, - "y": 272, - "w": 19, - "h": 24 - } - }, - { - "filename": "468_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 64, - "y": 67, - "w": 28, - "h": 19 - } - }, - { - "filename": "468_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 92, - "y": 69, - "w": 28, - "h": 19 - } - }, - { - "filename": "468_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 28, - "h": 19 - }, - "frame": { - "x": 61, - "y": 86, - "w": 28, - "h": 19 - } - }, { "filename": "428_2", "rotated": false, @@ -1431,8 +948,50 @@ "h": 22 }, "frame": { - "x": 59, - "y": 105, + "x": 61, + "y": 71, + "w": 26, + "h": 22 + } + }, + { + "filename": "468_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 61, + "y": 93, + "w": 28, + "h": 19 + } + }, + { + "filename": "428_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 63, + "y": 112, "w": 26, "h": 22 } @@ -1452,8 +1011,8 @@ "h": 21 }, "frame": { - "x": 89, - "y": 88, + "x": 57, + "y": 134, "w": 27, "h": 21 } @@ -1473,54 +1032,12 @@ "h": 21 }, "frame": { - "x": 85, - "y": 109, + "x": 57, + "y": 155, "w": 27, "h": 21 } }, - { - "filename": "406_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 112, - "y": 109, - "w": 12, - "h": 18 - } - }, - { - "filename": "428_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 59, - "y": 127, - "w": 26, - "h": 22 - } - }, { "filename": "480_1", "rotated": false, @@ -1537,7 +1054,7 @@ }, "frame": { "x": 57, - "y": 149, + "y": 176, "w": 26, "h": 22 } @@ -1557,12 +1074,54 @@ "h": 22 }, "frame": { - "x": 85, - "y": 130, + "x": 57, + "y": 198, "w": 26, "h": 22 } }, + { + "filename": "468_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 28, + "y": 220, + "w": 28, + "h": 19 + } + }, + { + "filename": "468_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 28, + "h": 19 + }, + "frame": { + "x": 56, + "y": 220, + "w": 28, + "h": 19 + } + }, { "filename": "480_3", "rotated": false, @@ -1578,14 +1137,14 @@ "h": 22 }, "frame": { - "x": 83, - "y": 152, + "x": 25, + "y": 239, "w": 26, "h": 22 } }, { - "filename": "412-sandy_1", + "filename": "413-sandy_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -1593,20 +1152,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, + "x": 9, "y": 5, - "w": 15, + "w": 24, "h": 23 }, "frame": { - "x": 109, - "y": 152, - "w": 15, + "x": 25, + "y": 261, + "w": 24, "h": 23 } }, { - "filename": "406_3", + "filename": "413-sandy_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1614,20 +1173,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 + "x": 9, + "y": 5, + "w": 24, + "h": 23 }, "frame": { - "x": 112, - "y": 127, - "w": 12, - "h": 18 + "x": 25, + "y": 284, + "w": 24, + "h": 23 } }, { - "filename": "414_3", + "filename": "413-sandy_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 25, + "y": 307, + "w": 24, + "h": 23 + } + }, + { + "filename": "429_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -1636,15 +1216,57 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 25, - "h": 20 + "y": 2, + "w": 19, + "h": 28 }, "frame": { - "x": 57, - "y": 171, - "w": 25, - "h": 20 + "x": 26, + "y": 330, + "w": 19, + "h": 28 + } + }, + { + "filename": "429_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 26, + "y": 358, + "w": 19, + "h": 28 + } + }, + { + "filename": "429_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 19, + "h": 28 + }, + "frame": { + "x": 26, + "y": 386, + "w": 19, + "h": 28 } }, { @@ -1662,33 +1284,12 @@ "h": 22 }, "frame": { - "x": 82, - "y": 174, + "x": 51, + "y": 239, "w": 25, "h": 22 } }, - { - "filename": "401_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 107, - "y": 175, - "w": 17, - "h": 22 - } - }, { "filename": "470_2", "rotated": false, @@ -1704,8 +1305,8 @@ "h": 22 }, "frame": { - "x": 55, - "y": 191, + "x": 49, + "y": 261, "w": 25, "h": 22 } @@ -1725,14 +1326,14 @@ "h": 22 }, "frame": { - "x": 80, - "y": 196, + "x": 49, + "y": 283, "w": 25, "h": 22 } }, { - "filename": "461_2", + "filename": "475_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -1741,19 +1342,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 19, - "h": 22 + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 105, - "y": 197, - "w": 19, - "h": 22 + "x": 49, + "y": 305, + "w": 22, + "h": 25 } }, { - "filename": "401_3", + "filename": "475_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -1761,16 +1362,163 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 + "x": 10, + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 63, - "y": 213, - "w": 17, - "h": 22 + "x": 45, + "y": 330, + "w": 22, + "h": 25 + } + }, + { + "filename": "413-plant_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 45, + "y": 355, + "w": 22, + "h": 23 + } + }, + { + "filename": "413-plant_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 45, + "y": 378, + "w": 22, + "h": 23 + } + }, + { + "filename": "402_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 26, + "y": 414, + "w": 20, + "h": 24 + } + }, + { + "filename": "402_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 26, + "y": 438, + "w": 20, + "h": 24 + } + }, + { + "filename": "413-plant_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 26, + "y": 462, + "w": 22, + "h": 23 + } + }, + { + "filename": "413-trash_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 26, + "y": 485, + "w": 23, + "h": 23 + } + }, + { + "filename": "413-trash_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 27, + "y": 508, + "w": 23, + "h": 23 } }, { @@ -1788,96 +1536,12 @@ "h": 23 }, "frame": { - "x": 63, - "y": 235, + "x": 27, + "y": 531, "w": 23, "h": 23 } }, - { - "filename": "489_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 80, - "y": 218, - "w": 23, - "h": 17 - } - }, - { - "filename": "454_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 219, - "w": 21, - "h": 22 - } - }, - { - "filename": "412-plant_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 235, - "w": 17, - "h": 22 - } - }, - { - "filename": "454_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 241, - "w": 21, - "h": 22 - } - }, { "filename": "423-east_1", "rotated": false, @@ -1893,54 +1557,12 @@ "h": 22 }, "frame": { - "x": 63, - "y": 258, + "x": 27, + "y": 554, "w": 23, "h": 22 } }, - { - "filename": "412-plant_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 257, - "w": 17, - "h": 22 - } - }, - { - "filename": "492-sky_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 263, - "w": 21, - "h": 22 - } - }, { "filename": "423-east_2", "rotated": false, @@ -1956,138 +1578,12 @@ "h": 22 }, "frame": { - "x": 63, - "y": 280, + "x": 27, + "y": 576, "w": 23, "h": 22 } }, - { - "filename": "412-plant_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 86, - "y": 279, - "w": 17, - "h": 22 - } - }, - { - "filename": "492-sky_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 21, - "h": 22 - }, - "frame": { - "x": 103, - "y": 285, - "w": 21, - "h": 22 - } - }, - { - "filename": "412-sandy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 48, - "y": 422, - "w": 15, - "h": 23 - } - }, - { - "filename": "412-sandy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 48, - "y": 445, - "w": 15, - "h": 23 - } - }, - { - "filename": "412-trash_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 48, - "y": 468, - "w": 16, - "h": 23 - } - }, - { - "filename": "412-trash_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 48, - "y": 491, - "w": 16, - "h": 23 - } - }, { "filename": "423-east_3", "rotated": false, @@ -2103,117 +1599,12 @@ "h": 22 }, "frame": { - "x": 50, - "y": 302, + "x": 27, + "y": 598, "w": 23, "h": 22 } }, - { - "filename": "423-west_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 324, - "w": 23, - "h": 22 - } - }, - { - "filename": "423-west_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 346, - "w": 23, - "h": 22 - } - }, - { - "filename": "423-west_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 50, - "y": 368, - "w": 23, - "h": 22 - } - }, - { - "filename": "400_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 50, - "y": 390, - "w": 22, - "h": 22 - } - }, - { - "filename": "412-trash_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 16, - "h": 23 - }, - "frame": { - "x": 73, - "y": 302, - "w": 16, - "h": 23 - } - }, { "filename": "387_2", "rotated": false, @@ -2229,8 +1620,8 @@ "h": 22 }, "frame": { - "x": 73, - "y": 325, + "x": 87, + "y": 71, "w": 18, "h": 22 } @@ -2250,14 +1641,119 @@ "h": 22 }, "frame": { - "x": 73, - "y": 347, + "x": 105, + "y": 66, "w": 18, "h": 22 } }, { - "filename": "388_3", + "filename": "427_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 105, + "y": 88, + "w": 18, + "h": 22 + } + }, + { + "filename": "412-trash_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 89, + "y": 93, + "w": 16, + "h": 23 + } + }, + { + "filename": "427_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 105, + "y": 110, + "w": 18, + "h": 22 + } + }, + { + "filename": "412-trash_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 89, + "y": 116, + "w": 16, + "h": 23 + } + }, + { + "filename": "447_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 105, + "y": 132, + "w": 18, + "h": 18 + } + }, + { + "filename": "454_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2266,40 +1762,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 73, - "y": 369, - "w": 22, - "h": 21 - } - }, - { - "filename": "400_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, "y": 6, - "w": 22, + "w": 21, "h": 22 }, "frame": { - "x": 72, - "y": 390, - "w": 22, + "x": 84, + "y": 139, + "w": 21, "h": 22 } }, { - "filename": "440_1", + "filename": "447_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2307,16 +1782,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 + "x": 12, + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 89, - "y": 301, - "w": 14, - "h": 19 + "x": 105, + "y": 150, + "w": 18, + "h": 18 } }, { @@ -2334,12 +1809,390 @@ "h": 20 }, "frame": { - "x": 103, - "y": 307, + "x": 84, + "y": 161, "w": 21, "h": 20 } }, + { + "filename": "447_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 105, + "y": 168, + "w": 18, + "h": 18 + } + }, + { + "filename": "400_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 83, + "y": 181, + "w": 22, + "h": 22 + } + }, + { + "filename": "492-land_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 105, + "y": 186, + "w": 18, + "h": 16 + } + }, + { + "filename": "489_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 83, + "y": 203, + "w": 23, + "h": 17 + } + }, + { + "filename": "401_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 202, + "w": 17, + "h": 22 + } + }, + { + "filename": "388_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 84, + "y": 220, + "w": 22, + "h": 21 + } + }, + { + "filename": "401_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 224, + "w": 17, + "h": 22 + } + }, + { + "filename": "414_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 76, + "y": 241, + "w": 25, + "h": 20 + } + }, + { + "filename": "400_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 22, + "h": 22 + }, + "frame": { + "x": 101, + "y": 246, + "w": 22, + "h": 22 + } + }, + { + "filename": "414_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 25, + "h": 20 + }, + "frame": { + "x": 74, + "y": 261, + "w": 25, + "h": 20 + } + }, + { + "filename": "423-west_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 74, + "y": 281, + "w": 23, + "h": 22 + } + }, + { + "filename": "423-west_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 99, + "y": 268, + "w": 23, + "h": 22 + } + }, + { + "filename": "423-west_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 97, + "y": 290, + "w": 23, + "h": 22 + } + }, + { + "filename": "433_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 74, + "y": 303, + "w": 23, + "h": 19 + } + }, + { + "filename": "433_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 97, + "y": 312, + "w": 23, + "h": 19 + } + }, + { + "filename": "448-mega_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 46, + "y": 401, + "w": 19, + "h": 24 + } + }, + { + "filename": "448-mega_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 19, + "h": 24 + }, + "frame": { + "x": 46, + "y": 425, + "w": 19, + "h": 24 + } + }, + { + "filename": "433_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 23, + "h": 19 + }, + "frame": { + "x": 71, + "y": 322, + "w": 23, + "h": 19 + } + }, { "filename": "444_1", "rotated": false, @@ -2355,8 +2208,8 @@ "h": 21 }, "frame": { - "x": 63, - "y": 412, + "x": 67, + "y": 341, "w": 23, "h": 21 } @@ -2376,8 +2229,8 @@ "h": 21 }, "frame": { - "x": 63, - "y": 433, + "x": 67, + "y": 362, "w": 23, "h": 21 } @@ -2397,14 +2250,35 @@ "h": 21 }, "frame": { - "x": 91, - "y": 327, + "x": 67, + "y": 383, "w": 23, "h": 21 } }, { - "filename": "433_1", + "filename": "388_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 65, + "y": 404, + "w": 22, + "h": 21 + } + }, + { + "filename": "448-mega_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2413,15 +2287,36 @@ }, "spriteSourceSize": { "x": 12, - "y": 9, - "w": 23, - "h": 19 + "y": 4, + "w": 19, + "h": 24 }, "frame": { - "x": 91, - "y": 348, - "w": 23, - "h": 19 + "x": 65, + "y": 425, + "w": 19, + "h": 24 + } + }, + { + "filename": "454_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 48, + "y": 449, + "w": 21, + "h": 22 } }, { @@ -2439,14 +2334,14 @@ "h": 22 }, "frame": { - "x": 95, - "y": 367, + "x": 69, + "y": 449, "w": 20, "h": 22 } }, { - "filename": "407_3", + "filename": "489_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2454,18 +2349,102 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 11, + "y": 11, + "w": 23, + "h": 17 + }, + "frame": { + "x": 94, + "y": 331, + "w": 23, + "h": 17 + } + }, + { + "filename": "492-sky_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 6, - "w": 20, + "w": 21, "h": 22 }, "frame": { - "x": 86, - "y": 412, - "w": 20, + "x": 90, + "y": 348, + "w": 21, "h": 22 } }, + { + "filename": "492-sky_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 90, + "y": 370, + "w": 21, + "h": 22 + } + }, + { + "filename": "406_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 348, + "w": 12, + "h": 18 + } + }, + { + "filename": "406_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 111, + "y": 366, + "w": 12, + "h": 18 + } + }, { "filename": "442_3", "rotated": false, @@ -2481,14 +2460,14 @@ "h": 20 }, "frame": { - "x": 86, - "y": 434, + "x": 90, + "y": 392, "w": 21, "h": 20 } }, { - "filename": "425_2", + "filename": "489_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2496,121 +2475,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 + "x": 11, + "y": 11, + "w": 23, + "h": 17 }, "frame": { - "x": 94, - "y": 390, - "w": 15, - "h": 22 - } - }, - { - "filename": "425_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 15, - "h": 22 - }, - "frame": { - "x": 109, - "y": 389, - "w": 15, - "h": 22 - } - }, - { - "filename": "427_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 106, + "x": 87, "y": 412, - "w": 18, - "h": 22 - } - }, - { - "filename": "422-west_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 107, - "y": 434, - "w": 17, - "h": 20 - } - }, - { - "filename": "433_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, "w": 23, - "h": 19 - }, - "frame": { - "x": 64, - "y": 454, - "w": 23, - "h": 19 - } - }, - { - "filename": "433_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 23, - "h": 19 - }, - "frame": { - "x": 64, - "y": 473, - "w": 23, - "h": 19 + "h": 17 } }, { @@ -2628,12 +2502,117 @@ "h": 20 }, "frame": { - "x": 87, - "y": 454, + "x": 84, + "y": 429, "w": 22, "h": 20 } }, + { + "filename": "412-plant_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 429, + "w": 17, + "h": 22 + } + }, + { + "filename": "412-plant_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 89, + "y": 449, + "w": 17, + "h": 22 + } + }, + { + "filename": "412-plant_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 106, + "y": 451, + "w": 17, + "h": 22 + } + }, + { + "filename": "436_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 13, + "h": 16 + }, + "frame": { + "x": 110, + "y": 412, + "w": 13, + "h": 16 + } + }, + { + "filename": "407_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 49, + "y": 471, + "w": 20, + "h": 22 + } + }, { "filename": "490_2", "rotated": false, @@ -2649,12 +2628,75 @@ "h": 20 }, "frame": { - "x": 64, - "y": 492, + "x": 69, + "y": 471, "w": 22, "h": 20 } }, + { + "filename": "412-sandy_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 91, + "y": 471, + "w": 15, + "h": 23 + } + }, + { + "filename": "422-west_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 106, + "y": 473, + "w": 17, + "h": 20 + } + }, + { + "filename": "422-west_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 106, + "y": 493, + "w": 17, + "h": 20 + } + }, { "filename": "490_3", "rotated": false, @@ -2670,14 +2712,14 @@ "h": 20 }, "frame": { - "x": 87, - "y": 474, + "x": 69, + "y": 491, "w": 22, "h": 20 } }, { - "filename": "489_2", + "filename": "412-sandy_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2685,20 +2727,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 86, + "x": 91, "y": 494, - "w": 23, - "h": 17 + "w": 15, + "h": 23 } }, { - "filename": "440_2", + "filename": "461_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2706,104 +2748,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 109, - "y": 454, - "w": 14, - "h": 19 - } - }, - { - "filename": "440_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 14, - "h": 19 - }, - "frame": { - "x": 109, - "y": 473, - "w": 14, - "h": 19 - } - }, - { - "filename": "436_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 13, - "h": 16 - }, - "frame": { - "x": 109, - "y": 492, - "w": 13, - "h": 16 - } - }, - { - "filename": "489_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 11, - "w": 23, - "h": 17 - }, - "frame": { - "x": 64, - "y": 512, - "w": 23, - "h": 17 - } - }, - { - "filename": "422-east_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, + "x": 10, + "y": 6, "w": 19, - "h": 20 + "h": 22 }, "frame": { - "x": 87, - "y": 511, + "x": 50, + "y": 493, "w": 19, - "h": 20 + "h": 22 } }, { - "filename": "427_3", + "filename": "422-west_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2812,36 +2770,15 @@ }, "spriteSourceSize": { "x": 12, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 17, + "h": 20 }, "frame": { "x": 106, - "y": 511, - "w": 18, - "h": 22 - } - }, - { - "filename": "448_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 16, - "h": 21 - }, - "frame": { - "x": 48, - "y": 514, - "w": 16, - "h": 21 + "y": 513, + "w": 17, + "h": 20 } }, { @@ -2859,14 +2796,35 @@ "h": 22 }, "frame": { - "x": 47, - "y": 535, + "x": 50, + "y": 515, "w": 19, "h": 22 } }, { - "filename": "494_2", + "filename": "412-trash_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 16, + "h": 23 + }, + "frame": { + "x": 69, + "y": 511, + "w": 16, + "h": 23 + } + }, + { + "filename": "422-east_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -2875,15 +2833,15 @@ }, "spriteSourceSize": { "x": 11, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 19, + "h": 20 }, "frame": { - "x": 66, - "y": 529, - "w": 18, - "h": 22 + "x": 50, + "y": 537, + "w": 19, + "h": 20 } }, { @@ -2901,8 +2859,8 @@ "h": 20 }, "frame": { - "x": 84, - "y": 531, + "x": 50, + "y": 557, "w": 19, "h": 20 } @@ -2922,14 +2880,14 @@ "h": 20 }, "frame": { - "x": 103, - "y": 533, + "x": 50, + "y": 577, "w": 19, "h": 20 } }, { - "filename": "494_3", + "filename": "412-sandy_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,16 +2895,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 18, - "h": 22 + "x": 13, + "y": 5, + "w": 15, + "h": 23 }, "frame": { - "x": 49, - "y": 557, - "w": 18, - "h": 22 + "x": 69, + "y": 534, + "w": 15, + "h": 23 } }, { @@ -2964,14 +2922,14 @@ "h": 19 }, "frame": { - "x": 67, - "y": 551, + "x": 50, + "y": 597, "w": 19, "h": 19 } }, { - "filename": "422-west_2", + "filename": "425_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -2979,16 +2937,58 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 + "x": 13, + "y": 7, + "w": 15, + "h": 22 }, "frame": { - "x": 86, - "y": 551, - "w": 17, - "h": 20 + "x": 69, + "y": 557, + "w": 15, + "h": 22 + } + }, + { + "filename": "425_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 15, + "h": 22 + }, + "frame": { + "x": 69, + "y": 579, + "w": 15, + "h": 22 + } + }, + { + "filename": "458_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 17 + }, + "frame": { + "x": 85, + "y": 517, + "w": 20, + "h": 17 } }, { @@ -3006,7 +3006,28 @@ "h": 19 }, "frame": { - "x": 103, + "x": 84, + "y": 534, + "w": 19, + "h": 19 + } + }, + { + "filename": "443_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 19 + }, + "frame": { + "x": 84, "y": 553, "w": 19, "h": 19 @@ -3027,14 +3048,14 @@ "h": 22 }, "frame": { - "x": 51, - "y": 579, + "x": 84, + "y": 572, "w": 16, "h": 22 } }, { - "filename": "443_3", + "filename": "458_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -3042,79 +3063,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 19 - }, - "frame": { - "x": 67, - "y": 570, - "w": 19, - "h": 19 - } - }, - { - "filename": "422-west_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 86, - "y": 571, - "w": 17, - "h": 20 - } - }, - { - "filename": "447_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, + "x": 10, "y": 10, - "w": 18, - "h": 18 + "w": 20, + "h": 17 }, "frame": { "x": 103, - "y": 572, - "w": 18, - "h": 18 - } - }, - { - "filename": "447_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 67, - "y": 589, - "w": 18, - "h": 18 + "y": 534, + "w": 20, + "h": 17 } }, { @@ -3132,14 +3090,35 @@ "h": 16 }, "frame": { - "x": 85, - "y": 591, + "x": 103, + "y": 551, "w": 20, "h": 16 } }, { - "filename": "447_3", + "filename": "399_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 12, + "w": 20, + "h": 16 + }, + "frame": { + "x": 103, + "y": 567, + "w": 20, + "h": 16 + } + }, + { + "filename": "448_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -3148,36 +3127,15 @@ }, "spriteSourceSize": { "x": 12, - "y": 10, - "w": 18, - "h": 18 + "y": 7, + "w": 16, + "h": 21 }, "frame": { - "x": 105, - "y": 590, - "w": 18, - "h": 18 - } - }, - { - "filename": "436_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 13, - "h": 16 - }, - "frame": { - "x": 52, + "x": 69, "y": 601, - "w": 13, - "h": 16 + "w": 16, + "h": 21 } }, { @@ -3195,8 +3153,8 @@ "h": 22 }, "frame": { - "x": 52, - "y": 617, + "x": 85, + "y": 594, "w": 16, "h": 22 } @@ -3216,8 +3174,8 @@ "h": 21 }, "frame": { - "x": 52, - "y": 639, + "x": 101, + "y": 583, "w": 16, "h": 21 } @@ -3237,14 +3195,14 @@ "h": 21 }, "frame": { - "x": 68, - "y": 607, + "x": 101, + "y": 604, "w": 16, "h": 21 } }, { - "filename": "458_2", + "filename": "492-land_3", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,37 +3210,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 17 + "x": 12, + "y": 12, + "w": 18, + "h": 16 }, "frame": { - "x": 84, - "y": 607, - "w": 20, - "h": 17 - } - }, - { - "filename": "458_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 17 - }, - "frame": { - "x": 104, - "y": 608, - "w": 20, - "h": 17 + "x": 50, + "y": 616, + "w": 18, + "h": 16 } }, { @@ -3300,8 +3237,8 @@ "h": 17 }, "frame": { - "x": 68, - "y": 628, + "x": 48, + "y": 632, "w": 17, "h": 17 } @@ -3321,14 +3258,14 @@ "h": 17 }, "frame": { - "x": 85, - "y": 624, + "x": 68, + "y": 622, "w": 17, "h": 17 } }, { - "filename": "399_3", + "filename": "440_1", "rotated": false, "trimmed": true, "sourceSize": { @@ -3336,41 +3273,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 12, - "w": 20, - "h": 16 - }, - "frame": { - "x": 102, - "y": 625, - "w": 20, - "h": 16 - } - }, - { - "filename": "492-land_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 18, - "h": 16 + "x": 13, + "y": 9, + "w": 14, + "h": 19 }, "frame": { "x": 85, - "y": 641, - "w": 18, - "h": 16 + "y": 616, + "w": 14, + "h": 19 } }, { - "filename": "492-land_3", + "filename": "440_2", "rotated": false, "trimmed": true, "sourceSize": { @@ -3378,15 +3294,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 99, + "y": 625, + "w": 14, + "h": 19 + } + }, + { + "filename": "440_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 14, + "h": 19 + }, + "frame": { + "x": 85, + "y": 635, + "w": 14, + "h": 19 + } + }, + { + "filename": "436_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, "y": 12, - "w": 18, + "w": 13, "h": 16 }, "frame": { - "x": 103, - "y": 641, - "w": 18, + "x": 65, + "y": 639, + "w": 13, "h": 16 } } @@ -3396,6 +3354,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8d567785b198c5a2f6892242773436c5:1a0706846c40b2345d9ac32977f8c2e5:ebc3f8ec5b2480b298192d752b6e57dc$" + "smartupdate": "$TexturePacker:SmartUpdate:ff9a4f796b02d3e2c7977d3c3d76a7b8:eabe987f61ff488162814a018b9b9c12:ebc3f8ec5b2480b298192d752b6e57dc$" } } diff --git a/public/images/pokemon_icons_4v.png b/public/images/pokemon_icons_4v.png index eaf8d009ca84f986ab9d2f7eac61297292fdd219..9f2a9ac1f19bab1b5ec996362e2440a29b7f6655 100644 GIT binary patch literal 29492 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 TQMCqb00000NkvXXu0mjfDFe4N literal 29855 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 KMNUMnLSTYaIH`;P diff --git a/public/images/pokemon_icons_5.json b/public/images/pokemon_icons_5.json index fdbba6575e7..685ce770889 100644 --- a/public/images/pokemon_icons_5.json +++ b/public/images/pokemon_icons_5.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_5.png", "format": "RGBA8888", "size": { - "w": 256, - "h": 681 + "w": 245, + "h": 713 }, "scale": 1, "frames": [ @@ -324,6 +324,27 @@ "h": 27 } }, + { + "filename": "640", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 224, + "y": 0, + "w": 21, + "h": 26 + } + }, { "filename": "644s", "rotated": false, @@ -345,27 +366,6 @@ "h": 27 } }, - { - "filename": "645-incarnate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 31, - "h": 26 - }, - "frame": { - "x": 224, - "y": 0, - "w": 31, - "h": 26 - } - }, { "filename": "641-incarnate", "rotated": false, @@ -409,7 +409,7 @@ } }, { - "filename": "645s-incarnate", + "filename": "645-incarnate", "rotated": false, "trimmed": true, "sourceSize": { @@ -430,7 +430,7 @@ } }, { - "filename": "646", + "filename": "645s-incarnate", "rotated": false, "trimmed": true, "sourceSize": { @@ -451,7 +451,7 @@ } }, { - "filename": "646s", + "filename": "646", "rotated": false, "trimmed": true, "sourceSize": { @@ -471,6 +471,27 @@ "h": 26 } }, + { + "filename": "646s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 31, + "h": 26 + }, + "frame": { + "x": 0, + "y": 352, + "w": 31, + "h": 26 + } + }, { "filename": "534", "rotated": false, @@ -487,7 +508,7 @@ }, "frame": { "x": 0, - "y": 352, + "y": 378, "w": 31, "h": 25 } @@ -508,7 +529,7 @@ }, "frame": { "x": 0, - "y": 377, + "y": 403, "w": 31, "h": 25 } @@ -529,7 +550,7 @@ }, "frame": { "x": 0, - "y": 402, + "y": 428, "w": 30, "h": 25 } @@ -550,7 +571,7 @@ }, "frame": { "x": 0, - "y": 427, + "y": 453, "w": 30, "h": 25 } @@ -571,7 +592,7 @@ }, "frame": { "x": 0, - "y": 452, + "y": 478, "w": 30, "h": 25 } @@ -592,7 +613,7 @@ }, "frame": { "x": 0, - "y": 477, + "y": 503, "w": 30, "h": 25 } @@ -613,7 +634,7 @@ }, "frame": { "x": 0, - "y": 502, + "y": 528, "w": 27, "h": 28 } @@ -634,7 +655,7 @@ }, "frame": { "x": 0, - "y": 530, + "y": 556, "w": 27, "h": 28 } @@ -655,7 +676,7 @@ }, "frame": { "x": 0, - "y": 558, + "y": 584, "w": 28, "h": 25 } @@ -676,7 +697,7 @@ }, "frame": { "x": 0, - "y": 583, + "y": 609, "w": 28, "h": 25 } @@ -697,7 +718,7 @@ }, "frame": { "x": 0, - "y": 608, + "y": 634, "w": 29, "h": 25 } @@ -718,13 +739,13 @@ }, "frame": { "x": 0, - "y": 633, + "y": 659, "w": 29, "h": 25 } }, { - "filename": "503", + "filename": "635", "rotated": false, "trimmed": true, "sourceSize": { @@ -732,20 +753,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 31, - "h": 23 + "x": 6, + "y": 3, + "w": 29, + "h": 25 }, "frame": { "x": 0, - "y": 658, - "w": 31, - "h": 23 + "y": 684, + "w": 29, + "h": 25 } }, { - "filename": "503s", + "filename": "640s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 21, + "h": 26 + }, + "frame": { + "x": 224, + "y": 26, + "w": 21, + "h": 26 + } + }, + { + "filename": "503", "rotated": false, "trimmed": true, "sourceSize": { @@ -766,7 +808,7 @@ } }, { - "filename": "569", + "filename": "503s", "rotated": false, "trimmed": true, "sourceSize": { @@ -775,36 +817,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 30, - "h": 22 + "y": 5, + "w": 31, + "h": 23 }, "frame": { "x": 33, "y": 81, - "w": 30, - "h": 22 - } - }, - { - "filename": "635", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 29, - "h": 25 - }, - "frame": { - "x": 32, - "y": 103, - "w": 29, - "h": 25 + "w": 31, + "h": 23 } }, { @@ -823,11 +844,32 @@ }, "frame": { "x": 32, - "y": 128, + "y": 104, "w": 29, "h": 25 } }, + { + "filename": "609", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 29, + "h": 23 + }, + "frame": { + "x": 32, + "y": 129, + "w": 29, + "h": 23 + } + }, { "filename": "530", "rotated": false, @@ -844,11 +886,32 @@ }, "frame": { "x": 32, - "y": 153, + "y": 152, "w": 29, "h": 22 } }, + { + "filename": "569", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 30, + "y": 174, + "w": 30, + "h": 22 + } + }, { "filename": "569s", "rotated": false, @@ -865,7 +928,7 @@ }, "frame": { "x": 30, - "y": 175, + "y": 196, "w": 30, "h": 22 } @@ -886,7 +949,7 @@ }, "frame": { "x": 30, - "y": 197, + "y": 218, "w": 30, "h": 22 } @@ -907,53 +970,11 @@ }, "frame": { "x": 30, - "y": 219, + "y": 240, "w": 30, "h": 22 } }, - { - "filename": "598", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 30, - "h": 22 - }, - "frame": { - "x": 30, - "y": 241, - "w": 30, - "h": 22 - } - }, - { - "filename": "609", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 29, - "h": 23 - }, - "frame": { - "x": 31, - "y": 263, - "w": 29, - "h": 23 - } - }, { "filename": "609s", "rotated": false, @@ -970,7 +991,7 @@ }, "frame": { "x": 31, - "y": 286, + "y": 262, "w": 29, "h": 23 } @@ -991,7 +1012,7 @@ }, "frame": { "x": 31, - "y": 309, + "y": 285, "w": 29, "h": 22 } @@ -1012,7 +1033,7 @@ }, "frame": { "x": 31, - "y": 331, + "y": 307, "w": 27, "h": 24 } @@ -1033,11 +1054,53 @@ }, "frame": { "x": 31, - "y": 355, + "y": 331, "w": 27, "h": 24 } }, + { + "filename": "623", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 31, + "y": 355, + "w": 26, + "h": 25 + } + }, + { + "filename": "623s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 31, + "y": 380, + "w": 26, + "h": 25 + } + }, { "filename": "508", "rotated": false, @@ -1054,7 +1117,7 @@ }, "frame": { "x": 31, - "y": 379, + "y": 405, "w": 27, "h": 23 } @@ -1075,7 +1138,7 @@ }, "frame": { "x": 30, - "y": 402, + "y": 428, "w": 28, "h": 23 } @@ -1096,7 +1159,7 @@ }, "frame": { "x": 30, - "y": 425, + "y": 451, "w": 28, "h": 23 } @@ -1117,7 +1180,7 @@ }, "frame": { "x": 30, - "y": 448, + "y": 474, "w": 28, "h": 23 } @@ -1138,7 +1201,7 @@ }, "frame": { "x": 30, - "y": 471, + "y": 497, "w": 28, "h": 23 } @@ -1159,13 +1222,13 @@ }, "frame": { "x": 30, - "y": 494, + "y": 520, "w": 28, "h": 22 } }, { - "filename": "598s", + "filename": "598", "rotated": false, "trimmed": true, "sourceSize": { @@ -1180,7 +1243,7 @@ }, "frame": { "x": 27, - "y": 516, + "y": 542, "w": 30, "h": 22 } @@ -1201,13 +1264,13 @@ }, "frame": { "x": 27, - "y": 538, + "y": 564, "w": 29, "h": 20 } }, { - "filename": "623", + "filename": "497s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1216,19 +1279,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 3, - "w": 26, - "h": 25 + "y": 6, + "w": 28, + "h": 22 }, "frame": { "x": 28, - "y": 558, - "w": 26, - "h": 25 + "y": 584, + "w": 28, + "h": 22 } }, { - "filename": "623s", + "filename": "508s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1236,16 +1299,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 26, - "h": 25 + "x": 7, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 28, - "y": 583, - "w": 26, - "h": 25 + "y": 606, + "w": 27, + "h": 23 } }, { @@ -1264,7 +1327,7 @@ }, "frame": { "x": 29, - "y": 608, + "y": 629, "w": 25, "h": 25 } @@ -1285,13 +1348,13 @@ }, "frame": { "x": 29, - "y": 633, + "y": 654, "w": 25, "h": 25 } }, { - "filename": "508s", + "filename": "586-autumn", "rotated": false, "trimmed": true, "sourceSize": { @@ -1300,15 +1363,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, - "w": 27, - "h": 23 + "y": 3, + "w": 25, + "h": 25 }, "frame": { - "x": 31, - "y": 658, - "w": 27, - "h": 23 + "x": 29, + "y": 679, + "w": 25, + "h": 25 } }, { @@ -1354,7 +1417,7 @@ } }, { - "filename": "604", + "filename": "598s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1375,7 +1438,7 @@ } }, { - "filename": "604s", + "filename": "604", "rotated": false, "trimmed": true, "sourceSize": { @@ -1396,7 +1459,7 @@ } }, { - "filename": "647-resolute", + "filename": "604s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1405,7 +1468,7 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 7, "w": 30, "h": 22 }, @@ -1417,7 +1480,7 @@ } }, { - "filename": "647s-resolute", + "filename": "647-resolute", "rotated": false, "trimmed": true, "sourceSize": { @@ -1437,6 +1500,27 @@ "h": 22 } }, + { + "filename": "647s-resolute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 30, + "h": 22 + }, + "frame": { + "x": 101, + "y": 49, + "w": 30, + "h": 22 + } + }, { "filename": "545", "rotated": false, @@ -1452,7 +1536,7 @@ "h": 22 }, "frame": { - "x": 101, + "x": 131, "y": 49, "w": 29, "h": 22 @@ -1473,7 +1557,7 @@ "h": 22 }, "frame": { - "x": 130, + "x": 160, "y": 49, "w": 29, "h": 22 @@ -1494,12 +1578,33 @@ "h": 22 }, "frame": { - "x": 159, + "x": 189, "y": 49, "w": 29, "h": 22 } }, + { + "filename": "523", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 218, + "y": 52, + "w": 27, + "h": 23 + } + }, { "filename": "571s", "rotated": false, @@ -1515,35 +1620,14 @@ "h": 22 }, "frame": { - "x": 188, - "y": 49, + "x": 99, + "y": 71, "w": 29, "h": 22 } }, { - "filename": "639s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 29, - "h": 20 - }, - "frame": { - "x": 99, - "y": 71, - "w": 29, - "h": 20 - } - }, - { - "filename": "497s", + "filename": "593", "rotated": false, "trimmed": true, "sourceSize": { @@ -1564,7 +1648,7 @@ } }, { - "filename": "593", + "filename": "593s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1585,7 +1669,7 @@ } }, { - "filename": "593s", + "filename": "596", "rotated": false, "trimmed": true, "sourceSize": { @@ -1605,6 +1689,27 @@ "h": 22 } }, + { + "filename": "639s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 29, + "h": 20 + }, + "frame": { + "x": 212, + "y": 75, + "w": 29, + "h": 20 + } + }, { "filename": "537", "rotated": false, @@ -1621,7 +1726,7 @@ }, "frame": { "x": 98, - "y": 91, + "y": 93, "w": 28, "h": 21 } @@ -1648,7 +1753,7 @@ } }, { - "filename": "596", + "filename": "596s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1669,7 +1774,7 @@ } }, { - "filename": "596s", + "filename": "523s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,16 +1782,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 28, - "h": 22 + "x": 7, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 182, "y": 93, - "w": 28, - "h": 22 + "w": 27, + "h": 23 } }, { @@ -1704,8 +1809,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 26, + "x": 209, + "y": 95, "w": 28, "h": 20 } @@ -1725,75 +1830,12 @@ "h": 20 }, "frame": { - "x": 222, - "y": 46, + "x": 64, + "y": 98, "w": 28, "h": 20 } }, - { - "filename": "531-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 58, - "y": 331, - "w": 22, - "h": 26 - } - }, - { - "filename": "531s-mega", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 58, - "y": 357, - "w": 22, - "h": 26 - } - }, - { - "filename": "586-autumn", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 25, - "h": 25 - }, - "frame": { - "x": 58, - "y": 383, - "w": 25, - "h": 25 - } - }, { "filename": "586s-autumn", "rotated": false, @@ -1809,8 +1851,8 @@ "h": 25 }, "frame": { - "x": 58, - "y": 408, + "x": 61, + "y": 118, "w": 25, "h": 25 } @@ -1830,29 +1872,8 @@ "h": 24 }, "frame": { - "x": 58, - "y": 433, - "w": 26, - "h": 24 - } - }, - { - "filename": "612s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 26, - "h": 24 - }, - "frame": { - "x": 58, - "y": 457, + "x": 61, + "y": 143, "w": 26, "h": 24 } @@ -1872,12 +1893,33 @@ "h": 23 }, "frame": { - "x": 58, - "y": 481, + "x": 61, + "y": 167, "w": 26, "h": 23 } }, + { + "filename": "612s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 26, + "h": 24 + }, + "frame": { + "x": 60, + "y": 190, + "w": 26, + "h": 24 + } + }, { "filename": "510s", "rotated": false, @@ -1893,138 +1935,12 @@ "h": 23 }, "frame": { - "x": 58, - "y": 504, + "x": 60, + "y": 214, "w": 26, "h": 23 } }, - { - "filename": "523", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 57, - "y": 527, - "w": 27, - "h": 23 - } - }, - { - "filename": "631", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 56, - "y": 550, - "w": 28, - "h": 20 - } - }, - { - "filename": "523s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 570, - "w": 27, - "h": 23 - } - }, - { - "filename": "621", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 593, - "w": 27, - "h": 23 - } - }, - { - "filename": "621s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 27, - "h": 23 - }, - "frame": { - "x": 54, - "y": 616, - "w": 27, - "h": 23 - } - }, - { - "filename": "600", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 27, - "h": 19 - }, - "frame": { - "x": 54, - "y": 639, - "w": 27, - "h": 19 - } - }, { "filename": "584", "rotated": false, @@ -2040,96 +1956,12 @@ "h": 23 }, "frame": { - "x": 58, - "y": 658, + "x": 60, + "y": 237, "w": 26, "h": 23 } }, - { - "filename": "498", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 80, - "y": 98, - "w": 18, - "h": 18 - } - }, - { - "filename": "502", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 19, - "h": 23 - }, - "frame": { - "x": 61, - "y": 103, - "w": 19, - "h": 23 - } - }, - { - "filename": "640", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 21, - "h": 26 - }, - "frame": { - "x": 61, - "y": 126, - "w": 21, - "h": 26 - } - }, - { - "filename": "556", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 61, - "y": 152, - "w": 23, - "h": 23 - } - }, { "filename": "584s", "rotated": false, @@ -2146,13 +1978,13 @@ }, "frame": { "x": 60, - "y": 175, + "y": 260, "w": 26, "h": 23 } }, { - "filename": "514", + "filename": "621", "rotated": false, "trimmed": true, "sourceSize": { @@ -2160,20 +1992,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 6, + "y": 5, + "w": 27, + "h": 23 }, "frame": { "x": 60, - "y": 198, - "w": 26, - "h": 22 + "y": 283, + "w": 27, + "h": 23 } }, { - "filename": "514s", + "filename": "638", "rotated": false, "trimmed": true, "sourceSize": { @@ -2181,16 +2013,79 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 26, - "h": 22 + "x": 10, + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 60, - "y": 220, - "w": 26, - "h": 22 + "x": 86, + "y": 118, + "w": 20, + "h": 25 + } + }, + { + "filename": "621s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 27, + "h": 23 + }, + "frame": { + "x": 106, + "y": 114, + "w": 27, + "h": 23 + } + }, + { + "filename": "531-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 87, + "y": 143, + "w": 22, + "h": 26 + } + }, + { + "filename": "561", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 133, + "y": 114, + "w": 21, + "h": 23 } }, { @@ -2208,8 +2103,8 @@ "h": 22 }, "frame": { - "x": 60, - "y": 242, + "x": 154, + "y": 115, "w": 27, "h": 22 } @@ -2229,119 +2124,14 @@ "h": 22 }, "frame": { - "x": 60, - "y": 264, - "w": 27, - "h": 22 - } - }, - { - "filename": "634", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 - }, - "frame": { - "x": 60, - "y": 286, - "w": 26, - "h": 22 - } - }, - { - "filename": "556s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 60, - "y": 308, - "w": 23, - "h": 23 - } - }, - { - "filename": "631s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 28, - "h": 20 - }, - "frame": { - "x": 98, - "y": 112, - "w": 28, - "h": 20 - } - }, - { - "filename": "600s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 27, - "h": 19 - }, - "frame": { - "x": 126, - "y": 114, - "w": 27, - "h": 19 - } - }, - { - "filename": "630", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 82, + "x": 181, "y": 116, - "w": 16, + "w": 27, "h": 22 } }, { - "filename": "567", + "filename": "499", "rotated": false, "trimmed": true, "sourceSize": { @@ -2349,20 +2139,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 10, "y": 7, - "w": 26, + "w": 23, "h": 21 }, "frame": { - "x": 153, - "y": 115, - "w": 26, + "x": 87, + "y": 169, + "w": 23, "h": 21 } }, { - "filename": "567s", + "filename": "531s-mega", "rotated": false, "trimmed": true, "sourceSize": { @@ -2370,78 +2160,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 26, - "h": 21 - }, - "frame": { - "x": 179, - "y": 115, - "w": 26, - "h": 21 - } - }, - { - "filename": "543", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 82, - "y": 138, - "w": 18, - "h": 14 - } - }, - { - "filename": "502s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 19, - "h": 23 - }, - "frame": { - "x": 84, - "y": 152, - "w": 19, - "h": 23 - } - }, - { - "filename": "640s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, + "x": 10, "y": 2, - "w": 21, + "w": 22, "h": 26 }, "frame": { "x": 86, - "y": 175, - "w": 21, + "y": 190, + "w": 22, "h": 26 } }, @@ -2461,13 +2188,13 @@ }, "frame": { "x": 86, - "y": 201, + "y": 216, "w": 23, "h": 24 } }, { - "filename": "528", + "filename": "586-summer", "rotated": false, "trimmed": true, "sourceSize": { @@ -2475,20 +2202,104 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 8, + "x": 8, + "y": 4, "w": 23, - "h": 20 + "h": 24 }, "frame": { - "x": 100, - "y": 132, + "x": 86, + "y": 240, "w": 23, - "h": 20 + "h": 24 } }, { - "filename": "521", + "filename": "532", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 9, + "w": 24, + "h": 19 + }, + "frame": { + "x": 86, + "y": 264, + "w": 24, + "h": 19 + } + }, + { + "filename": "556", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 87, + "y": 283, + "w": 23, + "h": 23 + } + }, + { + "filename": "514", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 109, + "y": 137, + "w": 26, + "h": 22 + } + }, + { + "filename": "514s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 135, + "y": 137, + "w": 26, + "h": 22 + } + }, + { + "filename": "505", "rotated": false, "trimmed": true, "sourceSize": { @@ -2497,19 +2308,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 5, + "y": 6, "w": 20, - "h": 23 + "h": 22 }, "frame": { - "x": 103, - "y": 152, + "x": 161, + "y": 137, "w": 20, - "h": 23 + "h": 22 } }, { - "filename": "634s", + "filename": "567", "rotated": false, "trimmed": true, "sourceSize": { @@ -2517,16 +2328,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, + "x": 8, + "y": 7, "w": 26, - "h": 22 + "h": 21 }, "frame": { - "x": 123, - "y": 133, + "x": 181, + "y": 138, "w": 26, - "h": 22 + "h": 21 + } + }, + { + "filename": "631", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 110, + "y": 159, + "w": 28, + "h": 20 + } + }, + { + "filename": "631s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 28, + "h": 20 + }, + "frame": { + "x": 138, + "y": 159, + "w": 28, + "h": 20 + } + }, + { + "filename": "567s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 26, + "h": 21 + }, + "frame": { + "x": 166, + "y": 159, + "w": 26, + "h": 21 + } + }, + { + "filename": "600", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 110, + "y": 179, + "w": 27, + "h": 19 + } + }, + { + "filename": "600s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 9, + "w": 27, + "h": 19 + }, + "frame": { + "x": 137, + "y": 179, + "w": 27, + "h": 19 } }, { @@ -2544,14 +2460,14 @@ "h": 21 }, "frame": { - "x": 123, - "y": 155, + "x": 164, + "y": 180, "w": 26, "h": 21 } }, { - "filename": "637", + "filename": "568", "rotated": false, "trimmed": true, "sourceSize": { @@ -2559,20 +2475,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 26, - "h": 22 + "x": 9, + "y": 10, + "w": 21, + "h": 18 }, "frame": { - "x": 149, - "y": 136, - "w": 26, - "h": 22 + "x": 108, + "y": 198, + "w": 21, + "h": 18 } }, { - "filename": "637s", + "filename": "638s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 109, + "y": 216, + "w": 20, + "h": 25 + } + }, + { + "filename": "634", "rotated": false, "trimmed": true, "sourceSize": { @@ -2586,8 +2523,8 @@ "h": 22 }, "frame": { - "x": 175, - "y": 136, + "x": 129, + "y": 198, "w": 26, "h": 22 } @@ -2607,14 +2544,14 @@ "h": 21 }, "frame": { - "x": 149, - "y": 158, + "x": 129, + "y": 220, "w": 26, "h": 21 } }, { - "filename": "552", + "filename": "634s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2622,100 +2559,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 + "x": 7, + "y": 6, + "w": 26, + "h": 22 }, "frame": { - "x": 175, - "y": 158, - "w": 25, - "h": 21 - } - }, - { - "filename": "529", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 21, - "h": 17 - }, - "frame": { - "x": 86, - "y": 225, - "w": 21, - "h": 17 - } - }, - { - "filename": "638", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 87, - "y": 242, - "w": 20, - "h": 25 - } - }, - { - "filename": "496", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 87, - "y": 267, - "w": 22, - "h": 20 - } - }, - { - "filename": "499", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 86, - "y": 287, - "w": 23, - "h": 21 + "x": 109, + "y": 241, + "w": 26, + "h": 22 } }, { @@ -2733,35 +2586,14 @@ "h": 22 }, "frame": { - "x": 83, - "y": 308, + "x": 110, + "y": 263, "w": 25, "h": 22 } }, { - "filename": "630s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 16, - "h": 22 - }, - "frame": { - "x": 107, - "y": 175, - "w": 16, - "h": 22 - } - }, - { - "filename": "552s", + "filename": "552", "rotated": false, "trimmed": true, "sourceSize": { @@ -2775,180 +2607,12 @@ "h": 21 }, "frame": { - "x": 123, - "y": 176, + "x": 110, + "y": 285, "w": 25, "h": 21 } }, - { - "filename": "565s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 109, - "y": 197, - "w": 25, - "h": 22 - } - }, - { - "filename": "611", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 148, - "y": 179, - "w": 25, - "h": 21 - } - }, - { - "filename": "611s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 173, - "y": 179, - "w": 25, - "h": 21 - } - }, - { - "filename": "542", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 134, - "y": 197, - "w": 14, - "h": 21 - } - }, - { - "filename": "620", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 148, - "y": 200, - "w": 25, - "h": 22 - } - }, - { - "filename": "620s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 173, - "y": 200, - "w": 25, - "h": 22 - } - }, - { - "filename": "628", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 10, - "w": 25, - "h": 19 - }, - "frame": { - "x": 109, - "y": 219, - "w": 25, - "h": 19 - } - }, - { - "filename": "586-summer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 107, - "y": 238, - "w": 23, - "h": 24 - } - }, { "filename": "586-winter", "rotated": false, @@ -2964,222 +2628,12 @@ "h": 24 }, "frame": { - "x": 109, - "y": 262, + "x": 135, + "y": 241, "w": 23, "h": 24 } }, - { - "filename": "518", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 109, - "y": 286, - "w": 23, - "h": 22 - } - }, - { - "filename": "647-ordinary", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 108, - "y": 308, - "w": 25, - "h": 22 - } - }, - { - "filename": "542s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 134, - "y": 218, - "w": 14, - "h": 21 - } - }, - { - "filename": "628s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 10, - "w": 25, - "h": 19 - }, - "frame": { - "x": 148, - "y": 222, - "w": 25, - "h": 19 - } - }, - { - "filename": "647s-ordinary", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 173, - "y": 222, - "w": 25, - "h": 22 - } - }, - { - "filename": "585-autumn", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 130, - "y": 239, - "w": 18, - "h": 22 - } - }, - { - "filename": "516", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 148, - "y": 241, - "w": 24, - "h": 21 - } - }, - { - "filename": "516s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 172, - "y": 244, - "w": 24, - "h": 21 - } - }, - { - "filename": "648-pirouette", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 - }, - "frame": { - "x": 132, - "y": 261, - "w": 15, - "h": 23 - } - }, - { - "filename": "518s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 147, - "y": 262, - "w": 23, - "h": 22 - } - }, { "filename": "586s-spring", "rotated": false, @@ -3195,14 +2649,56 @@ "h": 24 }, "frame": { - "x": 132, - "y": 284, + "x": 135, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "531", + "filename": "499s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 135, + "y": 289, + "w": 23, + "h": 21 + } + }, + { + "filename": "637", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 155, + "y": 201, + "w": 26, + "h": 22 + } + }, + { + "filename": "568s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3211,78 +2707,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 133, - "y": 308, - "w": 22, - "h": 22 - } - }, - { - "filename": "525", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 170, - "y": 265, - "w": 24, - "h": 21 - } - }, - { - "filename": "648s-pirouette", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 15, - "h": 23 + "y": 10, + "w": 21, + "h": 18 }, "frame": { "x": 155, - "y": 284, - "w": 15, - "h": 23 - } - }, - { - "filename": "525s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 24, - "h": 21 - }, - "frame": { - "x": 170, - "y": 286, - "w": 24, - "h": 21 + "y": 223, + "w": 21, + "h": 18 } }, { @@ -3300,8 +2733,8 @@ "h": 24 }, "frame": { - "x": 155, - "y": 307, + "x": 158, + "y": 241, "w": 23, "h": 24 } @@ -3321,14 +2754,98 @@ "h": 24 }, "frame": { - "x": 178, - "y": 307, + "x": 158, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "638s", + "filename": "516", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 158, + "y": 289, + "w": 24, + "h": 21 + } + }, + { + "filename": "494", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 159, + "w": 18, + "h": 22 + } + }, + { + "filename": "496", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 190, + "y": 181, + "w": 22, + "h": 20 + } + }, + { + "filename": "637s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 26, + "h": 22 + }, + "frame": { + "x": 181, + "y": 201, + "w": 26, + "h": 22 + } + }, + { + "filename": "504", "rotated": false, "trimmed": true, "sourceSize": { @@ -3337,15 +2854,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 3, + "y": 10, "w": 20, - "h": 25 + "h": 18 }, "frame": { - "x": 81, - "y": 570, + "x": 176, + "y": 223, "w": 20, - "h": 25 + "h": 18 } }, { @@ -3363,8 +2880,8 @@ "h": 24 }, "frame": { - "x": 81, - "y": 595, + "x": 181, + "y": 241, "w": 23, "h": 24 } @@ -3384,14 +2901,161 @@ "h": 24 }, "frame": { - "x": 81, - "y": 619, + "x": 181, + "y": 265, "w": 23, "h": 24 } }, { - "filename": "564", + "filename": "516s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 182, + "y": 289, + "w": 24, + "h": 21 + } + }, + { + "filename": "498", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 196, + "y": 223, + "w": 18, + "h": 18 + } + }, + { + "filename": "494s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 207, + "y": 201, + "w": 18, + "h": 22 + } + }, + { + "filename": "521", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 225, + "y": 115, + "w": 20, + "h": 23 + } + }, + { + "filename": "522", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 208, + "y": 116, + "w": 17, + "h": 22 + } + }, + { + "filename": "552s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 207, + "y": 138, + "w": 25, + "h": 21 + } + }, + { + "filename": "594", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 232, + "y": 138, + "w": 13, + "h": 22 + } + }, + { + "filename": "531", "rotated": false, "trimmed": true, "sourceSize": { @@ -3400,19 +3064,103 @@ }, "spriteSourceSize": { "x": 9, - "y": 13, - "w": 23, - "h": 15 + "y": 6, + "w": 22, + "h": 22 }, "frame": { - "x": 81, - "y": 643, - "w": 23, - "h": 15 + "x": 210, + "y": 159, + "w": 22, + "h": 22 } }, { - "filename": "561", + "filename": "594s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 6, + "w": 13, + "h": 22 + }, + "frame": { + "x": 232, + "y": 160, + "w": 13, + "h": 22 + } + }, + { + "filename": "513", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 20, + "h": 20 + }, + "frame": { + "x": 212, + "y": 181, + "w": 20, + "h": 20 + } + }, + { + "filename": "521s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 225, + "y": 201, + "w": 20, + "h": 23 + } + }, + { + "filename": "605", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 232, + "y": 182, + "w": 13, + "h": 19 + } + }, + { + "filename": "625", "rotated": false, "trimmed": true, "sourceSize": { @@ -3422,18 +3170,123 @@ "spriteSourceSize": { "x": 9, "y": 5, - "w": 21, + "w": 22, + "h": 24 + }, + "frame": { + "x": 204, + "y": 241, + "w": 22, + "h": 24 + } + }, + { + "filename": "502", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 19, "h": 23 }, "frame": { - "x": 84, - "y": 658, - "w": 21, + "x": 226, + "y": 224, + "w": 19, "h": 23 } }, { - "filename": "505", + "filename": "502s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 19, + "h": 23 + }, + "frame": { + "x": 226, + "y": 247, + "w": 19, + "h": 23 + } + }, + { + "filename": "625s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 204, + "y": 265, + "w": 22, + "h": 24 + } + }, + { + "filename": "520", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 270, + "w": 19, + "h": 20 + } + }, + { + "filename": "588", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 214, + "y": 224, + "w": 12, + "h": 17 + } + }, + { + "filename": "505s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3447,14 +3300,77 @@ "h": 22 }, "frame": { - "x": 212, - "y": 71, + "x": 206, + "y": 289, "w": 20, "h": 22 } }, { - "filename": "573", + "filename": "520s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 290, + "w": 19, + "h": 20 + } + }, + { + "filename": "592-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 310, + "w": 19, + "h": 20 + } + }, + { + "filename": "565s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 60, + "y": 306, + "w": 25, + "h": 22 + } + }, + { + "filename": "620", "rotated": false, "trimmed": true, "sourceSize": { @@ -3463,19 +3379,124 @@ }, "spriteSourceSize": { "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 85, + "y": 306, + "w": 25, + "h": 22 + } + }, + { + "filename": "620s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 110, + "y": 306, + "w": 25, + "h": 22 + } + }, + { + "filename": "647-ordinary", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 58, + "y": 328, + "w": 25, + "h": 22 + } + }, + { + "filename": "647s-ordinary", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 83, + "y": 328, + "w": 25, + "h": 22 + } + }, + { + "filename": "611", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, "y": 7, - "w": 24, + "w": 25, "h": 21 }, "frame": { - "x": 232, - "y": 66, - "w": 24, + "x": 108, + "y": 328, + "w": 25, "h": 21 } }, { - "filename": "573s", + "filename": "611s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 135, + "y": 310, + "w": 25, + "h": 21 + } + }, + { + "filename": "525", "rotated": false, "trimmed": true, "sourceSize": { @@ -3489,8 +3510,8 @@ "h": 21 }, "frame": { - "x": 232, - "y": 87, + "x": 160, + "y": 310, "w": 24, "h": 21 } @@ -3510,14 +3531,14 @@ "h": 22 }, "frame": { - "x": 210, - "y": 93, + "x": 184, + "y": 310, "w": 22, "h": 22 } }, { - "filename": "532", + "filename": "511", "rotated": false, "trimmed": true, "sourceSize": { @@ -3525,20 +3546,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 9, - "w": 24, - "h": 19 + "x": 11, + "y": 7, + "w": 20, + "h": 21 }, "frame": { - "x": 232, - "y": 108, - "w": 24, - "h": 19 + "x": 206, + "y": 311, + "w": 20, + "h": 21 } }, { - "filename": "499s", + "filename": "592", "rotated": false, "trimmed": true, "sourceSize": { @@ -3547,122 +3568,143 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 205, - "y": 115, - "w": 23, - "h": 21 - } - }, - { - "filename": "555", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 201, - "y": 136, - "w": 23, - "h": 22 - } - }, - { - "filename": "555s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 200, - "y": 158, - "w": 23, - "h": 22 - } - }, - { - "filename": "625", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 198, - "y": 180, - "w": 22, - "h": 24 - } - }, - { - "filename": "625s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 198, - "y": 204, - "w": 22, - "h": 24 - } - }, - { - "filename": "496s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, "y": 8, - "w": 22, + "w": 19, "h": 20 }, "frame": { - "x": 198, - "y": 228, - "w": 22, + "x": 226, + "y": 330, + "w": 19, "h": 20 } }, + { + "filename": "628", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 25, + "h": 19 + }, + "frame": { + "x": 133, + "y": 331, + "w": 25, + "h": 19 + } + }, + { + "filename": "628s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 10, + "w": 25, + "h": 19 + }, + "frame": { + "x": 158, + "y": 331, + "w": 25, + "h": 19 + } + }, + { + "filename": "525s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 183, + "y": 332, + "w": 24, + "h": 21 + } + }, + { + "filename": "592s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 207, + "y": 332, + "w": 19, + "h": 20 + } + }, + { + "filename": "592s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 226, + "y": 350, + "w": 19, + "h": 20 + } + }, + { + "filename": "608", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 207, + "y": 352, + "w": 19, + "h": 18 + } + }, { "filename": "532s", "rotated": false, @@ -3678,14 +3720,14 @@ "h": 19 }, "frame": { - "x": 196, - "y": 248, + "x": 58, + "y": 350, "w": 24, "h": 19 } }, { - "filename": "649", + "filename": "556s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3695,18 +3737,18 @@ "spriteSourceSize": { "x": 8, "y": 5, - "w": 22, - "h": 24 + "w": 23, + "h": 23 }, "frame": { - "x": 194, - "y": 267, - "w": 22, - "h": 24 + "x": 57, + "y": 369, + "w": 23, + "h": 23 } }, { - "filename": "544", + "filename": "573", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,16 +3756,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 + "x": 8, + "y": 7, + "w": 24, + "h": 21 }, "frame": { - "x": 194, - "y": 291, - "w": 22, - "h": 16 + "x": 82, + "y": 350, + "w": 24, + "h": 21 + } + }, + { + "filename": "573s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 24, + "h": 21 + }, + "frame": { + "x": 80, + "y": 371, + "w": 24, + "h": 21 } }, { @@ -3741,75 +3804,12 @@ "h": 24 }, "frame": { - "x": 201, - "y": 307, + "x": 58, + "y": 392, "w": 22, "h": 24 } }, - { - "filename": "632", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 228, - "y": 127, - "w": 24, - "h": 16 - } - }, - { - "filename": "632s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 24, - "h": 16 - }, - "frame": { - "x": 224, - "y": 143, - "w": 24, - "h": 16 - } - }, - { - "filename": "614", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 223, - "y": 159, - "w": 23, - "h": 22 - } - }, { "filename": "649-chill", "rotated": false, @@ -3825,33 +3825,12 @@ "h": 24 }, "frame": { - "x": 220, - "y": 181, + "x": 58, + "y": 416, "w": 22, "h": 24 } }, - { - "filename": "648-aria", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 242, - "y": 181, - "w": 14, - "h": 21 - } - }, { "filename": "649-douse", "rotated": false, @@ -3867,33 +3846,12 @@ "h": 24 }, "frame": { - "x": 220, - "y": 205, + "x": 80, + "y": 392, "w": 22, "h": 24 } }, - { - "filename": "648s-aria", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 14, - "h": 21 - }, - "frame": { - "x": 242, - "y": 202, - "w": 14, - "h": 21 - } - }, { "filename": "649-shock", "rotated": false, @@ -3909,98 +3867,14 @@ "h": 24 }, "frame": { - "x": 220, - "y": 229, + "x": 58, + "y": 440, "w": 22, "h": 24 } }, { - "filename": "624", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 242, - "y": 223, - "w": 14, - "h": 20 - } - }, - { - "filename": "624s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 242, - "y": 243, - "w": 14, - "h": 20 - } - }, - { - "filename": "539", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 22, - "h": 22 - }, - "frame": { - "x": 220, - "y": 253, - "w": 22, - "h": 22 - } - }, - { - "filename": "574", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 14, - "h": 18 - }, - "frame": { - "x": 242, - "y": 263, - "w": 14, - "h": 18 - } - }, - { - "filename": "649s", + "filename": "649", "rotated": false, "trimmed": true, "sourceSize": { @@ -4014,117 +3888,12 @@ "h": 24 }, "frame": { - "x": 216, - "y": 275, + "x": 80, + "y": 416, "w": 22, "h": 24 } }, - { - "filename": "585-spring", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 281, - "w": 18, - "h": 22 - } - }, - { - "filename": "606", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 223, - "y": 299, - "w": 15, - "h": 22 - } - }, - { - "filename": "585-summer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 303, - "w": 18, - "h": 22 - } - }, - { - "filename": "517", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 223, - "y": 321, - "w": 15, - "h": 14 - } - }, - { - "filename": "585-winter", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 238, - "y": 325, - "w": 18, - "h": 22 - } - }, { "filename": "649s-burn", "rotated": false, @@ -4140,8 +3909,8 @@ "h": 24 }, "frame": { - "x": 80, - "y": 331, + "x": 58, + "y": 464, "w": 22, "h": 24 } @@ -4162,7 +3931,7 @@ }, "frame": { "x": 80, - "y": 355, + "y": 440, "w": 22, "h": 24 } @@ -4182,8 +3951,8 @@ "h": 24 }, "frame": { - "x": 102, - "y": 330, + "x": 58, + "y": 488, "w": 22, "h": 24 } @@ -4203,12 +3972,180 @@ "h": 24 }, "frame": { - "x": 124, - "y": 330, + "x": 80, + "y": 464, "w": 22, "h": 24 } }, + { + "filename": "649s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 58, + "y": 512, + "w": 22, + "h": 24 + } + }, + { + "filename": "518", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 488, + "w": 23, + "h": 22 + } + }, + { + "filename": "518s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 510, + "w": 23, + "h": 22 + } + }, + { + "filename": "496s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 58, + "y": 536, + "w": 22, + "h": 20 + } + }, + { + "filename": "555", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 532, + "w": 23, + "h": 22 + } + }, + { + "filename": "528", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 57, + "y": 556, + "w": 23, + "h": 20 + } + }, + { + "filename": "555s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 80, + "y": 554, + "w": 23, + "h": 22 + } + }, + { + "filename": "614", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 56, + "y": 576, + "w": 23, + "h": 22 + } + }, { "filename": "614s", "rotated": false, @@ -4224,14 +4161,35 @@ "h": 22 }, "frame": { - "x": 102, - "y": 354, + "x": 79, + "y": 576, "w": 23, "h": 22 } }, { - "filename": "507", + "filename": "632", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 56, + "y": 598, + "w": 24, + "h": 16 + } + }, + { + "filename": "528s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4240,59 +4198,59 @@ }, "spriteSourceSize": { "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 80, + "y": 598, + "w": 23, + "h": 20 + } + }, + { + "filename": "632s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 24, + "h": 16 + }, + "frame": { + "x": 55, + "y": 614, + "w": 24, + "h": 16 + } + }, + { + "filename": "539", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 6, - "w": 21, + "w": 22, "h": 22 }, "frame": { - "x": 125, - "y": 354, - "w": 21, + "x": 54, + "y": 630, + "w": 22, "h": 22 } }, - { - "filename": "521s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 83, - "y": 379, - "w": 20, - "h": 23 - } - }, - { - "filename": "561s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 83, - "y": 402, - "w": 21, - "h": 23 - } - }, { "filename": "539s", "rotated": false, @@ -4308,12 +4266,96 @@ "h": 22 }, "frame": { - "x": 103, - "y": 376, + "x": 54, + "y": 652, "w": 22, "h": 22 } }, + { + "filename": "561s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 54, + "y": 674, + "w": 21, + "h": 23 + } + }, + { + "filename": "544", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 54, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "564", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 13, + "w": 23, + "h": 15 + }, + "frame": { + "x": 79, + "y": 618, + "w": 23, + "h": 15 + } + }, + { + "filename": "507", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 21, + "h": 22 + }, + "frame": { + "x": 76, + "y": 633, + "w": 21, + "h": 22 + } + }, { "filename": "507s", "rotated": false, @@ -4329,12 +4371,159 @@ "h": 22 }, "frame": { - "x": 125, - "y": 376, + "x": 76, + "y": 655, "w": 21, "h": 22 } }, + { + "filename": "575", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 75, + "y": 677, + "w": 22, + "h": 20 + } + }, + { + "filename": "544s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 76, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "648-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 97, + "y": 633, + "w": 15, + "h": 23 + } + }, + { + "filename": "648s-pirouette", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 15, + "h": 23 + }, + "frame": { + "x": 97, + "y": 656, + "w": 15, + "h": 23 + } + }, + { + "filename": "498s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 97, + "y": 679, + "w": 18, + "h": 18 + } + }, + { + "filename": "551", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 22, + "h": 16 + }, + "frame": { + "x": 98, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "527", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 102, + "y": 618, + "w": 20, + "h": 15 + } + }, { "filename": "509", "rotated": false, @@ -4350,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 104, - "y": 398, + "x": 112, + "y": 633, "w": 21, "h": 22 } @@ -4371,14 +4560,14 @@ "h": 22 }, "frame": { - "x": 125, - "y": 398, + "x": 112, + "y": 655, "w": 21, "h": 22 } }, { - "filename": "505s", + "filename": "513s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4386,20 +4575,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, + "x": 11, + "y": 8, "w": 20, - "h": 22 + "h": 20 }, "frame": { - "x": 84, - "y": 425, + "x": 115, + "y": 677, "w": 20, - "h": 22 + "h": 20 } }, { - "filename": "528s", + "filename": "551s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4407,16 +4596,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 + "x": 8, + "y": 13, + "w": 22, + "h": 16 }, "frame": { - "x": 104, - "y": 420, - "w": 23, - "h": 20 + "x": 120, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "522s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 102, + "y": 392, + "w": 17, + "h": 22 } }, { @@ -4434,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 447, + "x": 102, + "y": 414, "w": 21, "h": 22 } @@ -4455,8 +4665,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 469, + "x": 102, + "y": 436, "w": 21, "h": 22 } @@ -4476,12 +4686,33 @@ "h": 21 }, "frame": { - "x": 84, - "y": 491, + "x": 102, + "y": 458, "w": 21, "h": 21 } }, + { + "filename": "511s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 104, + "y": 371, + "w": 20, + "h": 21 + } + }, { "filename": "515s", "rotated": false, @@ -4497,138 +4728,12 @@ "h": 21 }, "frame": { - "x": 84, - "y": 512, + "x": 106, + "y": 350, "w": 21, "h": 21 } }, - { - "filename": "576", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 84, - "y": 533, - "w": 20, - "h": 22 - } - }, - { - "filename": "527", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 20, - "h": 15 - }, - "frame": { - "x": 84, - "y": 555, - "w": 20, - "h": 15 - } - }, - { - "filename": "511", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 127, - "y": 420, - "w": 20, - "h": 21 - } - }, - { - "filename": "575", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 105, - "y": 440, - "w": 22, - "h": 20 - } - }, - { - "filename": "575s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 22, - "h": 20 - }, - "frame": { - "x": 105, - "y": 460, - "w": 22, - "h": 20 - } - }, - { - "filename": "576s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 127, - "y": 441, - "w": 20, - "h": 22 - } - }, { "filename": "587", "rotated": false, @@ -4644,8 +4749,8 @@ "h": 20 }, "frame": { - "x": 105, - "y": 480, + "x": 127, + "y": 350, "w": 23, "h": 20 } @@ -4665,14 +4770,14 @@ "h": 20 }, "frame": { - "x": 105, - "y": 500, + "x": 150, + "y": 350, "w": 23, "h": 20 } }, { - "filename": "495", + "filename": "576", "rotated": false, "trimmed": true, "sourceSize": { @@ -4681,15 +4786,36 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, + "y": 6, "w": 20, - "h": 17 + "h": 22 }, "frame": { - "x": 127, - "y": 463, + "x": 103, + "y": 479, "w": 20, - "h": 17 + "h": 22 + } + }, + { + "filename": "576s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 103, + "y": 501, + "w": 20, + "h": 22 } }, { @@ -4707,180 +4833,12 @@ "h": 22 }, "frame": { - "x": 128, - "y": 480, + "x": 103, + "y": 523, "w": 20, "h": 22 } }, - { - "filename": "504", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 128, - "y": 502, - "w": 20, - "h": 18 - } - }, - { - "filename": "564s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 13, - "w": 23, - "h": 15 - }, - "frame": { - "x": 105, - "y": 520, - "w": 23, - "h": 15 - } - }, - { - "filename": "617", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 104, - "y": 535, - "w": 23, - "h": 20 - } - }, - { - "filename": "617s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 104, - "y": 555, - "w": 23, - "h": 20 - } - }, - { - "filename": "513", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 20, - "h": 20 - }, - "frame": { - "x": 101, - "y": 575, - "w": 20, - "h": 20 - } - }, - { - "filename": "522", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 104, - "y": 595, - "w": 17, - "h": 22 - } - }, - { - "filename": "522s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 104, - "y": 617, - "w": 17, - "h": 22 - } - }, - { - "filename": "572", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 9, - "w": 22, - "h": 19 - }, - "frame": { - "x": 104, - "y": 639, - "w": 22, - "h": 19 - } - }, { "filename": "591s", "rotated": false, @@ -4896,14 +4854,14 @@ "h": 22 }, "frame": { - "x": 105, - "y": 658, + "x": 103, + "y": 545, "w": 20, "h": 22 } }, { - "filename": "495s", + "filename": "585-autumn", "rotated": false, "trimmed": true, "sourceSize": { @@ -4912,99 +4870,15 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 20, - "h": 17 + "y": 6, + "w": 18, + "h": 22 }, "frame": { - "x": 128, - "y": 520, - "w": 20, - "h": 17 - } - }, - { - "filename": "511s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 127, - "y": 537, - "w": 20, - "h": 21 - } - }, - { - "filename": "504s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 20, - "h": 18 - }, - "frame": { - "x": 127, - "y": 558, - "w": 20, - "h": 18 - } - }, - { - "filename": "560", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 121, - "y": 576, - "w": 20, - "h": 21 - } - }, - { - "filename": "560s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 21 - }, - "frame": { - "x": 121, - "y": 597, - "w": 20, - "h": 21 + "x": 119, + "y": 392, + "w": 18, + "h": 22 } }, { @@ -5022,14 +4896,14 @@ "h": 21 }, "frame": { - "x": 121, - "y": 618, + "x": 124, + "y": 371, "w": 18, "h": 21 } }, { - "filename": "513s", + "filename": "617", "rotated": false, "trimmed": true, "sourceSize": { @@ -5037,18 +4911,81 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 9, "y": 8, - "w": 20, + "w": 23, "h": 20 }, "frame": { - "x": 126, - "y": 639, - "w": 20, + "x": 142, + "y": 370, + "w": 23, "h": 20 } }, + { + "filename": "585-spring", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 414, + "w": 18, + "h": 22 + } + }, + { + "filename": "585-summer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 436, + "w": 18, + "h": 22 + } + }, + { + "filename": "585-winter", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 458, + "w": 18, + "h": 22 + } + }, { "filename": "585s-autumn", "rotated": false, @@ -5064,8 +5001,8 @@ "h": 22 }, "frame": { - "x": 125, - "y": 659, + "x": 123, + "y": 480, "w": 18, "h": 22 } @@ -5085,12 +5022,432 @@ "h": 22 }, "frame": { - "x": 143, - "y": 659, + "x": 123, + "y": 502, "w": 18, "h": 22 } }, + { + "filename": "585s-summer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 123, + "y": 524, + "w": 18, + "h": 22 + } + }, + { + "filename": "521s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 18, + "h": 21 + }, + "frame": { + "x": 123, + "y": 546, + "w": 18, + "h": 21 + } + }, + { + "filename": "564s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 13, + "w": 23, + "h": 15 + }, + "frame": { + "x": 103, + "y": 567, + "w": 23, + "h": 15 + } + }, + { + "filename": "562", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 102, + "y": 582, + "w": 22, + "h": 16 + } + }, + { + "filename": "575s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 22, + "h": 20 + }, + "frame": { + "x": 103, + "y": 598, + "w": 22, + "h": 20 + } + }, + { + "filename": "585s-winter", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 137, + "y": 392, + "w": 18, + "h": 22 + } + }, + { + "filename": "606", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 141, + "y": 414, + "w": 15, + "h": 22 + } + }, + { + "filename": "606s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 15, + "h": 22 + }, + "frame": { + "x": 141, + "y": 436, + "w": 15, + "h": 22 + } + }, + { + "filename": "630", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 141, + "y": 458, + "w": 16, + "h": 22 + } + }, + { + "filename": "630s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 16, + "h": 22 + }, + "frame": { + "x": 141, + "y": 480, + "w": 16, + "h": 22 + } + }, + { + "filename": "549", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 141, + "y": 502, + "w": 17, + "h": 21 + } + }, + { + "filename": "549s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 141, + "y": 523, + "w": 17, + "h": 21 + } + }, + { + "filename": "560", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 141, + "y": 544, + "w": 20, + "h": 21 + } + }, + { + "filename": "495", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 20, + "h": 17 + }, + "frame": { + "x": 126, + "y": 567, + "w": 20, + "h": 17 + } + }, + { + "filename": "546", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 124, + "y": 584, + "w": 21, + "h": 14 + } + }, + { + "filename": "560s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 21 + }, + "frame": { + "x": 125, + "y": 598, + "w": 20, + "h": 21 + } + }, + { + "filename": "546s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 21, + "h": 14 + }, + "frame": { + "x": 122, + "y": 619, + "w": 21, + "h": 14 + } + }, + { + "filename": "572", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 9, + "w": 22, + "h": 19 + }, + "frame": { + "x": 146, + "y": 565, + "w": 22, + "h": 19 + } + }, + { + "filename": "617s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 145, + "y": 584, + "w": 23, + "h": 20 + } + }, + { + "filename": "562s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 22, + "h": 16 + }, + "frame": { + "x": 145, + "y": 604, + "w": 22, + "h": 16 + } + }, { "filename": "572s", "rotated": false, @@ -5106,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 146, - "y": 331, + "x": 143, + "y": 620, "w": 22, "h": 19 } @@ -5127,8 +5484,8 @@ "h": 19 }, "frame": { - "x": 146, - "y": 350, + "x": 133, + "y": 639, "w": 22, "h": 19 } @@ -5148,14 +5505,14 @@ "h": 19 }, "frame": { - "x": 168, - "y": 331, + "x": 133, + "y": 658, "w": 22, "h": 19 } }, { - "filename": "585s-summer", + "filename": "615", "rotated": false, "trimmed": true, "sourceSize": { @@ -5164,19 +5521,61 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 18, - "h": 22 + "y": 8, + "w": 19, + "h": 20 }, "frame": { - "x": 146, - "y": 369, - "w": 18, - "h": 22 + "x": 135, + "y": 677, + "w": 19, + "h": 20 } }, { - "filename": "585s-winter", + "filename": "599", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 142, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "542", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 155, + "y": 639, + "w": 14, + "h": 21 + } + }, + { + "filename": "495s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5185,15 +5584,141 @@ }, "spriteSourceSize": { "x": 10, - "y": 6, - "w": 18, - "h": 22 + "y": 11, + "w": 20, + "h": 17 }, "frame": { - "x": 146, - "y": 391, + "x": 155, + "y": 660, + "w": 20, + "h": 17 + } + }, + { + "filename": "615s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 19, + "h": 20 + }, + "frame": { + "x": 154, + "y": 677, + "w": 19, + "h": 20 + } + }, + { + "filename": "599s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 22, + "h": 16 + }, + "frame": { + "x": 164, + "y": 697, + "w": 22, + "h": 16 + } + }, + { + "filename": "529", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 21, + "h": 17 + }, + "frame": { + "x": 186, + "y": 353, + "w": 21, + "h": 17 + } + }, + { + "filename": "605s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 173, + "y": 353, + "w": 13, + "h": 19 + } + }, + { + "filename": "610", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, "w": 18, - "h": 22 + "h": 20 + }, + "frame": { + "x": 173, + "y": 677, + "w": 18, + "h": 20 + } + }, + { + "filename": "595", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 186, + "y": 697, + "w": 21, + "h": 16 } }, { @@ -5211,8 +5736,8 @@ "h": 19 }, "frame": { - "x": 190, - "y": 331, + "x": 165, + "y": 372, "w": 21, "h": 19 } @@ -5232,621 +5757,12 @@ "h": 19 }, "frame": { - "x": 168, - "y": 350, + "x": 186, + "y": 370, "w": 21, "h": 19 } }, - { - "filename": "520", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 369, - "w": 19, - "h": 20 - } - }, - { - "filename": "520s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 389, - "w": 19, - "h": 20 - } - }, - { - "filename": "568", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 189, - "y": 350, - "w": 21, - "h": 18 - } - }, - { - "filename": "548", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 211, - "y": 331, - "w": 12, - "h": 18 - } - }, - { - "filename": "517s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 223, - "y": 335, - "w": 15, - "h": 14 - } - }, - { - "filename": "521s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 18, - "h": 21 - }, - "frame": { - "x": 238, - "y": 347, - "w": 18, - "h": 21 - } - }, - { - "filename": "549", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 413, - "w": 17, - "h": 21 - } - }, - { - "filename": "592", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 409, - "w": 19, - "h": 20 - } - }, - { - "filename": "549s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 434, - "w": 17, - "h": 21 - } - }, - { - "filename": "592-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 429, - "w": 19, - "h": 20 - } - }, - { - "filename": "627", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 147, - "y": 455, - "w": 17, - "h": 21 - } - }, - { - "filename": "592s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 164, - "y": 449, - "w": 19, - "h": 20 - } - }, - { - "filename": "606s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 15, - "h": 22 - }, - "frame": { - "x": 148, - "y": 476, - "w": 15, - "h": 22 - } - }, - { - "filename": "583", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 15, - "h": 21 - }, - "frame": { - "x": 148, - "y": 498, - "w": 15, - "h": 21 - } - }, - { - "filename": "498s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 148, - "y": 519, - "w": 18, - "h": 18 - } - }, - { - "filename": "592s-f", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 147, - "y": 537, - "w": 19, - "h": 20 - } - }, - { - "filename": "615", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 147, - "y": 557, - "w": 19, - "h": 20 - } - }, - { - "filename": "568s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 141, - "y": 577, - "w": 21, - "h": 18 - } - }, - { - "filename": "615s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 19, - "h": 20 - }, - "frame": { - "x": 141, - "y": 595, - "w": 19, - "h": 20 - } - }, - { - "filename": "583s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 15, - "h": 21 - }, - "frame": { - "x": 139, - "y": 618, - "w": 15, - "h": 21 - } - }, - { - "filename": "610", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 146, - "y": 639, - "w": 18, - "h": 20 - } - }, - { - "filename": "594", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 13, - "h": 22 - }, - "frame": { - "x": 161, - "y": 659, - "w": 13, - "h": 22 - } - }, - { - "filename": "594s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 13, - "h": 22 - }, - "frame": { - "x": 183, - "y": 369, - "w": 13, - "h": 22 - } - }, - { - "filename": "627s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 17, - "h": 21 - }, - "frame": { - "x": 183, - "y": 391, - "w": 17, - "h": 21 - } - }, - { - "filename": "610s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 18, - "h": 20 - }, - "frame": { - "x": 183, - "y": 412, - "w": 18, - "h": 20 - } - }, - { - "filename": "619", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 18, - "h": 19 - }, - "frame": { - "x": 183, - "y": 432, - "w": 18, - "h": 19 - } - }, - { - "filename": "506", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 183, - "y": 451, - "w": 18, - "h": 18 - } - }, - { - "filename": "633", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 196, - "y": 368, - "w": 16, - "h": 20 - } - }, - { - "filename": "544s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 164, - "y": 469, - "w": 22, - "h": 16 - } - }, { "filename": "636", "rotated": false, @@ -5862,14 +5778,14 @@ "h": 19 }, "frame": { - "x": 163, - "y": 485, + "x": 207, + "y": 370, "w": 20, "h": 19 } }, { - "filename": "527s", + "filename": "610s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,37 +5793,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 20, - "h": 15 + "x": 11, + "y": 8, + "w": 18, + "h": 20 }, "frame": { - "x": 163, - "y": 504, - "w": 20, - "h": 15 - } - }, - { - "filename": "619s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, + "x": 227, + "y": 370, "w": 18, - "h": 19 - }, - "frame": { - "x": 166, - "y": 519, - "w": 18, - "h": 19 + "h": 20 } }, { @@ -5925,12 +5820,180 @@ "h": 19 }, "frame": { - "x": 166, - "y": 538, + "x": 155, + "y": 391, "w": 20, "h": 19 } }, + { + "filename": "627", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 156, + "y": 410, + "w": 17, + "h": 21 + } + }, + { + "filename": "627s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 17, + "h": 21 + }, + "frame": { + "x": 156, + "y": 431, + "w": 17, + "h": 21 + } + }, + { + "filename": "542s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 175, + "y": 391, + "w": 14, + "h": 21 + } + }, + { + "filename": "504s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 20, + "h": 18 + }, + "frame": { + "x": 189, + "y": 389, + "w": 20, + "h": 18 + } + }, + { + "filename": "506", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 209, + "y": 389, + "w": 18, + "h": 18 + } + }, + { + "filename": "619", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 227, + "y": 390, + "w": 18, + "h": 19 + } + }, + { + "filename": "583", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 173, + "y": 412, + "w": 15, + "h": 21 + } + }, + { + "filename": "578", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 173, + "y": 433, + "w": 16, + "h": 19 + } + }, { "filename": "529s", "rotated": false, @@ -5946,75 +6009,12 @@ "h": 17 }, "frame": { - "x": 166, - "y": 557, + "x": 157, + "y": 452, "w": 21, "h": 17 } }, - { - "filename": "501", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 186, - "y": 469, - "w": 16, - "h": 18 - } - }, - { - "filename": "608", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 183, - "y": 487, - "w": 19, - "h": 18 - } - }, - { - "filename": "546", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 21, - "h": 14 - }, - "frame": { - "x": 183, - "y": 505, - "w": 21, - "h": 14 - } - }, { "filename": "555-zen", "rotated": false, @@ -6030,323 +6030,8 @@ "h": 17 }, "frame": { - "x": 184, - "y": 519, - "w": 20, - "h": 17 - } - }, - { - "filename": "506s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 186, - "y": 536, - "w": 18, - "h": 18 - } - }, - { - "filename": "633s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 16, - "h": 20 - }, - "frame": { - "x": 187, - "y": 554, - "w": 16, - "h": 20 - } - }, - { - "filename": "578", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 200, - "y": 388, - "w": 16, - "h": 19 - } - }, - { - "filename": "551", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "frame": { - "x": 216, - "y": 349, - "w": 22, - "h": 16 - } - }, - { - "filename": "551s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 22, - "h": 16 - }, - "frame": { - "x": 212, - "y": 365, - "w": 22, - "h": 16 - } - }, - { - "filename": "562", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 368, - "w": 22, - "h": 16 - } - }, - { - "filename": "536", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 216, - "y": 381, - "w": 18, - "h": 18 - } - }, - { - "filename": "562s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 384, - "w": 22, - "h": 16 - } - }, - { - "filename": "578s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 407, - "w": 16, - "h": 19 - } - }, - { - "filename": "580", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 426, - "w": 16, - "h": 19 - } - }, - { - "filename": "580s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 445, - "w": 16, - "h": 19 - } - }, - { - "filename": "501s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 16, - "h": 18 - }, - "frame": { - "x": 202, - "y": 464, - "w": 16, - "h": 18 - } - }, - { - "filename": "536s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 18, - "h": 18 - }, - "frame": { - "x": 202, - "y": 482, - "w": 18, - "h": 18 - } - }, - { - "filename": "608s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 10, - "w": 19, - "h": 18 - }, - "frame": { - "x": 204, - "y": 500, - "w": 19, - "h": 18 - } - }, - { - "filename": "555s-zen", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 20, - "h": 17 - }, - "frame": { - "x": 204, - "y": 518, + "x": 157, + "y": 469, "w": 20, "h": 17 } @@ -6366,12 +6051,222 @@ "h": 16 }, "frame": { - "x": 204, - "y": 535, + "x": 157, + "y": 486, "w": 20, "h": 16 } }, + { + "filename": "608s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 19, + "h": 18 + }, + "frame": { + "x": 158, + "y": 502, + "w": 19, + "h": 18 + } + }, + { + "filename": "619s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 18, + "h": 19 + }, + "frame": { + "x": 158, + "y": 520, + "w": 18, + "h": 19 + } + }, + { + "filename": "583s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 7, + "w": 15, + "h": 21 + }, + "frame": { + "x": 161, + "y": 539, + "w": 15, + "h": 21 + } + }, + { + "filename": "501", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 16, + "h": 18 + }, + "frame": { + "x": 178, + "y": 452, + "w": 16, + "h": 18 + } + }, + { + "filename": "633", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 177, + "y": 470, + "w": 16, + "h": 20 + } + }, + { + "filename": "633s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 16, + "h": 20 + }, + "frame": { + "x": 177, + "y": 490, + "w": 16, + "h": 20 + } + }, + { + "filename": "501s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 16, + "h": 18 + }, + "frame": { + "x": 177, + "y": 510, + "w": 16, + "h": 18 + } + }, + { + "filename": "506s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 10, + "w": 18, + "h": 18 + }, + "frame": { + "x": 176, + "y": 528, + "w": 18, + "h": 18 + } + }, + { + "filename": "527s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 20, + "h": 15 + }, + "frame": { + "x": 176, + "y": 546, + "w": 20, + "h": 15 + } + }, + { + "filename": "566", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 189, + "y": 407, + "w": 21, + "h": 15 + } + }, { "filename": "554", "rotated": false, @@ -6387,35 +6282,14 @@ "h": 15 }, "frame": { - "x": 217, - "y": 399, + "x": 210, + "y": 407, "w": 17, "h": 15 } }, { - "filename": "599", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 22, - "h": 16 - }, - "frame": { - "x": 234, - "y": 400, - "w": 22, - "h": 16 - } - }, - { - "filename": "554s", + "filename": "536", "rotated": false, "trimmed": true, "sourceSize": { @@ -6424,19 +6298,19 @@ }, "spriteSourceSize": { "x": 11, - "y": 13, - "w": 17, - "h": 15 + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 217, - "y": 414, - "w": 17, - "h": 15 + "x": 227, + "y": 409, + "w": 18, + "h": 18 } }, { - "filename": "599s", + "filename": "555s-zen", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,20 +6318,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 10, "y": 11, - "w": 22, - "h": 16 + "w": 20, + "h": 17 }, "frame": { - "x": 234, - "y": 416, - "w": 22, - "h": 16 + "x": 189, + "y": 422, + "w": 20, + "h": 17 } }, { - "filename": "570", + "filename": "536s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6465,16 +6339,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 + "x": 11, + "y": 10, + "w": 18, + "h": 18 }, "frame": { - "x": 217, - "y": 429, - "w": 16, - "h": 17 + "x": 209, + "y": 422, + "w": 18, + "h": 18 } }, { @@ -6492,14 +6366,14 @@ "h": 18 }, "frame": { - "x": 217, - "y": 446, + "x": 227, + "y": 427, "w": 18, "h": 18 } }, { - "filename": "595", + "filename": "535", "rotated": false, "trimmed": true, "sourceSize": { @@ -6507,20 +6381,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 + "x": 13, + "y": 15, + "w": 14, + "h": 13 }, "frame": { - "x": 235, - "y": 432, - "w": 21, - "h": 16 + "x": 189, + "y": 439, + "w": 14, + "h": 13 } }, { - "filename": "595s", + "filename": "548", "rotated": false, "trimmed": true, "sourceSize": { @@ -6528,15 +6402,78 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 194, + "y": 452, + "w": 12, + "h": 18 + } + }, + { + "filename": "648-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 193, + "y": 470, + "w": 14, + "h": 21 + } + }, + { + "filename": "648s-aria", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 14, + "h": 21 + }, + "frame": { + "x": 193, + "y": 491, + "w": 14, + "h": 21 + } + }, + { + "filename": "519", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 12, - "w": 21, + "w": 16, "h": 16 }, "frame": { - "x": 235, - "y": 448, - "w": 21, + "x": 193, + "y": 512, + "w": 16, "h": 16 } }, @@ -6555,14 +6492,14 @@ "h": 18 }, "frame": { - "x": 218, - "y": 464, + "x": 194, + "y": 528, "w": 18, "h": 18 } }, { - "filename": "541s", + "filename": "519s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6570,15 +6507,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 12, "y": 12, - "w": 20, + "w": 16, "h": 16 }, "frame": { - "x": 236, - "y": 464, - "w": 20, + "x": 196, + "y": 546, + "w": 16, + "h": 16 + } + }, + { + "filename": "595s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 206, + "y": 440, + "w": 21, + "h": 16 + } + }, + { + "filename": "550-blue-striped", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 12, + "w": 18, + "h": 16 + }, + "frame": { + "x": 227, + "y": 445, + "w": 18, "h": 16 } }, @@ -6597,96 +6576,12 @@ "h": 14 }, "frame": { - "x": 236, - "y": 480, + "x": 206, + "y": 456, "w": 20, "h": 14 } }, - { - "filename": "570s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 16, - "h": 17 - }, - "frame": { - "x": 220, - "y": 482, - "w": 16, - "h": 17 - } - }, - { - "filename": "618s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 14, - "w": 20, - "h": 14 - }, - "frame": { - "x": 236, - "y": 494, - "w": 20, - "h": 14 - } - }, - { - "filename": "605", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 223, - "y": 499, - "w": 13, - "h": 19 - } - }, - { - "filename": "605s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 9, - "w": 13, - "h": 19 - }, - "frame": { - "x": 224, - "y": 518, - "w": 13, - "h": 19 - } - }, { "filename": "557", "rotated": false, @@ -6702,8 +6597,8 @@ "h": 17 }, "frame": { - "x": 237, - "y": 508, + "x": 226, + "y": 461, "w": 19, "h": 17 } @@ -6723,56 +6618,14 @@ "h": 17 }, "frame": { - "x": 237, - "y": 525, + "x": 207, + "y": 470, "w": 19, "h": 17 } }, { - "filename": "607", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 13, - "h": 18 - }, - "frame": { - "x": 224, - "y": 537, - "w": 13, - "h": 18 - } - }, - { - "filename": "543s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 14, - "w": 18, - "h": 14 - }, - "frame": { - "x": 237, - "y": 542, - "w": 18, - "h": 14 - } - }, - { - "filename": "546s", + "filename": "541s", "rotated": false, "trimmed": true, "sourceSize": { @@ -6781,98 +6634,14 @@ }, "spriteSourceSize": { "x": 10, - "y": 14, - "w": 21, - "h": 14 - }, - "frame": { - "x": 166, - "y": 574, - "w": 21, - "h": 14 - } - }, - { - "filename": "519", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, "y": 12, - "w": 16, + "w": 20, "h": 16 }, "frame": { - "x": 187, - "y": 574, - "w": 16, - "h": 16 - } - }, - { - "filename": "566", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 21, - "h": 15 - }, - "frame": { - "x": 162, - "y": 588, - "w": 21, - "h": 15 - } - }, - { - "filename": "566s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 21, - "h": 15 - }, - "frame": { - "x": 160, - "y": 603, - "w": 21, - "h": 15 - } - }, - { - "filename": "550-blue-striped", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 12, - "w": 18, - "h": 16 - }, - "frame": { - "x": 154, - "y": 618, - "w": 18, + "x": 207, + "y": 487, + "w": 20, "h": 16 } }, @@ -6891,8 +6660,8 @@ "h": 16 }, "frame": { - "x": 183, - "y": 590, + "x": 227, + "y": 478, "w": 18, "h": 16 } @@ -6912,33 +6681,12 @@ "h": 16 }, "frame": { - "x": 181, - "y": 606, + "x": 227, + "y": 494, "w": 18, "h": 16 } }, - { - "filename": "548s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 10, - "w": 12, - "h": 18 - }, - "frame": { - "x": 164, - "y": 634, - "w": 12, - "h": 18 - } - }, { "filename": "550s-blue-striped", "rotated": false, @@ -6954,8 +6702,8 @@ "h": 16 }, "frame": { - "x": 204, - "y": 551, + "x": 209, + "y": 503, "w": 18, "h": 16 } @@ -6975,8 +6723,8 @@ "h": 16 }, "frame": { - "x": 203, - "y": 567, + "x": 227, + "y": 510, "w": 18, "h": 16 } @@ -6996,8 +6744,8 @@ "h": 17 }, "frame": { - "x": 222, - "y": 555, + "x": 212, + "y": 519, "w": 15, "h": 17 } @@ -7017,75 +6765,12 @@ "h": 16 }, "frame": { - "x": 237, - "y": 556, + "x": 227, + "y": 526, "w": 18, "h": 16 } }, - { - "filename": "616", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 221, - "y": 572, - "w": 18, - "h": 15 - } - }, - { - "filename": "519s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 16, - "h": 16 - }, - "frame": { - "x": 239, - "y": 572, - "w": 16, - "h": 16 - } - }, - { - "filename": "616s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 13, - "w": 18, - "h": 15 - }, - "frame": { - "x": 203, - "y": 583, - "w": 18, - "h": 15 - } - }, { "filename": "540s", "rotated": false, @@ -7101,12 +6786,138 @@ "h": 17 }, "frame": { - "x": 221, - "y": 587, + "x": 212, + "y": 536, "w": 15, "h": 17 } }, + { + "filename": "616", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 227, + "y": 542, + "w": 18, + "h": 15 + } + }, + { + "filename": "517", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 212, + "y": 553, + "w": 15, + "h": 14 + } + }, + { + "filename": "616s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 18, + "h": 15 + }, + "frame": { + "x": 227, + "y": 557, + "w": 18, + "h": 15 + } + }, + { + "filename": "578s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 165, + "y": 620, + "w": 16, + "h": 19 + } + }, + { + "filename": "624", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 169, + "y": 639, + "w": 14, + "h": 20 + } + }, + { + "filename": "574", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 14, + "h": 18 + }, + "frame": { + "x": 175, + "y": 659, + "w": 14, + "h": 18 + } + }, { "filename": "559", "rotated": false, @@ -7122,12 +6933,327 @@ "h": 16 }, "frame": { - "x": 236, - "y": 588, + "x": 167, + "y": 604, "w": 15, "h": 16 } }, + { + "filename": "566s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 13, + "w": 21, + "h": 15 + }, + "frame": { + "x": 168, + "y": 561, + "w": 21, + "h": 15 + } + }, + { + "filename": "580", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 168, + "y": 576, + "w": 16, + "h": 19 + } + }, + { + "filename": "618s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 14, + "w": 20, + "h": 14 + }, + "frame": { + "x": 189, + "y": 562, + "w": 20, + "h": 14 + } + }, + { + "filename": "580s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 9, + "w": 16, + "h": 19 + }, + "frame": { + "x": 184, + "y": 576, + "w": 16, + "h": 19 + } + }, + { + "filename": "543", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 14, + "w": 18, + "h": 14 + }, + "frame": { + "x": 209, + "y": 567, + "w": 18, + "h": 14 + } + }, + { + "filename": "543s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 14, + "w": 18, + "h": 14 + }, + "frame": { + "x": 227, + "y": 572, + "w": 18, + "h": 14 + } + }, + { + "filename": "624s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 182, + "y": 595, + "w": 14, + "h": 20 + } + }, + { + "filename": "548s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 12, + "h": 18 + }, + "frame": { + "x": 196, + "y": 595, + "w": 12, + "h": 18 + } + }, + { + "filename": "517s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 200, + "y": 581, + "w": 15, + "h": 14 + } + }, + { + "filename": "582", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 215, + "y": 581, + "w": 12, + "h": 16 + } + }, + { + "filename": "554s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 13, + "w": 17, + "h": 15 + }, + "frame": { + "x": 227, + "y": 586, + "w": 17, + "h": 15 + } + }, + { + "filename": "570", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 208, + "y": 597, + "w": 16, + "h": 17 + } + }, + { + "filename": "570s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 16, + "h": 17 + }, + "frame": { + "x": 224, + "y": 601, + "w": 16, + "h": 17 + } + }, + { + "filename": "535s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 15, + "w": 14, + "h": 13 + }, + "frame": { + "x": 182, + "y": 615, + "w": 14, + "h": 13 + } + }, + { + "filename": "582s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 12, + "w": 12, + "h": 16 + }, + "frame": { + "x": 196, + "y": 613, + "w": 12, + "h": 16 + } + }, { "filename": "559s", "rotated": false, @@ -7143,8 +7269,8 @@ "h": 16 }, "frame": { - "x": 201, - "y": 598, + "x": 208, + "y": 614, "w": 15, "h": 16 } @@ -7164,73 +7290,31 @@ "h": 14 }, "frame": { - "x": 199, - "y": 614, - "w": 15, - "h": 14 - } - }, - { - "filename": "577s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 14, - "w": 15, - "h": 14 - }, - "frame": { - "x": 216, - "y": 604, - "w": 15, - "h": 14 - } - }, - { - "filename": "597", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 231, - "y": 604, - "w": 15, - "h": 16 - } - }, - { - "filename": "597s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 12, - "w": 15, - "h": 16 - }, - "frame": { - "x": 214, + "x": 223, "y": 618, "w": 15, - "h": 16 + "h": 14 + } + }, + { + "filename": "602", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 181, + "y": 628, + "w": 14, + "h": 11 } }, { @@ -7248,12 +7332,33 @@ "h": 18 }, "frame": { - "x": 229, - "y": 620, + "x": 183, + "y": 639, "w": 14, "h": 18 } }, + { + "filename": "607", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 10, + "w": 13, + "h": 18 + }, + "frame": { + "x": 189, + "y": 657, + "w": 13, + "h": 18 + } + }, { "filename": "607s", "rotated": false, @@ -7269,12 +7374,96 @@ "h": 18 }, "frame": { - "x": 243, - "y": 620, + "x": 191, + "y": 675, "w": 13, "h": 18 } }, + { + "filename": "524", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 15, + "y": 11, + "w": 11, + "h": 17 + }, + "frame": { + "x": 197, + "y": 629, + "w": 11, + "h": 17 + } + }, + { + "filename": "597", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 208, + "y": 630, + "w": 15, + "h": 16 + } + }, + { + "filename": "602s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 17, + "w": 14, + "h": 11 + }, + "frame": { + "x": 197, + "y": 646, + "w": 14, + "h": 11 + } + }, + { + "filename": "577s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 15, + "h": 14 + }, + "frame": { + "x": 223, + "y": 632, + "w": 15, + "h": 14 + } + }, { "filename": "613", "rotated": false, @@ -7290,8 +7479,8 @@ "h": 18 }, "frame": { - "x": 176, - "y": 634, + "x": 202, + "y": 657, "w": 14, "h": 18 } @@ -7311,180 +7500,12 @@ "h": 18 }, "frame": { - "x": 174, - "y": 652, + "x": 204, + "y": 675, "w": 14, "h": 18 } }, - { - "filename": "602", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 174, - "y": 670, - "w": 14, - "h": 11 - } - }, - { - "filename": "524", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 15, - "y": 11, - "w": 11, - "h": 17 - }, - "frame": { - "x": 188, - "y": 652, - "w": 11, - "h": 17 - } - }, - { - "filename": "602s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 17, - "w": 14, - "h": 11 - }, - "frame": { - "x": 188, - "y": 669, - "w": 14, - "h": 11 - } - }, - { - "filename": "582", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 12, - "w": 12, - "h": 16 - }, - "frame": { - "x": 202, - "y": 628, - "w": 12, - "h": 16 - } - }, - { - "filename": "588", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 11, - "w": 12, - "h": 17 - }, - "frame": { - "x": 190, - "y": 628, - "w": 12, - "h": 17 - } - }, - { - "filename": "535", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 15, - "w": 14, - "h": 13 - }, - "frame": { - "x": 214, - "y": 634, - "w": 14, - "h": 13 - } - }, - { - "filename": "535s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 15, - "w": 14, - "h": 13 - }, - "frame": { - "x": 228, - "y": 638, - "w": 14, - "h": 13 - } - }, - { - "filename": "590", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 14, - "h": 17 - }, - "frame": { - "x": 242, - "y": 638, - "w": 14, - "h": 17 - } - }, { "filename": "524s", "rotated": false, @@ -7500,12 +7521,75 @@ "h": 17 }, "frame": { - "x": 199, - "y": 651, + "x": 207, + "y": 693, "w": 11, "h": 17 } }, + { + "filename": "590", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 14, + "h": 17 + }, + "frame": { + "x": 216, + "y": 646, + "w": 14, + "h": 17 + } + }, + { + "filename": "597s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 15, + "h": 16 + }, + "frame": { + "x": 230, + "y": 646, + "w": 15, + "h": 16 + } + }, + { + "filename": "588s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 11, + "w": 12, + "h": 17 + }, + "frame": { + "x": 218, + "y": 663, + "w": 12, + "h": 17 + } + }, { "filename": "590s", "rotated": false, @@ -7521,53 +7605,11 @@ "h": 17 }, "frame": { - "x": 210, - "y": 647, + "x": 230, + "y": 662, "w": 14, "h": 17 } - }, - { - "filename": "588s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 11, - "w": 12, - "h": 17 - }, - "frame": { - "x": 210, - "y": 664, - "w": 12, - "h": 17 - } - }, - { - "filename": "582s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 12, - "w": 12, - "h": 16 - }, - "frame": { - "x": 224, - "y": 651, - "w": 12, - "h": 16 - } } ] } @@ -7575,6 +7617,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b1ede56fa38672ee5e2e5de6f39ff48:58f3f9bd48fa9481c3cd7a0cdebb3e00:20fe181c46701b46ac8f250d40b1bbc1$" + "smartupdate": "$TexturePacker:SmartUpdate:8a278d997d5726b88e2aaa301eb4e4e8:c33243967aadc5b2250e95b079396b1d:20fe181c46701b46ac8f250d40b1bbc1$" } } diff --git a/public/images/pokemon_icons_5.png b/public/images/pokemon_icons_5.png index e0a4ebef303172c0bf48286b3fb3f8d4d14fbb6b..264120c749995f91cc0105927f4684d6e3a82c94 100644 GIT binary patch literal 64514 zcmV))K#ISKP)00PMf0{{R3TS%3t00093P)t-sOlfh1 zbaTR0^j`jB&J=8sa>;s3cgHvQI5 zamiTD#i^QZNd2%ego17C=KoKBL;R+`ezEfEzl2s|hm)bDsivq@XSlV=%3F>9O}?+l zqH@Ecf%br>{NX2Mm|}KsYG+C{;96K%eTRily3?`#J2h<3G&1|P^xnK)_;G2QfmlV2 z-ir?z@4c>OLc_RPMg5@V^W00{>@8Dtm6J^PN#O+GoDr8j95{Mb~}^a zXqQzmJVaUF{QnW8ZcTFE*vyHaFCeg{o{z~>Mr)5a!&{y6On;UA(oI#?`2XUe0=>ZM zjAFi9S5Ucm()mq5$4hkmbU^;Lo20G%(RWC;@u+W@oVtthn!FfdqrzdWb8m8)FqT%l zMo-~iZ&XE#J)`18K{||Wwy}0P-Ap;i=39Ni)o$X!%Z(wTYVf&PZO%fYi+cK6iOt2+ z=-_y@Muf2@p_|8)S6HY0Uw3A4vJSx3H%){9qM(Z;fXgp1F@PvFw!NdNrOy#+n`30t z?e;{%S~=LW*TrfH$@Ch}^_p?EK!$1)SLcI^;E%28*=k! z%;lbg2F%VwSZC{}pom0T7NoJDV3u-)r(1HWVf^$Ec2KQ`X#$%V#WT~Si5gASDTLPV znQ*<*gmUR}^4F}Q|4Oeya9Emm(P%d6%o=4yAwE64-=~^82 z56Z=notz$joU%d}Q07&PKdF<@r|zz->}92%l?qr{g^+NXl#%SkP-q{Un1Ri?l&p#L zcvUu@AO5h!|EIL)r4v67$%P@}6f?D>JH09^Ep)G5@7&!hD^_lHd1s!cwJdK&UVpOG zT)lQ}HHE^q&_tgdiBnTmR%)&%{|!Aa@$(2Z1kEX5*!VBXFlohZJp|jv@4G7#vGq*~ z^}Ok8j;-PR6t!AHRQn{cz||S}tf7a}!>Y%W9xWpi3gc?p0ka)V;1$3pA*K-7CYF zLS=~0av^h9h?^;XdJ#^4%x%nl+Je)dPUEwAp*0h&JzNnAnt5BZ5b>ESU>|s>8WP7Ph+a4SR8� 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 %KPM#^zPkA>vu;7 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 Hu0mjfza-Yf literal 65335 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 z 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%0DbBh8(kOCz>IPy z>sy5X?^^%I2phM)q2qx@KAJ5I0#Mzr#hp!RuD3Uu{|dFUDkhS#00001bW%=J06^y0 zW&i*H32;bRa{vGi!~g&e!~vBn4jTXfAOJ~3K~#9!oSh3;Rb|@u*$~_dP!x}#qH+vH z1pyI|z*D4vW~LWNgZcSN7>1Ohj@p~1dCJhHnmm-IR-VwYtjsPuOlf&_)mu54sbe!^ zb@`doVVdi!cbb~-{r>m;ti!X`UK^e7Veid$vE9GtK0fza>sikV3v;zmqeg{Ytr3OV zPW&hJ>htHTeC??I{ik0IPKM$C-6K1r5vkXp?$T7c3i==Y^YTWS8VHF7J6JRt$!y^Z z-KCGIQ|YSgygU;r|L$>0*W??}A&lm=q<9Gi& zUpS+UN|v2$asZ9M&d(p2-#I_ug3BkQThpgc26{T)4OZI*4<1Z9`N|cBXAB#*eEG19 z{=@pu&l~0AWn{z~m0(vcG$l95fqbyz5K*& z@KHgoO)nC~*T+}J$1^^jO!idqZU`M0H#L7M=t}(~M~+nR$uSJ)r-gRO4R%IG#;EzD z)}3EBY}j|Jd0jwvMmS7k24$IDA~ojlVirl z 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
cxQ2V_+0(MF?H}V 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 diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index eb73c2f036b..1a16cdd41b9 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -312,13 +312,7 @@ export abstract class PokemonSpeciesForm { getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { const variantDataIndex = this.getVariantDataIndex(formIndex); const isVariant = shiny && variantData[variantDataIndex] && variantData[variantDataIndex][variant]; - const species = getPokemonSpecies(this.speciesId); - /** - * Currently, Victini's icon sprite is located in Gen 4, so we will temporarily bypass this issue with the following code. - * In the future, when Victini's icon sprite is properly moved to Gen 5, the temporary code below should be removed. - */ - const generation = species.speciesId === Species.VICTINI ? 4 : this.generation; - return `pokemon_icons_${generation}${isVariant ? "v" : ""}`; + return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } getIconId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { @@ -2952,8 +2946,8 @@ export const speciesStarters = { [Species.DARKRAI]: 6, [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, - [Species.VICTINI]: 7, + [Species.VICTINI]: 7, [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, From 7048fbe06f370f09830807bfb5b06a4e6d1d9b48 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Sat, 3 Aug 2024 16:34:05 -0400 Subject: [PATCH 140/321] [Feature] Implement generic evil team admins (#3234) * [Hotfix] Fix interactions of some moves not changing types (#3183) * [Hotfix] Fix wild spawns not having their HA (#3190) * Add evil admin placeholder images * Add admin names to locale files * Add evil team admin dialogue * Added new sprites * Make simple admin trainer pools * Add Korean localization * Increase evil boss money multiplier from 2.25 to 2.5 --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- public/images/trainer/aqua_admin.json | 41 + public/images/trainer/aqua_admin.png | Bin 0 -> 1032 bytes public/images/trainer/aqua_admin_f.json | 41 + public/images/trainer/aqua_admin_f.png | Bin 0 -> 865 bytes public/images/trainer/flare_admin_f.png | Bin 0 -> 671 bytes public/images/trainer/flare_admin_m copy.json | 41 + public/images/trainer/flare_admin_m.json | 41 + public/images/trainer/flare_admin_m.png | Bin 0 -> 789 bytes public/images/trainer/galactic_admin_f.json | 41 + public/images/trainer/galactic_admin_f.png | Bin 0 -> 621 bytes public/images/trainer/galactic_admin_m.json | 41 + public/images/trainer/galactic_admin_m.png | Bin 0 -> 689 bytes public/images/trainer/magma_admin_f.json | 41 + public/images/trainer/magma_admin_f.png | Bin 0 -> 847 bytes public/images/trainer/magma_admin_m.json | 41 + public/images/trainer/magma_admin_m.png | Bin 0 -> 845 bytes public/images/trainer/plasma_sage.json | 2120 +++++++++++++++++ public/images/trainer/plasma_sage.png | Bin 0 -> 5075 bytes public/images/trainer/rocket_admin_f.json | 41 + public/images/trainer/rocket_admin_f.png | Bin 0 -> 736 bytes public/images/trainer/rocket_admin_m.json | 41 + public/images/trainer/rocket_admin_m.png | Bin 0 -> 645 bytes src/battle.ts | 7 +- src/data/dialogue.ts | 84 + src/data/trainer-config.ts | 38 +- src/enums/trainer-type.ts | 6 + src/field/trainer.ts | 4 +- src/locales/de/dialogue.ts | 72 + src/locales/de/trainers.ts | 11 + src/locales/en/dialogue.ts | 72 + src/locales/en/trainers.ts | 11 + src/locales/es/trainers.ts | 10 + src/locales/fr/dialogue.ts | 72 + src/locales/fr/trainers.ts | 11 + src/locales/it/dialogue.ts | 72 + src/locales/it/trainers.ts | 12 +- src/locales/ko/dialogue.ts | 72 + src/locales/ko/trainers.ts | 11 + src/locales/pt_BR/trainers.ts | 11 + src/locales/zh_CN/dialogue.ts | 72 + src/locales/zh_CN/trainers.ts | 11 + src/locales/zh_TW/dialogue.ts | 72 + src/locales/zh_TW/trainers.ts | 11 + 43 files changed, 3265 insertions(+), 7 deletions(-) create mode 100644 public/images/trainer/aqua_admin.json create mode 100644 public/images/trainer/aqua_admin.png create mode 100644 public/images/trainer/aqua_admin_f.json create mode 100644 public/images/trainer/aqua_admin_f.png create mode 100644 public/images/trainer/flare_admin_f.png create mode 100644 public/images/trainer/flare_admin_m copy.json create mode 100644 public/images/trainer/flare_admin_m.json create mode 100644 public/images/trainer/flare_admin_m.png create mode 100644 public/images/trainer/galactic_admin_f.json create mode 100644 public/images/trainer/galactic_admin_f.png create mode 100644 public/images/trainer/galactic_admin_m.json create mode 100644 public/images/trainer/galactic_admin_m.png create mode 100644 public/images/trainer/magma_admin_f.json create mode 100644 public/images/trainer/magma_admin_f.png create mode 100644 public/images/trainer/magma_admin_m.json create mode 100644 public/images/trainer/magma_admin_m.png create mode 100644 public/images/trainer/plasma_sage.json create mode 100644 public/images/trainer/plasma_sage.png create mode 100644 public/images/trainer/rocket_admin_f.json create mode 100644 public/images/trainer/rocket_admin_f.png create mode 100644 public/images/trainer/rocket_admin_m.json create mode 100644 public/images/trainer/rocket_admin_m.png diff --git a/public/images/trainer/aqua_admin.json b/public/images/trainer/aqua_admin.json new file mode 100644 index 00000000000..507fe556ef1 --- /dev/null +++ b/public/images/trainer/aqua_admin.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "aqua_admin.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} \ No newline at end of file diff --git a/public/images/trainer/aqua_admin.png b/public/images/trainer/aqua_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f7893e5652254377239e8c398650273aa64773 GIT binary patch literal 1032 zcmV+j1o!)iP)K~#9! ztkY2n13?G`(Xq9%YUcju%`PGTf$<%nXav_E?6Jm}{2`m_`HxNZB$sR?7`jEkRFHTu z7=#D_Nw0P6l1Kpg%tVzdX>bvG4=mheO}p=k5Oy9U9l)xX2^v81aJ8*tmO#=?_{c+B zWp`&aL%(PBl@Yeqbvr#`*5134a5KwHE?Y+g0l0rks}rR+VHgO&+189b%qUqmH%aEDW!F2G9%DDh22~Tv*%7AR$$1Qr`=+%dHw$K-f}Mdr zHM$--OI0L4dHuwShD^!8=wJjOh#*B!@k9VlPDv~E}|55 z2K&V$t>89@EF|Gza&XC?``obaXOE~CgivyZ&^)A1;QjvRelKM5k?COl2uUBqH;|y> zhv(6P5iWXA^8_+g6a{fXO8w$>{y&!Qmy&~f7t~fvct!ULnBoLJ?D)z;3V_9{hgMM( zwAXbp#TXx&uG4qsX`tER70ceZJW)zIv$Ump271h^gMh$u`4GP>CB;iyAjG$aUNTPM zlj=S8vuMd+@Olv5-`;MY>}$CTnH#pzaU z>h*RdPKxFzsc(gz#NiyMF{Ml4$ZaKoc#yL<)W0VFUbIGJAiq>#jgbNd=tq|HWXGoMp=DKqz^Y%w8RQ zk25!pBQ}4{vS-V9y~pwO*1QZnA7GpUGI@ zs3RvV`1ts+fLLu;nacnG00DGTPE!Ct=GbNc00PZPL_t(|UhUP{j^jEE1W*@AEnc$U z`~SZ>B}R4C|Sp717&KtU-^*04^56x$EI{Y6tNE3BhRx30;rJR*_T{p94d|4M&R2 zpkD|gFQB13)6@*YF9-=C0N6wkGZ7t`>-BVM1WAfgbQAMD!^zR~e}Xu%<*CVIL=o;u zG$x9qJqvA^I0^ndt%kX^iB#$zTch#oMi5_GQy*?8qHkAX72{dZITDY$v-lCAr(TYLqh zGCuq(h7#eyn}Ep rdG%J&gZ;UrGv!Msx38|{Oep3|C=+%=6<#*shF{MB0004W zQchCb(7St+3f7g{ZE;)1mpmtGLi@X1NGyF z=1@>~^wCGlk&i3$o{5CGy=^YAEV#{obF7GYz8yb-8w?B1bD5^;p+s81B5rRghBITn zps7Dh95Ii;EWH9#EW>Ujj^3H)k|9CW!@?ZcN1E$9;uOF}s%Q+931QzsKum_d} z0#1U^1pB_H#|uq-XVzpzocA)I*^&b_#Vg{~II)hDnTU ztyZ=mJs=tsE0t`+nfr$VR@7R7&I2k;045{YPs$FW^MP=I65kI*X9Rl}sBnmW5SiqsGK0o;IX39^MiN~FuWkG zAVBYi!APeF3S`0v%5&ax5KNLr5y8x)`SW1DXeI9-^amIu8{UH+4K@G(002ovPDHLk FV1hG~8Cn1U literal 0 HcmV?d00001 diff --git a/public/images/trainer/flare_admin_m copy.json b/public/images/trainer/flare_admin_m copy.json new file mode 100644 index 00000000000..1e39a3fcb03 --- /dev/null +++ b/public/images/trainer/flare_admin_m copy.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_admin_f.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + } +} \ No newline at end of file diff --git a/public/images/trainer/flare_admin_m.json b/public/images/trainer/flare_admin_m.json new file mode 100644 index 00000000000..4228fac6af0 --- /dev/null +++ b/public/images/trainer/flare_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "flare_admin_m.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c30bf82452209a923f4becf13d275a9a:a6355b09f92c9c0388d0b919010f587f:0638dbf213f8a974eb5af76eb1e5ddeb$" + } +} diff --git a/public/images/trainer/flare_admin_m.png b/public/images/trainer/flare_admin_m.png new file mode 100644 index 0000000000000000000000000000000000000000..f431c20a479fccd415a489ed943d10a2c9a3f4a1 GIT binary patch literal 789 zcmV+w1M2*VP)Ax-SaR2}S0d!JMQvg8b*k%9#0*XmQK~#8Nt=3tN<1h>aP*-u0Y$rX-{SP~)g}9Xt zl7W_jAwc?gphlFjMN(?7J8v#RO1u{OjZje%g=08Am z6-je+rGXw zz^K4&Yj{+v=1am4@awi2al18wI6(lYdx#T+@zx4vvEW{3vVGk;!8b!jcpV_#gRoW* zs=C)=4I1nLq6O6a4vcWw3fSL7_ZM(zDlQ_G$nYA$TJ-QJ-VLINb$J0^A{U$@n!vxP zyaI|};89+~P_X7zGhVz93%E4CkCE35)E=b7dmmqT)R&64)FPIiz&+~w2_|cMEI5=76*dWZBLD-GgAY4ZU9sErnJSF)CC8ab7TB+$02P+gau^O}ykQSWPVC=?0iY3$pH{fehWzDmCQf=AnT?Pkh14k6Q8fm&|DzTR~gkoUr_RT@ILq$gGRCwCW)zOZtFbn|EOl%Vfbo>8*d+kQ_!Yi?~JFTkla^wh0 zEx#NrjYO?2iC$>o<#H_xWEnZzQoNt&BuSVryp}g3AqAKu(uUM>!M2}ZBLi%04>7!H zu#5@OJ+$Fvj7U9vNR*NQw!SR;799sAN9@ZM?MEX8WczgNv;>i*aX1&Rnr9qv^IC(? zgp^02s$9Gwa`4o9y)GhyL4@+G&Z|0k8wYqS_N~97ejrjJ5iu`Bo`LjN@7so%_-A~h z_W?W*_r4vza=Y1$Q+>bDM>F>Q@D=G-P)ut*-ddqNA)^8V15Bv3ib<`MiHIZ)1C#+~ zggK}ps%fBl4kB6N>WQp*;5i{#;22OOb3zeK1nUP>AqkANaj=RRNnU{QlLHdq8lnJM z;26=2EU&Hsk_e74$?)u(cyk=$O#P;wWL@_JRT8}%(6}^tWrchD?BalUP#E={G8Ymt zWC$+_lnBaf5S_4;tN~9s6BI82Bp6Es4X>nK8H@NH=RwH^RYYu@B?t8E{|i?#LG>m< z)73k{I8TGo0MU#I*YF0&ngQ0!jdlLY)X1(6iC|$Kw5yj7qA4KvE&r2XqR3wdO>0%V zd+W*!=v~3pJyn?5!W(E#MofVBO@ti9Z&i@@xGA(%BMZk9Yyh00000NkvXX Hu0mjf+(HpR literal 0 HcmV?d00001 diff --git a/public/images/trainer/galactic_admin_m.json b/public/images/trainer/galactic_admin_m.json new file mode 100644 index 00000000000..f404c2247e9 --- /dev/null +++ b/public/images/trainer/galactic_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "galactic_admin_m.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3012867f03f02c4ee67a8ab3ad5a000e:77a5f60f1adc158664b3b2ee17bf30fe:7e8259b5177c0a76e5d02d6bdc66affe$" + } +} diff --git a/public/images/trainer/galactic_admin_m.png b/public/images/trainer/galactic_admin_m.png new file mode 100644 index 0000000000000000000000000000000000000000..cb59227c7a743b3c220a0a10072504123947289e GIT binary patch literal 689 zcmV;i0#5yjP)n7VgLXD|NsAcdxJ`9oV~rpAVG89qy>pb+drDfpdt%;FTK~OLt{e_h00001 zbW%=J06^y0W&i*JFG)l}RCwCO)`?cFN(_WyDg`u+pzr^-w>pimot0$W^Pj=_TPf$^ zAGc%}56ChvaqmL(Xa+dz&(b-0IiR3}OSw=zsmA3@?wm@Ryj+|>WPpo{?bKyX0H0=o z{#R}axIej8XO#iY)#omGAP#VedmcKt12Qj=>Lxg1Ue_JtyzKP^x$^n>p17~C)xGip zx96K8PLK5hYOPx-9BzuWd6n1Ovo>*C?}2;W_D$Y!#;vM#z58MDH|NFCs&~_4Ya=gC z1wh&~O`tkBm}1~SvkA?V;@9~jlJ9ze8_o1bobv*ppzD8eK@e0OG=M`aQbs8+FJNy7 z#t|qE7NW&4C{ExmFfLvoAaKYKIgaBA4rB^AcF>LwIv532151Ol!0{C%%#3NEqJv>i z;5c>=2!T`U4QPh&h0|mvH*>N|o~%k?crrUR9XW_Ve-;KxrBM&5}Z&pF?T zU;xC&XWj$(adAKK?r0j6*#}VF1l8ev6dC=hi=PM=fjrQl{J@;eI2Y%f2+Ia>dO4e6 z=Ue5R2=mfFJKrV?^k0wci|f^-m-A1a`VuUqj4k^;SX#!fUTnp)Kb%Nq!^j`@E{2+?9q~^>| zegX|MSJPNTUS34%kPze4(>TEpF3-3khTs6#&@hHx8>0m^{ewq+%W!n%0C zWnIa*<9L66Z@G9-z#)Rr9>0}4juu2%d|(5T_T<`mW)*#2!y>I|$_;~o#BLC#&GUfI z0X0Bs`%et>zQ29#pbBDp^j~lDyldLFM$M$6c?KTvgC;7d;-DgY9{K`u2kptQ&*<0% zA`*X#O7?E=MxA_%N+ze*Aa;?uQ$)@=IUBM`ymf_0Oh`FpYznwUi74I{V;WQ51TGLE z1QVb#D>!oWiD4<5Y098D893dd3uF@O339@%h*Oj;Il!=reK$xMa^sW}tCwA(NOyvw zAQNrbB{D5bfD)hrQUpx&bS2~hf{2xkuoWF0Vz3fNWW)k)Xc~+j5y@VM6-`W&dKE+~ z6B{OCg-_9O9f5igF;1B7XDGtD__iJOCKWYBRF5cly-nRy3`<7~u>&-Zq=+zpNyPw{ z$0U!UdWJs}+&vS&6%Lc?c!q>>8!^nwDuN3Dk`EGjLS#V7k0<9(sNgB$15e(Uh;z!w z3TCFeh~~K@GYlKks3a@si_MCaJHdv%pfa4s3v>r328(+BB$V{Crmq2>Qn@A81@}rI zY-(uwy&7l|nj-cUy#ns21okFZ1m^-)>Pmkv6jeYB1-yoCa8{&&A^P`ZvBpooxxk0Lq12AYQdeboHt Z`2!llB*-I|PaFUM002ovPDHLkV1fX3YV`mB literal 0 HcmV?d00001 diff --git a/public/images/trainer/magma_admin_m.json b/public/images/trainer/magma_admin_m.json new file mode 100644 index 00000000000..9961b8dcd3b --- /dev/null +++ b/public/images/trainer/magma_admin_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "magma_admin_f.png", + "format": "RGBA8888", + "size": { + "w": 80, + "h": 80 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f63ad48affc076f60fae78992c96a2bf:80928b32710abcb28c07c6fc5a425d99:3b961d8852b62aaf24ceb2030c036515$" + } +} diff --git a/public/images/trainer/magma_admin_m.png b/public/images/trainer/magma_admin_m.png new file mode 100644 index 0000000000000000000000000000000000000000..93e3a17539d315e1ff7846e412b5264335f3d064 GIT binary patch literal 845 zcmV-T1G4;yP)24bkm+Vi|K~#9!?9hP*gE0)m@m*VxTuSr)54)Vt7z3n$ z{Z$?KA+LWwg}TWd70|xnolmHZE8b&9#O{L-Bu?$UFMz=U%T;$gmWU7+HQHdZ0<6e= zKREpLG(PB5l-bGtqIOC%#s92ab&i@G1r3gJ8yYQfy$oG#`SlRwPm)k=d;q!?(A=u}IpzG~ZT?-Gf;3#OFGw|p0`Vs??6y+>mA`Vs62M$iy5(YVflef9)%;NfEm z?|7Tp#GHBubv}Y^YbU_)7P7FMdhKD=QwbqO$*C(WtQb?~Xiv1%ny@)E9!82I)QiLP;B|-L literal 0 HcmV?d00001 diff --git a/public/images/trainer/plasma_sage.json b/public/images/trainer/plasma_sage.json new file mode 100644 index 00000000000..05e75141ec0 --- /dev/null +++ b/public/images/trainer/plasma_sage.json @@ -0,0 +1,2120 @@ +{ + "textures": [ + { + "image": "plasma_sage.png", + "format": "RGBA8888", + "size": { + "w": 250, + "h": 250 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 1, + "w": 56, + "h": 79 + }, + "frame": { + "x": 1, + "y": 1, + "w": 56, + "h": 79 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 13, + "y": 2, + "w": 55, + "h": 78 + }, + "frame": { + "x": 1, + "y": 82, + "w": 55, + "h": 78 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 2, + "w": 54, + "h": 78 + }, + "frame": { + "x": 59, + "y": 1, + "w": 54, + "h": 78 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 2, + "w": 54, + "h": 78 + }, + "frame": { + "x": 59, + "y": 1, + "w": 54, + "h": 78 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 3, + "w": 53, + "h": 77 + }, + "frame": { + "x": 1, + "y": 162, + "w": 53, + "h": 77 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 4, + "w": 53, + "h": 76 + }, + "frame": { + "x": 115, + "y": 1, + "w": 53, + "h": 76 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 3, + "w": 49, + "h": 77 + }, + "frame": { + "x": 170, + "y": 1, + "w": 49, + "h": 77 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 2, + "w": 47, + "h": 78 + }, + "frame": { + "x": 58, + "y": 82, + "w": 47, + "h": 78 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 56, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 56, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 107, + "y": 81, + "w": 46, + "h": 80 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 104, + "y": 163, + "w": 46, + "h": 80 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 155, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 203, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 203, + "y": 80, + "w": 46, + "h": 80 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 46, + "h": 80 + }, + "frame": { + "x": 152, + "y": 163, + "w": 46, + "h": 80 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 21, + "y": 1, + "w": 46, + "h": 79 + }, + "frame": { + "x": 200, + "y": 162, + "w": 46, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:98df2be457c75de554b8ce6c2f5ff582:93e2cb242dc211e2485f87e4db93af88:0c38bc008e5ede7b6331c02b8220846f$" + } +} \ No newline at end of file diff --git a/public/images/trainer/plasma_sage.png b/public/images/trainer/plasma_sage.png new file mode 100644 index 0000000000000000000000000000000000000000..6c866562989a99bbba8b844b7d17f3e5be6128de GIT binary patch literal 5075 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 literal 0 HcmV?d00001 diff --git a/src/battle.ts b/src/battle.ts index cbe6dee1a4a..e8a1323fc4c 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -464,7 +464,8 @@ export interface FixedBattleConfigs { /** * Youngster/Lass on 5 * Rival on 8, 55, 95, 145, 195 - * Evil team grunts on 35, 62, 64, 66, 112, 114 + * Evil team grunts on 35, 62, 64, and 112 + * Evil team admin on 66 and 114 * Evil leader on 115, 165 * E4 on 182, 184, 186, 188 * Champion on 190 @@ -485,13 +486,13 @@ export const classicFixedBattles: FixedBattleConfigs = { [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], true)), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], true)), [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index ec3358b1a77..4386515c953 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -459,6 +459,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.ROCKET_ADMIN]: [ + { + encounter: [ + "dialogue:rocket_admin.encounter.1", + "dialogue:rocket_admin.encounter.2", + "dialogue:rocket_admin.encounter.3", + ], + victory: [ + "dialogue:rocket_admin.victory.1", + "dialogue:rocket_admin.victory.2", + "dialogue:rocket_admin.victory.3", + ] + } + ], [TrainerType.MAGMA_GRUNT]: [ { encounter: [ @@ -469,6 +483,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.MAGMA_ADMIN]: [ + { + encounter: [ + "dialogue:magma_admin.encounter.1", + "dialogue:magma_admin.encounter.2", + "dialogue:magma_admin.encounter.3", + ], + victory: [ + "dialogue:magma_admin.victory.1", + "dialogue:magma_admin.victory.2", + "dialogue:magma_admin.victory.3", + ] + } + ], [TrainerType.AQUA_GRUNT]: [ { encounter: [ @@ -479,6 +507,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.AQUA_ADMIN]: [ + { + encounter: [ + "dialogue:aqua_admin.encounter.1", + "dialogue:aqua_admin.encounter.2", + "dialogue:aqua_admin.encounter.3", + ], + victory: [ + "dialogue:aqua_admin.victory.1", + "dialogue:aqua_admin.victory.2", + "dialogue:aqua_admin.victory.3", + ] + } + ], [TrainerType.GALACTIC_GRUNT]: [ { encounter: [ @@ -489,6 +531,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.GALACTIC_ADMIN]: [ + { + encounter: [ + "dialogue:galactic_admin.encounter.1", + "dialogue:galactic_admin.encounter.2", + "dialogue:galactic_admin.encounter.3", + ], + victory: [ + "dialogue:galactic_admin.victory.1", + "dialogue:galactic_admin.victory.2", + "dialogue:galactic_admin.victory.3", + ] + } + ], [TrainerType.PLASMA_GRUNT]: [ { encounter: [ @@ -499,6 +555,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.PLASMA_SAGE]: [ + { + encounter: [ + "dialogue:plasma_sage.encounter.1", + "dialogue:plasma_sage.encounter.2", + "dialogue:plasma_sage.encounter.3", + ], + victory: [ + "dialogue:plasma_sage.victory.1", + "dialogue:plasma_sage.victory.2", + "dialogue:plasma_sage.victory.3", + ] + } + ], [TrainerType.FLARE_GRUNT]: [ { encounter: [ @@ -509,6 +579,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.FLARE_ADMIN]: [ + { + encounter: [ + "dialogue:flare_admin.encounter.1", + "dialogue:flare_admin.encounter.2", + "dialogue:flare_admin.encounter.3", + ], + victory: [ + "dialogue:flare_admin.victory.1", + "dialogue:flare_admin.victory.2", + "dialogue:flare_admin.victory.3", + ] + } + ], [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ { encounter: [ diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 4f3481b27ac..2cc228a93cf 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -556,7 +556,7 @@ export class TrainerConfig { const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setTitle(title); - this.setMoneyMultiplier(2.25); + this.setMoneyMultiplier(2.5); this.setBoss(); this.setStaticParty(); this.setBattleBgm("battle_plasma_boss"); @@ -1187,6 +1187,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR] }), + [TrainerType.ROCKET_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], + [TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], + [TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR] + }), [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(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], @@ -1194,6 +1200,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] }), + [TrainerType.MAGMA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.RARE]: [Species.TURTONATOR, Species.CHARCADET] + }), [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(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL ], @@ -1201,6 +1213,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO] }), + [TrainerType.AQUA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.CORPHISH, Species.ZIGZAGOON, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH ], + [TrainerPoolTier.UNCOMMON]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], + [TrainerPoolTier.RARE]: [Species.DONDOZO] + }), [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(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY], @@ -1208,6 +1226,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), + [TrainerType.GALACTIC_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL ], + [TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], + [TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] + }), [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(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH], @@ -1215,6 +1239,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK], [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT] }), + [TrainerType.PLASMA_SAGE]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.SCRAFTY, Species.LILLIPUP, Species.PURRLOIN, Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS], + [TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK], + [TrainerPoolTier.RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT] + }), [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(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], @@ -1222,6 +1252,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), + [TrainerType.FLARE_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG], + [TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], + [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON] + }), [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"), diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 6bd8f567acb..db0bf3a8d64 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -53,11 +53,17 @@ export enum TrainerType { WORKER, YOUNGSTER, ROCKET_GRUNT, + ROCKET_ADMIN, MAGMA_GRUNT, + MAGMA_ADMIN, AQUA_GRUNT, + AQUA_ADMIN, GALACTIC_GRUNT, + GALACTIC_ADMIN, PLASMA_GRUNT, + PLASMA_SAGE, FLARE_GRUNT, + FLARE_ADMIN, ROCKET_BOSS_GIOVANNI_1, ROCKET_BOSS_GIOVANNI_2, MAXIE, diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 3e78afeae83..107dfbe6831 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -121,8 +121,8 @@ export default class Trainer extends Phaser.GameObjects.Container { // Determine the title to include based on the configuration and includeTitle flag. let title = includeTitle && this.config.title ? this.config.title : null; - - if (this.name === "" && name.toLowerCase().includes("grunt")) { + const evilTeamTitles = ["grunt", "admin", "sage"]; + 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, "_")}`); console.log("Localized grunt name: " + title); diff --git a/src/locales/de/dialogue.ts b/src/locales/de/dialogue.ts index 02c497b3182..6227c2d149d 100644 --- a/src/locales/de/dialogue.ts +++ b/src/locales/de/dialogue.ts @@ -378,6 +378,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Das war mal wieder ein Schuss in den Ofen!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "firebreather": { "encounter": { 1: "Meine Flammen werden dich verschlingen!", @@ -410,6 +422,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!", @@ -418,6 +442,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…", }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!" @@ -426,6 +462,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Zyrus wird uns für diese Niederlage bestrafen…" }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!" @@ -434,6 +482,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar! @@ -443,6 +503,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Stil ist wohl doch nicht alles…" }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: `Ich bin beeindruckt, du hast es bis hierher geschafft! diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 1390bf410ae..72776c40e88 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Rüpel von Team Rocket", "rocket_grunt_female": "Rüpel von Team Rocket", "rocket_grunts": "Rüpel von Team Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Rüpel von Team Magma", "magma_grunt_female": "Rüpel von Team Magma", "magma_grunts": "Rüpel von Team Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Rüpel von Team Aqua", "aqua_grunt_female": "Rüpel von Team Aqua", "aqua_grunts": "Rüpel von Team Aqua", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Rüpel von Team Galaktik", "galactic_grunt_female": "Rüpel von Team Galaktik", "galactic_grunts": "Rüpel von Team Galaktik", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Rüpel von Team Plasma", "plasma_grunt_female": "Rüpel von Team Plasma", "plasma_grunts": "Rüpel von Team Plasma", + "plasma_sage": "Plasma Sage", "flare_grunt": "Rüpel von Team Flare", "flare_grunt_female": "Rüpel von Team Flare", "flare_grunts": "Rüpel von Team Flare", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index dda8891b788..44693c38aa1 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 8e0394e0786..00367865d14 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Rocket Grunt", "rocket_grunts": "Rocket Grunts", "rocket_grunt_female": "Rocket Grunt", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Magma Grunt", "magma_grunt_female": "Magma Grunt", "magma_grunts": "Magma Grunts", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Aqua Grunt", "aqua_grunt_female": "Aqua Grunt", "aqua_grunts": "Aqua Grunts", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Galactic Grunt", "galactic_grunt_female": "Galactic Grunt", "galactic_grunts": "Galactic Grunts", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Plasma Grunt", "plasma_grunt_female": "Plasma Grunt", "plasma_grunts": "Plasma Grunts", + "plasma_sage": "Plasma Sage", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", "flare_grunts": "Flare Grunts", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index 133cce0785c..f881fc04f94 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -121,21 +121,31 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Rocket Grunt", "rocket_grunts": "Rocket Grunts", "rocket_grunt_female": "Rocket Grunt", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Magma Grunt", "magma_grunt_female": "Magma Grunt", "magma_grunts": "Magma Grunts", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Aqua Grunt", "aqua_grunt_female": "Aqua Grunt", "aqua_grunts": "Aqua Grunts", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Galactic Grunt", "galactic_grunt_female": "Galactic Grunt", "galactic_grunts": "Galactic Grunts", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Plasma Grunt", "plasma_grunt_female": "Plasma Grunt", "plasma_grunts": "Plasma Grunts", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", "flare_grunts": "Flare Grunts", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index d3ec5f85d5d..ac68aa6413b 100644 --- a/src/locales/fr/dialogue.ts +++ b/src/locales/fr/dialogue.ts @@ -2898,6 +2898,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" @@ -2906,6 +2918,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Je…?\nJ’ai perdu ?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" @@ -2914,6 +2938,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Comment ça ?" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Ne te mets pas en travers de la Team Galaxie !" @@ -2922,6 +2958,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Désactivation…" }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" @@ -2930,6 +2978,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa !" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Le style et le bon gout, il n’y a que ça qui compte !" @@ -2938,6 +2998,18 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "Mon futur me semble guère radieux." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index 263c1f6792a..98bf8cdd2fb 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Sbire de la Team Rocket", "rocket_grunt_female": "Sbire de la Team Rocket", "rocket_grunts": "Sbires de la Team Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Sbire de la Team Magma", "magma_grunt_female": "Sbire de la Team Magma", "magma_grunts": "Sbires de la Team Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Sbire de la Team Aqua", "aqua_grunt_female": "Sbire de la Team Aqua", "aqua_grunts": "Sbires de la Team Aqua", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Sbire de la Team Galaxie", "galactic_grunt_female": "Sbire de la Team Galaxie", "galactic_grunts": "Sbires de la Team Galaxie", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Sbire de la Team Plasma", "plasma_grunt_female": "Sbire de la Team Plasma", "plasma_grunts": "Sbires de la Team Plasma", + "plasma_sage": "Plasma Sage", "flare_grunt": "Sbire de la Team Flare", "flare_grunt_female": "Sbire de la Team Flare", "flare_grunts": "Sbires de la Team Flare", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts index 702b550c45a..3861d530c01 100644 --- a/src/locales/it/dialogue.ts +++ b/src/locales/it/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 260e44bdca8..dde79d694ca 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -120,23 +120,33 @@ export const trainerClasses: SimpleTranslationEntries = { "workers": "Lavoratori", "youngster": "Bullo", "rocket_grunt": "Recluta Team Rocket", - "rocket_grunts": "Reclute Team Rocket", "rocket_grunt_female": "Recluta Team Rocket", + "rocket_grunts": "Reclute Team Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Recluta Team Magma", "magma_grunt_female": "Recluta Team Magma", "magma_grunts": "Reclute Team Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Recluta Team Idro", "aqua_grunt_female": "Recluta Team Idro", "aqua_grunts": "Recluta Team Idro", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Recluta Team Galassia", "galactic_grunt_female": "Recluta Team Galassia", "galactic_grunts": "Reclute Team Galassia", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Seguace Plasma", "plasma_grunt_female": "Seguace Plasma", "plasma_grunts": "Seguaci Plasma", "flare_grunt": "Recluta Team Flare", "flare_grunt_female": "Recluta Team Flare", "flare_grunts": "Reclute Team Flare", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index 719b738778d..8e7f09ff373 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "로켓단은 다시 떠오를 거니까!" }, }, + "rocket_admin": { + "encounter": { + 1: "어라 어라… 결국 여기까지 오셨습니까? 꽤 우수한 트레이너인가 보군요.", + 2: "영웅 놀이는 여기까지랍니다, 꼬마야.", + 3: "어른이 화를 내면 무섭다는 걸 보여 드리죠!" + }, + "victory": { + 1: "크으… 비주기님 용서해 주세요…!", + 2: "어떻게 이런 일이…", + 3: "아아… 넌 너무 강하다…" + }, + }, "magma_grunt": { "encounter": { 1: " 마그마단을 방해한다면, 자비는 없닷!" @@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "하? 내가 졌어?!" }, }, + "magma_admin": { + "encounter": { + 1: "……아하… ……역시 왔네…그치만 안타깝게 됐어……다 끝났거든", + 2: "……남은……내 일은……너를……막는 것", + 3: "……너랑……인게이지……하고 싶어……아하하하" + }, + "victory": { + 1: "……룰루리", + 2: "……재밌쪄", + 3: "…하아하아……으…하아하아…" + }, + }, "aqua_grunt": { "encounter": { 1: "아쿠아단을 넘본 사람에게는 자비는 없다, 꼬마도 마찬가지야!" @@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "말도 안돼!" }, }, + "aqua_admin": { + "encounter": { + 1: "각오하는 게 좋을 거야! 네 얼굴이 눈물로 범벅이 되게 해주겠어!", + 2: "아앙? 뭐야? 이 건방진 꼬맹이는…", + 3: "…아니 넌!? 일부러 여기까지 쫓아온 거야?" + }, + "victory": { + 1: "하아… 하아…완전 지쳤어", + 2: "크윽…!? 너무 봐줬나…!", + 3: "뭐…뭐라고!?" + }, + }, "galactic_grunt": { "encounter": { 1: "갤럭시단을 방해하지 마!" @@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "사격 중지…… " }, }, + "galactic_admin": { + "encounter": { + 1: "나는 갤럭시단에 있는 간부 중의 한 명.", + 2: "갤럭시단을 방해한다면 일말의 가능성도 모두 제거한다!!", + 3: "왜 그래? 설마 떨고 있는 거야?" + }, + "victory": { + 1: "설마! 내가 졌다고!? 건방진 아이로구나!!", + 2: "…역시 강해!", + 3: "어린아이에게 지다니… 방심이란 무섭구나." + }, + }, "plasma_grunt": { "encounter": { 1: "다른 생각을 가진사람들은 용납하지 않겠다!" @@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "플라-스마-!" }, }, + "plasma_sage": { + "encounter": { + 1: "너는 플라스마단에게 있어 불안요소가 될 것이다. 여기서 제거하겠다!", + 2: "이런 이런… 내가 싸워야만 하다니.", + 3: "여기까지 오다니 대단한 트레이너군." + }, + "victory": { + 1: "게치스…", + 2: "그건 그렇고 춥구먼. 나는 떨고 있다. 괴롭지만 살아 있다.", + 3: "흐음. 의외로 똑똑한 트레이너군." + }, + }, "flare_grunt": { "encounter": { 1: "패션이 우리한텐 가장 중요하다고!" @@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "미래가 밝아 보이질 않네." }, }, + "flare_admin": { + "encounter": { + 1: "왔다! 왔구나! 자! 자! 아직 끝나지 않았다!", + 2: "너 강하구나. 에너지를 얼마나 갖고 있지?", + 3: "기다리고 있었어! 너를 조사하겠다. 자 시작한다!" + }, + "victory": { + 1: "강하구나, 너는. 응, 정말 강해, 너는.", + 2: "그렇지만 보스의 꿈이 이루어져 아름다운 세상이 태어날 것이다!", + 3: "굉장하구나 너! 아주 굉장해! 나는 너를 인정하겠다" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "그래서! 여기까지 오다니, 감탄이 절로 나오는군!" diff --git a/src/locales/ko/trainers.ts b/src/locales/ko/trainers.ts index aafe4121442..3a139026448 100644 --- a/src/locales/ko/trainers.ts +++ b/src/locales/ko/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "로켓단 조무래기", "rocket_grunt_female": "로켓단 조무래기", "rocket_grunts": "로켓단 조무래기들", + "rocket_admin": "로켓단 간부", + "rocket_admin_female": "로켓단 간부", "magma_grunt": "마그마단 조무래기", "magma_grunt_female": "마그마단 조무래기", "magma_grunts": "마그마단 조무래기들", + "magma_admin": "마그마단 간부", + "magma_admin_female": "마그마단 간부", "aqua_grunt": "아쿠아단 조무래기", "aqua_grunt_female": "아쿠아단 조무래기", "aqua_grunts": "아쿠아단 조무래기들", + "aqua_admin": "아쿠아단 간부", + "aqua_admin_female": "아쿠아단 간부", "galactic_grunt": "갤럭시단 조무래기", "galactic_grunt_female": "갤럭시단 조무래기", "galactic_grunts": "갤럭시단 조무래기들", + "galactic_admin": "갤럭시단 간부", + "galactic_admin_female": "갤럭시단 간부", "plasma_grunt": "플라스마단 조무래기", "plasma_grunt_female": "플라스마단 조무래기", "plasma_grunts": "플라스마단 조무래기들", + "plasma_sage": "플라스마단 현인", "flare_grunt": "플레어단 조무래기", "flare_grunt_female": "플레어단 조무래기", "flare_grunts": "플레어단 조무래기들", + "flare_admin": "플레어단 간부", + "flare_admin_female": "플레어단 간부", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 61a0be25005..32cc46300d5 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Recruta da Equipe Rocket", "rocket_grunt_female": "Recruta da Equipe Rocket", "rocket_grunts": "Recrutas da Equipe Rocket", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "Recruta da Equipe Magma", "magma_grunt_female": "Recruta da Equipe Magma", "magma_grunts": "Recrutas da Equipe Magma", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "Recruta da Equipe Aqua", "aqua_grunt_female": "Recruta da Equipe Aqua", "aqua_grunts": "Recrutas da Equipe Aqua", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "Recruta da Equipe Galáctica", "galactic_grunt_female": "Recruta da Equipe Galáctica", "galactic_grunts": "Recrutas da Equipe Galáctica", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "Recruta da Equipe Plasma", "plasma_grunt_female": "Recruta da Equipe Plasma", "plasma_grunts": "Recrutas da Equipe Plasma", + "plasma_sage": "Plasma Sage", "flare_grunt": "Recruta da Equipe Flare", "flare_grunt_female": "Recruta da Equipe Flare", "flare_grunts": "Recrutas da Equipe Flare", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index 6afbcd71064..50d6c5f4333 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "好讨厌的感觉啊!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" @@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "哈?我输了?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" @@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "你在开玩笑吧?" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "别惹银河队!" @@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "停机了…" }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "异端不共戴天!" @@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "等离子子子子子子!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "时尚最重要!" @@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "未来一片黑暗啊…" }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "我不得不说,能来到这里,你的确很不简单!" diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index e06f2afe2ec..1d32fdf6e02 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "火箭队手下", "rocket_grunt_female": "火箭队手下", "rocket_grunts": "火箭队手下们", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "熔岩队手下", "magma_grunt_female": "熔岩队手下", "magma_grunts": "熔岩队手下们", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "海洋队手下", "aqua_grunt_female": "海洋队手下", "aqua_grunts": "海洋队手下们", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "银河队手下", "galactic_grunt_female": "银河队手下", "galactic_grunts": "银河队手下们", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "等离子队手下", "plasma_grunt_female": "等离子队手下", "plasma_grunts": "等离子队手下们", + "plasma_sage": "Plasma Sage", "flare_grunt": "闪焰队手下", "flare_grunt_female": "闪焰队手下", "flare_grunts": "闪焰队手下们", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/zh_TW/dialogue.ts b/src/locales/zh_TW/dialogue.ts index 0823236bc84..530906eda5b 100644 --- a/src/locales/zh_TW/dialogue.ts +++ b/src/locales/zh_TW/dialogue.ts @@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Team Rocket blasting off again!" }, }, + "rocket_admin": { + "encounter": { + 1: "Oh? You managed to get this far? You must be quite the trainer.", + 2: "That's quite enough of you playing hero, kid.", + 3: "I'll show you how scary an angry adult can be!" + }, + "victory": { + 1: "No! Forgive me Giovanni!", + 2: "How could this be?", + 3: "Urgh... You were too strong..." + }, + }, "magma_grunt": { "encounter": { 1: " If you get in the way of Team Magma, don’t expect any mercy!" @@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Huh? I lost?!" }, }, + "magma_admin": { + "encounter": { + 1: "Hehehe! So you've come all the way here! But you're too late!", + 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", + 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + }, + "victory": { + 1: "Hehehe... So I lost...", + 2: "You're disgustingly strong!", + 3: "Ahahaha! Ouch!" + }, + }, "aqua_grunt": { "encounter": { 1: "No one who crosses Team Aqua gets any mercy, not even kids!" @@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You're kidding me!" }, }, + "aqua_admin": { + "encounter": { + 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", + 2: "Hahn? What's this? Who's this spoiled brat?", + 3: "What are you doing here? Did you follow us?" + }, + "victory": { + 1: "So I lost too...", + 2: "Ahhh?! Did I go too easy on you?!", + 3: "Wh-what was that?" + }, + }, "galactic_grunt": { "encounter": { 1: "Don't mess with Team Galactic!" @@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Shut down..." }, }, + "galactic_admin": { + "encounter": { + 1: "I'm one of Team Galactic's Commanders.", + 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", + 3: "What's the matter? Don't tell me you're shaking?" + }, + "victory": { + 1: "This can't be?! I lost?! You... you uppity brat!", + 2: "You, my friend, are tough!", + 3: "Losing to some child... Being careless cost me too much." + }, + }, "plasma_grunt": { "encounter": { 1: "We won't tolerate people who have different ideas!" @@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Plasmaaaaaaaaa!" }, }, + "plasma_sage": { + "encounter": { + 1: "You could become a threat to Team Plasma, so we will eliminate you here!", + 2: "Oh, for crying out loud... I didn't expect to have to fight!", + 3: "You're an impressive Trainer to have made it this far." + }, + "victory": { + 1: "Ghetsis...", + 2: "It's bitter cold. I'm shivering. I'm suffering.", + 3: "Hmph. You're a smarter Trainer than I expected." + }, + }, "flare_grunt": { "encounter": { 1: "Fashion is most important to us!" @@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "The future doesn't look bright for me." }, }, + "flare_admin": { + "encounter": { + 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", + 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", + 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + }, + "victory": { + 1: "You're quite strong. Oh yes-very strong, indeed.", + 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", + 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + }, + }, "rocket_boss_giovanni_1": { "encounter": { 1: "So! I must say, I am impressed you got here!" diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 2a6c3eac662..0efae11bbea 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -120,21 +120,32 @@ export const trainerClasses: SimpleTranslationEntries = { "workers": "工人組合", "youngster": "短褲小子", "rocket_grunts": "火箭队手下們", + "rocket_admin": "Rocket Admin", + "rocket_admin_female": "Rocket Admin", "magma_grunt": "熔岩队手下", "magma_grunt_female": "熔岩队手下", "magma_grunts": "熔岩队手下們", + "magma_admin": "Magma Admin", + "magma_admin_female": "Magma Admin", "aqua_grunt": "海洋队手下", "aqua_grunt_female": "海洋队手下", "aqua_grunts": "海洋队手下們", + "aqua_admin": "Aqua Admin", + "aqua_admin_female": "Aqua Admin", "galactic_grunt": "银河队手下", "galactic_grunt_female": "银河队手下", "galactic_grunts": "银河队手下們", + "galactic_admin": "Galactic Admin", + "galactic_admin_female": "Galactic Admin", "plasma_grunt": "等离子队手下", "plasma_grunt_female": "等离子队手下", "plasma_grunts": "等离子队手下們", + "plasma_sage": "Plasma Sage", "flare_grunt": "闪焰队手下", "flare_grunt_female": "闪焰队手下", "flare_grunts": "闪焰队手下們", + "flare_admin": "Flare Admin", + "flare_admin_female": "Flare Admin", } as const; // Names of special trainers like gym leaders, elite four, and the champion From 10aa85e9db71f477ebf38dc0babc51a6d60e625e Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:04:57 -0700 Subject: [PATCH 141/321] Fix name of files for Aqua Admin (M) (#3323) --- .../trainer/{aqua_admin.json => aqua_admin_m.json} | 2 +- .../trainer/{aqua_admin.png => aqua_admin_m.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename public/images/trainer/{aqua_admin.json => aqua_admin_m.json} (95%) rename public/images/trainer/{aqua_admin.png => aqua_admin_m.png} (100%) diff --git a/public/images/trainer/aqua_admin.json b/public/images/trainer/aqua_admin_m.json similarity index 95% rename from public/images/trainer/aqua_admin.json rename to public/images/trainer/aqua_admin_m.json index 507fe556ef1..f52412623cc 100644 --- a/public/images/trainer/aqua_admin.json +++ b/public/images/trainer/aqua_admin_m.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "aqua_admin.png", + "image": "aqua_admin_m.png", "format": "RGBA8888", "size": { "w": 80, diff --git a/public/images/trainer/aqua_admin.png b/public/images/trainer/aqua_admin_m.png similarity index 100% rename from public/images/trainer/aqua_admin.png rename to public/images/trainer/aqua_admin_m.png From 42d00e208e3a88de453361fdf5516bb477480a64 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Sun, 4 Aug 2024 04:09:06 +0100 Subject: [PATCH 142/321] Revert "[Bug] fixed switch out bug when fainted single -> double (#3288)" (#3330) This reverts commit 89d38a3b6bae56d8e4e86a29ddad33908a9b3b56. --- src/phases.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index 14c8e53aa73..7e2d8058aef 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -4462,10 +4462,9 @@ export class SwitchPhase extends BattlePhase { start() { super.start(); - const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()); // Skip modal switch if impossible - if (this.isModal && (!availablePartyMembers.filter(p => !p.isActive(true)).length || (!this.scene.currentBattle.started && availablePartyMembers.length === 1))) { + if (this.isModal && !this.scene.getParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { return super.end(); } @@ -4475,7 +4474,7 @@ export class SwitchPhase extends BattlePhase { } // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once - const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || availablePartyMembers.length > 1 ? this.fieldIndex : 0; + const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? this.fieldIndex : 0; this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { From fdcf21592b82fca783aaa0a42cde061736fab027 Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 3 Aug 2024 23:09:35 -0400 Subject: [PATCH 143/321] Update pokemon-species.ts (#3329) --- src/data/pokemon-species.ts | 502 ++++++++++++++++++------------------ 1 file changed, 251 insertions(+), 251 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 1a16cdd41b9..c65007a6580 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2682,71 +2682,71 @@ export const speciesStarters = { [Species.BULBASAUR]: 3, [Species.CHARMANDER]: 3, [Species.SQUIRTLE]: 3, - [Species.CATERPIE]: 1, + [Species.CATERPIE]: 2, [Species.WEEDLE]: 1, - [Species.PIDGEY]: 2, + [Species.PIDGEY]: 1, [Species.RATTATA]: 1, - [Species.SPEAROW]: 2, + [Species.SPEAROW]: 1, [Species.EKANS]: 2, - [Species.PIKACHU]: 4, + [Species.PIKACHU]: 3, [Species.SANDSHREW]: 2, [Species.NIDORAN_F]: 3, [Species.NIDORAN_M]: 3, - [Species.CLEFAIRY]: 4, + [Species.CLEFAIRY]: 3, [Species.VULPIX]: 3, - [Species.JIGGLYPUFF]: 4, - [Species.ZUBAT]: 2, - [Species.ODDISH]: 2, - [Species.PARAS]: 1, + [Species.JIGGLYPUFF]: 2, + [Species.ZUBAT]: 3, + [Species.ODDISH]: 3, + [Species.PARAS]: 2, [Species.VENONAT]: 2, - [Species.DIGLETT]: 3, - [Species.MEOWTH]: 4, + [Species.DIGLETT]: 2, + [Species.MEOWTH]: 3, [Species.PSYDUCK]: 2, [Species.MANKEY]: 4, [Species.GROWLITHE]: 4, - [Species.POLIWAG]: 3, - [Species.ABRA]: 3, + [Species.POLIWAG]: 2, + [Species.ABRA]: 4, [Species.MACHOP]: 3, - [Species.BELLSPROUT]: 3, + [Species.BELLSPROUT]: 2, [Species.TENTACOOL]: 3, [Species.GEODUDE]: 3, - [Species.PONYTA]: 3, + [Species.PONYTA]: 2, [Species.SLOWPOKE]: 3, - [Species.MAGNEMITE]: 3, - [Species.FARFETCHD]: 4, - [Species.DODUO]: 4, - [Species.SEEL]: 3, - [Species.GRIMER]: 3, - [Species.SHELLDER]: 4, - [Species.GASTLY]: 3, - [Species.ONIX]: 4, - [Species.DROWZEE]: 3, - [Species.KRABBY]: 2, + [Species.MAGNEMITE]: 4, + [Species.FARFETCHD]: 2, + [Species.DODUO]: 3, + [Species.SEEL]: 1, + [Species.GRIMER]: 2, + [Species.SHELLDER]: 5, + [Species.GASTLY]: 4, + [Species.ONIX]: 3, + [Species.DROWZEE]: 2, + [Species.KRABBY]: 3, [Species.VOLTORB]: 2, - [Species.EXEGGCUTE]: 4, + [Species.EXEGGCUTE]: 3, [Species.CUBONE]: 3, - [Species.HITMONLEE]: 5, - [Species.HITMONCHAN]: 5, - [Species.LICKITUNG]: 5, - [Species.KOFFING]: 3, + [Species.HITMONLEE]: 4, + [Species.HITMONCHAN]: 4, + [Species.LICKITUNG]: 3, + [Species.KOFFING]: 2, [Species.RHYHORN]: 3, - [Species.CHANSEY]: 5, + [Species.CHANSEY]: 3, [Species.TANGELA]: 3, - [Species.KANGASKHAN]: 5, - [Species.HORSEA]: 4, - [Species.GOLDEEN]: 3, - [Species.STARYU]: 4, - [Species.MR_MIME]: 4, + [Species.KANGASKHAN]: 4, + [Species.HORSEA]: 3, + [Species.GOLDEEN]: 2, + [Species.STARYU]: 3, + [Species.MR_MIME]: 3, [Species.SCYTHER]: 5, - [Species.JYNX]: 4, - [Species.ELECTABUZZ]: 5, - [Species.MAGMAR]: 5, + [Species.JYNX]: 3, + [Species.ELECTABUZZ]: 4, + [Species.MAGMAR]: 4, [Species.PINSIR]: 4, - [Species.TAUROS]: 5, - [Species.MAGIKARP]: 3, - [Species.LAPRAS]: 5, + [Species.TAUROS]: 4, + [Species.MAGIKARP]: 4, + [Species.LAPRAS]: 4, [Species.DITTO]: 2, - [Species.EEVEE]: 4, + [Species.EEVEE]: 3, [Species.PORYGON]: 4, [Species.OMANYTE]: 3, [Species.KABUTO]: 3, @@ -2759,57 +2759,57 @@ export const speciesStarters = { [Species.MEWTWO]: 8, [Species.MEW]: 6, - [Species.CHIKORITA]: 3, + [Species.CHIKORITA]: 2, [Species.CYNDAQUIL]: 3, [Species.TOTODILE]: 3, [Species.SENTRET]: 1, - [Species.HOOTHOOT]: 1, + [Species.HOOTHOOT]: 2, [Species.LEDYBA]: 1, - [Species.SPINARAK]: 1, - [Species.CHINCHOU]: 3, - [Species.PICHU]: 3, - [Species.CLEFFA]: 3, - [Species.IGGLYBUFF]: 3, + [Species.SPINARAK]: 2, + [Species.CHINCHOU]: 2, + [Species.PICHU]: 2, + [Species.CLEFFA]: 2, + [Species.IGGLYBUFF]: 1, [Species.TOGEPI]: 3, [Species.NATU]: 2, - [Species.MAREEP]: 3, + [Species.MAREEP]: 2, [Species.MARILL]: 4, - [Species.SUDOWOODO]: 5, - [Species.HOPPIP]: 1, - [Species.AIPOM]: 3, + [Species.SUDOWOODO]: 3, + [Species.HOPPIP]: 2, + [Species.AIPOM]: 2, [Species.SUNKERN]: 1, [Species.YANMA]: 3, [Species.WOOPER]: 2, - [Species.MURKROW]: 4, - [Species.MISDREAVUS]: 3, + [Species.MURKROW]: 3, + [Species.MISDREAVUS]: 2, [Species.UNOWN]: 1, - [Species.WOBBUFFET]: 4, - [Species.GIRAFARIG]: 4, + [Species.WOBBUFFET]: 2, + [Species.GIRAFARIG]: 3, [Species.PINECO]: 2, - [Species.DUNSPARCE]: 4, - [Species.GLIGAR]: 4, - [Species.SNUBBULL]: 3, + [Species.DUNSPARCE]: 3, + [Species.GLIGAR]: 3, + [Species.SNUBBULL]: 2, [Species.QWILFISH]: 3, - [Species.SHUCKLE]: 4, + [Species.SHUCKLE]: 3, [Species.HERACROSS]: 5, [Species.SNEASEL]: 4, [Species.TEDDIURSA]: 4, [Species.SLUGMA]: 2, [Species.SWINUB]: 3, - [Species.CORSOLA]: 3, - [Species.REMORAID]: 3, - [Species.DELIBIRD]: 3, - [Species.MANTINE]: 4, - [Species.SKARMORY]: 5, - [Species.HOUNDOUR]: 4, + [Species.CORSOLA]: 2, + [Species.REMORAID]: 2, + [Species.DELIBIRD]: 2, + [Species.MANTINE]: 3, + [Species.SKARMORY]: 4, + [Species.HOUNDOUR]: 3, [Species.PHANPY]: 3, - [Species.STANTLER]: 4, - [Species.SMEARGLE]: 3, - [Species.TYROGUE]: 4, - [Species.SMOOCHUM]: 3, - [Species.ELEKID]: 4, - [Species.MAGBY]: 4, - [Species.MILTANK]: 5, + [Species.STANTLER]: 3, + [Species.SMEARGLE]: 1, + [Species.TYROGUE]: 2, + [Species.SMOOCHUM]: 2, + [Species.ELEKID]: 3, + [Species.MAGBY]: 3, + [Species.MILTANK]: 4, [Species.RAIKOU]: 6, [Species.ENTEI]: 6, [Species.SUICUNE]: 6, @@ -2825,62 +2825,62 @@ export const speciesStarters = { [Species.ZIGZAGOON]: 2, [Species.WURMPLE]: 1, [Species.LOTAD]: 3, - [Species.SEEDOT]: 3, + [Species.SEEDOT]: 2, [Species.TAILLOW]: 3, - [Species.WINGULL]: 3, + [Species.WINGULL]: 2, [Species.RALTS]: 3, [Species.SURSKIT]: 2, [Species.SHROOMISH]: 3, [Species.SLAKOTH]: 4, [Species.NINCADA]: 4, - [Species.WHISMUR]: 3, + [Species.WHISMUR]: 2, [Species.MAKUHITA]: 3, - [Species.AZURILL]: 3, - [Species.NOSEPASS]: 3, - [Species.SKITTY]: 3, - [Species.SABLEYE]: 3, - [Species.MAWILE]: 5, + [Species.AZURILL]: 4, + [Species.NOSEPASS]: 2, + [Species.SKITTY]: 1, + [Species.SABLEYE]: 2, + [Species.MAWILE]: 3, [Species.ARON]: 3, - [Species.MEDITITE]: 4, - [Species.ELECTRIKE]: 3, + [Species.MEDITITE]: 3, + [Species.ELECTRIKE]: 2, [Species.PLUSLE]: 2, [Species.MINUN]: 2, [Species.VOLBEAT]: 2, [Species.ILLUMISE]: 2, - [Species.ROSELIA]: 4, - [Species.GULPIN]: 3, + [Species.ROSELIA]: 3, + [Species.GULPIN]: 1, [Species.CARVANHA]: 3, - [Species.WAILMER]: 3, - [Species.NUMEL]: 3, - [Species.TORKOAL]: 4, - [Species.SPOINK]: 3, - [Species.SPINDA]: 2, - [Species.TRAPINCH]: 4, - [Species.CACNEA]: 3, - [Species.SWABLU]: 3, - [Species.ZANGOOSE]: 5, - [Species.SEVIPER]: 4, - [Species.LUNATONE]: 4, - [Species.SOLROCK]: 4, - [Species.BARBOACH]: 3, + [Species.WAILMER]: 2, + [Species.NUMEL]: 2, + [Species.TORKOAL]: 3, + [Species.SPOINK]: 2, + [Species.SPINDA]: 1, + [Species.TRAPINCH]: 3, + [Species.CACNEA]: 2, + [Species.SWABLU]: 2, + [Species.ZANGOOSE]: 4, + [Species.SEVIPER]: 3, + [Species.LUNATONE]: 3, + [Species.SOLROCK]: 3, + [Species.BARBOACH]: 2, [Species.CORPHISH]: 3, - [Species.BALTOY]: 3, + [Species.BALTOY]: 2, [Species.LILEEP]: 3, [Species.ANORITH]: 3, [Species.FEEBAS]: 4, - [Species.CASTFORM]: 2, - [Species.KECLEON]: 4, - [Species.SHUPPET]: 3, + [Species.CASTFORM]: 1, + [Species.KECLEON]: 2, + [Species.SHUPPET]: 2, [Species.DUSKULL]: 3, - [Species.TROPIUS]: 5, - [Species.CHIMECHO]: 4, - [Species.ABSOL]: 5, - [Species.WYNAUT]: 3, - [Species.SNORUNT]: 3, - [Species.SPHEAL]: 3, + [Species.TROPIUS]: 3, + [Species.CHIMECHO]: 3, + [Species.ABSOL]: 4, + [Species.WYNAUT]: 2, + [Species.SNORUNT]: 2, + [Species.SPHEAL]: 2, [Species.CLAMPERL]: 3, - [Species.RELICANTH]: 4, - [Species.LUVDISC]: 2, + [Species.RELICANTH]: 3, + [Species.LUVDISC]: 1, [Species.BAGON]: 4, [Species.BELDUM]: 4, [Species.REGIROCK]: 6, @@ -2898,39 +2898,39 @@ export const speciesStarters = { [Species.CHIMCHAR]: 3, [Species.PIPLUP]: 3, [Species.STARLY]: 3, - [Species.BIDOOF]: 2, + [Species.BIDOOF]: 3, [Species.KRICKETOT]: 1, - [Species.SHINX]: 3, + [Species.SHINX]: 2, [Species.BUDEW]: 3, [Species.CRANIDOS]: 3, [Species.SHIELDON]: 3, - [Species.BURMY]: 1, + [Species.BURMY]: 2, [Species.COMBEE]: 2, - [Species.PACHIRISU]: 3, - [Species.BUIZEL]: 3, - [Species.CHERUBI]: 3, + [Species.PACHIRISU]: 2, + [Species.BUIZEL]: 2, + [Species.CHERUBI]: 1, [Species.SHELLOS]: 3, - [Species.DRIFLOON]: 3, - [Species.BUNEARY]: 3, - [Species.GLAMEOW]: 3, - [Species.CHINGLING]: 3, - [Species.STUNKY]: 3, + [Species.DRIFLOON]: 2, + [Species.BUNEARY]: 2, + [Species.GLAMEOW]: 2, + [Species.CHINGLING]: 2, + [Species.STUNKY]: 2, [Species.BRONZOR]: 3, - [Species.BONSLY]: 4, - [Species.MIME_JR]: 3, - [Species.HAPPINY]: 4, - [Species.CHATOT]: 4, - [Species.SPIRITOMB]: 5, + [Species.BONSLY]: 2, + [Species.MIME_JR]: 2, + [Species.HAPPINY]: 2, + [Species.CHATOT]: 2, + [Species.SPIRITOMB]: 4, [Species.GIBLE]: 4, [Species.MUNCHLAX]: 4, - [Species.RIOLU]: 4, + [Species.RIOLU]: 3, [Species.HIPPOPOTAS]: 3, [Species.SKORUPI]: 3, - [Species.CROAGUNK]: 3, - [Species.CARNIVINE]: 4, - [Species.FINNEON]: 3, - [Species.MANTYKE]: 3, - [Species.SNOVER]: 3, + [Species.CROAGUNK]: 2, + [Species.CARNIVINE]: 2, + [Species.FINNEON]: 1, + [Species.MANTYKE]: 2, + [Species.SNOVER]: 2, [Species.ROTOM]: 5, [Species.UXIE]: 6, [Species.MESPRIT]: 6, @@ -2951,70 +2951,70 @@ export const speciesStarters = { [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, - [Species.PATRAT]: 2, + [Species.PATRAT]: 1, [Species.LILLIPUP]: 3, - [Species.PURRLOIN]: 3, - [Species.PANSAGE]: 3, - [Species.PANSEAR]: 3, - [Species.PANPOUR]: 3, - [Species.MUNNA]: 3, - [Species.PIDOVE]: 2, - [Species.BLITZLE]: 3, + [Species.PURRLOIN]: 2, + [Species.PANSAGE]: 2, + [Species.PANSEAR]: 2, + [Species.PANPOUR]: 2, + [Species.MUNNA]: 2, + [Species.PIDOVE]: 1, + [Species.BLITZLE]: 2, [Species.ROGGENROLA]: 3, [Species.WOOBAT]: 3, [Species.DRILBUR]: 4, - [Species.AUDINO]: 4, - [Species.TIMBURR]: 3, + [Species.AUDINO]: 3, + [Species.TIMBURR]: 4, [Species.TYMPOLE]: 3, - [Species.THROH]: 5, - [Species.SAWK]: 5, - [Species.SEWADDLE]: 3, + [Species.THROH]: 4, + [Species.SAWK]: 4, + [Species.SEWADDLE]: 2, [Species.VENIPEDE]: 3, [Species.COTTONEE]: 3, [Species.PETILIL]: 3, [Species.BASCULIN]: 4, - [Species.SANDILE]: 3, + [Species.SANDILE]: 4, [Species.DARUMAKA]: 4, - [Species.MARACTUS]: 4, - [Species.DWEBBLE]: 3, + [Species.MARACTUS]: 2, + [Species.DWEBBLE]: 2, [Species.SCRAGGY]: 3, - [Species.SIGILYPH]: 5, + [Species.SIGILYPH]: 4, [Species.YAMASK]: 3, - [Species.TIRTOUGA]: 4, - [Species.ARCHEN]: 4, - [Species.TRUBBISH]: 3, + [Species.TIRTOUGA]: 3, + [Species.ARCHEN]: 3, + [Species.TRUBBISH]: 2, [Species.ZORUA]: 3, [Species.MINCCINO]: 3, [Species.GOTHITA]: 3, - [Species.SOLOSIS]: 3, - [Species.DUCKLETT]: 3, + [Species.SOLOSIS]: 4, + [Species.DUCKLETT]: 2, [Species.VANILLITE]: 3, - [Species.DEERLING]: 3, - [Species.EMOLGA]: 3, + [Species.DEERLING]: 2, + [Species.EMOLGA]: 2, [Species.KARRABLAST]: 3, - [Species.FOONGUS]: 3, + [Species.FOONGUS]: 2, [Species.FRILLISH]: 3, [Species.ALOMOMOLA]: 4, [Species.JOLTIK]: 3, [Species.FERROSEED]: 3, [Species.KLINK]: 3, - [Species.TYNAMO]: 3, + [Species.TYNAMO]: 2, [Species.ELGYEM]: 3, [Species.LITWICK]: 3, [Species.AXEW]: 4, - [Species.CUBCHOO]: 3, - [Species.CRYOGONAL]: 5, - [Species.SHELMET]: 3, - [Species.STUNFISK]: 4, + [Species.CUBCHOO]: 2, + [Species.CRYOGONAL]: 4, + [Species.SHELMET]: 2, + [Species.STUNFISK]: 3, [Species.MIENFOO]: 3, - [Species.DRUDDIGON]: 5, + [Species.DRUDDIGON]: 4, [Species.GOLETT]: 3, [Species.PAWNIARD]: 4, - [Species.BOUFFALANT]: 5, + [Species.BOUFFALANT]: 4, [Species.RUFFLET]: 3, [Species.VULLABY]: 3, - [Species.HEATMOR]: 5, - [Species.DURANT]: 5, + [Species.HEATMOR]: 3, + [Species.DURANT]: 4, [Species.DEINO]: 4, [Species.LARVESTA]: 4, [Species.COBALION]: 6, @@ -3032,77 +3032,77 @@ export const speciesStarters = { [Species.CHESPIN]: 3, [Species.FENNEKIN]: 3, - [Species.FROAKIE]: 3, - [Species.BUNNELBY]: 2, + [Species.FROAKIE]: 4, + [Species.BUNNELBY]: 3, [Species.FLETCHLING]: 3, - [Species.SCATTERBUG]: 1, - [Species.LITLEO]: 3, + [Species.SCATTERBUG]: 2, + [Species.LITLEO]: 2, [Species.FLABEBE]: 3, - [Species.SKIDDO]: 3, + [Species.SKIDDO]: 2, [Species.PANCHAM]: 3, - [Species.FURFROU]: 4, - [Species.ESPURR]: 3, + [Species.FURFROU]: 3, + [Species.ESPURR]: 2, [Species.HONEDGE]: 4, - [Species.SPRITZEE]: 3, + [Species.SPRITZEE]: 2, [Species.SWIRLIX]: 3, [Species.INKAY]: 3, [Species.BINACLE]: 3, - [Species.SKRELP]: 3, + [Species.SKRELP]: 2, [Species.CLAUNCHER]: 3, [Species.HELIOPTILE]: 3, [Species.TYRUNT]: 3, [Species.AMAURA]: 3, [Species.HAWLUCHA]: 4, - [Species.DEDENNE]: 4, - [Species.CARBINK]: 4, + [Species.DEDENNE]: 2, + [Species.CARBINK]: 2, [Species.GOOMY]: 4, - [Species.KLEFKI]: 4, - [Species.PHANTUMP]: 3, - [Species.PUMPKABOO]: 3, + [Species.KLEFKI]: 3, + [Species.PHANTUMP]: 2, + [Species.PUMPKABOO]: 2, [Species.BERGMITE]: 3, - [Species.NOIBAT]: 4, + [Species.NOIBAT]: 3, [Species.XERNEAS]: 8, [Species.YVELTAL]: 8, [Species.ZYGARDE]: 8, [Species.DIANCIE]: 7, [Species.HOOPA]: 7, [Species.VOLCANION]: 6, - [Species.ETERNAL_FLOETTE]: 5, + [Species.ETERNAL_FLOETTE]: 4, [Species.ROWLET]: 3, [Species.LITTEN]: 3, - [Species.POPPLIO]: 3, - [Species.PIKIPEK]: 3, + [Species.POPPLIO]: 4, + [Species.PIKIPEK]: 2, [Species.YUNGOOS]: 2, - [Species.GRUBBIN]: 2, - [Species.CRABRAWLER]: 4, + [Species.GRUBBIN]: 3, + [Species.CRABRAWLER]: 3, [Species.ORICORIO]: 3, [Species.CUTIEFLY]: 3, [Species.ROCKRUFF]: 3, - [Species.WISHIWASHI]: 3, - [Species.MAREANIE]: 3, + [Species.WISHIWASHI]: 2, + [Species.MAREANIE]: 2, [Species.MUDBRAY]: 3, [Species.DEWPIDER]: 3, - [Species.FOMANTIS]: 3, - [Species.MORELULL]: 3, + [Species.FOMANTIS]: 2, + [Species.MORELULL]: 2, [Species.SALANDIT]: 3, [Species.STUFFUL]: 3, [Species.BOUNSWEET]: 3, [Species.COMFEY]: 4, - [Species.ORANGURU]: 5, - [Species.PASSIMIAN]: 5, + [Species.ORANGURU]: 4, + [Species.PASSIMIAN]: 4, [Species.WIMPOD]: 3, [Species.SANDYGAST]: 3, - [Species.PYUKUMUKU]: 3, + [Species.PYUKUMUKU]: 2, [Species.TYPE_NULL]: 5, - [Species.MINIOR]: 5, - [Species.KOMALA]: 5, - [Species.TURTONATOR]: 5, - [Species.TOGEDEMARU]: 4, - [Species.MIMIKYU]: 5, - [Species.BRUXISH]: 5, - [Species.DRAMPA]: 5, - [Species.DHELMISE]: 5, + [Species.MINIOR]: 4, + [Species.KOMALA]: 3, + [Species.TURTONATOR]: 4, + [Species.TOGEDEMARU]: 3, + [Species.MIMIKYU]: 4, + [Species.BRUXISH]: 4, + [Species.DRAMPA]: 4, + [Species.DHELMISE]: 4, [Species.JANGMO_O]: 4, [Species.TAPU_KOKO]: 6, [Species.TAPU_LELE]: 6, @@ -3124,49 +3124,49 @@ export const speciesStarters = { [Species.BLACEPHALON]: 7, [Species.ZERAORA]: 6, [Species.MELTAN]: 6, - [Species.ALOLA_RATTATA]: 2, - [Species.ALOLA_SANDSHREW]: 4, - [Species.ALOLA_VULPIX]: 4, - [Species.ALOLA_DIGLETT]: 3, - [Species.ALOLA_MEOWTH]: 4, + [Species.ALOLA_RATTATA]: 1, + [Species.ALOLA_SANDSHREW]: 2, + [Species.ALOLA_VULPIX]: 3, + [Species.ALOLA_DIGLETT]: 2, + [Species.ALOLA_MEOWTH]: 3, [Species.ALOLA_GEODUDE]: 3, [Species.ALOLA_GRIMER]: 3, - [Species.GROOKEY]: 3, - [Species.SCORBUNNY]: 3, - [Species.SOBBLE]: 3, + [Species.GROOKEY]: 4, + [Species.SCORBUNNY]: 4, + [Species.SOBBLE]: 4, [Species.SKWOVET]: 2, - [Species.ROOKIDEE]: 4, + [Species.ROOKIDEE]: 3, [Species.BLIPBUG]: 2, - [Species.NICKIT]: 3, - [Species.GOSSIFLEUR]: 3, - [Species.WOOLOO]: 3, + [Species.NICKIT]: 1, + [Species.GOSSIFLEUR]: 2, + [Species.WOOLOO]: 2, [Species.CHEWTLE]: 3, - [Species.YAMPER]: 3, + [Species.YAMPER]: 2, [Species.ROLYCOLY]: 3, - [Species.APPLIN]: 4, + [Species.APPLIN]: 3, [Species.SILICOBRA]: 3, [Species.CRAMORANT]: 3, [Species.ARROKUDA]: 3, [Species.TOXEL]: 3, [Species.SIZZLIPEDE]: 3, - [Species.CLOBBOPUS]: 3, + [Species.CLOBBOPUS]: 2, [Species.SINISTEA]: 3, - [Species.HATENNA]: 4, + [Species.HATENNA]: 3, [Species.IMPIDIMP]: 3, [Species.MILCERY]: 3, [Species.FALINKS]: 4, [Species.PINCURCHIN]: 3, [Species.SNOM]: 3, - [Species.STONJOURNER]: 4, - [Species.EISCUE]: 4, - [Species.INDEEDEE]: 3, + [Species.STONJOURNER]: 3, + [Species.EISCUE]: 3, + [Species.INDEEDEE]: 4, [Species.MORPEKO]: 3, - [Species.CUFANT]: 4, + [Species.CUFANT]: 3, [Species.DRACOZOLT]: 5, - [Species.ARCTOZOLT]: 5, + [Species.ARCTOZOLT]: 4, [Species.DRACOVISH]: 5, - [Species.ARCTOVISH]: 5, + [Species.ARCTOVISH]: 4, [Species.DURALUDON]: 5, [Species.DREEPY]: 4, [Species.ZACIAN]: 9, @@ -3179,67 +3179,67 @@ export const speciesStarters = { [Species.GLASTRIER]: 6, [Species.SPECTRIER]: 7, [Species.CALYREX]: 8, - [Species.GALAR_MEOWTH]: 4, - [Species.GALAR_PONYTA]: 4, + [Species.GALAR_MEOWTH]: 3, + [Species.GALAR_PONYTA]: 2, [Species.GALAR_SLOWPOKE]: 3, - [Species.GALAR_FARFETCHD]: 5, - [Species.GALAR_CORSOLA]: 4, + [Species.GALAR_FARFETCHD]: 3, + [Species.GALAR_CORSOLA]: 3, [Species.GALAR_ZIGZAGOON]: 3, [Species.GALAR_DARUMAKA]: 4, [Species.GALAR_YAMASK]: 3, - [Species.GALAR_STUNFISK]: 4, - [Species.GALAR_MR_MIME]: 5, + [Species.GALAR_STUNFISK]: 2, + [Species.GALAR_MR_MIME]: 3, [Species.GALAR_ARTICUNO]: 6, [Species.GALAR_ZAPDOS]: 6, [Species.GALAR_MOLTRES]: 6, [Species.HISUI_GROWLITHE]: 4, [Species.HISUI_VOLTORB]: 3, [Species.HISUI_QWILFISH]: 4, - [Species.HISUI_SNEASEL]: 4, - [Species.HISUI_ZORUA]: 4, + [Species.HISUI_SNEASEL]: 5, + [Species.HISUI_ZORUA]: 3, [Species.ENAMORUS]: 7, - [Species.SPRIGATITO]: 3, - [Species.FUECOCO]: 3, - [Species.QUAXLY]: 3, + [Species.SPRIGATITO]: 4, + [Species.FUECOCO]: 4, + [Species.QUAXLY]: 4, [Species.LECHONK]: 2, [Species.TAROUNTULA]: 1, [Species.NYMBLE]: 3, - [Species.PAWMI]: 3, + [Species.PAWMI]: 4, [Species.TANDEMAUS]: 4, - [Species.FIDOUGH]: 3, + [Species.FIDOUGH]: 2, [Species.SMOLIV]: 3, - [Species.SQUAWKABILLY]: 3, + [Species.SQUAWKABILLY]: 2, [Species.NACLI]: 4, [Species.CHARCADET]: 4, [Species.TADBULB]: 3, [Species.WATTREL]: 3, [Species.MASCHIFF]: 3, - [Species.SHROODLE]: 3, + [Species.SHROODLE]: 2, [Species.BRAMBLIN]: 3, [Species.TOEDSCOOL]: 3, - [Species.KLAWF]: 4, + [Species.KLAWF]: 3, [Species.CAPSAKID]: 3, - [Species.RELLOR]: 3, + [Species.RELLOR]: 2, [Species.FLITTLE]: 3, [Species.TINKATINK]: 4, - [Species.WIGLETT]: 3, + [Species.WIGLETT]: 2, [Species.BOMBIRDIER]: 3, - [Species.FINIZEN]: 4, + [Species.FINIZEN]: 3, [Species.VAROOM]: 4, - [Species.CYCLIZAR]: 5, + [Species.CYCLIZAR]: 4, [Species.ORTHWORM]: 4, [Species.GLIMMET]: 4, - [Species.GREAVARD]: 4, + [Species.GREAVARD]: 3, [Species.FLAMIGO]: 4, - [Species.CETODDLE]: 4, + [Species.CETODDLE]: 3, [Species.VELUZA]: 4, - [Species.DONDOZO]: 5, - [Species.TATSUGIRI]: 5, + [Species.DONDOZO]: 4, + [Species.TATSUGIRI]: 4, [Species.GREAT_TUSK]: 6, [Species.SCREAM_TAIL]: 6, [Species.BRUTE_BONNET]: 6, - [Species.FLUTTER_MANE]: 6, + [Species.FLUTTER_MANE]: 7, [Species.SLITHER_WING]: 6, [Species.SANDY_SHOCKS]: 6, [Species.IRON_TREADS]: 6, @@ -3273,7 +3273,7 @@ export const speciesStarters = { [Species.PECHARUNT]: 6, [Species.PALDEA_TAUROS]: 5, [Species.PALDEA_WOOPER]: 3, - [Species.BLOODMOON_URSALUNA]: 7, + [Species.BLOODMOON_URSALUNA]: 6, }; export const noStarterFormKeys: string[] = [ From ca64c4aaf2dfce38e89133f7445a65acf89948ee Mon Sep 17 00:00:00 2001 From: Jacob Knispel Date: Sun, 4 Aug 2024 00:04:59 -0500 Subject: [PATCH 144/321] [Bug] Skip forced switch if the fainted party member has been revived already (#1236) --- src/phases.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/phases.ts b/src/phases.ts index 7e2d8058aef..a38fff8b077 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -4468,6 +4468,10 @@ export class SwitchPhase extends BattlePhase { return super.end(); } + // Skip if the fainted party member has been revived already + if (this.isModal && !this.scene.getParty()[this.fieldIndex].isFainted()) + return super.end(); + // Check if there is any space still in field if (this.isModal && this.scene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { return super.end(); From d8794367512c3423acf717cfea2c7b43dafed427 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:06:51 -0400 Subject: [PATCH 145/321] [Sprite] Target FormSpriteKey-labelled sprite assets (#3322) --- 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 c65007a6580..ac79b6223c0 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -301,7 +301,7 @@ export abstract class PokemonSpeciesForm { let variantDataIndex: integer|string = this.speciesId; const species = getPokemonSpecies(this.speciesId); if (species.forms.length > 0) { - formkey = species.forms[formIndex]?.formKey; + formkey = species.forms[formIndex]?.formSpriteKey; if (formkey) { variantDataIndex = `${this.speciesId}-${formkey}`; } From 22349da663001ecc9d58994e6ac89748f65195fc Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:41:59 -0400 Subject: [PATCH 146/321] Update phases.ts Fixed a linting problem --- src/phases.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index a38fff8b077..3c4d7f1ce44 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -4469,8 +4469,9 @@ export class SwitchPhase extends BattlePhase { } // Skip if the fainted party member has been revived already - if (this.isModal && !this.scene.getParty()[this.fieldIndex].isFainted()) + if (this.isModal && !this.scene.getParty()[this.fieldIndex].isFainted()) { return super.end(); + } // Check if there is any space still in field if (this.isModal && this.scene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { From 0796a9fce8c34ba5a9e788b5a1ab05ea14ff41f5 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:50:13 +0200 Subject: [PATCH 147/321] [Enhancement] Improvements to starter selection and filtering user experience (#3325) * [filter-ui] Improvements to starter selection and filtering user experience Original messages of 14 squashed commits: * final cleanup and code comments * automatically go to the list of starters when closing filters * FilterBar cleanup. Associate each DropDown with an id and access them through it * reset all filters when creating a new game. Set different default gen filter for challenge mode * start of code cleanup plus some documentation * fix filter bar label coloring for legacy theme * change generation filter default values to be all generations selected * fix navigation between team and filtered Pokemon * add missing localisation keys * first pass at improving navigation between the UI elements * have each filter group handle its default values instead of the filter bar * revamp dropdown class. add possibility to display both a sprite and text label at the same time * groundwork to be able to move around starter ui elements more easily * add hybrid filtering type for Gen and Type filters, clean up implementation for radial type * [loc][ko][zh] localisation of starter ui filters for Chinese and Korean Co-authored-by: Enoch Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * [loc][de] German translations for the filters Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> --------- Co-authored-by: Enoch Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> --- src/locales/de/filter-bar.ts | 5 +- src/locales/en/filter-bar.ts | 9 +- src/locales/es/filter-bar.ts | 5 +- src/locales/fr/filter-bar.ts | 11 +- src/locales/it/filter-bar.ts | 9 +- src/locales/ko/filter-bar.ts | 11 +- src/locales/pt_BR/filter-bar.ts | 9 +- src/locales/zh_CN/filter-bar.ts | 9 +- src/locales/zh_TW/filter-bar.ts | 9 +- src/ui/dropdown.ts | 567 ++++++++++++++++++++-------- src/ui/filter-bar.ts | 152 ++++---- src/ui/starter-select-ui-handler.ts | 298 ++++++++++----- 12 files changed, 746 insertions(+), 348 deletions(-) diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts index 31c6fee20d4..9c1009171e2 100644 --- a/src/locales/de/filter-bar.ts +++ b/src/locales/de/filter-bar.ts @@ -3,14 +3,17 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen.", "typeFilter": "Typ", + "dexFilter": "Dex.", "unlocksFilter": "Freisch.", - "winFilter": "Abschluss", + "miscFilter": "Sonst.", "sortFilter": "Sort.", "all": "Alle", "normal": "Normal", "uncaught": "Nicht gefangen", + "passive": "Passive", "passiveUnlocked": "Passive freigeschaltet", "passiveLocked": "Passive gesperrt", + "ribbon": "Band", "hasWon": "Hat Klassik-Modus gewonnen", "hasNotWon": "Hat Klassik-Modus nicht gewonnen", "sortByNumber": "Pokédex-Nummer", diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts index 60c6ffb1bbc..18b6ba77e21 100644 --- a/src/locales/en/filter-bar.ts +++ b/src/locales/en/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Type", + "dexFilter": "Dex", "unlocksFilter": "Unlocks", - "winFilter": "Win", + "miscFilter": "Misc", "sortFilter": "Sort", "all": "All", "normal": "Normal", "uncaught": "Uncaught", + "passive": "Passive", "passiveUnlocked": "Passive Unlocked", "passiveLocked": "Passive Locked", - "hasWon": "Yes", - "hasNotWon": "No", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", "sortByNumber": "No.", "sortByCost": "Cost", "sortByCandies": "Candy Count", diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts index 50826ba0502..33b60cfa427 100644 --- a/src/locales/es/filter-bar.ts +++ b/src/locales/es/filter-bar.ts @@ -3,14 +3,17 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen.", "typeFilter": "Tipo", + "dexFilter": "Dex", "unlocksFilter": "Otros", - "winFilter": "Vic.", + "miscFilter": "Misc", "sortFilter": "Orden", "all": "Todo", "normal": "Normal", "uncaught": "No Capt.", + "passive": "Passive", "passiveUnlocked": "Pasiva Desbloq.", "passiveLocked": "Pasiva Bloq.", + "ribbon": "Ribbon", "hasWon": "Ya ha ganado", "hasNotWon": "Aún no ha ganado", "sortByNumber": "Núm.", diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index de0be450ad6..acbb34e18e8 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Type", - "unlocksFilter": "Autres", - "winFilter": "Victoires", + "dexFilter": "Dex", + "unlocksFilter": "Débloq.", + "miscFilter": "Divers", "sortFilter": "Tri", "all": "Tous", "normal": "Normal", "uncaught": "Non-capturé", + "passive": "Passif", "passiveUnlocked": "Passif débloqué", "passiveLocked": "Passif verrouillé", - "hasWon": "Oui", - "hasNotWon": "Aucune", + "ribbon": "Médaille", + "hasWon": "Médaille - Oui", + "hasNotWon": "Médaille - Non", "sortByNumber": "Par N°", "sortByCost": "Par cout", "sortByCandies": "Par # bonbons", diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts index 979b52f1729..88745d2c4f8 100644 --- a/src/locales/it/filter-bar.ts +++ b/src/locales/it/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Tipo", + "dexFilter": "Dex", "unlocksFilter": "Altro", - "winFilter": "Vinto", + "miscFilter": "Misc", "sortFilter": "Ordina", "all": "Tutto", "normal": "Normale", "uncaught": "Mancante", + "passive": "Passive", "passiveUnlocked": "Passiva sbloccata", "passiveLocked": "Passiva bloccata", - "hasWon": "Si", - "hasNotWon": "No", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", "sortByNumber": "Num. Dex", "sortByCost": "Costo", "sortByCandies": "Caramelle", diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts index 7f2dbf89db8..821a80d78ee 100644 --- a/src/locales/ko/filter-bar.ts +++ b/src/locales/ko/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "세대", "typeFilter": "타입", - "unlocksFilter": "등록", - "winFilter": "클리어", + "dexFilter": "도감", + "unlocksFilter": "해금", + "miscFilter": "기타", "sortFilter": "정렬", "all": "전체", "normal": "기본", "uncaught": "미포획", + "passive": "패시브", "passiveUnlocked": "패시브 해금", "passiveLocked": "패시브 잠김", - "hasWon": "완료", - "hasNotWon": "미완료", + "ribbon": "클리어 여부", + "hasWon": "클리어 함", + "hasNotwon": "클리어 안함", "sortByNumber": "도감번호", "sortByCost": "코스트", "sortByCandies": "사탕 수", diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index 5e3ab7114da..0c6a8e9ae50 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Ger.", "typeFilter": "Tipo", + "dexFilter": "Dex", "unlocksFilter": "Outros", - "winFilter": "Vit.", + "miscFilter": "Misc", "sortFilter": "Ordem", "all": "Tudo", "normal": "Normal", "uncaught": "Não Capturado", + "passive": "Passive", "passiveUnlocked": "Passiva Desbloq.", "passiveLocked": "Passiva Bloq.", - "hasWon": "Sim", - "hasNotWon": "Não", + "ribbon": "Ribbon", + "hasWon": "Ribbon - Yes", + "hasNotWon": "Ribbon - No", "sortByNumber": "Núm.", "sortByCost": "Custo", "sortByCandies": "# Doces", diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts index 581c7bf6b8c..5ccc5b8d9d9 100644 --- a/src/locales/zh_CN/filter-bar.ts +++ b/src/locales/zh_CN/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "世代", "typeFilter": "属性", + "dexFilter": "Dex", "unlocksFilter": "解锁", - "winFilter": "通关", + "miscFilter": "混合", "sortFilter": "排序", "all": "全部", "normal": "无闪光", "uncaught": "未捕获", + "passive": "被动", "passiveUnlocked": "被动解锁", "passiveLocked": "被动未解锁", - "hasWon": "已通关", - "hasNotWon": "未通关", + "ribbon": "缎带", + "hasWon": "有缎带", + "hasNotWon": "无缎带", "sortByNumber": "编号", "sortByCost": "费用", "sortByCandies": "糖果", diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts index 1f562ffb7ba..0290bda62de 100644 --- a/src/locales/zh_TW/filter-bar.ts +++ b/src/locales/zh_TW/filter-bar.ts @@ -3,16 +3,19 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "世代", "typeFilter": "屬性", + "dexFilter": "Dex", "unlocksFilter": "解鎖", - "winFilter": "通關", + "miscFilter": "混合", "sortFilter": "排序", "all": "全部", "normal": "通常", "uncaught": "未捕獲", + "passive": "被動", "passiveUnlocked": "被動解鎖", "passiveLocked": "被動未解鎖", - "hasWon": "已通關", - "hasNotWon": "未通關", + "ribbon": "緞帶", + "hasWon": "有緞帶", + "hasNotWon": "無緞帶", "sortByNumber": "編號", "sortByCost": "花費", "sortByCandies": "糖果", diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 4f330de0588..4338e11e0c6 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -7,14 +7,14 @@ import i18next from "i18next"; export enum DropDownState { ON = 0, OFF = 1, - INCLUDE = 2, - EXCLUDE = 3, + EXCLUDE = 2 } export enum DropDownType { - MULTI = 0, - SINGLE = 1, - TRI = 2 + SINGLE = 0, + MULTI = 1, + HYBRID = 2, + RADIAL = 3 } export enum SortDirection { @@ -22,130 +22,252 @@ export enum SortDirection { DESC = 1 } +export class DropDownLabel { + public state: DropDownState; + public text: string; + public sprite?: Phaser.GameObjects.Sprite; + + constructor(label: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + this.text = label || ""; + this.sprite = sprite; + this.state = state || DropDownState.ON; + } +} + + export class DropDownOption extends Phaser.GameObjects.Container { public state: DropDownState = DropDownState.ON; public toggle: Phaser.GameObjects.Sprite; public text: Phaser.GameObjects.Text; - public sprite?: Phaser.GameObjects.Sprite; public val: any; public dir: SortDirection = SortDirection.ASC; - public offStateLabel: string; // label for OFF state in TRI dropdown - public includeStateLabel: string; // label for INCLUDE state in TRI dropdown - public excludeStateLabel: string; // label for EXCLUDE state in TRI dropdown - private onColor = 0x55ff55; + private currentLabelIndex: number; + private labels: DropDownLabel[]; + private onColor = 0x33bbff; private offColor = 0x272727; - private includeColor = 0x55ff55; private excludeColor = 0xff5555; - - constructor(scene: SceneBase, val: any, text: string | string[], sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + constructor(scene: SceneBase, val: any, labels: DropDownLabel | DropDownLabel[]) { super(scene); this.val = val; - this.state = state; - if (text) { - if (Array.isArray(text)) { - this.offStateLabel = text[0]; - this.includeStateLabel = text[1]; - this.excludeStateLabel = text[2]; - text = text[0]; - } else { - this.offStateLabel = undefined; - this.includeStateLabel = undefined; - this.excludeStateLabel = undefined; - } - this.text = addTextObject(scene, 0, 0, text, TextStyle.TOOLTIP_CONTENT); - this.text.setOrigin(0, 0.5); - this.add(this.text); - } - if (sprite) { - this.sprite = sprite.setOrigin(0, 0.5); - this.add(this.sprite); + if (Array.isArray(labels)) { + this.labels = labels; + } else { + this.labels = labels? [ labels ] : [ new DropDownLabel("") ]; + } + this.currentLabelIndex = 0; + const currentLabel = this.labels[this.currentLabelIndex]; + + this.state = currentLabel.state; + this.text = addTextObject(scene, 0, 0, currentLabel.text || "", TextStyle.TOOLTIP_CONTENT); + this.text.setOrigin(0, 0.5); + this.add(this.text); + + // Add to container the sprite for each label if there is one + for (let i=0; i < this.labels.length; i++) { + const sprite = this.labels[i].sprite; + if (sprite) { + this.add(sprite); + sprite.setOrigin(0, 0.5); + if (i!== this.currentLabelIndex) { + sprite.setVisible(false); + } + } } } - public setupToggle(type: DropDownType): void { - if (type === DropDownType.MULTI || type === DropDownType.TRI) { - this.toggle = this.scene.add.sprite(0, 0, "candy"); - this.toggle.setScale(0.3); - this.toggle.setOrigin(0, 0.5); - } else { + /** + * Initialize the toggle icon based on the provided DropDownType + * For DropDownType.SINGLE: uses a cursor arrow icon + * For other types: uses a candy icon + * @param type the DropDownType to use + * @param visible whether the icon should be visible or not + */ + setupToggleIcon(type: DropDownType, visible: boolean): void { + if (type === DropDownType.SINGLE) { this.toggle = this.scene.add.sprite(0, 0, "cursor"); this.toggle.setScale(0.5); this.toggle.setOrigin(0, 0.5); this.toggle.setRotation(Math.PI / 180 * -90); + } else { + this.toggle = this.scene.add.sprite(0, 0, "candy"); + this.toggle.setScale(0.3); + this.toggle.setOrigin(0, 0.5); } this.add(this.toggle); + this.toggle.setVisible(visible); + this.updateToggleIconColor(); } - public setOptionState(type: DropDownType, state: DropDownState): DropDownState { - this.state = state; - // if type is MULTI or SINGLE, set the color of the toggle based on the state - if (type === DropDownType.MULTI || type === DropDownType.SINGLE) { - if (this.state === DropDownState.OFF) { - this.toggle.setTint(this.offColor); - } else if (this.state === DropDownState.ON) { - this.toggle.setTint(this.onColor); - } - } else if (type === DropDownType.TRI) { - if (this.state === DropDownState.OFF) { - this.text.setText(this.offStateLabel); - this.toggle.setTint(this.offColor); - } else if (this.state === DropDownState.INCLUDE) { - this.text.setText(this.includeStateLabel); - this.toggle.setTint(this.includeColor); - } else if (this.state === DropDownState.EXCLUDE) { - this.text.setText(this.excludeStateLabel); - this.toggle.setTint(this.excludeColor); - } + /** + * Set the toggle icon color based on the current state + */ + private updateToggleIconColor(): void { + switch (this.state) { + case DropDownState.ON: + this.toggle.setTint(this.onColor); + break; + case DropDownState.OFF: + this.toggle.setTint(this.offColor); + break; + case DropDownState.EXCLUDE: + this.toggle.setTint(this.excludeColor); + break; } + } + + /** + * Switch the option to its next state and update visuals + * If only ON/OFF are possible, toggle between the two + * For radials, move to the next state in the list + * @returns the updated DropDownState + */ + public toggleOptionState(): DropDownState { + if (this.labels.length > 1) { + return this.setCurrentLabel((this.currentLabelIndex + 1) % this.labels.length); + } + const newState = this.state === DropDownState.ON ? DropDownState.OFF : DropDownState.ON; + return this.setOptionState(newState); + } + + /** + * Set the option to the given state and update visuals + * @param newState the state to switch to + * @returns the new DropDownState + */ + public setOptionState(newState: DropDownState): DropDownState { + const newLabelIndex = this.labels.findIndex(label => label.state === newState); + if (newLabelIndex !== -1 && newLabelIndex !== this.currentLabelIndex) { + return this.setCurrentLabel(newLabelIndex); + } + + this.state = newState; + this.updateToggleIconColor(); + return newState; + } + + /** + * Change the option state to the one at the given index and update visuals + * @param index index of the state to switch to + * @returns the new DropDownState + */ + private setCurrentLabel(index: number): DropDownState { + const currentLabel = this.labels[this.currentLabelIndex]; + const newLabel = this.labels[index]; + + if (!newLabel) { + return this.state; + } + + this.currentLabelIndex = index; + + // update state, sprite and text to fit the new label + this.state = newLabel.state; + this.updateToggleIconColor(); + + if (currentLabel.sprite) { + this.text.x -= currentLabel.sprite.displayWidth + 2; + currentLabel.sprite.setVisible(false); + } + if (newLabel.sprite) { + this.text.x += newLabel.sprite.displayWidth + 2; + newLabel.sprite.setVisible(true); + } + this.text.setText(newLabel.text); + return this.state; } - public toggleOptionState(type: DropDownType): DropDownState { - if (type === DropDownType.TRI) { - switch (this.state) { - case DropDownState.OFF: - this.state = DropDownState.INCLUDE; - break; - case DropDownState.INCLUDE: - this.state = DropDownState.EXCLUDE; - break; - case DropDownState.EXCLUDE: - this.state = DropDownState.OFF; - break; - } - } else { - switch (this.state) { - case DropDownState.ON: - this.state = DropDownState.OFF; - break; - case DropDownState.OFF: - this.state = DropDownState.ON; - break; - } - } - return this.setOptionState(type, this.state); - } - + /** + * Set the current SortDirection to the provided value and update icon accordingly + * @param SortDirection the new SortDirection to use + */ public setDirection(dir: SortDirection): void { this.dir = dir; this.toggle.flipX = this.dir === SortDirection.DESC; } + /** + * Toggle the current SortDirection value + */ public toggleDirection(): void { this.setDirection(this.dir * -1); } + + /** + * Place the label elements (text and sprite if there is one) to the provided x and y position + * @param x the horizontal position + * @param y the vertical position + */ + setLabelPosition(x: number, y: number) { + let textX = x; + for (let i=0; i < this.labels.length; i++) { + const label = this.labels[i]; + if (label.sprite) { + label.sprite.x = x; + label.sprite.y = y; + if (i === this.currentLabelIndex) { + textX += label.sprite.displayWidth + 2; + } + } + } + if (this.text) { + this.text.x = textX; + this.text.y = y; + } + } + + /** + * Place the toggle icon at the provided position + * @param x the horizontal position + * @param y the vertical position + */ + setTogglePosition(x: number, y: number) { + if (this.toggle) { + this.toggle.x = x; + this.toggle.y = y; + } + } + + /** + * @returns the x position to use for the current label depending on if it has a sprite or not + */ + getCurrentLabelX(): number { + if (this.labels[this.currentLabelIndex].sprite) { + return this.labels[this.currentLabelIndex].sprite.x; + } + return this.text.x; + } + + /** + * @returns max width needed to display all of the labels + */ + getWidth(): number { + let w = 0; + const currentText = this.text.text; + for (const label of this.labels) { + this.text.setText(label.text); + const spriteWidth = label.sprite? label.sprite.displayWidth + 2 : 0; + w = Math.max(w, this.text.displayWidth + spriteWidth); + } + 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; private dropDownType: DropDownType = DropDownType.MULTI; - public cursor: integer = 0; + public cursor: number = 0; + public defaultCursor: number = 0; private onChange: () => void; private lastDir: SortDirection = SortDirection.ASC; + private defaultValues: any[]; constructor(scene: BattleScene, x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { const windowPadding = 5; @@ -165,36 +287,31 @@ export class DropDown extends Phaser.GameObjects.Container { this.cursorObj.setOrigin(0, 0.5); this.cursorObj.setVisible(false); - if (this.dropDownType === DropDownType.MULTI) { - this.options.unshift(new DropDownOption(scene, "ALL", i18next.t("filterBar:all"), null, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF)); + // 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(scene, "ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); } + this.defaultValues = this.getVals(); + + // Place ui elements in the correct spot options.forEach((option, index) => { - option.setupToggle(type); - if (type === DropDownType.SINGLE && option.state === DropDownState.OFF) { - option.toggle.setVisible(false); - } - option.setOptionState(type, option.state); + const toggleVisibility = type !== DropDownType.SINGLE || option.state === DropDownState.ON; + option.setupToggleIcon(type, toggleVisibility); option.width = optionWidth; option.y = index * optionHeight + index * optionSpacing + optionPaddingY; - if (option.text) { - option.text.x = cursorOffset + optionPaddingX + 3 + 8; - option.text.y = optionHeight / 2; - } - if (option.sprite) { - option.sprite.x = cursorOffset + optionPaddingX + 3 + 8; - option.sprite.y = optionHeight / 2; - } + const baseX = cursorOffset + optionPaddingX + 3; + const baseY = optionHeight / 2; + option.setLabelPosition(baseX + 8, baseY); if (type === DropDownType.SINGLE) { - option.toggle.x = cursorOffset + optionPaddingX + 3 + 3; - option.toggle.y = optionHeight / 2 + 1; + option.setTogglePosition(baseX + 3, baseY + 1); } else { - option.toggle.x = cursorOffset + optionPaddingX + 3; - option.toggle.y = optionHeight / 2; + option.setTogglePosition(baseX, baseY); } }); + this.window = addWindow(scene, 0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, null, null, WindowVariant.XTHIN); this.add(this.window); this.add(options); @@ -202,10 +319,32 @@ export class DropDown extends Phaser.GameObjects.Container { this.setVisible(false); } - toggle(): void { + getWidth(): number { + return this.window? this.window.width : this.width; + } + + toggleVisibility(): void { this.setVisible(!this.visible); } + setVisible(value: boolean): this { + super.setVisible(value); + + if (value) { + this.autoSize(); + } + + return this; + } + + resetCursor(): boolean { + // If we are an hybrid dropdown in "hover" mode, don't move the cursor back to 0 + if (this.dropDownType === DropDownType.HYBRID && this.checkForAllOff() && this.cursor > 0) { + return false; + } + return this.setCursor(this.defaultCursor); + } + setCursor(cursor: integer): boolean { this.cursor = cursor; if (cursor < 0) { @@ -220,96 +359,213 @@ export class DropDown extends Phaser.GameObjects.Container { } 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.onChange(); + } } return true; } - toggleOptionState(): void { - if (this.dropDownType === DropDownType.MULTI) { - const newState = this.options[this.cursor].toggleOptionState(this.dropDownType); - if (this.cursor === 0) { - this.options.forEach((option, index) => { - if (index !== this.cursor) { - option.setOptionState(this.dropDownType, newState); - } - }); + /** + * Switch the option at the provided index to its next state and update visuals + * Update accordingly the other options if needed: + * - if "all" is toggled, also update all other options + * - for DropDownType.SINGLE, unselect the previously selected option if applicable + * @param index the index of the option for which to update the state + */ + toggleOptionState(index: number = this.cursor): void { + const option: DropDownOption = this.options[index]; + if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { + const newState = option.toggleOptionState(); + if (index === 0) { + // we are on the All option > put all other options to the newState + this.setAllOptions(newState); } else { - if (this.checkForAllOff()) { - this.options[0].setOptionState(this.dropDownType, DropDownState.OFF); - } else if (this.checkForAllOn()) { - this.options[0].setOptionState(this.dropDownType, DropDownState.ON); + // select the "all" option if all others are selected, other unselect it + if (newState === DropDownState.ON && this.checkForAllOn()) { + this.options[0].setOptionState(DropDownState.ON); } else { - this.options[0].setOptionState(this.dropDownType, DropDownState.OFF); + this.options[0].setOptionState(DropDownState.OFF); } } } else if (this.dropDownType === DropDownType.SINGLE) { - if (this.options[this.cursor].state === DropDownState.OFF) { + if (option.state === DropDownState.OFF) { this.options.forEach((option) => { - option.setOptionState(this.dropDownType, DropDownState.OFF); + option.setOptionState(DropDownState.OFF); option.setDirection(SortDirection.ASC); option.toggle.setVisible(false); }); - this.options[this.cursor].setOptionState(this.dropDownType, DropDownState.ON); - this.options[this.cursor].setDirection(this.lastDir); - this.options[this.cursor].toggle.setVisible(true); + option.setOptionState(DropDownState.ON); + option.setDirection(this.lastDir); + option.toggle.setVisible(true); } else { - this.options[this.cursor].toggleDirection(); + option.toggleDirection(); this.lastDir = this.options[this.cursor].dir; } - } else if (this.dropDownType === DropDownType.TRI) { - this.options[this.cursor].toggleOptionState(this.dropDownType); - this.autoSize(); + } else if (this.dropDownType === DropDownType.RADIAL) { + option.toggleOptionState(); } this.onChange(); } - setVisible(value: boolean): this { - super.setVisible(value); - - if (value) { - this.autoSize(); - } - - return this; - } - + /** + * Check whether all options except the "ALL" one are ON + * @returns true if all options are set to DropDownState.ON, false otherwise + */ checkForAllOn(): boolean { return this.options.every((option, i) => i === 0 || option.state === DropDownState.ON); } + /** + * Check whether all options except the "ALL" one are OFF + * @returns true if all options are set to DropDownState.OFF, false otherwise + */ checkForAllOff(): boolean { return this.options.every((option, i) => i === 0 || option.state === DropDownState.OFF); } + /** + * Get the current selected values for each option + * @returns an array of values, depending on the DropDownType + * - if MULTI or HYBRID, an array of all the values of the options set to ON (except the ALL one) + * - if RADIAL, an array where the value for each option is of the form { val: any, state: DropDownState } + * - if SINGLE, a single object of the form { val: any, state: SortDirection } + */ getVals(): any[] { if (this.dropDownType === DropDownType.MULTI) { return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); - // in TRI dropdown, if state is ON, return the "ON" with the value, if state is OFF, return the "OFF" with the value, if state is TRI, return the "TRI" with the value - } else if (this.dropDownType === DropDownType.TRI) { - return this.options.filter((option, i) => option.state === DropDownState.OFF || option.state === DropDownState.INCLUDE || option.state === DropDownState.EXCLUDE).map((option) => { - return {val: option.val, state: option.state}; + } else 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; + } + // if nothing is selected and the ALL option is hovered, return all elements + if (this.cursor === 0) { + 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 { val: option.val, state: option.state }; }); } else { - return this.options.filter((option, i) => option.state === DropDownState.ON).map((option) => { - return {val: option.val, dir: option.dir}; + return this.options.filter(option => option.state === DropDownState.ON).map((option) => { + return { val: option.val, dir: option.dir }; }); } } + /** + * Check whether the values of all options are the same as the default ones + * @returns true if they are the same, false otherwise + */ + public hasDefaultValues(): boolean { + const currentValues = this.getVals(); + + switch (this.dropDownType) { + case DropDownType.MULTI: + case DropDownType.HYBRID: + return currentValues.length === this.defaultValues.length && currentValues.every((value, index) => value === this.defaultValues[index]); + + case DropDownType.RADIAL: + return currentValues.every((value, index) => value["val"] === this.defaultValues[index]["val"] && value["state"] === this.defaultValues[index]["state"]); + + case DropDownType.SINGLE: + return currentValues[0]["dir"] === this.defaultValues[0]["dir"] && currentValues[0]["val"] === this.defaultValues[0]["val"]; + + default: + return false; + } + } + + /** + * Set all values to their default state + */ + public resetToDefault(): void { + this.setCursor(this.defaultCursor); + + for (let i = 0; i < this.options.length; i++) { + const option = this.options[i]; + // reset values + switch (this.dropDownType) { + case DropDownType.HYBRID: + case DropDownType.MULTI: + if (this.defaultValues.includes(option.val)) { + option.setOptionState(DropDownState.ON); + } else { + option.setOptionState(DropDownState.OFF); + } + break; + case DropDownType.RADIAL: + const targetValue = this.defaultValues.find(value => value.val === option.val); + option.setOptionState(targetValue.state); + break; + case DropDownType.SINGLE: + if (option.val === this.defaultValues[0].val) { + if (option.state !== DropDownState.ON) { + this.toggleOptionState(i); + } + if (option.dir !== this.defaultValues[0].dir) { + this.toggleOptionState(i); + } + } + break; + } + } + + // Select or unselect "ALL" button if applicable + if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { + if (this.checkForAllOn()) { + this.options[0].setOptionState(DropDownState.ON); + } else { + this.options[0].setOptionState(DropDownState.OFF); + } + } + + } + + /** + * Set all options to a specific state + * @param state the DropDownState to assign to each option + */ + private setAllOptions(state: DropDownState) : void { + // For single type dropdown, setting all options is not relevant + if (this.dropDownType === DropDownType.SINGLE) { + return; + } + + for (const option of this.options) { + option.setOptionState(state); + } + } + + /** + * Set all options to their ON state + */ + public selectAllOptions() { + this.setAllOptions(DropDownState.ON); + } + + /** + * Set all options to their OFF state + */ + public unselectAllOptions() { + this.setAllOptions(DropDownState.OFF); + } + + /** + * Automatically set the width and position based on the size of options + */ autoSize(): void { let maxWidth = 0; let x = 0; for (let i = 0; i < this.options.length; i++) { - if (this.options[i].sprite) { - if (this.options[i].sprite.displayWidth > maxWidth) { - maxWidth = this.options[i].sprite.displayWidth; - x = this.options[i].sprite.x; - } - } else { - if (this.options[i].text.displayWidth > maxWidth) { - maxWidth = this.options[i].text.displayWidth; - x = this.options[i].text.x; - } + const optionWidth = this.options[i].getWidth(); + if (optionWidth > maxWidth) { + maxWidth = optionWidth; + x = this.options[i].getCurrentLabelX(); } } this.window.width = maxWidth + x - this.window.x + 6; @@ -319,7 +575,4 @@ export class DropDown extends Phaser.GameObjects.Container { } } - isActive(): boolean { - return this.options.some((option) => option.state === DropDownState.ON); - } } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index fd661901c78..e163284bad3 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -1,13 +1,14 @@ import BattleScene from "#app/battle-scene.js"; import { DropDown } from "./dropdown"; import { StarterContainer } from "./starter-container"; -import { addTextObject, TextStyle } from "./text"; +import { addTextObject, getTextColor, TextStyle } from "./text"; +import { UiTheme } from "#enums/ui-theme"; import { addWindow, WindowVariant } from "./ui-theme"; export enum DropDownColumn { GEN, TYPES, - SHINY, + DEX, UNLOCKS, MISC, SORT @@ -15,18 +16,14 @@ export enum DropDownColumn { export class FilterBar extends Phaser.GameObjects.Container { private window: Phaser.GameObjects.NineSlice; - public labels: Phaser.GameObjects.Text[] = []; - public dropDowns: DropDown[] = []; + 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 defaultGenVals: any[] = []; - public defaultTypeVals: any[] = []; - public defaultShinyVals: any[] = []; - public defaultUnlocksVals: any[] = []; - public defaultMiscVals: any[] = []; - public defaultSortVals: any[] = []; + private uiTheme: UiTheme; constructor(scene: BattleScene, x: number, y: number, width: number, height: number) { super(scene, x, y); @@ -42,10 +39,26 @@ export class FilterBar extends Phaser.GameObjects.Container { this.cursorObj.setVisible(false); this.cursorObj.setOrigin(0, 0); this.add(this.cursorObj); + + this.uiTheme = scene.uiTheme; } - addFilter(text: string, dropDown: DropDown): void { - const filterTypesLabel = addTextObject(this.scene, 0, 3, text, TextStyle.TOOLTIP_CONTENT); + /** + * Add a new filter to the FilterBar, as long that a unique DropDownColumn is provided + * @param column the DropDownColumn that will be used to access the filter values + * @param title the string that will get displayed in the filter bar + * @param dropDown the DropDown with all options for this filter + * @returns true if successful, false if the provided column was already in use for another filter + */ + addFilter(column: DropDownColumn, title: string, dropDown: DropDown): boolean { + // The column should be unique to each filter, + if (this.columns.includes(column)) { + return false; + } + + this.columns.push(column); + + const filterTypesLabel = addTextObject(this.scene, 0, 3, title, TextStyle.TOOLTIP_CONTENT); this.labels.push(filterTypesLabel); this.add(filterTypesLabel); this.dropDowns.push(dropDown); @@ -53,69 +66,39 @@ export class FilterBar extends Phaser.GameObjects.Container { this.calcFilterPositions(); this.numFilters++; + + return true; } + /** + * Get the DropDown associated to a given filter + * @param col the DropDownColumn used to register the filter to retrieve + * @returns the associated DropDown if it exists, undefined otherwise + */ + getFilter(col: DropDownColumn) : DropDown { + return this.dropDowns[this.columns.indexOf(col)]; + } + /** + * Highlight the labels of the FilterBar if the filters are different from their default values + */ updateFilterLabels(): void { - const genVals = this.getVals(DropDownColumn.GEN); - const typeVals = this.getVals(DropDownColumn.TYPES); - const shinyVals = this.getVals(DropDownColumn.SHINY); - const unlocksVals = this.getVals(DropDownColumn.UNLOCKS); - const miscVals = this.getVals(DropDownColumn.MISC); - const sortVals = this.getVals(DropDownColumn.SORT); - - // onColor is Yellow, offColor is White - const onColor = 0xffef5c; - const offColor = 0xffffff; - - // if genVals and defaultGenVals has same elements, set the label to offColor else set it to onColor - if (genVals.length === this.defaultGenVals.length && genVals.every((value, index) => value === this.defaultGenVals[index])) { - this.labels[DropDownColumn.GEN].setTint(offColor); - } else { - this.labels[DropDownColumn.GEN].setTint(onColor); - } - - // if typeVals and defaultTypeVals has same elements, set the label to offColor else set it to onColor - if (typeVals.length === this.defaultTypeVals.length && typeVals.every((value, index) => value === this.defaultTypeVals[index])) { - this.labels[DropDownColumn.TYPES].setTint(offColor); - } else { - this.labels[DropDownColumn.TYPES].setTint(onColor); - } - - // if shinyVals and defaultShinyVals has same elements, set the label to offColor else set it to onColor - if (shinyVals.length === this.defaultShinyVals.length && shinyVals.every((value, index) => value === this.defaultShinyVals[index])) { - this.labels[DropDownColumn.SHINY].setTint(offColor); - } else { - this.labels[DropDownColumn.SHINY].setTint(onColor); - } - - // if unlocksVals and defaultUnlocksVals has same elements, set the label to offColor else set it to onColor - if (unlocksVals.every((value, index) => value["val"] === this.defaultUnlocksVals[index]["val"] && value["state"] === this.defaultUnlocksVals[index]["state"])) { - this.labels[DropDownColumn.UNLOCKS].setTint(offColor); - } else { - this.labels[DropDownColumn.UNLOCKS].setTint(onColor); - } - - // if miscVals and defaultMiscVals has same elements, set the label to offColor else set it to onColor - if (miscVals.every((value, index) => value["val"] === this.defaultMiscVals[index]["val"] && value["state"] === this.defaultMiscVals[index]["state"])) { - this.labels[DropDownColumn.MISC].setTint(offColor); - } else { - this.labels[DropDownColumn.MISC].setTint(onColor); - } - - // if sortVals and defaultSortVals has same value and dir, set the label to offColor else set it to onColor - if (sortVals[0]["dir"] === this.defaultSortVals[0]["dir"] && sortVals[0]["val"] === this.defaultSortVals[0]["val"]) { - this.labels[DropDownColumn.SORT].setTint(offColor); - } else { - this.labels[DropDownColumn.SORT].setTint(onColor); + for (let i = 0; i < this.numFilters; i++) { + if (this.dropDowns[i].hasDefaultValues()) { + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, this.uiTheme)); + } else { + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, this.uiTheme)); + } } } - calcFilterPositions(): void { + /** + * Position the filter dropdowns evenly across the width of the container + */ + private calcFilterPositions(): void { const paddingX = 6; const cursorOffset = 8; - // position labels with even space across the width of the container let totalWidth = paddingX * 2 + cursorOffset; this.labels.forEach(label => { totalWidth += label.displayWidth + cursorOffset; @@ -134,12 +117,23 @@ export class FilterBar extends Phaser.GameObjects.Container { } } + /** + * Move the leftmost dropdown to the left of the FilterBar instead of below it + */ + offsetFirstFilter(): void { + if (this.dropDowns[0]) { + this.dropDowns[0].autoSize(); + this.dropDowns[0].x -= this.dropDowns[0].getWidth(); + this.dropDowns[0].y = 0; + } + } + setCursor(cursor: number): void { if (this.lastCursor > -1) { if (this.dropDowns[this.lastCursor].visible) { this.dropDowns[this.lastCursor].setVisible(false); this.dropDowns[cursor].setVisible(true); - this.dropDowns[cursor].setCursor(0); + this.dropDowns[cursor].resetCursor(); } } @@ -149,9 +143,9 @@ export class FilterBar extends Phaser.GameObjects.Container { } toggleDropDown(index: number): void { - this.dropDowns[index].toggle(); + this.dropDowns[index].toggleVisibility(); this.openDropDown = this.dropDowns[index].visible; - this.dropDowns[index].setCursor(0); + this.dropDowns[index].resetCursor(); } hideDropDowns(): void { @@ -182,11 +176,22 @@ export class FilterBar extends Phaser.GameObjects.Container { } getVals(col: DropDownColumn): any[] { - return this.dropDowns[col].getVals(); + return this.getFilter(col).getVals(); } + setValsToDefault(): void { + for (const dropDown of this.dropDowns) { + dropDown.resetToDefault(); + } + } + + /** + * Find the nearest filter to the provided container + * @param container the StarterContainer to compare position against + * @returns the index of the closest filter + */ getNearestFilter(container: StarterContainer): number { - // find the nearest filter to the x position + const midx = container.x + container.icon.displayWidth / 2; let nearest = 0; let nearestDist = 1000; @@ -201,11 +206,4 @@ export class FilterBar extends Phaser.GameObjects.Container { return nearest; } - getLastFilterX(): number { - return this.labels[this.lastCursor].x + this.labels[this.lastCursor].displayWidth / 2; - } - - isFilterActive(index: number) { - return this.dropDowns[index].isActive(); - } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ff7b7c19e47..3249ae668a1 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -40,7 +40,7 @@ import { Species } from "#enums/species"; import {Button} from "#enums/buttons"; import { EggSourceType } from "#app/enums/egg-source-types.js"; import AwaitableUiHandler from "./awaitable-ui-handler"; -import { DropDown, DropDownOption, DropDownState, DropDownType } from "./dropdown"; +import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType } from "./dropdown"; import { StarterContainer } from "./starter-container"; import { DropDownColumn, FilterBar } from "./filter-bar"; import { ScrollBar } from "./scroll-bar"; @@ -119,6 +119,14 @@ const starterCandyCosts: { passive: integer, costReduction: [integer, integer], { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 ]; +// Position of UI elements +const filterBarHeight = 17; +const speciesContainerX = 109; // if team on the RIGHT: 109 / if on the LEFT: 143 +const teamWindowX = 285; // if team on the RIGHT: 285 / if on the LEFT: 109 +const teamWindowY = 18; +const teamWindowWidth = 34; +const teamWindowHeight = 132; + function getPassiveCandyCount(baseValue: integer): integer { return starterCandyCosts[baseValue - 1].passive; } @@ -145,6 +153,57 @@ function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number return {x: x, y: y}; } +/** + * Calculates the y position for the icon of stater pokemon selected for the team + * @param index index of the Pokemon in the team (0-5) + * @returns the y position to use for the icon + */ +function calcStarterIconY(index: number) { + const starterSpacing = teamWindowHeight / 7; + const firstStarterY = teamWindowY + starterSpacing / 2; + return Math.round(firstStarterY + starterSpacing * index); +} + +/** + * Finds the index of the team Pokemon closest vertically to the given y position + * @param y the y position to find closest starter Pokemon + * @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 { + let smallestDistance = teamWindowHeight; + let closestStarterIndex = 0; + for (let i = 0; i < teamSize; i++) { + const distance = Math.abs(y - (calcStarterIconY(i) - 13)); + if (distance < smallestDistance) { + closestStarterIndex = i; + smallestDistance = distance; + } + } + return closestStarterIndex; +} + +/** + * Finds the row of the filtered Pokemon closest vertically to the given Pokemon in the team + * @param index index of the Pokemon in the team (0-5) + * @param numberOfRows the number of rows to check against + * @returns index of the row closest vertically to the given Pokemon + */ +function findClosestStarterRow(index: number, numberOfRows: number) { + const currentY = calcStarterIconY(index) - 13; + let smallestDistance = teamWindowHeight; + let closestRowIndex = 0; + for (let i=0; i < numberOfRows; i++) { + const distance = Math.abs(currentY - calcStarterPosition(i * 9).y); + if (distance < smallestDistance) { + closestRowIndex = i; + smallestDistance = distance; + } + } + return closestRowIndex; +} + + export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; private starterSelectScrollBar: ScrollBar; @@ -297,40 +356,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); - const starterContainerWindow = addWindow(this.scene, 109, 18, 175, 161); - const starterContainerBg = this.scene.add.image(110, 19, "starter_container_bg"); + const starterContainerWindow = addWindow(this.scene, speciesContainerX, filterBarHeight + 1, 175, 161); + const starterContainerBg = this.scene.add.image(speciesContainerX+1, filterBarHeight + 2, "starter_container_bg"); starterContainerBg.setOrigin(0, 0); this.starterSelectContainer.add(starterContainerBg); - this.starterSelectContainer.add(addWindow(this.scene, 285, 59, 34, 91)); - this.starterSelectContainer.add(addWindow(this.scene, 285, 145, 34, 34, true)); + this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight)); + this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY + teamWindowHeight - 5, teamWindowWidth, teamWindowWidth, true)); this.starterSelectContainer.add(starterContainerWindow); + // Create and initialise filter bar this.filterBarContainer = this.scene.add.container(0, 0); - - // this.filterBar = new FilterBar(this.scene, 143, 1, 175, 17); - this.filterBar = new FilterBar(this.scene, 109, 1, 175, 17); + this.filterBar = new FilterBar(this.scene, Math.min(speciesContainerX, teamWindowX), 1, 210, filterBarHeight); // gen filter const genOptions: DropDownOption[] = [ - new DropDownOption(this.scene, 1, i18next.t("starterSelectUiHandler:gen1"), null, DropDownState.ON), - new DropDownOption(this.scene, 2, i18next.t("starterSelectUiHandler:gen2"), null, DropDownState.ON), - new DropDownOption(this.scene, 3, i18next.t("starterSelectUiHandler:gen3"), null, DropDownState.ON), - new DropDownOption(this.scene, 4, i18next.t("starterSelectUiHandler:gen4"), null, DropDownState.ON), - new DropDownOption(this.scene, 5, i18next.t("starterSelectUiHandler:gen5"), null, DropDownState.ON), - new DropDownOption(this.scene, 6, i18next.t("starterSelectUiHandler:gen6"), null, DropDownState.ON), - new DropDownOption(this.scene, 7, i18next.t("starterSelectUiHandler:gen7"), null, DropDownState.ON), - new DropDownOption(this.scene, 8, i18next.t("starterSelectUiHandler:gen8"), null, DropDownState.ON), - new DropDownOption(this.scene, 9, i18next.t("starterSelectUiHandler:gen9"), null, DropDownState.ON), + new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("starterSelectUiHandler:gen1"))), + new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("starterSelectUiHandler:gen2"))), + new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("starterSelectUiHandler:gen3"))), + new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("starterSelectUiHandler:gen4"))), + new DropDownOption(this.scene, 5, new DropDownLabel(i18next.t("starterSelectUiHandler:gen5"))), + new DropDownOption(this.scene, 6, new DropDownLabel(i18next.t("starterSelectUiHandler:gen6"))), + new DropDownOption(this.scene, 7, new DropDownLabel(i18next.t("starterSelectUiHandler:gen7"))), + new DropDownOption(this.scene, 8, new DropDownLabel(i18next.t("starterSelectUiHandler:gen8"))), + new DropDownOption(this.scene, 9, new DropDownLabel(i18next.t("starterSelectUiHandler:gen9"))), ]; - this.filterBar.addFilter(i18next.t("filterBar:genFilter"), new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.MULTI)); - this.filterBar.defaultGenVals = this.filterBar.getVals(DropDownColumn.GEN); - // set gen filter to all off except for the I GEN - for (const option of genOptions) { - if (option.val !== 1) { - option.setOptionState(DropDownType.MULTI ,DropDownState.OFF); - } - } + const genDropDown: DropDown = new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); @@ -342,10 +394,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const typeSprite = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); typeSprite.setScale(0.5); typeSprite.setFrame(type.toLowerCase()); - typeOptions.push(new DropDownOption(this.scene, index, null, typeSprite)); + typeOptions.push(new DropDownOption(this.scene, index, new DropDownLabel("", typeSprite))); }); - this.filterBar.addFilter(i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.MULTI, 0.5)); - this.filterBar.defaultTypeVals = this.filterBar.getVals(DropDownColumn.TYPES); + this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); // shiny filter const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); @@ -365,45 +416,54 @@ export default class StarterSelectUiHandler extends MessageUiHandler { shiny3Sprite.setTint(getVariantTint(2)); const shinyOptions = [ - new DropDownOption(this.scene, "SHINY3", null, shiny3Sprite), - new DropDownOption(this.scene, "SHINY2", null, shiny2Sprite), - new DropDownOption(this.scene, "SHINY", null, shiny1Sprite), - new DropDownOption(this.scene, "NORMAL", i18next.t("filterBar:normal")), - new DropDownOption(this.scene, "UNCAUGHT", i18next.t("filterBar:uncaught")), + new DropDownOption(this.scene, "SHINY3", new DropDownLabel("", shiny3Sprite)), + new DropDownOption(this.scene, "SHINY2", new DropDownLabel("", shiny2Sprite)), + new DropDownOption(this.scene, "SHINY", new DropDownLabel("", shiny1Sprite)), + new DropDownOption(this.scene, "NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), + new DropDownOption(this.scene, "UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) ]; - this.filterBar.addFilter("Owned", new DropDown(this.scene, 0, 0, shinyOptions, this.updateStarters, DropDownType.MULTI)); - this.filterBar.defaultShinyVals = this.filterBar.getVals(DropDownColumn.SHINY); - + this.filterBar.addFilter(DropDownColumn.DEX, i18next.t("filterBar:dexFilter"), new DropDown(this.scene, 0, 0, shinyOptions, this.updateStarters, DropDownType.HYBRID)); // unlocks filter + const passiveLabels = [ + new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), + ]; const unlocksOptions = [ - new DropDownOption(this.scene, "PASSIVE", ["Passive", i18next.t("filterBar:passiveUnlocked"), i18next.t("filterBar:passiveLocked")], null, DropDownState.OFF), + new DropDownOption(this.scene, "PASSIVE", passiveLabels), ]; - this.filterBar.addFilter(i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.TRI)); - this.filterBar.defaultUnlocksVals = this.filterBar.getVals(DropDownColumn.UNLOCKS); + this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); // misc filter - const miscOptions = [ - new DropDownOption(this.scene, "WIN", ["Win", "Win - Yes", "Win - No"], null, DropDownState.OFF), + const winLabels = [ + new DropDownLabel(i18next.t("filterBar:ribbon"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasWon"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:hasNotWon"), undefined, DropDownState.EXCLUDE), ]; - this.filterBar.addFilter("Misc", new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.TRI)); - this.filterBar.defaultMiscVals = this.filterBar.getVals(DropDownColumn.MISC); + const miscOptions = [ + new DropDownOption(this.scene, "WIN", winLabels), + ]; + this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); // sort filter const sortOptions = [ - new DropDownOption(this.scene, 0, i18next.t("filterBar:sortByNumber")), - new DropDownOption(this.scene, 1, i18next.t("filterBar:sortByCost"), null, DropDownState.OFF), - new DropDownOption(this.scene, 2, i18next.t("filterBar:sortByCandies"), null, DropDownState.OFF), - new DropDownOption(this.scene, 3, i18next.t("filterBar:sortByIVs"), null, DropDownState.OFF), - new DropDownOption(this.scene, 4, i18next.t("filterBar:sortByName"), null, DropDownState.OFF)]; - this.filterBar.addFilter(i18next.t("filterBar:sortFilter"), new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + new DropDownOption(this.scene, 0, new DropDownLabel(i18next.t("filterBar:sortByNumber"))), + new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("filterBar:sortByCost"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("filterBar:sortByCandies"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("filterBar:sortByIVs"), undefined, DropDownState.OFF)), + new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("filterBar:sortByName"), undefined, DropDownState.OFF)) + ]; + this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); this.filterBarContainer.add(this.filterBar); - this.filterBar.defaultSortVals = this.filterBar.getVals(DropDownColumn.SORT); this.starterSelectContainer.add(this.filterBarContainer); + // Offset the generation filter dropdown to avoid covering the filtered pokemon + this.filterBar.offsetFirstFilter(); + if (!this.scene.uiTheme) { starterContainerWindow.setVisible(false); } @@ -479,22 +539,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.valueLimitLabel = addTextObject(this.scene, 302, 150, "0/10", TextStyle.TOOLTIP_CONTENT); + this.valueLimitLabel = addTextObject(this.scene, teamWindowX+17, 150, "0/10", TextStyle.TOOLTIP_CONTENT); this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); - const startLabel = addTextObject(this.scene, 302, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); + const startLabel = addTextObject(this.scene, teamWindowX+17, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); startLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(startLabel); - this.startCursorObj = this.scene.add.nineslice(289, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); + this.startCursorObj = this.scene.add.nineslice(teamWindowX+4, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); this.startCursorObj.setVisible(false); this.startCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.startCursorObj); const starterSpecies: Species[] = []; - const starterBoxContainer = this.scene.add.container(115, 9); + const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115 this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 0); @@ -544,7 +604,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(starterBoxContainer); this.starterIcons = new Array(6).fill(null).map((_, i) => { - const icon = this.scene.add.sprite(292, 63 + 13 * i, "pokemon_icons_0"); + const icon = this.scene.add.sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0"); icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame("unknown"); @@ -833,6 +893,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setUpgradeAnimation(icon, species); }); + this.resetFilters(); this.updateStarters(); this.setFilterMode(false); @@ -848,6 +909,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + /** + * Set the selections for all filters to their default starting value + */ + resetFilters() : void { + const genDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.GEN); + if (this.scene.gameMode.isChallenge) { + // In challenge mode all gens are selected by default + genDropDown.defaultCursor = 0; + } else { + // in other modes, gen 1 is selected by default, and all options disabled + genDropDown.defaultCursor = 1; + } + + this.filterBar.setValsToDefault(); + + // for all modes except challenge, disable all gen options to enable hovering behavior + if (!this.scene.gameMode.isChallenge) { + genDropDown.unselectAllOptions(); + } + } + showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); @@ -1035,11 +1117,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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 onScreenFirstRow = Math.floor(onScreenFirstIndex / maxColumns); const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / maxColumns); - // console.log("this.cursor: ", this.cursor, "this.scrollCursor" , this.scrollCursor, "numberOfStarters: ", numberOfStarters, "numOfRows: ", numOfRows, "currentRow: ", currentRow, "onScreenFirstIndex: ", onScreenFirstIndex, "onScreenLastIndex: ", onScreenLastIndex, "onScreenNumberOfStarters: ", onScreenNumberOfStarters, "onScreenNumberOfRow: ", onScreenNumberOfRows, "onScreenCurrentRow: ", onScreenCurrentRow); - const ui = this.getUi(); let success = false; @@ -1053,8 +1132,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else if (button === Button.CANCEL) { 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.statsMode) { this.toggleStatsMode(false); success = true; @@ -1081,6 +1170,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterIconsCursorIndex = this.starterSpecies.length - 1; this.moveStarterIconsCursor(this.starterIconsCursorIndex); } else { + // up from start button with no Pokemon in the team > go to filter + this.startCursorObj.setVisible(false); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); } success = true; @@ -1091,6 +1183,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterIconsCursorIndex = 0; this.moveStarterIconsCursor(this.starterIconsCursorIndex); } else { + // down from start button with no Pokemon in the team > go to filter + this.startCursorObj.setVisible(false); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); } success = true; @@ -1129,27 +1224,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = this.filterBar.decDropDownCursor(); // else if there is filtered starters } else if (numberOfStarters > 0) { + // 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 + 0.5) / this.filterBar.numFilters; - const targetCol = Math.floor(proportion * 9); + const targetCol = Math.min(8, Math.floor(proportion * 11)); if (numberOfStarters % 9 > targetCol) { - success = this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); } else { - success = this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9,0)); + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); } + success = true; } break; case Button.DOWN: if (this.filterBar.openDropDown) { success = this.filterBar.incDropDownCursor(); } else if (numberOfStarters > 0) { + // DOWN from filter bar to top of Pokemon list this.setFilterMode(false); this.scrollCursor = 0; this.updateScroll(); const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); - this.setCursor(Math.round(proportion * (Math.min(9, numberOfStarters) - 1))); + const targetCol = Math.min(8, Math.floor(proportion * 11)); + this.setCursor(Math.min(targetCol, numberOfStarters)); success = true; } break; @@ -1669,9 +1768,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else { if (this.starterIconsCursorIndex === 0) { + // Up from first Pokemon in the team > go to filter this.starterIconsCursorObj.setVisible(false); this.setSpecies(null); - this.startCursorObj.setVisible(true); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); } else { this.starterIconsCursorIndex--; this.moveStarterIconsCursor(this.starterIconsCursorIndex); @@ -1687,7 +1788,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } success = this.setCursor(this.cursor + 9); this.updateScroll(); - } else { // last row + } else if (numOfRows > 1) { + // 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 + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); this.setFilterMode(true); success = true; } @@ -1708,29 +1816,36 @@ 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 (this.starterSpecies.length === 0) { - // just wrap around to the last column + // no starter in team > wrap around to the last column success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); - } else if (onScreenCurrentRow < 3) { - // always to the first starter - this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = 0; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = Math.min(onScreenCurrentRow-2, this.starterSpecies.length - 1); + 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 this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); } success = true; } - } else { + } else if (numberOfStarters > 0) { + // LEFT from team > Go to closest filtered Pokemon + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); - success = this.setCursor(Math.min(onScreenFirstIndex + (this.starterIconsCursorIndex + 2) * 9 + 8,onScreenLastIndex)); // set last column + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); + success = true; + } else { + // LEFT from team and no Pokemon in filter > do nothing + success = false; } break; case Button.RIGHT: @@ -1739,33 +1854,37 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { success = this.setCursor(this.cursor + 1); } else { - // in right edge + // RIGHT from filtered Pokemon, on the right edge if (this.starterSpecies.length === 0) { - // just 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 < 3) { - // always to the first starter - this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = 0; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = Math.min(onScreenCurrentRow-2, this.starterSpecies.length - 1); + 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 this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); } success = true; } - break; - } else { + } else if (numberOfStarters > 0) { + // RIGHT from team > Go to closest filtered Pokemon + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); - success = this.setCursor(Math.min(onScreenFirstIndex + (this.starterIconsCursorIndex + 2) * 9, onScreenLastIndex - (onScreenLastIndex % 9))); // set first column - break; + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); + success = true; + } else { + // RIGHT from team and no Pokemon in filter > do nothing + success = false; } + break; } } } @@ -1959,7 +2078,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // pre filter for challenges if (this.scene.gameMode.modeId === GameModes.CHALLENGE) { - console.log("this.scene.gameMode.modeId", this.scene.gameMode.modeId); this.starterContainers.forEach(container => { const isValidForChallenge = new Utils.BooleanHolder(true); Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(container.species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); @@ -1997,7 +2115,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); - const fitsShiny = this.filterBar.getVals(DropDownColumn.SHINY).some(variant => { + const fitsShiny = this.filterBar.getVals(DropDownColumn.DEX).some(variant => { if (variant === "SHINY3") { return isVariant3Caught; } else if (variant === "SHINY2") { @@ -2012,7 +2130,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { - if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.INCLUDE) { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { return !isPassiveUnlocked; @@ -2024,7 +2142,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (container.species.speciesId < 10) { } - if (misc.val === "WIN" && misc.state === DropDownState.INCLUDE) { + if (misc.val === "WIN" && misc.state === DropDownState.ON) { return isWin; } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { return isNotWin || isUndefined; @@ -2749,8 +2867,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.starterSpecies.length > 0) { this.starterIconsCursorIndex--; } else { + // No more Pokemon selected, go back to filters this.starterIconsCursorObj.setVisible(false); this.setSpecies(null); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); } } From 8b8ac416b80f7d7f9ad50ba2de608859351f7307 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Sun, 4 Aug 2024 16:22:31 +0900 Subject: [PATCH 148/321] [Bug] Fix blocking menu when 6 starter selected (#3333) * fix bug of block menu when 6 starter * update comment * update comment again --- src/ui/starter-select-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 3249ae668a1..22ce5cb7531 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1265,7 +1265,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - } else if (this.starterSpecies.length < 6) { // checks to see you have less than 6 pokemon in your party + } else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon let species; @@ -1291,7 +1291,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); const newCost = this.scene.gameData.getSpeciesStarterValue(species.speciesId); - if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit()) { // 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 < 6) { // 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"), From 0241abcf61308b95b72a8952fc6b3eae52511bce Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:00:49 -0700 Subject: [PATCH 149/321] [Bug] Fix evil team admins (#3341) * Rename `flare_admin_m copy.json` to `flare_admin_f.json` * Also fix the Magma Admins --- .../trainer/{flare_admin_m copy.json => flare_admin_f.json} | 0 public/images/trainer/magma_admin_f.json | 2 +- public/images/trainer/magma_admin_m.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename public/images/trainer/{flare_admin_m copy.json => flare_admin_f.json} (100%) diff --git a/public/images/trainer/flare_admin_m copy.json b/public/images/trainer/flare_admin_f.json similarity index 100% rename from public/images/trainer/flare_admin_m copy.json rename to public/images/trainer/flare_admin_f.json diff --git a/public/images/trainer/magma_admin_f.json b/public/images/trainer/magma_admin_f.json index 1065b9f9cdd..95e00803df4 100644 --- a/public/images/trainer/magma_admin_f.json +++ b/public/images/trainer/magma_admin_f.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "magma_admin_m.png", + "image": "magma_admin_f.png", "format": "RGBA8888", "size": { "w": 80, diff --git a/public/images/trainer/magma_admin_m.json b/public/images/trainer/magma_admin_m.json index 9961b8dcd3b..977e911eb69 100644 --- a/public/images/trainer/magma_admin_m.json +++ b/public/images/trainer/magma_admin_m.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "magma_admin_f.png", + "image": "magma_admin_m.png", "format": "RGBA8888", "size": { "w": 80, From 6ce3468e04f9d88707e974e7716a8fc2f5c39045 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Sun, 4 Aug 2024 20:11:09 +0200 Subject: [PATCH 150/321] [Localization] Fix some errors and transalte admin dialogue (#3335) * Bring german translation up to date by fixing some errors and translating the admin dialogue * Update src/locales/de/move-trigger.ts --- src/locales/de/ability-trigger.ts | 6 +-- src/locales/de/dialogue.ts | 85 ++++++++++++++++--------------- src/locales/de/move-trigger.ts | 6 +-- src/locales/de/status-effect.ts | 2 +- src/locales/de/trainers.ts | 22 ++++---- 5 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 88dc9f9f027..3c9586fb6f2 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -35,12 +35,12 @@ export const abilityTriggers: SimpleTranslationEntries = { "battlerTagImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert {{battlerTagName}}!", "forewarn": "Vorwarnung von {{pokemonNameWithAffix}}: Konzentraion auf {{moveName}}!", "frisk": "{{pokemonNameWithAffix}} hat die Fähigkeit {{opponentAbilityName}} von {{opponentName}} erschnüffelt!", - "postWeatherLapseHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "postWeatherLapseHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "postWeatherLapseDamage": "{{pokemonNameWithAffix}} wurde durch {{abilityName}} verletzt!", "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} hat {{berryName}} geerntet!", - "postTurnHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "postTurnHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "fetchBall": "{{pokemonNameWithAffix}} hat einen {{pokeballName}} gefunden!", - "healFromBerryUse": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "healFromBerryUse": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "arenaTrap": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert den Tausch!", "postBattleLoot": "{{pokemonNameWithAffix}} hebt {{itemName}} auf!", "postFaintContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", diff --git a/src/locales/de/dialogue.ts b/src/locales/de/dialogue.ts index 6227c2d149d..57fd9071463 100644 --- a/src/locales/de/dialogue.ts +++ b/src/locales/de/dialogue.ts @@ -380,16 +380,17 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rocket_admin": { "encounter": { - 1: "Oh? You managed to get this far? You must be quite the trainer.", - 2: "That's quite enough of you playing hero, kid.", - 3: "I'll show you how scary an angry adult can be!" + 1: "Oh? Du wagst es, dich Team Rocket zu widersetzen? Du wirst es bereuen.", + 2: "Du glaubst, du kannst uns aufhalten? Naiver Narr!", + 3: "Ich werde dir die wahre Macht von Team Rocket zeigen!" }, "victory": { - 1: "No! Forgive me Giovanni!", - 2: "How could this be?", - 3: "Urgh... You were too strong..." + 1: "Nein! Verzeih mir, Giovanni!", + 2: "Wie konnte das geschehen?", + 3: "Urgh... Du warst zu stark..." }, }, + "firebreather": { "encounter": { 1: "Meine Flammen werden dich verschlingen!", @@ -424,14 +425,16 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "magma_admin": { "encounter": { - 1: "Hehehe! So you've come all the way here! But you're too late!", - 2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!", - 3: "I'm going to give you a little taste of pain! Resign yourself to it!" + 1: `Hahaha! Du hast den ganzen weiten Weg auf dich genommen! Aber du bist zu spät! + $Unsere Mission ist schon fast abgeschlossen!`, + 2: `Du willst dich in Team Magmas Angelegenheiten einmischen? Du bist so süß, dass es ekelhaft ist! + $Ich werde dich ein für alle Mal erledigen!`, + 3: "Ich werde dir zeigen, was wahrer Schmerz ist! Mach dich bereit!", }, "victory": { - 1: "Hehehe... So I lost...", - 2: "You're disgustingly strong!", - 3: "Ahahaha! Ouch!" + 1: "Hahaha! Ouch! Ich habe wohl verloren...", + 2: "Du bist ekelhaft stark!", + 3: "Da habe ich meine eigene Medizin zu schmecken bekommen!" }, }, "aqua_grunt": { @@ -444,14 +447,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "aqua_admin": { "encounter": { - 1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!", - 2: "Hahn? What's this? Who's this spoiled brat?", - 3: "What are you doing here? Did you follow us?" + 1: "Ich bin eine Stufe über den Rüpeln, die du bisher gesehen hast. Ich werde dich pulverisieren!", + 2: "Hmmm? Wer ist das? Wer ist dieses verwöhnte Gör?", + 3: "Was machst du hier? Bist du uns gefolgt? Dann müssen wir dich wohl loswerden!" }, "victory": { - 1: "So I lost too...", - 2: "Ahhh?! Did I go too easy on you?!", - 3: "Wh-what was that?" + 1: "Also habe ich auch verloren...", + 2: "Ahhh?! War ich zu nachsichtig mit dir?!", + 3: "W-was war das?" }, }, "galactic_grunt": { @@ -464,14 +467,15 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_admin": { "encounter": { - 1: "I'm one of Team Galactic's Commanders.", - 2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!", - 3: "What's the matter? Don't tell me you're shaking?" + 1: "Ich bin einer der Commander von Team Galaktik. Wir werden Zyrus' Traum verwirklichen!", + 2: `Alles, was sich Team Galaktik widersetzt, muss zerschlagen werden! + $Selbst der Gedanke an Widerstand wird nicht toleriert!`, + 3: "Was ist los? Sag mir nicht, dass du zitterst? Mach ich dir Angst? Gut so! Knie nieder!" }, "victory": { - 1: "This can't be?! I lost?! You... you uppity brat!", - 2: "You, my friend, are tough!", - 3: "Losing to some child... Being careless cost me too much." + 1: "Das kann nicht sein?! Ich habe verloren?! Du... du freches Gör!", + 2: "Du, mein Freund, bist stark! Aber widestand ist zwecklos! Team Galaktik wird siegen!", + 3: "Gegen ein Kind zu verlieren... Meine Unachtsamkeit wird mir nicht verziehen werden..." }, }, "plasma_grunt": { @@ -484,14 +488,15 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "plasma_sage": { "encounter": { - 1: "You could become a threat to Team Plasma, so we will eliminate you here!", - 2: "Oh, for crying out loud... I didn't expect to have to fight!", - 3: "You're an impressive Trainer to have made it this far." + 1: "Du könntest eine Bedrohung für Team Plasma werden, also werden wir dich hier eliminieren!", + 2: "Oh, ernsthaft... Ich hatte nicht erwartet, kämpfen zu müssen!", + 3: `Du bist ein beeindruckender Trainer, dass du es so weit geschafft hast. + $Als Weiser von Team Plasma werde ich dich besiegen!` }, "victory": { - 1: "Ghetsis...", - 2: "It's bitter cold. I'm shivering. I'm suffering.", - 3: "Hmph. You're a smarter Trainer than I expected." + 1: "G-Cis...", + 2: "Es ist bitterkalt. Ich zittere. Ich leide.", + 3: "Hm. Du bist ein klügerer Trainer, als ich erwartet hatte. Ich bin beeindruckt." }, }, "flare_grunt": { @@ -505,14 +510,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "flare_admin": { "encounter": { - 1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!", - 2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.", - 3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!" + 1: "Ah ha ha! Es wäre mir ein Vergnügen. Komm schon, kleiner Trainer! Zeig mir, was du drauf hast!", + 2: "Wir von Team Flare sind die einzigen, die die Schönheit der Welt wirklich schätzen!", + 3: "Ich habe auf dich gewartet! Lass mich ein wenig an dir forschen! Komm, lass uns beginnen!" }, "victory": { - 1: "You're quite strong. Oh yes-very strong, indeed.", - 2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!", - 3: "Wonderful! Amazing! You have tremendous skill and bravery!" + 1: "Du bist ziemlich stark. Oh ja, sehr stark, in der Tat.", + 2: "Es scheint als hätte ich mich geirrt… Der Sieger steht fest.", + 3: "Wunderbar! Erstaunlich! Du hast enormes Geschick und dieser Mut!" }, }, "rocket_boss_giovanni_1": { @@ -548,7 +553,7 @@ export const PGMdialogue: DialogueTranslationEntries = { $Wir brauchen mehr Landmassen um zu leben! Team Magma wird dieses Ziel mit aller Macht erreichen!` }, "victory": { - 1:"Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!" + 1: "Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!" }, "defeat": { 1: "Team Magma wird weiterhin die Welt verbessern!" @@ -614,7 +619,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "plasma_boss_ghetsis_1": { "encounter": { - 1:"Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!" + 1: "Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!" }, "victory": { 1: "Wie kann das sein? Ich bin der Schöpfer von Team Plasma! Ich bin perfekt!" @@ -2676,7 +2681,7 @@ export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDial // Dialogue that does not fit into any other category (e.g. tutorial messages, or the end of the game). For when the player character is male export const PGMmiscDialogue: SimpleTranslationEntries = { "ending": - `@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen. + `@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen. $Aber, du bist jetzt zurück. $@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet. $@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren. @@ -2687,7 +2692,7 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben? $Wenn du dazu bereit bist.`, "ending_female": - `@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?! + `@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?! $@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast. $@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl. $@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet. diff --git a/src/locales/de/move-trigger.ts b/src/locales/de/move-trigger.ts index cc5411af339..427ec6acbde 100644 --- a/src/locales/de/move-trigger.ts +++ b/src/locales/de/move-trigger.ts @@ -4,8 +4,8 @@ export const moveTriggers: SimpleTranslationEntries = { "hitWithRecoil" : "{{pokemonName}} erleidet Schaden durch Rückstoß!", "cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!", "absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!", - "switchedStatChanges": "{{pokemonName}}tauschte die Statuswerteveränderungen mit dem Ziel!", - "goingAllOutForAttack": "{{pokemonName}}legt sich ins Zeug!", + "switchedStatChanges": "{{pokemonName}} tauschte die Statuswerteveränderungen mit dem Ziel!", + "goingAllOutForAttack": "{{pokemonName}} legt sich ins Zeug!", "regainedHealth": "{{pokemonName}} erholt sich!", "keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!", "fled": "{{pokemonName}} ist geflüchtet!", @@ -35,7 +35,7 @@ export const moveTriggers: SimpleTranslationEntries = { "isOverflowingWithSpacePower": "Kosmische Kräfte strömen aus {{pokemonName}}!", "usedUpAllElectricity": "{{pokemonName}} braucht seinen Strom komplett auf!", "stoleItem": "{{pokemonName}} hat {{targetName}} das Item {{itemName}} geklaut!", - "incineratedItem": "{{itemName}} von {{targetName}} ist verbrannt und somit nutzlos geworden!", + "incineratedItem": "{{pokemonName}} hat {{itemName}} von {{targetName}} verbrannt. Es ist somit nutzlos geworden!", "knockedOffItem": "{{pokemonName}} schlägt das Item {{itemName}} von {{targetName}} weg!", "tookMoveAttack": "{{pokemonName}} wurde von {{moveName}} getroffen!", "cutOwnHpAndMaximizedStat": "{{pokemonName}} nutzt seine KP und maximiert dadurch seinen {{statName}}-Wert!", diff --git a/src/locales/de/status-effect.ts b/src/locales/de/status-effect.ts index 997d005987e..b48bd468626 100644 --- a/src/locales/de/status-effect.ts +++ b/src/locales/de/status-effect.ts @@ -33,7 +33,7 @@ export const statusEffect: StatusEffectTranslationEntries = { description: "Paralyse", obtain: "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", - activation: "{{pokemonNameWithAffix}}ist paralysiert!\nEs kann nicht angreifen!", + activation: "{{pokemonNameWithAffix}} ist paralysiert!\nEs kann nicht angreifen!", overlap: "{{pokemonNameWithAffix}} ist bereits paralysiert!", heal: "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" }, diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 72776c40e88..5b156afd331 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -128,32 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = { "rocket_grunt": "Rüpel von Team Rocket", "rocket_grunt_female": "Rüpel von Team Rocket", "rocket_grunts": "Rüpel von Team Rocket", - "rocket_admin": "Rocket Admin", - "rocket_admin_female": "Rocket Admin", + "rocket_admin": "Team Rocket Vorstand", + "rocket_admin_female": "Team Rocket Vorstand", "magma_grunt": "Rüpel von Team Magma", "magma_grunt_female": "Rüpel von Team Magma", "magma_grunts": "Rüpel von Team Magma", - "magma_admin": "Magma Admin", - "magma_admin_female": "Magma Admin", + "magma_admin": "Team Magma Vorstand", + "magma_admin_female": "Team Magma Vorstand", "aqua_grunt": "Rüpel von Team Aqua", "aqua_grunt_female": "Rüpel von Team Aqua", "aqua_grunts": "Rüpel von Team Aqua", - "aqua_admin": "Aqua Admin", - "aqua_admin_female": "Aqua Admin", + "aqua_admin": "Team Aqua Vorstand", + "aqua_admin_female": "Team Aqua Vorstand", "galactic_grunt": "Rüpel von Team Galaktik", "galactic_grunt_female": "Rüpel von Team Galaktik", "galactic_grunts": "Rüpel von Team Galaktik", - "galactic_admin": "Galactic Admin", - "galactic_admin_female": "Galactic Admin", + "galactic_admin": "Team Galaktik Commander", + "galactic_admin_female": "Team Galaktik Commander", "plasma_grunt": "Rüpel von Team Plasma", "plasma_grunt_female": "Rüpel von Team Plasma", "plasma_grunts": "Rüpel von Team Plasma", - "plasma_sage": "Plasma Sage", + "plasma_sage": "Weiser von Team Plasma", "flare_grunt": "Rüpel von Team Flare", "flare_grunt_female": "Rüpel von Team Flare", "flare_grunts": "Rüpel von Team Flare", - "flare_admin": "Flare Admin", - "flare_admin_female": "Flare Admin", + "flare_admin": "Team Flare Vorstand", + "flare_admin_female": "Team Flare Vorstand", } as const; // Names of special trainers like gym leaders, elite four, and the champion From 491f801d1c5b636942adfb9b58edfe1fb02d4c42 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:12:22 -0700 Subject: [PATCH 151/321] [Refactor] Use `tagType` instead of manually passing `BattlerTagType.BYPASS_SLEEP` (#3338) --- src/data/battler-tags.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index ce70240df8c..94df265ff5e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1747,7 +1747,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); case BattlerTagType.BYPASS_SLEEP: - return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); case BattlerTagType.ROOSTED: From fdf20837a6943a5dfc64b126ef7232824129b12c Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sun, 4 Aug 2024 20:12:42 +0200 Subject: [PATCH 152/321] [Localization] Small batch of French localization/adjustments (#3339) * Update filter-bar.ts * Update trainers.ts * Update trainers.ts * Update starter-select-ui-handler.ts * Update starter-select-ui-handler.ts --- src/locales/fr/filter-bar.ts | 8 ++++---- src/locales/fr/starter-select-ui-handler.ts | 12 ++++++------ src/locales/fr/trainers.ts | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index acbb34e18e8..8e2c1a53afa 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -13,12 +13,12 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passif", "passiveUnlocked": "Passif débloqué", "passiveLocked": "Passif verrouillé", - "ribbon": "Médaille", - "hasWon": "Médaille - Oui", - "hasNotWon": "Médaille - Non", + "ribbon": "Ruban", + "hasWon": "Ruban - Oui", + "hasNotWon": "Ruban - Non", "sortByNumber": "Par N°", "sortByCost": "Par cout", - "sortByCandies": "Par # bonbons", + "sortByCandies": "Par bonbons", "sortByIVs": "Par IV", "sortByName": "Par nom", }; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index ef685598158..c49c326385f 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -35,12 +35,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "unlockPassive": "Débloquer Passif", "reduceCost": "Diminuer le cout", "sameSpeciesEgg": "Acheter un Œuf", - "cycleShiny": ": » Chromatiques", - "cycleForm": ": » Formes", - "cycleGender": ": » Sexes", - "cycleAbility": ": » Talents", - "cycleNature": ": » Natures", - "cycleVariant": ": » Variants", + "cycleShiny": ": Chromatique", + "cycleForm": ": Forme", + "cycleGender": ": Sexe", + "cycleAbility": ": Talent", + "cycleNature": ": Nature", + "cycleVariant": ": Variant", "enablePassive": "Activer Passif", "disablePassive": "Désactiver Passif", "locked": "Verrouillé", diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index 98bf8cdd2fb..84d49eba549 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -152,8 +152,8 @@ export const trainerClasses: SimpleTranslationEntries = { "flare_grunt": "Sbire de la Team Flare", "flare_grunt_female": "Sbire de la Team Flare", "flare_grunts": "Sbires de la Team Flare", - "flare_admin": "Flare Admin", - "flare_admin_female": "Flare Admin", + "flare_admin": "Manager de la Team Flare", + "flare_admin_female": "Manageuse de la Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -284,7 +284,7 @@ export const trainerNames: SimpleTranslationEntries = { "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language "maxie": "Max", "archie": "Arthur", - "cyrus": "Hélios", + "cyrus": "Hélio", "ghetsis": "Ghetis", "lysandre": "Lysandre", From 6f82d9c96cc36eca29da677eb5cb3e445f9abce8 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:27:37 -0400 Subject: [PATCH 153/321] Update move.ts Mark future sight and doom desire as partial --- src/data/move.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/move.ts b/src/data/move.ts index b8593ede356..c5ed3dc5575 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6645,6 +6645,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPDEF, -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) + .partial(), .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) .attr(StatChangeAttr, BattleStat.DEF, -1), @@ -6933,6 +6934,7 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) + .partial(), .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) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), From 84d89617edee50faf01024dfb3341e7d5d7d9de4 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:33:54 -0400 Subject: [PATCH 154/321] Update move.ts Fixed accidentally added commas --- src/data/move.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index c5ed3dc5575..13282a1a3d1 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6645,7 +6645,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPDEF, -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .partial(), + .partial() .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) .attr(StatChangeAttr, BattleStat.DEF, -1), @@ -6934,7 +6934,7 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .partial(), + .partial() .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) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), From d27e764e24919a4f63ee5df96cba435a253b7ba3 Mon Sep 17 00:00:00 2001 From: DustinLin <39450497+DustinLin@users.noreply.github.com> Date: Sun, 4 Aug 2024 12:14:16 -0700 Subject: [PATCH 155/321] [Bug] Adding check to apply attr on moves that dont fail (parting shot) (#3195) --- src/phases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index 3c4d7f1ce44..362f5f22cc2 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2998,7 +2998,7 @@ export class MoveEffectPhase extends PokemonPhase { } applyAttrs.push(new Promise(resolve => { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && hitResult !== HitResult.NO_EFFECT, user, target, move).then(() => { if (hitResult !== HitResult.FAIL) { const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget(), move)); From 0572ac4b9172ef9ab10b377e5a2cdb62c4028a44 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Sun, 4 Aug 2024 17:53:53 -0400 Subject: [PATCH 156/321] [Sprite] Trim Skeledirge back exp palettes (#3350) * [Sprite] Trim Skeledirge exp back palette * [Sprite] Trim Skeledirge shiny back exp palette --- public/images/pokemon/exp/back/911.png | Bin 3185 -> 3443 bytes public/images/pokemon/exp/back/shiny/911.png | Bin 3181 -> 3443 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/exp/back/911.png b/public/images/pokemon/exp/back/911.png index 04010c67444de9fd9e631ba7a4f2d57c4cf8df9a..a15676954fc2a14637bc73193d884607af0b9beb 100644 GIT binary patch literal 3443 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 SXO08_0000%qwlRi!k*qOf7+Yp!iOSyKm5j3Q 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 RGy4|=fLUC*+;GV&@jn?Em9hW; delta 3176 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 Date: Sun, 4 Aug 2024 21:41:29 -0300 Subject: [PATCH 157/321] [Localization] Update Portuguese translation for filter-bar.ts (#3353) --- src/locales/pt_BR/filter-bar.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index 0c6a8e9ae50..01f37f55eab 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -4,19 +4,19 @@ export const filterBar: SimpleTranslationEntries = { "genFilter": "Ger.", "typeFilter": "Tipo", "dexFilter": "Dex", - "unlocksFilter": "Outros", - "miscFilter": "Misc", + "unlocksFilter": "Desbloqueios", + "miscFilter": "Outros", "sortFilter": "Ordem", "all": "Tudo", "normal": "Normal", "uncaught": "Não Capturado", - "passive": "Passive", + "passive": "Passiva", "passiveUnlocked": "Passiva Desbloq.", "passiveLocked": "Passiva Bloq.", - "ribbon": "Ribbon", - "hasWon": "Ribbon - Yes", - "hasNotWon": "Ribbon - No", - "sortByNumber": "Núm.", + "ribbon": "Fita", + "hasWon": "Fita - Sim", + "hasNotWon": "Fita - Não", + "sortByNumber": "Número", "sortByCost": "Custo", "sortByCandies": "# Doces", "sortByIVs": "IVs", From b6da93a092f01fdd31e1013ea183dce24b15484d Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sun, 4 Aug 2024 19:45:29 -0500 Subject: [PATCH 158/321] Add ORAS Champion theme for Mixed music (#3351) --- ...mpion.mp3 => battle_hoenn_champion_g5.mp3} | Bin public/audio/bgm/battle_hoenn_champion_g6.mp3 | Bin 0 -> 1600745 bytes src/battle-scene.ts | 4 +++- src/data/trainer-config.ts | 4 ++-- src/locales/de/bgm-name.ts | 3 ++- src/locales/en/bgm-name.ts | 3 ++- src/locales/es/bgm-name.ts | 3 ++- src/locales/fr/bgm-name.ts | 3 ++- src/locales/it/bgm-name.ts | 3 ++- src/locales/ko/bgm-name.ts | 3 ++- src/locales/pt_BR/bgm-name.ts | 3 ++- src/locales/zh_CN/bgm-name.ts | 3 ++- src/locales/zh_TW/bgm-name.ts | 3 ++- 13 files changed, 23 insertions(+), 12 deletions(-) rename public/audio/bgm/{battle_hoenn_champion.mp3 => battle_hoenn_champion_g5.mp3} (100%) create mode 100644 public/audio/bgm/battle_hoenn_champion_g6.mp3 diff --git a/public/audio/bgm/battle_hoenn_champion.mp3 b/public/audio/bgm/battle_hoenn_champion_g5.mp3 similarity index 100% rename from public/audio/bgm/battle_hoenn_champion.mp3 rename to public/audio/bgm/battle_hoenn_champion_g5.mp3 diff --git a/public/audio/bgm/battle_hoenn_champion_g6.mp3 b/public/audio/bgm/battle_hoenn_champion_g6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..16ef20a5bea6627f5266bb6cf89a036f197340ae GIT binary patch literal 1600745 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

Qr|Gk&DXZri(-1})5O-z=_WR^fm(bu}spb7++ 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 z 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 z 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 UlVH@5 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

}CEK=ljwyLeJP60g5Z2d1seYV|7%~dWT6& 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 ys$82ji!K|&zn3Vd{-gO&o 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à*OB+3CLh9@ezld4o+8 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

|GWq0Rg(?gIQ%J6@^1?4e`JNHpv|)NG;fA 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�^UEEr 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 z zvX3x?hM}1me$^m#`LRfYFF)zG51-ai%dQ0%>xU51vp~7Ku7unX-B@E~T(WL2c;&-h zsj9+$Q-e_`)(~55ne9*iIUFG#o#9Yg;{B!%|25z1wQQRT}Zf$~m?yk?(8X48D)pEj7#n6SKFLpHPd_0uq zMMcWAa>x#0933Ml$Wgi$n(C|4$^W5Vd@f)w5YxP3Flg+CMh$qfD)RBjn0Xw7dhnegccG4+0IHt0!zj-H&+wv z@ysH!*9v)q_K98acnHGuEH}z@YNjrC`TCtm!&(_frzViNq0BXRhMJNdHi@6?^qXGD#!NYrvhvM+qy}joG6gqZP-Ckh~>#Shn9dqR& zzYk{GrdDdKVfa0Zn=^Uv<&Dk8W#0vC*-z$3oa!!1ZY#3EPw#Dg>q$k76xZwu>I zcJuk{2aR(Xi8_s*afyw|i;B3X)YzJ-ye+ktL(wWPU|6T*@zQQh!BIVv)0tPR5|O-g z7PmPKC5=*LLcGyfA23>gMqC!|pyFFe3cej5Z3WF*6aIE1#%h>iUEjFF$yK{~?}~7r zEjIgC67sVbx=j*!KNYY5w;rn|Z>A15L;3k6iJIYTQ9Q-!H2sL__`UeI3~T9fDTsTg zE0BNVH-%i=3U4m8>-dD${lk}&ghz2g(OI&crI7@>NLdL4%H^1DMP)s?Dw<|usTvR* zC3sAQ#^nC0Z(8G4jP09mm=I{SG<=EDRIW5Y)Kn*DKe|Ja>|OMR#fiI;6w%bMTI9(1 zej7HGgKAxwFVMV`ag&lxPXu6oEbj&KBz++Rw({$g_{x}@|M(H4+j3}S7P{3Tb{9?F zk>VAcaC%6atf(v)(vpAyPx?ufBj(HM@|WQ5GQvOuKCQM`3(gNlmwSR69-{!$d&sg# z*>ph7PvmX))wo6kD_D5Elnd=*=h@hJs~5_JWs)%6yB1nO(;cURIMXESZ9dM^iW$?Ig^7%jI2>x2H9Mu(@&50S1>uZ9lf6|%4dIlJ&&XPb?s{JpT zMC!Er6Caw}6XAZohQ@bwgE1=QcD32zw$9P!xPfn9s}X407LWJ@8UN@-mQY)IXdUP) z^JYYlJ`h~Yj%&Dd4SB$(Eo_J^X_pIzR0rG*qFu8pPVfo`4mL+}h&-(_Xn-u#SpQQy zmHWd{Y7LtkGM*@)1B6V5iA&T7orheCqtd@~k-a##u|*j4P<9%4H0OFb7!RWVkkw5w zs`TJZr(MeZZRCSBhp@_bT6vdn#?~XAEmi}iKBrX4WUkNe<7u?R-Nb=$o`zrOB2nT$ zM~pZessb_1s97q;miKbFs7yq_Y`QqP(Jk=A4q5s0Y#(MSCer@XDwSga8z3Pqt9l5^ z5)9gW_2b9XPhRyXrb7il-!;o;xbE<8=-m&Y++n7F-(R<5w0uiiZ}p!2Auk%8VL_=%z3mf#*$+NokTbf?qY1Lq zgwMjr(iLfn7~iC*;dTq+JXp^&cpXdh^1HlO6=n6^dfrA-BWRh`-3lvO%Se0Xl1moZ zUyg8NTfwxanYudRb%r7R3uS2Jh9Xin(gZ=8`W!82hPxBTp< z+@~Soop`Zn)uEI6{u*GM(aiU+FCz+IMHJD-j!D2ZW0M&!>ak$-_suYY(86AL2*0yyV&QpJ@ z*B3g(xEOSVwA}P7;BcHP3yMuQkvSqY`-&%zg)f4%_DYa1Xldmp;nJ4MC?~-A=L+cpEsU_4gbU?T@7{^T2Ke6sXuG1 zloyz0Y_n5<4<`d-D-v1da1q69{w%@$IiHS&l*Odqza}LHhskq;lfC~dnSm3>!qzDZ zTb4YOmWHQ;zmoq2WRnQ6M6(r)dyn{E+rRpO`E$%*?|V#S^7geXL8cLo&=h;?%VwDW zzYeA^VD@E}p!{cxxwTDDpi?I2;Z^sn7pHx777K`m2>#c&9Ab|#3VmB%I5`QV19cno z6erER`AHzteUy}5&L5EVV;MDxpSLh4>i#H-Ef!2<$&5@bhcTujE5WR`E<9SKFg{_) zOkZRE8LwIvgM(^N5q>ohXE&Dkn@sx`nyScP(P|iF}`7{i=6%{zk zIOS|4D#-^LB35oZB`eSwNB9K@-0sy2#hW@iKbm7=D@(eW#G{K~Lt%t3{Bnn;;-TIz z7JaTi10nfsq*m_hhtVXUFb{53F%3tCV6X+2sw$-k*d)34G6%b^NmB)sUArFm)cbR= zc^to#Yf{M%cfBFo0$@gjCImTl4h!yO9Hqwnv<{J{glPFdaz6iJ!kY6rHg=@5QEq)% zKn5y3kRLp{IN3@Yt>5tSGG_3-ZFS1Cocx*p?W5AN^Y(X9Nh?;LgmfOu`~4rDfR?bh$>rvclvvuH@h+ z_Ymg|c)c4UNI%{t4xbJh^H%8-Nzqdt*8T5&<~$g2U3c>WRZ2ck9@c+gd}LHh>r2|z z>itr1dw9ZQtp*njlO`g=ZN z#(22`N_{9CSGAo58(Oi0I)Rv5+(}o&qo8l@E>;S^-eXv3q(FaCM)Czq7fj&v9QZ_N z!@g%#7%!$<9Lepcc|{p08f>@4`}5tCg8X-n&iho<7^@E)g>LlR8)ZK#zs8}k^vd7Q z40V$FS^WAXckn2=pI@z6yhlBQg34Xo;l{l*x>f+`<*moWkK)qRHEodc!! zv!6*_>@+PMNKq*{u_CC(;vu3AZKW@pg z%gesGvooek*Yt$HHirhdn5gljz12zE1=4Ds^K=5%04WO$AEww;kI;ScO*;$ed)72E z7!-JmtyfUtyKMc}>@0cC61nB(L6Yb(R_WGSPeCQ}*tdu0M8jjk)<tACPYKU@zTW&;Y`cB9c^<%_XLDsT z{*wd#9>4vb@GlPIM3SE2cR6@{fOQNn72mca6GRRX1#}LN6&D;F9X>QulwX^3-OeCj z=T;(oCEIgrx2iYfWM0;UzZ8~ZIlkfOIdhLLFFxeE|6HiO(`)*LgiSt_Sz)wDQMpDm zV|OPU1$CN!p(`WXG!Cbne#D6ce@`%1Ti_@+J0eD#ZY~yI+`fAvo5Ci=9>QdvJZV>B zPf|y26lOGspbF226PD(x7^inoQzZ8VC+^fpARxXmX4daUe~EJ9V1tK^o1DQ;us)m;4bsX+zf9f3C!>H-dt}~?rfjHhp>Nb?n`+}+Db!o^3FC06gnOiW3 z5=4qi`yc8_1)>xWWk{qn#jkbDP8ZjaiQXkKS&DaYaWK%HjKJ8rO#tLf;v%mBpv6naD!lp~`0U@F%$HmIwq8;HW^63Fu-!PQ zpfces9S}7jVYmBO6^1tK(w32l9}3SEqbgJJMa0%bh%z{{IheZ*wQ8p1ONFl#12G91 z;xaEDJnuUaFG2^`a;0cHZIlaHS&9tIg1OCmob9Q944(;K&Inyho9PkPThb=@KYF(XHV^-L7@iXjP#}VSv zFCvgTZWAd@%MuTK^A#gju>vI);2Fj$kFL**ZNd%%xRpP!XJ*2_rM=awTdMK!LQ%5B z;bNVrv(i$bO<(icb5~oGdW2AOa9UlnhB^(28Is}A3DW51eD<;c< zy=s62v>8%`9`X)U{Z~OkHBa1$^zp7+rcs3(;Xf-2D{Q{jEiekAX9Qkb;sNqQGUX`b zKV6F59H|x#gQKcxPsjRSq*bw_@POn~-b_T7V2sgy}3m#^SwXFvo?Vavm;=cR`-&Gnegh zL9a3F`nBIu+p;W^-oY&!&lgt~svt930Xc{PURjlpM)K8bXq{$7sWpxZU%HM>Sy+o) zTQhNRS-3N2reqW?so3F-e!JGCk|^({Dn1`6;7E@r9qxWLv!Fk0b-@mu2Ig3Vk?t|s zwX>yOJ>m?uwLqUdv!@at{4fXf_AC zjmAYzRJ7s=p_AEJI+~lt!bA=)eT6RIO~{e)1v>Xm&|EWugs34KJ%K2-Z+(TER_2Yd z74|sLCX?vvY`nOe96Lg=6m>1lei@h)L}&9(nwMhqLMg`5Qx*V35ifE0|N3Fj)pQ3+fZxpEqcoP zYxyuG&}yFIdm|{NxGv@M{wi9Qn|1>rEH>K^DV;APmIB_wOjke`H>l9`Q`pbhUu_do zt=f!|a41rE;ydb9VfQZuCj5^=pKQLU890%bT_@>dLP^GSh z04|(Mf*CI)Vr?fBM{s2{l*7u`bG=d1k>z$#7?IquzV*8^T!*iiu$-Fe<%RWuVG z<|}VScV_!`XDf^7wHZ|iH%&Shkd|k=L?JX971C$(o;!|M6^}R~6|1QzD)e}&F!>lI z)aLkk57@!Syj24oDv=etOJ}#8L@jQgXqy-CLpZsSWt;M@X*af|u0A)dvXYKwTbC<|xsFUPvzuS}&O0;Lu%ifmyuj~F$dVVfFz@7E7?Jgv^F4*GUXRk-GOLOiK1 zC8b+ebm~LnWy-?ka$QeZZdCmL`upVE5i97z}ki2R=)26}a=;YZkD*e!6Uy)x` zFfh9icBftSDVA9@Ps=t`$;}B2dX?ONi^r>{iQn&mNGU7Bk_$_gYcV%_mrnxAJ*&=C z_n?s>u$W|Y6>I!?LNKnR5O+s_xLr+@tJ+j&KunhUQwH#Qx;l2Xx|nx zl=NGX>S=ztcS{Q&4Vd#!OPny*q?C=NJZbQON^vHel!ssXA~sC-YvkFB4sEEG`ggSE zw?wH(uA|u|c*!1#nc2%LP)xbbbES?s|D(`csUs<$kHBrqTnEADFtj&`gHInypAxV? z+RLdYkni}8i^2gxr5Oh(jEo}Hr&Bmww08lDNvT!y#Un`|!zxorw0ENk5msQA&`3tq zgh~!UDP};z3(l}My{{TgjEzp7mc_4}PxUjISfSE{YqL4%c$rS`az;^$>;K2k+6xA- z>%z`2UT6$#zuq)DQROGhKg`j1_Evov5T2M5u`FJI#!vr?jd5MtG`v`oI!d+T6<|W& zn}m6Pd-_?k#Lj&%gG-r8Oct5&19kc+0O(wq^%)5i#?JN$mj_zV5zS3m_2ob07X07m zJW>J-lmhCu(CIlXk#}1wKuH zt?~?BVfR8_J#VuEQw6i<5|(+r>-zG7u_4A6)y0%&d6h$ociyR)REEJie%tm0=7hwb zg<^BBpP*V-okNE;Z z6a{CCO_wP~T!GmY6LrdjD8j0YgT2!%Ki2(t(evm6Pi!SkAixLpwWxPTWgRuO>EAp; zr$^F~GNP1Ub}aN`Gb{X<2Y12)7-Ep+<4JA9v$R(-yIK-PY1RRRzTUfL&yL)sH*9bh>Ecuiep*7ABzy0Lun6*tLniJ@rmSoW;Flc^`geYv z!U0rub^TCfn8RmC*kSs$>e|2k7t|V>+Dnh9oPIX?J%bba+g^L!A6cK5+Ms3cSqY># ze`3tkOjx7Oui?F35J%c~CVh~PgI1Q+*Rt~ubUr>XHW>zJjApTq8hSpB-9Qc|3IF`~ z8;6GBd2S<<{SJ=DOp`x;NykKgBo&1w9Zi^4#dP&!0;I%CQWTAUgZPbr1FpP#>p=*Q z$4~Z{`}=2e7Iotzhva%W1-XSuzV|_^H)+|#6xAt(T|VNR{OSk;t?n_UKRZ7{RcB@S ztF?Z&z4jEaO;zXJsJQVY?fu;gHz#&3EvJ;k#e5gDDQTOW>!gSw^znVQ(sa4g2)Z1y zsuogNxx?;UB^HrEU8uBG84Q03{WO@7-{&x}Ji;EI#p^$iSU-ar9I`W^Rqa4UprFfY z*&Yq|-@Lc?SKlPYtv&MtoA)1~Mz4J2=!tq+WDb2K=Y4ZprAAiQ2e;#Fttz;FzZoVe z=x7wVQA&$?I~+^H5!y3%sU(91q2IDuYdVYlXr1YryVUt&=lRn&5sSib z4F#t{bik$f-|J0vJEm12j3gfpV^FC$T&QzM%p#rS`TFFNxm)v=XN=Wxarpm=$8#qG zl|Lcau6lkUdNGPTc4`Z6rWvZ}PX0Mi94a$+~k=i}d9_ zP>D55OjBo@;&TGeX@>Au;0DfWeg0$){_tZPlqPv)tn^5Vs>WnlSViy^IkA$4J!8 zGaW~Ip={sjw?ruJ<(8Ay2X=JaTNwZOZa|3VIJGR#8 zqRhBkSh=k5+odu+)M;ec8{~$|a;-A!G>Q@SA`-+hDD5RQ(GW=h3Cue9ZWS0Y{gJtT z&Bze)aKR@b9*^S$M9LAC3YQXG}}s-`fdPEmm-vUW3XS_9RtqMl3VKfb>l3#Ch+^Tr4ioWqD|ntmF%AStLz+FV|7*MeQPr z5P}CJKkGj1R5jQeoP9rPoRInR^$73sTbsk92*2X46e*n#mxt~DhB-qWEgi3D7plXU>jSdVuULo&ZZ`f{SL_6BCR|w- z-69k9OH!6Z!zUxWL}k|c+lqk+ofUhquRAI&6lz`V(u6lg!ts+imghrnds&iL`hRJR zkk{dJotsmE+F0ozBj;s*am#yBI<>W&;(Yx+ZoE9x?`RvcUoyMJa+z?6fBDp4?QAJV z9RoFDGLMdo!3WDQQt+*MEBBC>?*-8c-2V^qq=qlcTgcEBoH7cp-gzZsVv?^q8@A>i&9W9I{eOxyg zEhOT0qS4;3b)L}D(km*Q7>^kjKloAxw(taohc={eWGzk62F+k$>LPz_6uY05xg1^zfK zuvKFih)3kl@idUM>QR{6EMx8~tc>_0dPDc1`aOFo_ixMrzjt@wA6bfRKChNL=385x zOS4&(6`aqOCR`9;TFa%}s(Ib$z&Zw_Sbpp$0rnXbPH?^3 z=u1jw{PM}stIybfK`hN_@SwL3U{$@`>rtE466h!)x0@ZEdz2InHJZ}JtPQmd@z69! zGre4hX=YZNg)Jw#XO?8O9u2AQwO-hNw2CG-pL_Byzact-YZFRL-*L4<<|m<3@ep7n zm8@b}3c9U~D;;>*u1p$lMKRRI3|dku%Ii*ZoHW?k>k^^-(Tn=UwRq)>1>ww=PIwq| z{<4eE0PmwYwLkjU-@im~X57Rav>@+lG=Sl?R838!%;6tbES9#*;HacePBhUnG6wnP z%4sSP!V3O}B`RhY`@miuO0b|KYE9$CS`GV#y9|S^rpqD+&&+b#S~8?HRa@ZkEV{JC zd9%~HPVbPhd-*VfoSrB;m|EV;#T@RAQ>Lh9jkB8RODy7&uFd``*&1pZ*cv&pjRb3o zDr&P>d;b1w!}5t5Qnv+t)+id)J??Ne3jmivQ@w_5K*jRw14OO-FB<0f2-EqmEiM6H zhvh^&F7t@yyfutD?24lpy4bUXYbu-6^yX7OgdGvc+2!P52UC^R`8eS|%5PFu3#*uR zO%Nr5TtHP_2oaMwH~`&KC1(}b0M!Ub&MePbranLV^Q%qixH697t5qTK0;2~QKx5Dh!N`TV%*Q`jF<<<5C&1mfQsP^rRcVvB)gn~eDzHugCT(tL_ zTrl?pJ~L0`Rx zhH`VRp2ES4td%|T7)aPFIw<*gd<5nt;og7+KKV>W0EV@;;8WSe@nZ!qpsM&`_t7Qs z(*RwuqRCPjxbr2;Tutgo!8x69uUebN*wU+)&9>cilh>$xARtG-I;Dm_%Z%yqdbHmO3pObPfrJ%fd3E z{@mB6Ci#G%c})WpW!P}s0EdXh<~xIhf4$~wSIai{O?t5Z?&-t4q43{C`Pa^8&lK`% zM^?R-H;#wWC>%dI(0z1GRj9l|_XOn2e-lWvf~Lkdt{nNuvBm&?rKkG{@motEvlE*T zOO&`C!Ue7|Pov|d;$Ct{r)Hmt!R`z2X_8FM+#HN-%6)In${C&kumtp+ZAHD|zbai3;8XkEA`M4m9qcAlpSbj*;9BLyWEI$)# zl7_?oy(5GBYI!nx`Jw}f5c*e9^lgT7`s`ByH=QsFQl@Y z3yoIp$5x;FusSaeC>gn$NtWfJ@0=j>W<4;sE8pTC!%>T(L>33F1#PnPZK#TJu`chU z{9MoO+jjQP_ekU9fBzPKa*#)JMTUgyQL3nru$Q5H%Y$ELg~vjDAc!oivsg*hZ@5_4 zda0QuIS&XdwXp=K8%)Qb(J2WBLCJTZbgqRg?z1ICfgk+;w(3Reu5!#SKvHN)HSY`@0 z(+~R@$5H3ll~!MY^JC?^tI>SGtdNQ~Ti&y|yM55jHhTZf^KZY#oVyn_CDL1nSziuv zyJDoBI9(-UA7?y>h!U-7!fGP+LR3P$G#nVrNTY14Th$PO>^LTeu(UEs;u6)*|M%MQ zm|na*Kyg;{hvf6>k3d+$h7bd0VK=)Mb<+w<9Op~C4X#4nS)PXti*AgUIS|UG@Z|}a z=LSF7o*J2O%P5mnQUHb2?6~71=U;z#g9CW!>G`p9?OUNJd@x09#a8R8=k z3K-X%4$m=s2D#HK;xZ0Xh&W!$n5uAeZ^T}QEsPBCFQi)yx4Q16u>&tp2)`Pa9$Ga= zEbQ15lX-@-^DIXOmuPr($5oG~t*2&K)T1;ZV+XAAl5EA-?_*=;W^4#8FaSeu6XGAo z8)|?U?qJjCM$R1Y_3Tqd!E2>yjzZ}waJx86ai(i2J1P5NU}5e%nU z?4?7iAE&2cVw4Egf6i1tcu9Gk`+pe(BQ68)%G1C1+!mi8$*+`fm zDMzp#{EftzoON={FRQNpOInWGiPnsqU+Ocr=xwSS0m=;&xjKZoIWsxKKfE%mf!knE zsLbp=(npL0oDHdW;78(T>xaK`JQV}Kr4MK(yE(owcuZH69e@(W#b-8|rTx?2vsOE3 zwghNt|9rbQ9HZHa1F51WGZNCqZeqU7d9e12_3HimzcBxsGwlDO^0-*U#;KS_d{R4d zw1(}kQT1gxiDu;TMmEasvNF64|K;!=Y!MLN5G;RGdMQ49iQdBRlrGiVw8BzYyj9JQ!24S>dR3$_eh>9ipa=wd+P?wfp ztKe8FuzZC!9s&{dAG;(F%?lDK-%{N30cJdeO%zj;bZlZRdjJi8|b^aa; z#-Qh@Ng8?C^b^LzNC^BDIBHaQ?eY923z_pgWps{(8ig@j{TPwa9UpUvgmGA84-Sqn z!LkL)w~YiZba%tzt14^Afsmj9}GjQJHn z=c!(JGWB{VCZiE)7Fr|X1D>0?u%-L`*OptviKByz%gKLcrW^E!M{pw&Q<-~qk-Q~_ z8p)>={=cJh96cKuP7sdL&KLkE6vq&UimhjU1gHt(0fvdA>5i|El{btnFd$5$L20Aw zMmE zWcCX}b)Qc+rjaka$lE5FT{?YGohlTr+co%A7|8RoaV<`TJxy(O8Ed1CpzgTywdF;E z05D9BhWqXqh%q1m^rq1bq2jD~$Ckd6lf}(V9{6%wH2iHbkxW#i`o!qOwszrL>GNfx zY+yPU^Q^PeY{m*&_nm%en$~H{Y-KY6{W|Gcy*Y9DC!rjtyV9qIW}fLt0RCZKE_1GD zSie*l3Z5V!7@tsvL`#)Y74=%5flfYG-(QO&6er^|P@g+fk4(iJHa&R%CE?Wy2Jq+abm1;@FWAKO-Ie+LUG2zxr; z1b-ATf(tft-yZzK{P_&mE`}rrM<`r*d8{(%Kq%>}DeM~6U+!i+l_IGn)0f1h?AU&K z<|tGb%0nhSTQ!-9fs^bhtDS#JeXo&p|8x8$3l$GM9AqzxL@||aX8)1+uRp-vR|T~7 z{N%V>tj~m#Y^;;iGXC}d`Ju2ZhyJL9s!S@fe6Fz5fjCJ+>OTbxw=WW9R$L5e0f?ALh5r|7tmg&QLRq|^-S^0@a+|4xFa`4U zxD2rI6}vn*f-K>69~+iuhHYuRJ+b8hnsN}qt@2Sf>Dq?k3ObbDtvAWLX;ADNHzQitfP^oTmPbB zXN$>GYB4e@#7ul7{n*7-&(W#sFz4V=2f{YjkOGYJ>KMS!a838|(mAqLFFU;#oBP_-nSpSqj`P+H8iaExWhmSxQScB`D{}#J-^|Om z{G;YyLNK7Wtg5#JX1QVogH2y%Y(k$OgJE*U-3Si-@rDHdrxfJ8p*(&|hH{)=hYenH zD`t9A%vHJmD{^~Mt1g)#`6XtcIee(RosTLC`;tj4Mh0{|l(P2+;r>fFW&0JM^2YK1 z=EEg8fF>+IkV*2~0(nNoV#FSM4b~sZmd+ZoVELj6msmU4WH2cV$1;)#s<|y`WJ}Lt zRp3KEt5%?SJM(pZn4|G!7g{j30Vo}BUyFGdqNk`w<2as4BmX(VElU3Ex&iMQqqAg^e=KS5n zyK-j@Dyk|ZqD^NnR53hrK6(^rDZNCT@!R6wouoydbJ8k+{^ zxO#D;G#-3h-DyOlFT=7z*b3TSacrI!c`}5V0%n=v92wb&iszDp#pLMC4=`3OILFo$ zT?Epbx_H0a5Y~Cyz0%x0I#sz%>yCT<@v5z4`aTQGq681l+lut1!_C5{FxNcqj823K_jJE)AH}=&C_9 zs6k>y8VO92Zsat1lxQMNRu~qQ<=ztWh&Ck7997eaC$oS*`mMV!@pw!$CDG2p=pnU4 z6z4YpTw(n|m%%8}<_XF}iHN1e*jj4sRe44W79p2kMPn%`E8}@;O>-O@%Mu=`+cm43 zUO}5zwoc0jV-c6x>LdT@gs7cs4Ux!&KGZItj0efJrZ9%`!*% z_urYeTR>}!iu%C^No$r;`s8)5QSrTT3^k+HCQg3cvE;-d)qH&*F}~b&32`U2a(cI# z+hGa8vKUS)g$>vk0c5C(r6wnqVo!#uKk^y2%>uOX0bRgpe!H_S&8xTY)Irl*FpGJN zN?7)F0|GOL_haTMu-HW89ZbfV!DN|($)-Cgw{xg&qnO|46<5cn-&Ve@H8t*ko3rlJ zjkI&Bd3+aH$jtQK>%iK(XUQKB8Mhb^Xgkv=g68{VDXmURgbS6FqVFt@5m971Vh)E5 zhld9pP<)v}N-U-mY=l} zTLI0H9aKg9lLrkkzJ<4U4L`i8Kw&=lYXDGLm~%Gn3jhTip`G%rL>ewdo)r)C7u^cq zkUg)N0y`#US$8_~dc>Qerl zS;6GEaDmRF%Y~`{EZZm$>WcQyl8A6Lhlk%^m&4rg7B4)aDT>fA`-v#r#k_vsW`93P z*nY|S-tEfz?*7FaC8aG6t+aSfjvFwC8B@ffC5%$GnlvgYja6P6_X$>opMg`Z*o$)~ zia+IFRD*dG^Nm-mMfhKa6yYgIPkaSBsTyA45--f_V8cRan@ekU`D z_LaW`Rr$_HF%68Z3(TLty(EU@y+8K8u&0*1pRn4VL5_Z8ro|Dy^R%_Z;dkBKQPg2&G^}zlAifmm!b9Z$7==isPZ1I@Gt;0c6J^O)1&KKe zS-OpwIX`n3{`rUiDsf1{w7qHR1S_L&XFHGF%cvnD3vMK2>`mt*PSV%0^|i)+p5J`i zm8B)e6fl!L9T&Z1NS%|UYM?Ud!MVXtSvyD)K6w+eJ`_?HR~gH~NOrKBAx1iL4Ux+B z**29s+1PHygfOkBl4_vGQDq^II6BwOfk( zFN#&ClD;eY|Mcep!ml$h_`iQJ=9SIr+(g3+;y-O%x>%vOehg12>iD8C7mh@3GUk3T zjMw*PS{GZuMkIcVU^)elGzgk%S+NVlZ_4?ea_>W@{k9^Xu?AVJ9w9B`+gc^Yj_bVK zujQc3ZhkF&w2ZHY_SC-%ImxqX*E#X z++jLvXNzmwF}PgD@WobW;)<`*F;%)xWsgQY>R~q~p@tCgZfYGS<3FYSn&HjT*3abbg(w>Y`%ySeMk7h1)L~8xpZYX*ATGvG+1@F}5Cfz@Z zW`wJ|41J9VZ^JCn4am9ioYK7$)Ki)-33cG5H*3T8N!o^l=9;k#*(X>E;6*8ZQ!bS(sIzP%yqiCGpeRMiDP_4w^69gK^D~x@}-o_7FsFL z?mKUFgKF|XFf<2Km^hi+0FXia=BNwnWtf^>F>Kvyo`RLB~{TBGP~)@2kkdtloz?VBAo(DuRqwTqZDCm_SSjRIM;bn3 zb#bUoBDh}q?PxqQ@Z(A`G#DCpDZk(CmASRbqJ`e(Z@sj2%dX7wJLv!1=P?=%6yWUE zN%@!`G4u~?J6>-szxQ#q9wauPz6v<3{JiV4FCAm<=L{O-_KxDyq@`&$T0y`t9glJw zPDYH#G-ulE311T%CGp(>QK8NKwrVrH(6*k*qe2RoF7E(LWXqRm)O3C@l$(fiN_ zZpRZV%2Ee6TON8Y^U!pdM_U3`ep(xf)X(b8Mf^#8KMyYGdNy?(48w|cDp<0DhVB1u z6nt&h?{}Bvb?>(i9xA-vl!}j%a+4!V(63&mwW2S@WF430=){{ElVKcnVlBZK;<2(3 z#}}9VZ%%LIGHG+OSSA!ve7EJIfyHnBVF~Ksp>^>OJr(W9Y<5;V%M9~g-_*r7Y$K-t z>8Xp(iU~ngOo=%e6S?;!_RD!7~X_ElUEdV$I>}+%pokIUob1biKolZP= zcGJK%CUtD@eY)MsX>=#*U8OWOg0a!?ngh_aD0Fulm!npUp?FhNcrT>YvfCW{9xI$J zu4c`@ycZ6auzX++{--|>ex012p}#z-dAPigGw8}t-O9-RhI;8@zq(GOH9@3V)V{9K zrTmCBO)G>bg=Do^F~&FNHVU<9^mHT5317`BTC((OZ;N7~BfawM)Q=Y!B)aZ5)?Ts8 zFVD4&r5_(30|jQ@=3X;zy3JScwq&ztoCMdn^p%#<;xGxybV0@DGE~4hzyt@BPC0x8 z2}(mGG&RybQ}u7=7g&!dd9v#&hNHBb1*2E(bM_9rK-RHsyMdcb5D+ZAzI+4){R_P? zEUdOfq8z(0Y$mkG*Jk& zJIUX#N2VU7skCVKm7me(tddVqbW8s@KGc_W&<%>mile^`OC+&jU;5?V+{IEyhKlcJ+($BC^QZwZXzBSpv&LG?4so36 zKWbyietg_jK#b1?2r$3gC2ZB`i|icK8DWFvds;YJC5MR+gQ7u7a60B82vO-`Zm#t( z77i9joiJ5Yps+x!VKu&`Y63ywj;kY`Qc!w#b1b&DrhIIAzZ6h?l#Axv(C4lSMq~Op z>t0&}*PwQwx0am(yZgt@RT&M|x3^zl2R^Jkt)m{nv|@%+ssZw_&_m%>)!`^lBM=0-v7)&+CUfwusPiBl ziDkAi=ssn_ESAi4n6fO+p;yOAB6WI%c=cl@Or3h>z;3g34)5RNzxCw%sd=^BSGK=9~S)Y<96 z&N4Zl9;|*nDHjyBBk#{q5@)k&wf?Yc*&#z=3Pb;0q@|(+zg8~1R(sdM<355ehubm8 z_w7RK^$K?v`AT>7#OpMD>Hc5+oCN^_A@f^iDL*&(8E30=PfV~4#9xLv{i%)_;(zZm zd`sv41VOFWWx16@{k)!#w%hpPh??Q3d9X~s>uoPNNtTSPx@z*w?%ZC$rCF^@>Ze-V zYOV=iBX(6o;aW-`Uv2oOVm2rl#Eh5JB56sBz|j~Dph4%ktoqbp%t+)p`oTdJ0bQmF z7VEVKmS>-2P!2{u!Y8ihv;MiHFM;9gu}6a$C!t)#EvK}Ejcv$3~!Pj)56 zhm9BQ3R<)F88)5D1O{WWWbUQ~axEt^K@vl0%9uE;h&Y)5^5*YdpFv(=xuv1MO5De6UG`VfJbQn8&bsZRQ^U`8 z_p+X%*+DkBUb`Kc8F`*Wal|g6Z(1K`!=-QA;~!7%Ph9%@Pv3v<*8$STpiECp6rhN( zWy85RDdN(V7sc|5FhNvtj*BU#%IqU1G(NML#9TU6Uo@^gU8WiO+jP#J?9KVeqOVgZ z9IYPFo&3L1^2Bycg7cc5RZv@J{`Ef){uqJY))h0?bR?6%s#%05#vY`8*w+}bnIZeZ z>>`(&fCVe$QC`qHb@3J_6O+(D`m>>XA7{H=# zFZ{11#}TccIberf+9+*cSaq6A0}IGL`N-Vp(&GZ;ptGN$&Ki#FXHo0UOqroScU_mG z*Nn#oer%! z2!{KWe8{-W8`Ju~LputZfLd=i!;lqgnzzAa%>0v%d)<`o&Nm$@3%2vavY~?(EIUQ3 z7^N*D4AJuR)!+DHp&{8?7MyTW+de;~Eupv(DoU)o^U3Nb0Y^o9@fr1o+_Qw%=&+=I zW)~zXI|k$978A5hvc|-=d3PuZ>mffgFhY?EzYcv%-WB3$zQf76yN@ppzvlJ7Qx>;H zjO!A01Jf8l4tw`5UhpTKbMkiEXEvTuiK&e&pJ{pWb57YfHWWXQxu@nyeah;N!>Ey5 z%4kiCsZ=mfvJjAvfMg_;dRxc|;lCCWIB+|0&b&kc;BPFdHfX!mga4s(udnjYeV1%; z^t!d$<>jZs3{O~NsF4UlqYJkpiuwvG{8iDs%6h_AEU&0WZ^jlPBSf%g8I}z zN{rd|&+7yc5*&moZX@&0bvr*g&TISQ1E;sUMhd6JWDEZz8Chbym|UEs-pz1H(Tqe{8Dmq^& zck}DJQ!Vu~ICgA;w)sXgtg5dUX_4V9QpMRrSJJ~);h{rhayOFByKEq>PcWjM{9`on zC-7&?_%QEX4&&bW-Dd3|EQ8Cv9@S#Q;kD$^vqmZ;|x1Vj7dFNMXb+OWN0(Z6A`@ON85j_J*FP z`o&D;`+;e+IpZzspzLXNq(4q0L{CYvjhExe!vPZ%zn8YD6&Xw;Ulr8C*20u3XSxLN z_tXu;a3c;XPPVL!@UWH{epzW`WkgrE={IeXuMV$lH=km?gPI*k=249(Z%4NCidau)xFx3CzDJH%XW`jyYTG)%yIT58=&~28yC;&tlrOg~X6Da2tQU!+yKwvtTG?3+VT->_&N_Z%S-Xa{(t` zHJ|E_O&naz&Hg~wXf3&>?ZJ{F7 zlO&)otsujyY>=}Xg@e)8EE&EQhNr?+qScA2 zhO~t}gs*!s3Gu(D#h-}fCTH#YK$iMtu+)+sts8Fo?|Zz#DRZfzwN&kvbswlS8%o{E zRv!%4C?4L-hm&S&*OO-zMJePDtroFPf$vJOKW9l!#iH)Dt_1m(_)z2Rn1Z1{*+Fab z$&AWKVj#-X1y>VQehZ@Yvv3^q!8<3h$@AokeK`y~XUOhRjlz?0C6f3v^Hr*Ggi`32sp!(bKbF*1iJi5 zG!C5XGAp>s$I_L)e=XBcVYA-5h`!lUa>$;&M#Sf8OAo=xF0sy(eZJJh)OGaWyQ(?X z)h-+N8y?bS7Uvd3AtEffVRc!(^`m5%RBt&ku7VXJZn^EF7>VEFY^_Gb#L)0^65wW6 zQn!?3T!UlS=4qr=GHf@dMx3SfCHZRA@VA}%*Gj9BRsXdfXW?jh^HrH}@^3o4q*a8) zE}~O_yab-OmA}l)kX-;?UF-DJJLyuajbjllMe$DVJe{+qE%R*sBH)Ct##1S?}sP z3HD0vo0e}pS7AoIMP%4Vd)ts7xQuMgb2DV_D7p;2t#n2q_a_j30wli`^1epl_5)oZ zo0yhVs|!HthkA7?Df_lB9k=xT!>)%cC0R{Lp;&q_=s$5YXj6G97>Q4HCfgCR!;*Me z-Ml^%me?@j@^q{G3tVPdc4pD^a>rq^gNg(&O4Nk_mLZqEkiRX{*X;r@Cx;KA)Gx zC61-@fcjQGB?-r`U*`?{nu`5_4S$_(jnBe&vk{UA=cnBi`dAdWnkeIV%P)P;gg@Ca zmg^)1b8+e|qw)mkASo;iIzTTZEm?g#2X%>|8v~=g!p4l*M_LfBYom^Sj3}X?BIvUYb!j5=5T&d5735K8$ zS2{!7w^?#bLoNEU%w?^Wd6P=&3Vin_JJ|>N69f%?s2@{a*k4_tRtoDH=+(E@-&`az z?pNm3!FNdSmtg#jMO*J!)+*;oD?64C?0Y06#zY5{uaj!`x@tFYU1;j@(mXuuIr%)m zw1Z?{hBa9vtPkBZbhH;6#IgvUTn7xRE1YsvDgWoTGA5?LV+F5|O(Q|j2HRM%>M2n+ z`LL*ljj~mv_Mb2L8eRSSS)YvD5uFW1MDAQS*3UH9K7rv8r1wwW)3O_t$Z#e{CO=M8 zl0SHx=xExrm}&E>FW8iJLe#2JJG@duS!zCrFE{_Ur@ zrp*{$3#`KJ)qg?yTMo9WaiZG3bRb2Py9FU&5zh=?fde#tT#F!6BsRyo^L8h&qj{Wm090 zmrIj0ivnFCb~);_Vmcz<5icZ)DyCY&W(lSk8$N4KWDdOPP<@bpYo6r=E3@xGWpee zl>wYzBb#2y%S(JLAa2d<9eu?`t)Km-@+xYr&F~)XD%2Rkb6x~$vZc1m-_2ecJBcp- z>BBJ;AW~27idKd*V2X*&a%2+o4YEJtUDAMnzk7j*Pw)&GenNbWCjvPeCP+o?g(rkDEg=<^JV?BL|Jwdo4l$L%C`H{n-n zno-AyMU{%hyV&!J@}~Oac)w4BO8MPPP(@0xIoqN`<=8`DNfn`u;EOZ?{qSuhyIdg? z{V-7pwz|Qi7IV$tEd`j4xiJ@sarLzKIq?&-C~NM!le>Lositg?$dD#|KEni7GI8~@ z;JB@r5z7P>)C(~?&wj>B%DvspZoDrmqwBb}XJ?v_(_JSf-^7u5C zw%S|(g=D^Pl}IW(9ZWc>u&(XxCg=(Z9KjXUQGtrw>U>=?F#q}s&d^?66&FpiAi7d< zZHut6uZ)1UUsTSp4xc`yPTH@6u#6=F*J97mEr8Rbr0EwU(C5y*UBfRr;nw8ftyYZF z;qrwRPxc99iSnXbqb8_w)gSi`^QP~*OmyG*fN3UmpXJobrVLRV=Lt?=XjDjLoCj79W zi%ggFDa^n`+s4BEmkUA@IIWkbZ#SYf-yF*8Yrj`Cy!#DAi>@m@N$ilD&5ko^twbwx z+lkeAg)fz2eiGC>Mv}A5(B^@`N#|Pv$SiJB1iXBWstgU*;N_mMT6po*C)SXYL8vJ` zzOKajBj7YTEn~SxP=cuOfOAD>0x#rixzK)P?P-O0<=py$gf%o>&3lyl73rdz^$~O~EmwK*9Ed*KI>QLzWL~t1)VA^19+}+Vc1Ocz>S` zY_Xn%Ln+Z1{U!BMB91^f_a~YHNhxDDsX6wDfe|OaNDe<7du3}xAs4DTRnTPEFV(+e zuUo)IS&Cr}!^%%s8vQkcc%+6pi&??1Cfzch0DO55UdLTBOA^ondEOIYR=n%R_}-5Mo9DOc~d zkOYuo%-U%&EEN{@{|>XIB9t*>8P3R#*t`gtU20WDN%l%JX~U{4e$md{l+j?rXemb^SfyDpfSfwyvnsY*K@6u=%b%J`9T$r3oL)-tSZ#w3nD*g)n=dISmtlm14&LO1Dpts|*kC#FwlmuZPdh7y(JK=34z>0!4IW%g>!E=AoZ=zB5 zz@0wcDw~sJ(&D1cps-|`!{hY-{MCMH6mC$`e>o4qLujuZi#;F2ApX?+Z`eCXOs6&$k2@EZ#BWu=2wEeQq^BWz^~qk(5SU(ejq zC!X%LR~g)@fAs^I|Fb~ykK{=-Tq^uc9FOcUn_Qj$-QRW>-1w%&KVmygt@e+1KZNEw zM9(et{s=Swe1chnJgkYf&sm~cOjq2SRpmc$fznFntc?W>m*9Xwl%`WV^^9Uc70`ld z+{yBT14v7}b=}SYzuYKqHyaURSa4yjZp;@L3@IgreKpjWWhcM?f{{w(TWj_)TKeX} z)ml6ysHDDqO#4T+zbv_J`r#=fmr|#oj!Fatc=tPf&-&Z-VRLKwFWG(@*}q#@v7|Hm zTwS%Vyr3Qio#?oRT~|7m2pB~zDW)W+@tpl_;{UcA#;H#zvm2Xb5v4PMAsVuz5-8kF z$ruGR{TkJe8_dmA#w3oY`{DPC&f|{?CyjE+L#u$-R0M`6$DBzOw+26*A1k%GuUC>P zVCKAR4>0`-LS_Aq7{TB87eQ%u$w zDBYW{W(^JDG(5#>{6aXKKh7uAE9oWLDJ>}Ce8cy8+N7>V8Q^}W9MER`IMG!LoX5%V zra@j#Xm8Wt(9rTP{%WKcTgsXqN5$c2dc4=8aj--BxraaDkOgn_yWa`3#djBgxr{-5 z9s;w82f~672Yfi=0pq=zm1|I&w%ZqipI<^<#e{Z4jucc0v8@nCFs8K|YDzz?^XH!G z9;ju?NCib0n9$TFNF48p=We>&yx*VrOyk_AMyWSd1h*He`VV0v%G1`h(}-B*vqqB3 z_8m?3M)xGvVOvG~>u(|XX!?eb`5V`=Jsl+fmnu-*6T+V?U6QW>--<*KuIfm^QYF`{ zLJ6J@$p(WzhioM)q9}W{U+AiaReP4+K)*W{bzf#@JvwfuKUT@!4jnQax=rITLc@iZ z;2B5Gym4G5)%D?s-U@bHEyc#hf3hH z{$9zt@`+NZMh+&B3{Rd9JNd$e+f#ZlEjZyO42I4(FV4%FvP^M!C$HTj4}$}M8aolN z>^V;NShr@nf3!?C5}J8QO3kKbmvTLW#>8z;(RiM)CMW3?dUDp$*1vX#7rV#o#RKnD z(i;ENh;sh&OTUw#{idA?L6w)2~ngwMh*968f z9K>z4%)|+Kl(Ipg5p}&40eKywNI@H1`bp=v&3s>*L7L@wl^);_E=vhpbl7$t8Rp&X zZAkv_|NT3Dh6b-FQis+Pu>)pQ{#gI`>cR^b)p)mW z5ollRVOsw1r9LgGhPYE&RoOc=4vqY2s-!A#IXFgUI5OeP+|A!JkWp$>%dC_S0@^A_ zndXrD>*0Dv;$c8R1F%uFz-cSI#&(4QfJy}HP9#g8_PgUQF!$<@NHPMWP6|t|rO7UL zNjdd_RPd4dwgVtwC8DLK0UpmRe1mjO8c8h&=?it`K^Z3==OGDo=dsLk7TLi_ftxF1 z(Kr@irlPKAiHO>nimT;Q;rAA3qDgmTcqocFZUcXP&=}&u{oLTiyQY;Hm0IX}5thHp zH6JRS-aLGJJ{}dL1i~9$sqWoywo0LNjUMy%8Yyb4D>)l;#4rEGWA|sl=-%p%a3@oc zwn}v0S|(VxvO)y?3jfD zhu&_pfRINn*u$J_Xogg};JELAhiA<-6H(BhJ_P%hyUErLVR1M}BjQ~Or4R7p={EU1 z&2D=Cj$ij~P|%c<8#gAFJX$lYrx?brwp{)08cItb3I`<_WDJB|G{X z15k6u*A#Ou`Y82pGcP*zyca?S<*Gzw;N{hH1$vsH8ySUpS(VVDv8GDn%3r6}U`S!|48WBR47P$xqEGsE4s+hpO*1?)79ps z(OLqU&W4EtDsT)IfdRdXKGfJyE%Q`jG~1CpMZ-TE$Lk0p$A?Orc*{(woaqoMAf)Nq z-bfbg(VzxGk+=@F1JWM`ub0@>G=fzdp#?sXoi%|q`hJQx%k>S0^XdX>$z@uM9M8Kn zs_UA(r<;v-ponmwH0O?or6d7-wqdyrW6bj?5rUte`)^110?X6r9_*aD0@m9`B?EuG9|Uk$kVIB&%%0`@it}+d&!48& zQ@^oNMN%|sYVvAjsr7|36^ixu2SFDOY&eKyy znjzegn!e8l{rAVsiV;F@!@FJVqV04cf4@G_Cot~R9-1NU=7m)5l4&G50cAZE>Y)Lm^*r;tG(E==ct;ZL@4|A zSO*=K7eqW!E2~JOcUe`_te1AIz;#_-`xMqECZ**NQ$s3edvHhgNeT-USM74VtuovF zc@dYAMNB1j7#-NcK;w~HGv(Wouqb0#QYZA-)P-N(LGI)T>)zC@5))Hd+m?<6@LRBy z<(wYo_^erwd@RPENnS&>Aq#KFw{TK!ReGx(XMBk<(o-ioAuO`hR6egOAyifWGbUp( zGD{HjMNog?^-3PG9Eve+C?u#_+H?_F3INEEq8?Ox#4W>x_6%1?aQ@MwdN8UptcSMB5U%c z3gz@TqmO64V6V7 z6J-d0L=AbS)6wlwshU^g$Oygwt^4_4caj~gywX+a1m;?czbqrfd#J~>^X%&Juh&kC z?38V7MTPv3BKA{WukqyhAv~(lM2ajG*NQ%>0j?6I+Gy+{>s-|lN+Up(DdvsT=jFgi zQI?OrrSMr%yj6sOttGT9Jnm8^pal*9nX0O}qd>FY%BNaEJLY=rRrc38KtDp}(U>q| zDJ2`$Ggx%%csvya_uDIQ69*drji9(zMLP`4`QfiqJ^z!V^Y5r!#eBU*$!X4WmuR27nK=#4k z;VBkiVlr-CJ+MDMGje*h+#0hZi5n;PjUcZI{6w4m&SZ1j$#HjLly?GJf^V-9AGN$7S`-W^#2ko-7F=v@FYqlHm^%4u={p26JN7nGZsw{BXXx>qBu3cQz)J zEe3RSr8-n7|75-rig>V*S*$|ZW#c(w%6I+sTAbXw=!%--%Qp9sve6s?eP=NORFJKbUUCOjxE zy}7KX-a;HvqugQw84=}b%QJ;-5o}6BK5Ozz#{U)96F~Ds2X_5DqoBLCo;9lU)b{Dp zp@NcUz*ljZ0R$-xcEj+Ja;gCk374rmg|=nhi1)|an-s@FFp?yWy}o1vlg;X_6)U5Y zz4kY81uVA7DxMn{Z=|cEq{*E@`6T)tZQ4e@lbnmHvHH$PlS0O{kzugQmXW-p(lY%O z_v2?j-~I3#T-}YkTR)UTY`i^v8YU-ON3Z-=mP;>Q=IH zfyqMrLigfFZ#7Em&+&{Mq5Wt0D0!|f=X-T9z6=QB2A3efiB2?<&q62wC#aV<^15=+ z4S!=7nbB^u>q6h#ax$vw>1dh&5=unK_8Kbk1>wSoY_t#rz4Rybyhw^i>om7aPdRct zOJy}>dI&11+zL1y5HKH?BGd+_An56xx}<3Bnc=HKj?2%1GGc4Kwdm2!#iFpF*{7nd zXj6znN`w${UCv=!`%A(myI2yI0vMwOg~Uhnsa6n)=o}znTI)&gEEq4LGvUmIuisZ( z{id7D@HhqS5*RFor+`!~wP>J7p=T@CGA8rb1p@LcjS(G>t*Bc)k{rM^J~Wna+G+!1 zt{N{WMlNMu?kg$Xc4YaRZm@UcD{#muhKXcZ^uBMcp%Pef2~)MFlq8GVfxh}28e@?y zm2hjJD=jZDPSOvGrQb2v5J9aKYEyl+je0n(tgH>;oDuV}9#+B#IgbsFv9C5&IwY9% z@M7+r+Osc-l`U}3`(6yqV(Yxvm+=jR{-fLLM!7|n2^<}mf%m3wm`>G~u;MPN<`^-0{0MF1L0`DB*s74zk4!vUccF~AgE-e`eQy2n{D+CMwTEp= zaT=l9FOW`3t3EN3@!=Z~2wuxrsZ1$f;$pUy!k~c@WX#raz;GFLB^JFURHG4ItflKR)jk8VCh zXo3r7-_ezpXnh+BxJ=)03v49nn(AF=Jb!+IEceKCbFzj-l=!;pI~I}j5w?H&0O1=K zX+rKpq`NH?6%(x>V4{EdQ0xm;=?wq+TN;;(`;=;2yY`vrqNX=Bd6x+lH1tHDZ-#PD z<^@m7Jq^Y)XLKLkR~H#-X2)%Uf3_0bz}kdz^udP5oJ{hcRBISt$lIuWe67r2pb=;? zF^0sWOye+MiAvyT>9v%kqQ(lH5cHa}&cq!>mlhU!)R7V_#Z(xj#DoV+9|bCaGH4-{ zZ6#loDQSwd>8LQgxV)+_S@#sHO|Tg~lcPDLG(9bggl6lyOUtSQIxmg6R2+v{co-aY zWn(RV>5!5edmgyFXK>{_d!PDEz*6KhMqpR+cF*F5!eG{8 zD)h{>U=x2vBY^6YpERpD(6!3#&hIVpc!<|3NY9m{p#CpUIy%w!=GT>OBtbWg)8#tg zp(r_vxkBi*i{Lxa#XI#eO+WZXx9@q!@}vKmOQg!87zTygR!>tLXNaX|Cdruq*K(4h z@fgZ;ju|BPU#j9T?}DcMf;}h1=5la>(#|BHIxQa&^{T0?lj&0`$Hoa%mPpWyJ+qfU zIZ8Lv1FM(t5o&GNYwP!w6EQD|mesLvz>$VLo$;lO&49)7o&M&@8oHjv1K<5V?Duu+ zXBboKY7|b2i>jtj0YENPklK5CxLOS6gdWYRMosp-LBi)=+-!Dp4KuQ_2y8NS-+EqU zWzH;ro|w&kacqBQ^M!!;Bj z#}MK#Q|PpoUsVii8r}@r6^k~-bA&`CNAo35lzl^;~NYrLz{Xph%N6!``0}gLVS^}AcX>~KF z$Mb?mmHHA0x=5hP!f4m%I_%hiBtq=wZJ&gL?IY)XBJPu#3pY>|2S-YcmMY}Gi?N*d z8<}AMmQH!((hZ(rQ`s~xrPvqtmEIWK;~0(AdL6PzMv$7kR^8ooXvqnIMG-$evlrQu z2HVudtC}1+J0)H7q{8~#djpJ|<$Ya)eH|@niwEQQX?|CU+)Hc8 zI~WaFUrSC5vC_OgM2m^C$`rHNjuI_QdPf~goK%L%l4LC@U8bUF&Rui$sVVEr4;nYI z+=nTt)Ou4@0YP-+AH31-dp}l;yC+RQ_N1;c#HDz;W7v>>6(J+wgqDRw$(18%5eYll zwIp>wP5sk{r69nNp#el63>@t3mCZu@vBvBnd;`y+ro7w0R5H>9qs~y}I2dsp6c~MZ z_{0z#1bJ4{=|sskytrPcCugsMZ=V2Dk*Arg=hFdbSje?0V5Yx6KBkXCLyy8@vz3y5 zSNbY&CG3AxbSI`^W?HFhZQPuF+uFb0Hd&88uhy3dy%@FR(W@|*gc4U47@i1OSwx{+ z?l7ODKqzcpu1qKO;^2caNXMH}P+>ys@LP`^vOv)_z(jLvS->3XC7pX^oKFex`8Dku z^Bgd+YNGQ8js7flobOu;SMl=u%Om6ve_DfeT5rkB7Trwj$mA-cXbun;@S$&?O$T}JWbIDN^( zGksiY3VqN2^DB3uU>_j&At;i90Z2KJ{9IpkWeDGZ2DR#E4GSbcS6j(DlKiCJ%)!mN zhe%znw6N-<<;R@)^T=Jlq>AcBWO|~+;RVyzC951vmW;#!5R%hNT)w=-=CtlMr*w+TIe)KD9Z`DyjSq$ z0C%TbC}PFiIu4h`I4)CooIhd1NMLHtVU*e^sL<1tL-`gh|Ax|X*ohx8*gB@iFH~~! zSKqpsml(wqq-(wk$dmPLM+%&0FO9VJ+a&(z={&V-J6K(HoqiJS;clGlWX9!0O}1rz znPYXiOJOZ00{yAt)i(q7bDzupb^QFGp)*yUPlz#?o~>eDJoyL7Hc9gu_$S?T0W}^~ z?2QJ$MZ0y0q7q=oHyM4VC|K8?=Fr!c9zA5(QNc3oTYxz|A^gg_M#|n{wM>N4Tu3sv zn)>1@c$yB@wNBr9t&Y8Cjh*p(!DSqnm@oSIcI{zg`BpqDBC;`X*l*JQyG!8-_^jx6 zlki2Q6utGC)iQdDs^f~g!6*oEn#x9EgIPO5JLmxK3vXkhumo8se%0=JF`UY}_pO|a z!kA@e(;_yJ9|zSx{ek4a$LK@&2~u{!NIfPX`arccNPp6}U{*v1`MyLSCr^GIza*dQ zewL({$bPn7*OkniYHJR0YaA3e)nFqVk6NauN+rb&F0~%7O?a+m@_%IkAc1D7^ zb0|HFquHkt)r+BMNYr_krBiysZniq2$4c;{fGJWV*JI=?SN1Abt1p&1jh3r-m_26( z>QYCp57U<|`&JgR$1S~ueb?t@mF@GTyZH9rZrcv895&AT@#TFm$LNxEUwW(4biJ@E zt$1K}QaaoA4-Q1ON^>qX9e(MJrLk*Zcwn!}!Rh*W>aZib3KabZ<>x^{1x`aK22h(? zQWuRvqA6(n5gzE+jp>P&ZrQI}-)?1&j%%*Y5Vxg&MzXH^?DTQJ2>p{OTNG(ty04na&0|>ixRGsu`CQh zSEC5YFu-LxqQ@v146RhR+VbE zH9Ke2C)AJa)Y}dkl_OFG!=oiZZ30)RDi-NJ8kA75N_<0N$(V))`bp`a@fs+cl1+^; z7;aiFc)8#q4KWgg9%P@BSzO9bpYG;;1KhiGR-Slc&`z3(KzxsI!0z^UbPx5wnn$9#tBWSXcD0UfcWldk)a2af&mA+>Qu+VAfXfOS|%`&7?i6)kpEmmtJf%o zmLLo_x4cwCeiBhLMCSDhJVh(yqL7FMf(zE?K`97_2}l50LS<1| z;aVqf3ap{6aUs}iSaF&A_bKKmxVP(q6(_Zb+bME#ShJhbDCjkok?pqxVXy}v^5vEw zlkfVy72zV^VGH=A^9QFNGCC^f|NFFL{eT33TiN?5M0kBmTQ6mWe^K3SVeGLH3KFgC zJ(eOQ|Kl9BE;eFbyRK%@_eDlus=83yf7-^@s!qNbr+kZLL?>D z%KnHZc`%g~!))R8joTC=HJ`R#P+dGB8~Eb(_q*;Pf9rm{*Rn0$H>z!aE}xqI_8}A@ zyGDyg+-$#SCm;NJxWp3u-YBU~sgJKIL4uM=^8yh?6w5?7Ca6q>E_a5GfH^B+c+(LM z0F-b&*V7m-ijWHyEfJQJ*))lE;P~~0#Ko76PduAODrKKglCIm;B~;EE%lB10`LM@k zTu8Gw)#|WeSNqR4>6s!F!Fzn^YTuqSi={vB;}DOiLv2>0Do=f4@XXpJB|@Qe0i}zw zs**UG*ph@&lx0DLCnUTcWwKiJ{x#%P9=rh^8n8Nxt@C9nv8=dJF(8#%#%U=pT0|j_ zn$>FfU7f?qUDXCyWC+x?t``N*^>GeAZZn zRSk7fZXemjPxL3 z1ST34IRNMYmS`+G%~mMlG_dR4Q(J)(eh@O0WcdYcr?%n6T zMWOWxPPJ8=s0Y(l8pHKGq5AY7ii@3d|NFE=`v3$rT3LGuH7bnjYaL;UX%MArW$Zl; z!XT||y@nyY*SUg+{L*Dnmh?K2N3+)xp@%bkJ-w>+OMLgX*LqBO_;%x@c>Hn@k4G&r zRg}np7)2}t3pxUoRRANFhFO)n!XdEX5Gusn)`H3BnzF0FL?**>+i|8%>|&255Gfcs zc=5#mhfghbET9%TPK(a(kqP{3$E%h7e7k5pDwu5I(IszR<|wvryN={D>^nUaX8F69 zmd>jAnc=JdlI@j0Un$#vN?B-AF0`b9hz%iW7Ws8-q@!s(92qz$XbA=ukq4F#xL_r} zN$~|TrZVci?F@N6bW+N8(bbUx?3dd$R#;pVj}e?4sYINxlK9KEY%~zC8b_Dr(h`Ct zGFbR<0ii3+?S`GwF#}r^6rI-mF`w)<{VpHxGZ$Tcaqcbg?dvXH%x2Ax^xUUv?;DHw zaurx(=EK@bVF?s?He^BqOD#7;6&OcBz!01vZcvC+h0t0}fwX4qzEx$hHyNk&ZYf;j zMUY}b@7bdSnTqS%$U;hn;s2h&!e^q*IOQGvyM4;fG;Fb@3#@&$acMCa+VgDNkDvJP zP+~Q_v2eHl7K@+t+P<9@@B2Ad=l}l9FZQDBnzFa!f2-1Jm1I;vNjBxUAy5Fqg4qcR zs_hM(h8Ce)h>J@jVsU47403A9SsRN1I5UF7jEc;gN7V$}++Ouoi8RUjo8cxJ6-M0Y zF*zzBiS^vtmytNjnpM+X1koXTLhR#ML=h(<|NFE=_<#f`TUhG}G-!$oTRmZhdk_(8 zY3wA?BDt+?eT2S!5d-oz6htKrUanoR&|so9EUP^Wswk12=QSd#&<)MRbK(w%z&aF% z`S`~UJNqe;h=_=`&8hJb{O{?n5lH==vamci51HcMF!#A5Gb^~%vduk z&0ARF2pn{it5OFUXY5dhixMI&%yQsDQ;#ZYt-U(5C6+XM}?@djL16d?BL=XyXsYGCF$c%?zVH4~zMXP#~ z0h6&7wHaoyl7?Vg)1IysHD*{59vIqJyQ1qCp7_D;SvJn7=s;SH4`=K+b{=`wJ&FKf z$=13G6g#4a%9t+#qd5@IF2~#;)vSnAN%}-}TjA9Q{YK*$I}aUYmCOz_n@(LGpJ-@o zo91B$Btl^Cbd4g4XuF3%#F;SYLBcLr_z~G3niC-l36MMw3xhQr0*x0TMh6o?A_IEL zUS?EiY{OSI+mxPac`LF^s;f@-Hk1;{YkX_0)mNLs|NFE==YRvoTiI&~8{mRV8%<$` zTu{wtXY4TzDfB07^@NT2Nf?;eV2b7o3cYa0-S||{f{9X2lA#K7m)|H5AhD}JviT{v zm@lgr00xyZ-60!wF6px&5>sh9N^)TnAqIiea#S3MF!%sv+d>7p(_0wqcrP5DrJ*@s z)sf;B7UV0|>O*Md+GA82D0H;NMngQxUc46ANjjUnAtK#DAoofR60lOZS2 zstGSBiA^8{M}%q(<4B3IDO;`woULAXnSLHjdlz{Q5hSco(+VW_tGjf`z`(+=v+W>k zIWV9{B`uGy`mRW9VhISrklKTaOJs_9hXJ%(B>ml?`>t*vIgLn46Qx$UeztY-&)97( zGfjMsCJ9L<-!q~>8D+_m4o13#07Qz16vdTR)On!G-uuCHkr*~mni`HM$yjSph($oe zj#K)qxneY}7q^j3&dxPqF*h!+NzRmuxfgD0dy8qhs;tV}*4@ix)jz8!|NEpw_5cI^R$1!|Lt1%i zn_pogdrNbj@HltRzODcBhbP*#XjywsPgqPX3 z01cg^8XwZ6gKW{=r^#Vni_mbJl5-I%%Q4ZKcGWC;6ebVN_xbL25$wU*GQOW&QuGbe zD?b6v^541dKU`cKfkMip&tyU45wkO1p4C`9iIzewiDDZv4q}<2SZaMGQ^8XGhs*Ih zAj*}Y5K@A%PwL|Y6xveYNmPmm9*}d@MJCcM0|{WN0}OPhSc5xnO*N1QNDnzS){ zlVSXqK@qbFuFVtng9qmfHtS#|y*2f`y6Beo&dbzFX@8^F$v}*BayXiy=?t|HhOETk zvp+2f6_>fL;suk?fZ2daZlHq0GUeHXRQPZj;LG{xa@o$1A|4`Sw6foF_75HH4w9zB`D9lLMkdW}k3Cb}aGl)FM+& z?nEC4gF){UQinrJ5}dUK?nDwYmeMIdrkLaE9Ui%kWo>5I+xgU2fwtXr^L18OSBO<& z9hKY6D-Kx{k#t~~2OT4!@uH_vGC9jq1$ANO?CHB0Hf@6lQvyiU_buyC51;u_4i2&W z8HTxIi6MIqiGk3!n16?e8|OdREKk4Pvf>h{AWxLh1ntNX_R{Y*|7<5NtABz85#*)*O*Ip_iQ#Q8!WXepkF_@^>oQ6sNnodnI-Io^| z_xh{H>E?gnl8rdIE+utcjaDO!@O8E$Pd|K&rzKnR-|P2snBUcZe7~d`L}oa4B?44c zx6DRw%kZTmS2O@i?7{0Tlw_(!j;aw5C|3|d)s8&*(f^18eFh$)=U7!PON;DZ;8|V6 zp#)vWX(G;Xw6&cQNe`0-)e8tFFIujOiQuu>l^x=3a03 zh?%dCsH^;m6%`shR8mE4#fFmSn1YIss7eK@(z^;FPoV`ukEh6y+B&CZiSS#LDUiEP zh!rh6!A`?aj1W`VCcgn!hJMK|g`fL&OV;xAksJe-3)ugE<;!~Iut>^0D6_sM0ENr2v zJ3hjcTxGe$WkoG07bm!hDRe+IV12<$6Gq8RdAp>(@^m3G#h^0T70?%ce# zG1!$#Sc>}M605uYq{FC@%WqCeO)?_UvmlrNRf#MMBf0@2GE{&NEis@vLMbK4iU|(k zh8R3nI}DqP4@z%S;9YCL>#o&@mABjVTj>wKr+>(V5^dI+(hY(LEcWnXNj$TqCd{5F z-%eer!iU#yS90UcWPcE1iK~zjq|7e)t)haNcpd$4=NVL6QnDkN0mq#DGuF71P{&J-{RQ4^r5*cLd z2WC*2Lph+UNG*2>?CEE^NOR)2P855#FrWT9%&iSKr7z@^6(ZDy5TC>hd%ndCH~A&QIEDvPb*q6LO? znF+gtLaFlgv#Vneq1~SM^J>k{j(00w7rtdK#3gDu*Ds6I2Q%B+zS{b&>8WGp91BwO zR~o)=^**nkjZ$4hq-YncwfNj`G-&CHGg#|1S&X{3t%G8a4g0J3iiHEDW9{4!f_gn%y~ zIrFm&IFL9)>R&|VF+@%JgFs=MHKYfs#aoeRQ^`m*$Pt^DR2)HSJWleQK}e{_8Z$qE zRK;xygB}YUQ$|l8SLl-w|NGQr(|`oBS=s$%fC`>Vi!ZFa0Uq^pXZf8F11PR7e>I{3 zSXV9QWQv~Lomt!Zew>FH{BdCTToDw$_qtidp9#oZarl-q$MR7cpQC`< zOU;d%)R&^v?d$VFsO7oIBu1OCOTQ9-<#yq?b@Yl#XYbscjkJ6uvk>(?NR*;8CATq2 z3^!PEMN@z6y_bpin~B)3x8gsLqsVsh*g$~i2nbAP__mP;+h^XFnu0?O>bIbqNI z`K?^venD1(BP*HIzTQ8d{;;u*Hfvk4^sr2(2&K18OG{#ox9fWT;oLV@_jf$^`Pjm} z1~Xc_OK1P<{uMLNEBOEa_LnTKTJ3q&MR}EFF#tgT6^sxY7;8cX6{#~q251xtBSHxw zVUYR-Dkr;oY-ARLnu7PMVl zE85MCRpH_`tES?+>-qiuf8&?*{_o;@kM3nBxQSRePU=#z6=X04AIJ+>z-D z6-I%o|NFFL#sCCzSX=*LAPQrrJ74S|01*jGZS1hj$<8gUy@8uGF^DQ7A&8ENEJduY z?DDOK_uswEV)(q6~f0+t~S(7~!oRJv8>~Wl&F~@x~v;O>~(1JmTl%!vQ|>tElRmkutIq#( zPck*%>u)Aa3Nu#&d1;h1SP3mB_19H|p+JpH=*A{+nM2DNG77VEEN$!Bqt}Z6Xr>61 zh~*ZsExgaBMsDVmt>M$tz4u#_H0PIMIVHigl$ial`dN}^g`^4mti6Z-mp{Lp^KX)T z|6+$iRIKXe>Ej#1Or~{0F(8!PxGEHw$wLCj3PcV9YQ_STmh>z{Py#i+%-Ky{h8*rQ zH*!+oF!$yBI7l_DEH>PvGV_R(b9&2>m_!3>_MO`%T2yot37a0epdT`HJ>7Kop-15s;ZGPToyYG6um&}(=;sU&! zn==X}hUWe1QIf=V0df%p18P*mP+}0(j6auWq-s{_Q$TOpJz183T2RsjjB$`*(-F?Z zj?;^zq9$1`|NFFL-2enARonXsG)icTJAYy0KT)-3YwaY`iI%19eS`{Oqi^%}l@iG9 zsx9=Rqqd%nNvmw%Gs0AjZSRw}?%AFddwEqN0#OC0$4ORzDI%i)Q3nbx znZPIrlPzQjfu?tpYCH|fVv$M-k;=2-*~>g7-Gm~ktAvw6nQo{mOA#_lHEE?Mn7#w# zd1IDa`aUY8(~c`G$sNNvbz_Bgq<(0!$_N2@B#WSgq#j8~n;MjZXgwr!%e+la?Vm9| ziHdh4*7RG}uJ4Ua%qQ#K_7BtAbfdhgd za|K-jBLRn1BJWQ^3f99d6vG|$r6)P(((;-m2s#?+hB5k6cgDBAaK3;2NQN%Vl#5Tu ziXSHm|NOo3*s6^P9I(mA1dYA|{(k|T15AGjsuEd{fCNbi(-B~Ejgk=+4Al=1@@5MQ zDp)vH)wzKWKr!%9VDgaFVJbSv^^gz6)oG5JF#T!FWhvW23Jxz`-X^dT%qe{6#$qKB zMfYD(NYJ7j*Gdt`yqcJJAn%y?c5DCl&lb{G_rWQ)-KS^o?TvR+j<=Xx7K>zkW$$cw z(ni$h>vEc8qYG;7NG3sP*LAs2fKeGH7%+Ln7$yhgylU-$!(<^La6oV+khl&_?Vqk3 zkFl`>8T3ZJ`k4{SoE#XUj*7n;!~Vk`${)Y-cdQQ6C6^rJ3!qN6)$i|#OsF(^bqqZ$ zq;=IcXGn%J00IcN|NEq5`hWznTibgqLwIT`tAA+&b5SK{ZR{}3sfQY^eU=T-fRT=Z za|!`LQ#T^xFXosafXTrkRbZ+Cpmo+3SmQAV{!1Gviv>&DZc$O#9Xli=>TN{UX0JVkqf$-H6xnq)#;*A+QkFu3OhcPu)NQ9iy?(ti%ObnR98QQ? zIZjsENIp(!N;wGCTj!}ZlCz~C%;cWs?m{Y{geO^OI#0kMVky|rP%5V`mfZowEdX$3 zs|>k(UO^I$E_ZS*E_|%xePu-~7ZR*cLL8boUEV)z?sa61%{Gmm7LSB=E&Zh$2Y^DKRF)!yjdp zXaibZ;h}<}#l-_I(`0_4Op(iL%>jqQkX@08N~&OlnN!Xl9V0D7D3vg^6co`r$x#r& zwDlc1Os(0djCOS@y-yZWJ{IYz(3N8u(VE0FWgPi@tk0C}!;&zAZvhNQ9LW5?@9x9- z?Go6|+>id*m#6PpcX4l|Ze_8|dDYq$S`kbD0wwuNtP6ot0O1OqDp`Yg98hwdmcEya z_A2N$xVe}_YAm`0KygKUlYb8h+L{)H|NFFL;(!FcTH5eS{WObxE`wi~Eav)|-rUVmVC3DJNtrzWU_o%F4QV(zpBfcRjS)eUGw~`ba7o z6CO0`kEpteHdQ)!6C^NK6yzS8p4TEQB~OyfJsW# zCq5wvrwR^OC_L>UmXQr_N)zdgCUQ5f2D}xVb_AA5)&b^%<7y<)@ihR0p>%lvkf_N% z>-OBDu9=_3mNUP**GAT>yEB-dUVXh0)%_LproWYq2F#3s&nxdHYSDgpj^~n3p;x8E zQ$htIo4mtKG7VwS;3^Q%A-#hoXhw0SMJEuR$eVUsD5hI3blBJs38N(vngY;4i)JWx zV(hxwng;^{b%~UE5@evs$`erqGcjeEIG-FrYc?T@QPk2o^Up_Ig2&zdva1s^OLH47 z(GzoG&vPT<=KidVO9KX^Zoe-D$#q8A-o}H%rl^3;T^xkVs?15E2(*AsNHYhKAc<70zo#Stsck|NEq5^Z*1>RN8wFGeT}jTQ6Y3rcvc> zY3!vD0gDc-{hTm3%zbqiR$5jw5|IWw&PG*p&WkJ~tG-R=>297#B0^wLHYMKaF}P`z zFlaae1w$cqOxPEMVt-wv0zi=3^vbCbfSAH^Q8HL;5aNcnWg<6t{wRG+G4Q;iO)Ofr z4Qzy7DbSe4jwo<)Py9YqCN|RYZ{nhgvWOT=!*ZxP>h7*m>smd9f(UU&_)`U_Xwz1e zgoYv@5?!7Fj{uS|;1v_BUSUG1p$U-LA+4%{v@OR)A{VMHP33_DB(VhKvBayEFfikn zet?8Cb5Mh$Xs>qurQdE#JzI9256)%TDRo6vVmWLToe|V^GQ$0gU5Ii8;E~J#5Jh)c zWkVJc1v!p%*QhE1AOMSrJs%}4oe>DLP>rU#>VX^IsCBq4dUdXXi>YOAabP|gp(>8? zkdC{xs--QMMwsEdTQr&=18LbJjyij%=i@t+txN9bu7B9g>Dnx6eD;E!>o25J*dc}> zo&r_$;_h~$Up7{1<@4qhg|%a5b^I^apCF5{o(LQjQpU=~2!>!0O*y-KtmE$jsJ{-0 zSzuZbpr*M{RvDCOq)MuQmg0yUMqSn0y0+YVpTEC!f_(S1txm#`|NFFL+<*jBTG{&v zL_%kXYd>KEh7pZhZS1hoDW@xKJ%bJDcl%81@?SnCW`FVPHt2=t&!_&CH~8js^7Asw zLUG_vEA}x{>0FCEpB@Z?pVW-1dh=|s0#QZ03S(dZwu}_Um?l8GxgH+b8=Hn{%)t=D zTTjAhp1T&03QX26c%zUThao1(WhI#&+%jia#QVNIW*@I?^2MiA=EgH6aV2*Dy4Rb! z|08~9@0EcjQGFzFvi5d&{_xxTHZxRif92)>Y}n?>`n9BDne3YT8vp_UN}NOpgfO*b z3@Sp=k{#F{ArajgSS5hA&&8RiVlGI*#q4UJ8D@kYUpXdug-IMWt@E|oH@JuH?F;M=F-x^tyA?y$LVwBqcxo;GqrXqr{qN9F75vJULx?t zw*KX1WQz#wW+Fi@J9yN<0S1{l(xr+3hOkoLp^?o-7dtFoRwJ(z0HbiJRuq$)q@kyW z5Ck|hB__7Lqj~spkS!{!<$Z;I%92FgGuI0-O@+L~6!66BGZ6M}HmrS0b2Ynhu|ZOV zGRn0@hHllbRPHV#_})*n>85S_id2J(wB&1cj>g#%N-`M;kdjSGG$RqgreQ&XLJ(<4 zW|3r5XlNye*Grr`mq1bY_=03;x!2fEBGnTKnJ``3TQ~7Pc52blt*p8`!!Fr!n^wdk z3pZ!juN166L97c&YaS&sAqG^9NcR+Dt8o1FT3NT5FM4^T;MXY3gj0r)KJ{e}&>f^0qg$cUy54G!yE2mlFb$}|-H0!8ow zynigrw2K)7f&|MTnkKG;&5`uB$Z4n<0E-hyR1&4o=@5j?NQ}6Mx*BFoOIoz;NzPX+ zM7LIUFDWKm#Pb*OXe3G_1q`8510{y!bQ9w`Is#Ypgpg{CZ-Qsv8Pe8*%?2`M(ae|I zbz&75$j4_(1(yPkNMaFivhqSLlu&QsR6;>xQ;2ibM8YHq#}NvI))w|WNJNN?4UjHO z+W)F(fIMo`QZ;H662*iuroFLy(L=Ke7P?;}A~L>t|5)SkjIQU*^Y3&0OClo5L>Bp~ z4q9=lKFUcq*qH87{FXLRGBDuXh8@`mh?F3)HKS%#0sx|lcoI<&L)j)oTryL=kSWia zq({Zxn@TC8=|FUC?aQvYTk-88>g=9Xs=iln>lv@xxW_ zw$I-V#c4B+7qaOrBh4Jq>p2ZE}DbOhb+(*l8*t3o(spQ zxu>di|NFFL*? zg0Tcf2oYFuCB$|hz?$`n${e`&^EiaI`G54jYyPM;6JlFy@d{W|t6YCQNH$Vl&dQy0 zAp);%1z@TfeQazZ8g}k5Hy}F*nkqKBzS5!95Ct$>c;ooL+e${t4~fIfpj7i6#EX`H zS|}pS*A1|ZtB>3)m2!`fwGcMM@|1bzY?`j9YQXZOl~0n99>IvZ#}@=ADYG1eM@P%# zPb-oKY*&{0q0QKaLYnE&WD8DnfJFxV(WVG3xpyENz%)dZa8R^pL%?Lg$_F8#KvOFZ zW*K3d%$zX{9bI&R~-QINd;(twX?ycJu?r1Q1HzUW;OabF7 z+xU()m6^eU`ua*JD9Lc|TnH&qBW`8~+}-<=D;xD0HjDhzj>|uxv&_m1#7c82pEqrG zSmD1sZnrYpu?H3-7IQ?`CXyBC^JJh}j$DTYh!ksHEokr%)qy4o1Pjvo6LMH1^O6Sl z<^bo0%#N1#Q$I;Zs_mNUU7&uDj|UxxJ|ed`Tl{VN~eR$6Nb8{&4#%S~Y;d{HH7XY9QV>I|!F^@o{g*H}RZW5=?I z>u*1wyD#o9EcEFJ+IfEW26xTf-df7nt4w^WhSf!Rb!7u0(`cszAy06}F9gdaDkm(Y z{%#?-d#mzFk+Oc$_ ztJh|Ox%!D}<{a)d9x+;WZ4H{2pTE<-Ik~B>o?-N>k%(o7;lZe4MKFR~oatRIgn$Vs z11Jh6HCm)4Cx9Ey+9ELImu1Ys_Fb(i8M{j0zhiJi1W77_1oB>W1){MM0bWxJA!DSQ zqa~7l;)5Qp5csPFP}Gu+Bn>}IXI#2m;XRIX<;r^=Z^@NT+Qpr$` z3uZ-VR!0WYNh!o_L?andNO-cMu*;o--USM|dW<{FGfcMbP8!eGS~D3FLfcxV}M(zG9Pw&Vx8Row85IV0i}ZH{{W)%u&SNF3JO&P5@* zti|Q+cOP)_qp#D((46;PA<2bZvgCOLy{$#uDTgn~|H(u{j>~v}D8?AH(?t|mB8rQv zr07cJHCQ)3R!$RG5Jm$4?F!aWmQ*fj&RVzRlWuahkm6({PkdlmMQaI2^1kch0l#uR z6bTEVr-cJ202@1BC(Y?&DMRoKkz6R1U{%sJoij55hGqT7Gxq2+Sx>G$qJ!@Z^u;1s z`*kc5TWP;52q`M4M4;{$!FDN{BLj&6%A@Pdri4x_6VabFa&*tdaS=-&**k_HYVzw) z+B+Pvm$WeCFi`Rjm?Vc$Ms72AN;0o=q6LX@)|;y1I#orlcsilT5LBaN)U~2lFiq0^ z$oU_AUpB+tZfCD(*ZeYIfFYWDIHC))iqw?#JqK&^@N$MQVzm+ZtVh_OFN^kQA8=diQS_@D@k=9W)^ciJ9s-U>@&yg2Kd>w*GFXj zWQIu=Ji*1nGMHp%JLV+x!Q21#_x*owP5<1)aMn;BpS-M2u29uwS(bDm0!mD$jDdtt zf>%<+Q3V)ej+-Wc;UX7Z4#_6nlom}$-?O>qgiO5GYEnoYAr(NBn9^q24+UWKTHAKm z(swr&Q>1XPiH5@^*qG>Tf2P=3>Vs}C5p%;d=g(1pzQ3H)nX&YgrB78)^9z4|^F2v+ zQ+)m!qf`C&y=FgZ-9>2=zbVCtH&P3$!XXM04LIfYr6))Vi0LE+910*IhJ>L=n7bu< z>1E`s9E;4*2+E5zT)co{hRalDko5c0F0Qo_lz{(HNz_bp5`pu%#Kmcv@c13bcce^A z9G7}ylX{lO&a@GljH+GTD1G*vLCadok?6GV(G^s3StzPgpw&%USx|()0t*Gw>k(#m zjG{o$)u3;na7_p(OC(vW^-Sp(V@!r&mgy}4)ByqWa!qBI550-@ER2n^1{;S_1_#lo zs^^#ANYL-K89I+xT}C_|Yo;JVhIWZex!G|f*@9OZqq`x79~Hc~xHngO$35=os}V0w z`GRmw8(0)Ig@q7&+>f`BL3>4rG4&A7ndDH0o+6nb%>b7RE%rh*F{C)iE0~uy_61h=8?q~*fj`;G|2lsL3pCI&HY(tyhVDRCYisEp}Kx>s(1hCo`@t9 z2^I&Oc?!PV>&cOM+xE}S9`C=ku^4C2%rMd<5k_;gpdTLV!-Fv(Tb` zk{^ZkQ2@Z48zgO&U0EM5vzooqxYb_dHwaqsn|FM>KE`HN9kf-uI}0o0J-5mw`4kLQ zdyzuzk4JF*dQMbJ5*Kr44w*Q$Vok?hlo24&ZY;{IQ5#RZ;#kigeL4~P)+poaklS5K zy8LlKwy}DdqNE@p0-0${IF`^t0nwq!dIQ;rw}NCH2bt7h4kbz+jFl4Lf?TpNx|-7? z!$!Y0YYh<*CJHvM55~1iA7~^V_CEN%!^BD7`Vga-TlPZgxS4|CUhk=rVyn4h1R+t; z7u2d8HX5&bVAMIZX!0#Y>ajI%9`!G$%0wbO#h6&}!qnEK9SDgBQz~JCx1eJzIJMWZ zKAA!sbSOr*S#!e;MEUT3UMvL(-iKi!EU+ zeh^h_YwSG*>FFjdeT0p<%+~HF6(KORYAeeow9v4+D?6D8AdYms15&AB=GDEw<4vQD z&;xfk7$_`DSVTfevjnAW#sn(jSVrTJ*!$)lLNF*NoxjH=ST={H0#sB^JJ9ghu?T|2 z4g&l~Hh8H^0DBhd>~hfV=zuv%c>?e_kj&kKWq`)9QUyBTv!2G1Dx`>KKLeW3LqPcM zBD{d;q`s%-4!5jzayo}K*wq>)4g$i6k;92MW|?7>A>Vw{Pr;X6Uq!}5jB(Ke1hpDp zaOYG!rE?6HbIP#C97^1~T+<8|(N2{>WM~jeWf_ybz1Kxp1(w_yn~>F@nWu3kRomyl*xxoM#s z)}t_CO@;zBK`d2{7~C`LLhIVpFM zmw*1&L`=(XXJn_=?qh5blJWm=Ak{6tzbLE7jaY}#zQVx|CPzAJ49$3`EI|>(*bNSy zHs}{s#i`jG#u!<1bwfrRF(tN5a70)DVH@O{LKVpyQ}x+Xb%EU2Olu~^wAomV=n{}v z7A7n-(LR1`)Uw8p)Kf&=Df)8CEF_HX_tr%?-A?xvS}e`E|NFE=>Hq{XTHAXJLr8vW zTRmXIxDX9(XRH``A^k0Fy@ZZEu^fwxX;|YiAvzXRu+4Z%CK?#7&P|M_v$s_;?Ubfj zkz75NJ}gBDfMMKS6;y%6RW&v>gCjx#DK~?LA1D%BK!~TXh(b^m^2#rRPA(#N;+Jo0 zV_8zq87{(Jm9dUd9zeXUAZp4$z!O00mGu>BgONDDS3TV+aZ!6PD%!H2p$ZtR zb|T1aw&qWwF^LXF9Y&sy?Z#9>RbJDTwWKgMn(M!J>Eu8r=fz{4Vr9weWI9j z^Rm(tC`S|%MRaQBnsPU}3C20LMY*Z9=B5x6DgskR&@;FKSlJ%bK3|CPfd=WC-I@50Fj2p}17p7RinU*g|SZP=Xw zXtSyu)fPvVgES%vD3^c?W8kHN*ba697=a9rEYO(SyQC@>Q1>+JFHJn`QpUE?f)s6$ zO~n-)O5|WNNhxK;Wfnmn=Lz1~*|oLSw3A1g_#<1*KrK2HDshrpObaGl?Bb$v88+!D z2{N5R6zNEs(te5TZ&TiS(@vfaOSzoslz(cSDCc}3$dj~CkBsI*Lz7e;rY0Gf zlTjkxxwR}w@?hFH^S&ipp{Nn95#K#yPPwX=OQSR6<_OY+BXK-I0CspDN@Ix@$Gb{I zd;j#8{$9yvDSFj8FWe*~8*WY(r78@gOkzomUWEfq0JI$`FGz`$DwUag|NEq5{eT3H zTUz@GH2PqqYky&jR}oQbXY4#}$#Ie{y@#cYirpg|XmYAsGMgQ>QQ&AY_?15^*0Ev> zO37S;|JLhTHT#)gph)=J4cwNEV2lv0UL{=pW6{{&hKNEWOn{X3S~|JU^M4g2}+iEr+A!-=9%PmXgF9v=aoA>o}>*Ar^~`)sNOQo+bm zEDdX}4m4Ur4T=Ca|2qLf_F61ztZlGJ)!y7;k>R4Kgv#Xa%{_wrcDhJ*f&~BFb^X8E ziR?qK`?dR)|NZ|}4iQk4s9PUF*Y|4SdARrZ8_c$abK!_YrN+MJb4KR5k703Cj3J2GXk)yPdm^S>0g#;3l3B@3?p@j_}X6k|F%t?507`56R+Rb z+RwVBSa*YU2qCAF=>}bP#Oq*yfGTi-D1ulhk@WpyaiJlsmcwR8NVJf>v1drO8XobK z-RJ)zG*YSR*X$T(wYPw;iJhYN1~+FT%wj0 z5~FHp4aEksgybaAhbRa!tqS4cQ}rRWgqw&qP=gf+b%~G?U&(Gp1)F})b}=Z3k{h+{ zR9k-T|H{}y_G==AiC?P!!8dq#$7^V9y~L{}NdMnglg0j3m!?`wGD@jf(xr0!#6u zl`AjYvf(sBc@!|0VRPG9xUVfneusC?O85JmoJ?0px)wol>c7WvsB#$;c}%J%x&G zG;C%Fk3H3jCaEY(D)+J{-VAN6PD)d0r`3;0rNlm>Z!|&NOc2_@g59L`mG9BaJrb1c4sp$jpg4PH<8cat4h@yHF(i z^+XLmjI8uqaGXq)V>`?i9Y>Faic?#Bf^G)EjHyL9qk^HyS3eGU6*N)M4uK&MS}6zA z=8iDwiuI9_Y$ab5LyxYXB;m-TswNhNV>Lh6V}_T!y2Ju9H!m4e?5$!jkSrr1-cV*> zFaW{dc$#yY1+@0Avt(vylR*_r0h=Pl#Dz!i++fQoM(0A*-OYoiK|+hZp(gK*<#{NHc682tX=eBXl=} zzK0Bt2$`{QBR+68OZ|2wbBxqq1XiapM1MbZ(ZD=C4A1*A*Ct_KJ(PXNrsjAIBf zVZ~qoE5J;lxIAax0^tDR9)$!fB2_nukb-e4E{3p~7D}0fQPW`C5_%S9l)&{_*8Zhw zkXll&dC1YZ1#;l%A+z7R{Ioy0GJCOkzG8rw@00ic%bC{y@FDWGy3%T7n{~GSqmT-A ze`mq!N_Qh9@Nw>-g=S=65@fX#a!Xwc%M76~ia3(eSW#I+#g>{k1;Q|(V)~nYwVG+9 zB?`8+X609u(2zrI#5%T8IoE4NxE=2gvd4s*d!$4DRd}8vnBiZ&DyG_qyfR0sDyd+7rzW4nDldLJF z(vk^X__S#dL1f;mQoa%QTHx*mfWhazcJ68|>H9HYc>nzRn7erG{#Bq54z%vD#%#$V zm(@Axh#MBZXpXz%);FX zO?8#$iw=b;`nIv^Qlx)cjP90rzN^0f_^m}Igp|*pE76|sY3}ym2+mH6^ znw^I6#U&>|7-pC-DY!hOp()Cz9AcKi!96q(~c_XPv zc^PDZB3E}|w!$$3s-y7)qMknLv)^Ck7ImK5|NFFL^8f@-TH0$2GkS7J`+s35gHhRQ zYwWQN;sGt~eV3tpHAO=<7{ve+LF~S=J5;@QZ96ng+;so-T+MGh^z$|9=2}tWhG``q zN^~knMTT|*0*Wy=fyEkO@DTGgC|L1xB}m8xyu=nccY>mCSp%(Y;JX6ei$0gRb2VV-^1|73o4i9 zw7KAIW~Nc>!X%^ZV!oh?|Cq|!?zjI`_i;+h!2aBYenNyADa}*P|Lz{O&syJj_Al-M zpv#)DV8UHPprAyVQeNj3fjH(vn~xD5G!9y11DOydPzlt?P;tvA#E#DtD#`sDgzf5Rf(03Qz=~Jf0n7&2_0ajgDP5(H8}IHf@64+yXm%Y{p8{e$XEt zM9%G35O6x5#`C3ovMK|)d)LCA1$FBGuDuHDN@foc0zU@_)&KjXWcvUFy;@rP3^jUg z274c2f_hQeZ)xo?(LsY0Y`vonScynwWmE#%C^vysK;@4L!rivx#ehTwK#3Jv0DCyX z9>yce5`{pM8v^2pU9CCVpG-$1yvMvWbg#+SSVvMU288A2Xa!>;?2}JyLW);4w{0{g zoZOI4R6k1-Vifmqg(4X(IeBMZG4tQ+&AaiEBvwr^x6O)f(tjaD#Iwh#i@yK8^XsMR zcfLB^Gk3L(yd@`2Q+yuKvlR@GhRQ?;wq=(XlB7UUGDkv(4@M+&Tu5=l5TeX}k?U3m zf>%QEE(f~ykN(Yz+cShI}I(#Y0xq)=(RAn%-_jOc`Fvj0GsakXTrOinbYW3wUZ zmWz=E!50YDQw;Tpn5)2OSz%EfnWFSCO!S9?bz&h2HszedB&8BX##A(7JxmCpRFq_p z0VUt1go9MdJgM1Lcp=e~%}Xfzl-(ow6#H0j4cwB;SuQ!v5a%soiNQnSKjF0FV{-81 zs-|@qswUEG$Jo(s^B-KjD=uA@@sxey`pk2WBpt5yydYNpQ~be~{dJ}D&3&Q&TsAzA zi3^HqgM_1Kbg;s@8GwYNZMtzn7>wDL6ERVT0ZYLmCGavX{JJEtWohk&%rU7}+W-5s zWZnP-$6MNaPfB=iru#2tg@_SlZ)fb889}z4Y<-87xWAfNww%mQ+V`mNAt9KHeZH^4 zpnm+if4Wwz%&&FjXAm`B<<1cV9^LB^W~pAbwzV~hqYOac&qt-bM=Dw$RAIBEq=gkV zIZ1Uh082?HgBXvX<%+Q&38r3jWniO>1+i(#rj*6nHg@*jM! z9#T>aXxp04AyXb%s}5GT?s(0A$9SIkhhOmqii>AI7u9mZyL@ARSgrM~)8?=-edkhR z)5p&Bt6rFI&9DF7pi8Nv?-co_<5yq$+ZToi1UF=q+vF?HGmmZecPk{@Z#ZK-!q z;?K_8dm`op9bJu2%s@caZ`s}{tV;GLRQc;vPM`VehQeq_-Rx&~YA{LHr$03d14k%+Xpz5Lm83-;Y#K(m* zq0A&xUb#^XF)(G<=+SXufF^}OEg2SzsMAi=*b^;M4b6!Vgu2*aE5)F67<>$%@aje^ zBY>E$68AtG)dDjXuGOEp0|lIYrx;)WR3=3jLJ_=bHjEM3M3U1HSYE}X4n@-U)t!|$ zk#4-VsHCvm3tH|_9Br*rd>3x41yXV&55Sq*bg8>HoF8v0Z{&fto2bjV+IydN?<>+{ zsQ>%aMC$+qk6PLNVc-gft6M#+BmrH`d0F|afCIiR?0+?&NX8fG^+#TEK{*9cQcgc{ zizCk*E~mG5N`>xV3hWfgm*E_4Tb>17h!KT{I=*h@H|W$KAZg019E za#jgeBs zej4niQ3CkrztU!PS3`zPDJIq#>e~Z$ZjDimrXqV zmBoMRISq3&&wCQW422 zsWo5?FeOnipp&qW3DG6ePU_1z$PlZ=T}qGPVi#p&s?g#g3RHu1&*hDTyF^Hx06kp;D_-OsQwz#TI4D@dw#-MQ$?p zx>noMJ9XZcohfJbVy~_*P8Dn8x`~4gDT=T*C>mU_&cktx@9s*eV^dLRL-|LlUi(vb zC2z~B`qE0L;?&pCK_LT(paYCdB?<$8z;rwwEHfFW0iue55QUi-F{%x-;(~J(6f)u_ z@{|m!AuLy^wuPt;WKErYvzO?AQp7U?z!{Gaa?>N=u}1+$9DZReY!t202N2bKi5h-w zRez~?(kWm|vc{1EN#Ev?GyLc4l86tp&((@r+oqM$!Sb1`vc~?VaMk%GEW3Ae%FS5( z3C-Bcy2hUVbavv`=x%PmE8&G+^LT!I&sb|#A@-3fc(KCF-D#fd3jh1mWZeJ=0$y8g zYXlI}%e$}5=>!sSUvK?}013@2E`PFs1(Y{_CIlF4h1MK61wtT&%nO03YGX3)GPgQXI)bC3A=zM+$1E8uj<6`a zEi8Hj>My*ZLefK0;^^#sYnSh=p=76GW9&NVc<2D!D;8Z@ZpXB4grTf&v@+rM}MUqkbMai{Ndg z^0fO;_5P9f*3&b05;Yuc3LyvghE?rTOmBY z8YVQlSCuj#k}b=K2LXcz9c<@OdC34YT)>e2xdO+FIui2;_YX+ zn{gUkiKQ{=nruya@@I9guiw4Vz5Vn$&S48eD&2m|av4wx zpbU%59x-pUO$@DK4!Wy{l>W)HjQ8oYBOgDcmz>-}A1apqyqn9o%-5W!+xpe_`K9CQ z(Qy7{9N(DbSAV1!)(I@-78l=AgrY@SYFU)XfPn>WaV{!|A4~?Y)Bz4Y*Ob|1;>Eok=2g%>KWZ`ct37kYl=%sWq1Qm+nXC4i)%U?~*@Q zrJfvFDiOG8kV9us6s>t1mKR`AE0spr zDM%(lP@MZH!rGvw4ZPZ|vZHdFN$c3QPU>9~4WhQ9VMe1B5JyPuNvh*7U5I(@>{l4F zUEN!k5p7ioHp>)Q_XU`r7ktg*O(K@Z2s0Ft{`Sv9hl|#sWJ5B`avXOxMMH4A_O&$hbNwEe4E z)5*^sYpoa4NTSXnrCM2+bjgE1llZ87{@XmBuf*Rzhx4O-&}3t;`~0+kNlCfHMGtal z!Xb2-r~FA)oJ8^*R{DRtBFb zfrKwejb~BpWw*_?kS&a^tj!#Ka4_gRs9Ww>UPUZ;@vL1xF{EuwHKB~WSOSsPb9~HH zM+3FDWI^b?EWFIdvjSrU>D5ksi%w1G~8F1qUV@*bN@*`e^A=1O8qJ)XP8z&0RQ`>WcGjrdRtoi2}E*WA~gjR7EqnCM~%_JQo>A^|pQXo?|fHHR@p(&7ykhGTZXvFg-! z=(;aSbCD&8RhAtVLP5*vqK?IoK!I4kI$@aeGE(Q2S<9HCr3~)Z9p1fm9C_a6JWZN* z!%JlQRTt@8r0Cz^`F{V!dvD&ho&Sbr_qUsExc5@orj(0WfD$~!M1iSE6pQ+@%Vq-yZpxx!K}ETEC8gI3kvg6|r!%GM_K8J$pL?$x zJ8w*CPFBfq?=XYI&NF^f!~X8vxaW{8s_%94%|>_sTO!MG@|*qEa}PnbYN8_?3tkZH zt(0uBt2^5x8Zg^&-uY8Kh}^pes}aQLGEu}#Aj$$ySLQ#ySAJb3xhAb~pk_Zldb;ea zqX>l<1bvKEQZ(R3MMYyVE^|GMjP$)7(Cy0Z%c3#dzjN2Lxu~oEzmr9IcK`dNWZ?h= z5m?*%3^PhyO52}d0((%YXKn0g#fhXUZM~Kj5n9rPs#4QBkLYL2wP$IFhD0$Oa$m{v z0Z1+7&T68;D}gcL@sp1UQ?NNo(|#M+#TzlFT!cjtF+srDD|fBq#E^uL5J0Gw2xR5c zbBNkyqzx{O$f)3K((*vwP?#H-bQez7X!3@NN>^>wR}4MsrE8v{)R~NC==L;zwf4ge z6hsHvUKyvTxnfnK=BfIrHVPTeg2dIjtEj1@o!Ra)95TWqNJKkzLvdBg2~9OPpqp2o zsJ94eWgC=IO8wRMo8K94X4xt-S$Cg5vamy>S$q4*axb*Lm*xz=BVZU(Av#p0#plcbe?f6CRB~ac6I9j6eky@e7 z8M6v6Bayw;O)M?9P?gNgF*?*w4^^Bk?OYps#MPr+oWq`|aH}h=#On1Tbf!VoCs@ij zNI5wqtkb?Kx)HfSIX2|shX)TpN^=faJJ@i;SV{b9u5Bzyr^h7suV)|28yvLU5s67s z$+B>&+yDEtWY_=%IageJ2}Dw9N=u(*<6TjCUumqd4~fSit-Yj{G);}V8GI{eZ>U7kzD#VEC9So$|=w+vtX`-4Xj<$B5re9R7+;89~ zXQ)&|1c3;ZgsK=MK>9|8Bqd>4)JLHsFsx$8M97J7O-D%QIoQ!kcuyd!u<3NUT9Xau z)?|8+Eh@n3m_LbqJSOal)^%wGjG+<}*nIQ?zZfm>T#+qNr(<1Q!W4yVA1`Cyx?R4f zo(#LkDdwB`YWmmXB?_}*wr4ZG>%1YAh1A}rL9Y-JG#Hwq)l(w~hKzDa&OJ|_+#aIRD`LRB}1h*_gcUp5=*9n zCFucVvc!f7K+8e#CdmOTy$%UF13gvVM##i2t+r_?q>slN1UE|?AXFV#lpic00FhYw zZFa3yB^knf6jx!mL!dI#H)z_D%&RlFI)5EeKfhJ*NcAe4V9tRSHEY>J= znmSn<6Kf9Z)vQg)8W}IZGD%OtWm-6P#LZL zDQ5L^D%E;xB6Z^oPC9xk@>-mTZEr-oi)s#HtDfE z7TVPtp~Nd083{=);mTOSQlcClMU;(@06L5;K!V)beqq~Q;9Vj>@_rFGjcGNYfzRCN_Vo<;k)`Wrscw%)y}R*4 z)U(f+IOW-5E97YJF{2+g!tb*+^ULi#%Db8&9$n%7QCNZF80RxOT&U!!82kE=XfxL96sTz1J@EGW}+3{fygj|zyDsk5nK zm#$`p$S2lBOg9dKMhF~+TE{dN8{M+fq{a99dazy|XDoGFQ#R$8uGZM7-MaFMT*Hdi zv8yF6xpB+0)SQ@nw8y#1yVNM1{2>=UM305 zffCv(Qsa)CG9-Bjgr78~aY0Nh8)skBt)5E*w|NZC7$AC9@*UoLxP9zg`ozimqJKWC zltL&$l#4IMHPaL?Xc=X9ui`+k1O)Lv~TQ-nqkuxRm7dH?&gMB0D^B3D{_3^PJ^3hP~AgKkezLv8G& zZ|VW9Eq#U=rSZ1gW(`#TpJb3Dzn7gaU%toOkK4ZO=Wh*;S$IJtfVGZGVe9Xv%$cjK zXPmuuiI|65`Cm(765_qas#)^;gV6|+uS_}K;{g`N+SF4~PscHdHJ8PMTC6kdwbd%IFc%hPM)=k*6CoAtGuh-;1X zOEEg9u;(Ue`jA>PO(8lOf|GLIt+k)x^4~wN?53rmyGd6=KP9P? z$c)O4@J1pjiq!#9{J98z(htrvLl2WbFV1eOcLSDK%1bN_$Ue!>Cd1 zX=m)P)oJ&wZ9SKve2DdXEMLl+ILThU;^1nJOYfV%bXdBMweC`#o9q9C@4orfVK1sm z`q$)Se8AZp_A$lBBo;8VDw0gp@q(k0-gsyQ!W*h*6ljJQC5S-~<54-N6Uy6do9MV; zRJoUO8Ki=n=Goq}f4i4&MEMN#?azlATTDTc^UQ)B+@s?`@H|pFER@$XU*9)HuN*g>WR*KY1x~X zdR81l(9WvEED_tX6&{nM04SuKSzr={z{gvP5R#S_T2!5gAj1oQRrq>m>0ZsN{04SCl0JPPR)*Te8Y9(x)yk zJZZIsU9;;NWy~59PhGX1we3YlHR`fu%MuKtN@r)<=%)b_INkpGD##K;Vo041>VqS$-opsQpIIs}a z(Uo==Va`n$j5{ZNo3$#wFheRNJRYN>Sk5e+4O4u0F+w?Q#LAjS=W%2y4*t=hL43br zh*<;X-Jatpu!ES5-s$A9`PHgkBJ?0a()gVaVdPN-Umd;Gz~ip&Mk~S%Ruxl_o3b`n zVK&mrbRT&E*$5;bb&aXO(V6Al4H}zeJJSUVuu8HaBQymKA=yq6dD2+XD7yt_5QJSO zmf&k~8P#&oe}{`fAoQ#i& zsg~O`IuU}Z_((dZxhrGc_H~mKB$QK85ZZFv()l|CE>LO~)K$#9xriri6Dfp)jVd;h zF;RuO1d-vwdaB*w?iLxnwW(CUy~EXGQgzStLvXRm=|(!wcKWY+)$ zVp`d23`A0E$9qp)pq11pPsC>8gI`vZM~XbJyCzt+0|a{ zR|?_v6sU$romo~K*wBKGM(1%!BQgsbWQ4>mNOgK7DpjPzjQ+9NAo?H-;VYNTM_84{ zo%p9emR(CH50%3a$t_Dr`P3!562juEQrk0YawJ#{Pgb2BUPurKBaIbW<>MwZ&w7td zZU%8VX#aNQ=)hTLoX?X-&9ish%{k9K5^n!8Ub}i+dABOP%EFx#auoJj%2qOnB!J{| zmaIskAVcLr$_Y?|FY+=8h`=r3fTlbY3oVT-(lk`buAd zR%s!xDhe7~G5QH$J&BRNj8zP$0@cwq%l1|p?R<+>*&Hwwf zMDhRx9$DGz4?=p2i+f*XhHns|Z(*!G3BndEEq#QVEgfG|@0*tviXu^XPJR|y0321` zIi*v~(|wA3&z!2q?%y-K%cYMMdl!{gyWhnM`A%&n+ZKvcNL2+9APkkaz{Lx=3lo{s ziH!+_YDW;asfgV$R)=T|5vih!%Jt6DN^8rx2%)nKtKB2uK%P72Z&R#FwpTVL^~I3a zZbJ98^GJz;KqroOH4UMHxwaL6Ivlmk|#;OdQ9dIh4J4z^|9Zd}j zR~!_}lhw3htqfD@GQy5Ykoe4MqjX=#T7;mFR@XVCTr7RIDK`|=lwE{sLmBC)RcmRP zG!#bSGIa%H$jc+r5eUF8G$b@26^IBKMWpFW?0|}^wj}La0OcfsP_ol%!is?g2!#tt zfD0!)txu_qU2^f5$vGs6NSSmp`0>cCt0c1|WIGs1e0MF{XKAc4E$R-et$l=#Eo}@1YqaWg%FCXK>`E&Q z%bzDJ3CwF@HI3}Io_(ulKbw!$fK`UA*;*Z0NU`h&6V!dj`?=1Rl~=mVC!lO8ndtleVA7CTrpX%d2C23>Jz zUFhJrutgI!i2p`ZAdW*^{4rOsRyTI1AdW6^)a|;_RoU^HeCsJ9XKlCc@oW9FwR&eK z{5MFw`fH@#+oAnyLK^SdsG!XS<<%ubXi_2&RgJrggn$8su|lg83`R7tR3l4r$d;DN z{gw{MCM2Z<#7B^~C2WwS7TiFhscMMwrFr#fD2-A99j1mef@rcMbdlq3a#Pp3Dj#UMei;hieph&b9hjdbXAL@6)ftEwCCVQ;?y_K-fSYb79JF$-2pklL} zr51g~BelA8T5ww*JOKM^6J+A4H7Ni-7@0I9@83?PH#CLSY78SHvRSCnbqgGf`YIl} z5tmhZT$VM6E^=({?_?DNf*nO-v?X=kjYxassMEVYE0p|F%3SjePx~-)nh6^c zh2$g&EiMA(Y|L@}qH$ZS3fx)^SQ(hmuD(~VwohHVxO(yEI2e`(bHn(abt49z(mbBE zvb^6J3^y7_r6kOvhd$suFOTeqnTUZM&ga;!ZnPuNXOe(?Hg;tmpz_}5ch^%BT z6-S^EEJ8^*PYrV-B}`# z1nFWT3T>&)EC2hnWZnP-cv;(f3^hu5OG|BGg>6!`Wo4|S)d~JAYxRZ}X%lyw(IG^k z*j!2eQAG-o>qvE7%Vl9;jt$T(!)1j}B0E4#dMBfYF?UW_yb*hf_L;SDv}6NWDbT8m zii@ccYwn+a^MswIIIBhr4Y?es&ZH@I-Fa%aTY5T?6>^=3FtsW%9o(5)-zi3AB?73|$6%_e-FK8i#7xiNQ{a64K z>NwfjSWxAHuBf`I)I_xwGeyiE)ZUK2P@+Woo33h-wk8Ir(t1St>E=`cGhVeQ3}I)& zg?_?xB!3Zl&_E(VDhoiF0D>BhOkzq2MF5wKq*~)bYwGn9+Q5u3BYP9I5_%#pU0AH- za2C0soKVdyOb#$2lyzyo_t8v<+!8~VFGnSN-B`Z<+Oww;+VFKj=-(WjLIh;gz(4mQ zAuz2K0f4nLcSUm;(AeCNAUat&rsbHk%U9N+jOg!ZI;JtGOcqYz8AMP~wC5xXXBL8> z2ZbZV($ELmFve1yO-;GgcAxhk2p0}+s)Q4SJxPj;_COiERn#l!NW&gGe>nWcX8TZQHjN=m7e!B^_{Qx zizq#O!Q)j?$x}r^d31o*-9lMqBm#wkuk;~qg92vYA`>p*08(ZY!`dDA3HqggEA#C_ z>0rq+!^o>kS-BCxiU0ewMBM-c1zK5a2pwR7D;qCiBaRTcX=&^w4`KkU?Dd8YJ>r&6 zNeoZz7%ucVOt=5dOW8&nfr|D~&SELc^uGI6#~ybnWixLaGZHnHhRo6(D$!&SDJ_fB;WnElZr4g|B36 z!Wd=Ih}?Rb?y|xeWYnKma0{q_s=Q$WW;3lBed>_)NhWh@lYXqsm0@@~RMMpnLm`xH z{9?@&qok`X1;FrjrTXPo-Hki*($nuS;#*EUe0&d=w3l7&=SU z79&K?7EOsXP>d9E@s7p$no3{7rZ>PJl6wfE{=vIND-WyzZD557y^ktVN(O?%!W?DIN4T-nXnhlHP%xn$ zvSa8~KIt`WI z6_yx7FGOde`# z%#fr6sF_ZmsItK%QUjz^V%}4Dk$YdYZeR%f*VVCd7x6*g+GKNWL*$Xq)Tm1&23LWK zRtKGRyv$@97%`8ICC@aTk|5M_0{{E8MC||s8d}(E2`x~5Ydc+GhHFu&XJhO<&&ms| zZ2g3yB^ItIbMtCIC>>Wy^*678il(8W15I&!-osq#sA)HLVy#i*x_w}4 zA?W&R<3u_1nHVN?I6(k`C?yT?WhX&qkO5J2U>1&`VijVkGKcX(<#GnHo@Au0dc=yr zRv>v3$RLUakS3TtF(L@;I&4rMqCJd;LNJ98hd}V~-!L0~HBsd_C|H#!1O(25LAmxq z+|0RkI^zh*L&wFTW6n9H*&~>DXlssl3MCRZ2 zS)U(oHHu51Xb9HsN%7WuduOXHA;7RfDZh{EWgnfck2+gF|I?Qc+SfI1hRhMvvv!;m zvw|S`HbYyLFaasBoyI^RJUa$5A>*DLSc2FK2{2NrdPCFFXbtNi5z-_H5>evHG88OKuX_9RV%%6Q{xrJ(cgmpun= z*72=<=DVSB%WBBY!p{g@npFc>hD8w&3j`&M5EG;ZKtMp{oq@8zB8Y)2MG+LWxI^q6 z(q{~f1nAtw)aM{^_zwr#kz!Dd$D%w+e%liZn9jI~AhwTIC?ksB*C@L^2=8j8hf&I!b+eaal;nm}6CCwc5yGo;s_bwn% z`!rbKSV?Dzl+IyzZnczBK}lx*R|E-+KA>5$&@vb4hZuVgF2Hc%p$;s%ShCy()uH_z z97a~&a;@6XZ@o$HceYW+Z|-ekRCphFt2G?1_p4TUBfX^E-{rGV^|?0xPZZl zZKOI>=tDG6nw?@HF*uk+XrlDf3g|$Zj;6F@AcqS?a>A}R6iAAhEmfgK)v24v{sMBE zq%SLm2+vkZ$iu`fNyvdwBWBU0r1o~wF;+ph?k>Y>qBZD>FcRE|y~0aB?T8NeijlmdvC0qQLLbh*swrXU8rm(+PP zAE>`Y1p8OXL=rWeNc0MNC+T&HTs*4Mt6s+1lv~?H1x!!YX56)JuBkzL3&VG_u{;rjGb0$vGU=fis zd-bkrHrh!ksIRgiLp)80I<=xXw+sS>!ACTYf(vzRF;g_1U)igJp&$7n)qWp{7i z7Pbl%p)O^^c2m@wX=P>GTi)Yt?6rK{v;?lByeq@~N&fRQ`DK(^K5?JKAEwRg0#=zO z6*56_Cuwar%{)}7+GSACR+tDNLnr}s@R@v>d#x9>jjPnjj_6ERO`B{2@SwQNfrU=Un4uTek{m+W-5sWb*(7U0T@d3`6j6D@z|? z<62TFWoPUp*JB$3Bo2CNGgM$L6*3AJQj+t{b{utIzDuK%g{%qHDuSs&s`hm3;Q+ML z`8K3J@bP$2d|I<;k*yDi>7PH+XXmHf{jxSS;vS;T9VyiB`H!_;%5??N?21JTRcG(7 z-A4C&-2JyEG4to??)zv+{Q72+l7iN`0!3(HQUFDylX!MZO~f9kTr+EZED>Nq1>VL) zI~BVz`ibn`m10|syk#6s;Vi$#O@CeE5;94tCIOI6r5n$iUfW7E%J~lR711a1Tkq76 z*2{STiS92mL=kpEe`@wy=7Dk0PDSa`Nbh!LZrm}H?O5Gs^|^4l!sBq9uIDM5O^;Ny zMMu1o*DT$JNdgK*I7qT3f)tGc1Shcz(&c6d3bM$i0XtgA{Rm+;49C%8AIV~zd|~lU}Yg3dZqlTGcB2N0wg9{gBSRP|mO|%TI zIP0urDFTF?M9u?_#dkhY$Y)~@3kdunEmcf2LfAtI$Tu{nYy@=B$v21dcQ(!l7hjzh~dP7&rMa%+D5D~PAw(Uy^zWg>Ry6q6*-(3sLy|Wz-?Y3Ge zRHR1vcILn2BpstT@WQj3o9jK@+%zCUCH4b?e1>E$b)njQzW@8AME!sS6j)g63^byM ziyKd2>0MBjGhM7b3(5hiExm-ACC4{!S+lfvZ+h*SPxEy1h%#Pq2Oua8~ItTz;?Oj#ouNGB9(qcw>v$VkFWoIp0lljwe`O}q?K=fzMAYP zk{g+onjy+h8~57oc@=56I{PG@z{IaBS|D#Z_6Ob51g;7NK zi{$`DBoDJdr{1aI0N?NP`#8}7I8F`Qmn4O5E?TlZ8OQFuwtvOKF@{ z{}oGP8f`T;nUQo>uu#Na)PX_uG{Z@IDAthjH4+e}ec{P5h#9L#Vu^7Pw2ho>o&3Yj9VVlLDc?0Z4AADR=RM4QdP^qq< zEFD?9Xj2HToDqP6xjNENG9gV&=8Os`?yFBeaRicWr0S(GiGdWXn8m3J0p)ywA^-cd zMALu-QCZo04>Nj%>U$kwCZ13kXKU;rRjJh@?DdD4VRg{>Jyv6RFoH8rrNpvjcGAIU zkO?QI)C?E-KcabcyugJzn+<*c9Tq#ax2a?yKj-qOyWD$iWWD(N>l?f??-H$?XM26` z6_Nh7=C(8-rR`Zhnm1dxKG2-`yCVHHGnfc+bP7x*i46>mFgn5_D{_jpHlh$J$o8Dp zI@>WxwGu0nW5Tr1h()1pPlEqq{CW9m&R7ecMMBvhZWDyd25w%x_z@p|`lV2Y5DHu- zC75L(So_`vS5%8HzpD=mFubmZoK%DT?W-WF@4Q(BNZ;vT3|j0{MMF@a2$5T1N6RRZ zl0>LFr7=R*goo_-6;yk5P{9=#8pFzRec`tO5~#deBcKvS+D^eF3cqEI2%&{c#H=~3 zYIiaRHNCTZ=AJc@liTXj$o{Y_*x{xpK*$f&T2RBe@nac?hHYC$C2}6rj;f`c;jz;y zscIg5@>-wqm*yY;C{u836_FO0nSiC4#^wvQI9wN)m`&hfm%CdSj9EWYre`Tcxx@qb z6ck#%%_AEb@%EyFthEpkEQrL97@;iUm25&sYQJ;EvLiXpUKgj5Vztwbw}{Xgv+aG>XoIwGreyul%~G(iv9lnEp?Ceol+zyGi&GjTAvXh zx!#uex5g;hKd8Q%{wts_+XtHZsNF^^5v&k5-fsy(r4Ghi8W{H|0VzcIkL{O|~ zaKL>YD$Qb+$UxGwFsNTw&@nSWj1)oe;q01fLmZoICb&m&GbX87><7^=(I=+t|_DfgQK%QC|#h$s{mcj@QMxxf`Z<8CEgI zQ8P#1cb&}W?Bi;t5lf%+vH1kLRT!J5q_HN4w`+}tUQMZ{k=H%i;|-N<5C~x=N=Q0z zQO2r4QiVzf3Itq4%L*SUOn^}%ijS7z2Nlzs#V>D5AcgI`WfU00R0IVPDU+p(F-8*2 z+}3dKwFYSmi!pW%-nMp)av=k(HY0`-qrmAc=2Y-6NZgJV=rsps2W*juu3sN~Bo!wg ziHHHsfn^X>?Cmt08}7@;9kUo-5omIysWn>BE@J9ba_!Mm+l)jf+dOUle_%OFk52+b z$_dd;E)ncUv2%S019BN?mw{b1)f{FNX(`HfnJ)} z-Q}AQ?aE8lsh|hfpYo|R+`g8QiaGn7=iaM3b1F-8)iJV=iqL3i0GAt^rb4VT@XR3a zV1#}^YV$41ftRJJs>$z^C3K3H6%xz`vg#Vw;)&$-iK$hdhP!5;SQk>R{0^oqqN8Q! z;*E3nLPnwEqtWF;7b8WT@v(fZ`N!73y&JQA*1P^X=UNYfw!T}pve&imd9VEB+Lfej z)_Y^Up6gcdQ#*DKqm{L9kkk9R7D2;+!5yg`jS-9_+9}}!0mvX)bAnd_k%9pV4L;YZ z(PpsrbPB~hrc|E9?3y0r$jMH*v@E-4@fy0RLhZGSGgB=}UpoJLd3r&Iokxp&)_UsItSVo7t~K$zS8=J0XIjPWedp_cSoWoS_pZHX z&8_WS+TOYU>t5N;D@@{^Uz% zqhx>}I2nWuh=PF;V$)FJa$C8_j|!h#eL}OTZw1{dq>2+vf^5-*HH|t{c{5a8DNcr< z7C96AkUA4nZqaoXv{@XcrMy?W!uC6rC?zSjqfuR&yVP`Cx`&P0+WQ!(o6k$A=fPtK zbB+6i5h61&23MK-dU7CJkL~qkx+uY}g^?74$X;T16TuuCt}6>9*;1fF_gRG*+K>A( zbxTwe+>Vd;T?^dPzy7`ZP%$7KL71V*Sdy7FiA-{nrNZ3R4`y^ zh?)+nMOdI2gcb=5u@LAX1l$#95*q-bsB|p3DQQ#~HARG%?$`1+$K~)mwQ9rBO*Dj| zn*?@gwRUP4b!-AXkjyZfqs-_*y!qa1m1b%+TF{A4ONK(S;r*s!8hcvFS@Zj6cmFD5 z<9FU!SWo8THak`(ea^K%tuixBl_TZ4I0yi^Z23ye=mtEHt(0G`YM}rYLFv9V?6Cj) zv}D161bACq`z$kPP6s=$Vd6#+rD1XHFwJSvtZlu9A&szLLZXD%wqQ)Cm)0c+(^YiG zM4>DF?f+c;ZOr_h)$lTro|>h48xFb+7Y_D1r}yf=>Mp;0KMw@V<4|MUNV*xJ1j?G# za}qk@?R&ajw40hL-cZDdZQP+pPs#>VhC~81f@(|OQ0o{{T2Y}Pn3EI)6cYTFzlpmC zE@&b+%U=mUT!?m!xHlIqZCj6mCdv>WzPI64$mP~;7P2oeG;Emjf-M{}wc!7%Gvy(M6SAT^kRO)yIf%OfxY z2!Q1z5X^x^3KY7-Q1>o?s?kxie(^N0qF^X2=y9h@QSoR90z$d^^J%R8xFldKwxN{` zjNc~C6_J*`oZofM)&|4XgGCNsJu1YqmdKOe<5AxvPXGV^|NW2azWH;%@HA2|>i_AM zDnugPo0IXm_9F&H%A)F#wfeE7=6;(z^w3bY>SA;Hc-+|PqcOFMdzai5lM6X&i zC!LCmj7$u){s?HfhESMBdfGB-rJT!KHE7mLIOCHtRD7K-X}$_aQp-k~9n%nMSBtyL zD3kq3uyHss1X~Zt*w>#~yru*0RlCGS6rK5P{yt5yhoR|jxKSsfNjN~HxNVekML-rx zxwNA=p+8Chu%ucN1jP_T^ub_7l(&&U@-?r)x(3%GZSf;YQD$f-Whx>Qb#>j^orS|# z%^v^zv}E7_1dCc)dkGyvT|%3mVJ2r%U1@3UFwd!;DXsmKm8GAV4WgjMy{OB#)?3NHjet`J5vO zEz3tj_Gs#dz|3ILIU7ew$V*YWk?Ib8ubi$m{k<-oAvdR5qNx;*K&wRr-I)oz*EcB% z-e9k4i3okR%GYyusJv%pe4poEXsRiHw4#{ImqQZ7`1sR@-g0nTiE?in~mvMyL|&8e$@ zB>yz}L6p`rkS7!vqKFc?jaemJEsb(ll7h~>3Z_@MHzc=+t1B;jmWg(0@ zlQIxO2ufI7_<)(UT(p_G86<8Nh$GvbVW^5*VgcDn*~fHfXV<(9otIj&{4TC}m`fF3 zUt>1@!A?48xbbIgHR{yLIej^ctk^XzPh~%~O|Jh=s)AYGu;Y|XbDyJA{z~&%Qe2z; zClLD0EYUM@(Z=6h<-c1f3sd(D#^3+|4@+iNO1w6+41l9(jZ>Ht=Yd5*tW_!Uz^VaESc@vFQ*a*e?n)38qOnISF&u3usq1H_?(AC;c{8=mrEQ%5>#?lW zt(|=n=V{x)1>UjAW7e}ME8*8h1Vkc*jS*>;OoW1qZt!NzLNWzw102%9&P?E748(5~ z#YNT3!@S|aPs^_)1O}982`N$yL<~G&nc_><$d5FDQw%L-8Gr%dU^2=&2&b;2A-7#R zTO2}<6Nntjzi@p+pv`*cvMHUjY2?-IW^5*U5m;w_W@q`SBcvsq=;!RB-yPfikzvbI zyQi%hfo5bX5UbRFG^0FWCgkn?L0>Pxfk_N{u0w^Af4%}vK_?Lan?X1;KeG@q}4aJs;sFHKgXI-T# zH+f$>>(@hfzLn!%$+8Wne4JG}sRj}avSHN7761Wc>S-rJ2M)v5C1yTQU~|#T8YTAI zxlS{F%O05Z26^3X4MX$pS*uZ?el?wJ@}ywG!0?b`D|Kv*SEDL191*Pl*76~rr4IeM zDPVoSZof(^+QpVrJl4GY%u&ulsY-`oV1*B;nQEyaQ4<8YHW_%Z0zMU_B4xl3##`|t zjIe+ri6#{iKbo&*tT0CrM>#AJtRSP}anT*P7;%;XxOr$v<=fsNUjbC*cRp;#me->w1G`rfsEa)kpXqI?qnxgo-l@8YE~DQ9(;TQdHAKmRxw7$_jYJ zKyu>`=Yw75x1t*Jdi#~`qkOiPGs7*eEDld(fnBi>;YL)?GCvemP438K40z!R6H=ps z$B9p>QQ?-6kP}~O$9;cpb<98kDpvpdq-6Vm1X@|zdkHhrZHqfkVFIO5Nn>m5u+Is} zneF|Tjr4EcZIA#3JV`1$5h{%UftXN?B!ohQ2CtTD*nsUju=e62sHB<17&+|&U+0eMAUclb6}|EfiLT}ZE7(NMs3-~j0eL9 zoru>&h+V9j^+cGo-%)WRA_r2#%%eiA-JN_bi;y9Z?Jj=ibZ3tyLM9nbU5QW#s=a<1 zVzCIu*HRTh)>2+39$3mFX^4+&d219R=PSnOlpZB zFu4lOipb?e#vQ7uL^0(v(r&J-#2>HT_$rN6PVeogfQd!S70M(D(zpUB0S-dhF9_>P zewu~gi@6JyO#HgcZR!djvg3<0G*BjqqLNl7)|%2Tz;y_u<69(CLT|U=Z@^(9=mF1l)!SJrh=ieN|O?sAV zy*^J~nRTWvVOTG8jsX%Z`?UxvnlA%HY307i6ka{X z*R7ypI{n^_OX=hglr3t6v-EV!Rm&^f#39SM#x#UERGCbq6W zdZ!687{Z7K7D@6U5uVdBTw)arxT3P(=1E%j-~Tnf_&t%$rC$I0q-5^^1VmU`>j^YU zbgJu5V8xeEfmv(pB+yByEbRS&k1S_TJD=|nL9(eGrV0qEC6#AoPymvS+sr5jSjh-T z0BxWX)dyv12;w79I0~Xh)RBCl*U|Z4O<`B0kvJ^bL#Wg}tubyuUC^`|Fw!EVFvbZ; zQi^9GB-6weA5m0fD%ADXtfD&|81O~?$buVoK$}ovkAj*PxY3)&%nOOmkf3OVL`cY*l<(1HoA2;KmCZy;!(%*@ zbr_}Ts~T@&mgHA7Wa}=qd^$N`W&X`)LfTToYOD9(QPSdzM_`#GeZlNOBr~CHdyJSD z+io|qQ8BJnX(echbaDa_QMt@!O9AP< z%Dfc8#k2$~P*>a`NUm9kVXMSph^pw0h}$tFDxW(Nbqk-|bwwYnf9l$(aTx^S%7V1kjO0SDDHDTsp-$OrjMBHwGy1C5HBXPd`K_Da`tdKy zti?3mKgOGEx+x!fn&V`>S+_V!%)7&>1d?t~eyDmZ#lw=A@WEG>dz9ywt)mD+1Ek@Z z**qgy@zcX7Vy29_*n(jnpU&hO~aH`YUeB zlAi*CaW+omfp8F1cyO4CWya3IbZbnW1`)byzO1hIAgNI#d$QU_i;3zy@w_vT~)WINW12U}Cv5GX{HCZNQl~77h z!4usWN^zr5aT0VUol9LjB3xhhdJG77rtX}*2)uX~zv-I9?ZH-+OiRB(#9wqh)Vu%t za{K@Lq-64d1Wj67dkHjpVq+_RWrJrC{b_COB+==} ztN|T!0q22=63D=zV@MWLLrP}siVwS#?OEIDSiM$T^Pa0GWiwUVPS%qK4967`ITqfo zQ2xCgt@(OgDt3{6L)k}{b})>!yP2Oey#oD-NV7wSAR!3I&MhJ2GA%wif6;FCPJ5AbSlzfvqaR}vrG0qLlCJH1#p_4?vpY5YXWhv&AvE^{r|`rYBmfD9 zCYP+jNMWlD6j&i>C>wDk#@tc+DWs1&q)$xWwdhR>^a||F5Xrh4f3o{O6XD~Ssqki+Zl7lbP^D<*#A zB~O^!>)Yg(^v>!iegLjGbCXQf#2p+KuC&UQ3xPRkkt- z4(AO9hq)|C!OPd8LzDmev_#r~1PNK$>kJ%vfoj`dVJ2%(nQ3FJJjv<%E3N&88KrB! zw5O7SwpM^$B{(>dF+^G+rkh`%N5tkCdYZ?icr(0s|%zsZ|B~K-?A#nWhn?%1JDy++;Lr34@gF)wc~@j0or% zRko<}o}~6nTMbOk9(B(iwzg(7%as53EI>@%MsWH6CM>*eemNHE*lI)1OES#+0YZ%R zWjw*Wah5t&VhkAyIkLHFdTQ%kVIz-H4P|MpEf{I}tSz;M z8RS}_wv~y!pQ&_-B2nG0UW;TkSDn60M>z4{*Wck!(=D6k>l>cSlJBq1GadU7OwapU zHu@9o-{HCa;cNcq8TKE%n-*mJn4G#ziq)CjrDPCDB)nqC9KrZYiidF}2V7(f^#%!& zXv=&=GVE1pwi-lu(2cMTBNGOpHpAsi3keJ@0s&>-ZTcTV$&X%x0uw$E44r+}KpyX2 z%);^Ya6vXQS5Yl&27bnE6FqFvI9(YJdG-^eFvxdnzVEx4f3ZM=FW@kgUO7tbzUGNh z1|}DbqRY!oJ+d>YW(thdMt~`jk}|6k@1 zBT7-PAu4>GWp;-u*4*3?ZOL(dBPcaOkai>;3PvPVZSLZRp#}ryqE($Ny^R=aOIANf zq=S3*L;rh3m*S|h%M_`(|NpzIF(h-|T{-s3pkhrl<_3>a zDomL(A)o~ffe{T50m-$5Vg>-u0?pTH86eth$jbei2;hckm<>ECUv31?X-GzM@B==v5!`Wq-h__^IXT-&yrMc&!d8|LOySZrnE)=ZF4=lQO85|Ig zO<(6VTAO;pnX`!?X>#jY%T}T8p^_-_?7iZ>sLHpQy?K6hdbqU!;Y0p}^{n!9&MGAU zif!DQ*{F`IfHrVPfTVsEoUI5=w2c4zv}EW21b155>nStJgi9L#Y3NQ=F>h_Gy^CS^ zAFOqRCg3_ym)*v#9)-|L>t}H^WHFqjlToR3rYf>32j5$lGsIZ4irkeYJ0uLTQQbVA zoGVz#)di@jx|kxLs{tD*E(jS&xwI=7w)_$k2-!)!S9**#YXd{0n9+5&JlMe^k#KQI zVn?TjML-k^aXG@xQqw_HEL z6iY=;czF&1>0gGJS(OzJ1Vt{{2isf+B-5=|0xcq(;*}I{Gc_8jbx~_fE*P<+3_*=u zUUIqc_jRUQ83d1rcbS#XBG$+87F0Eg5>GGO4|Rlhg?A7}M#`8hxD*b=uSwE^1%V1u z3Alt$OHNP>niMq|ioTP%TaoSr@vM1i3^;fl>W2M7lyt`ndLd}S9V5j`|BgWyht*c= zbrt3%+8f5|lFWWNs4J8~^*2LcI|(h)xP|NOH|M$0%P8BkqrQG?XIYM-8u~&>oXy&t zyeZ0v0CH(QI6yy)#)bw)GLU@L`tMA&#d;{KtAzlVgKi0y#0et-U9{BSIW1ba(m#{8 zPs_E&0bx{-q&~1JDM6VcwL9NjM&$%)ajJJLGWHgSC2C+Y#dBb= zdId{mbGl-8WVm)|?o?0miHxc>Y?wG@FiTCjzyb!AfEA~p zfXPD8(g!6`p%BW(hmHV;=jlg3+ijCJ06|XWc)}4Y{;YSJth$Sro&v?f(m58h~lQEM8$0qc#*j);a6|ox{pKa*i zG^|B8-5@4c6bR4GQ30Yz{N!o_DmhCm7ZjO~d3Djx+Z~wcom7fU;BNVkethZkjoZ;N zKW?!E0drF;@T8+8o&Wa^`aP%!1PF=0Yyb1=`s92CGRvRU>5}k@q0Abr?wt|bIxu5#;ayg-A`UwBQAdJRlkdED);cHy2CM@f4wf{iWQ(@anDmuSdKHfKDh2s&`u9H!eJ&5wbBTkAYlQ? zmK>tDx>kZZ7<|_~vV{!;6E)N!CT5wOqt{ZLqBbtnX74W^+1WxhpEC09M5)?aCcQ;y;Y3Zt zuTV)bIO%3ucEVXNkeZ4t`0RHjX{R+16+-M%bH3d1ml=y5p)Y#gp6gif!xU;#RRRqs z8ntsTQiCxW9HX$d)2-<$WW-|C5HUFkb=?%h`_%BFzvH=CHamy@N+GH&O~|k0bH_2lr~0rfU;#wIZ4qy42BT7|<5UFFZ`@{y*9v&ud{B85jczF8!st9fy4oWK71d{D|6?`hG?qBp*E zu(|t;QXQ1@etK6NW#p(5YHdyEB3qVJKq6UnIgB=1X%RDwG@{TMB*2F_7XYAkM#I^h zdA*fdicGE@i>f$0xzwpQEP~m?nQ26$mOXMiVFg3WZT0+oAc>_h*3-?3myMv(#<0n_ zG)Hxl)@S}zo!<&Wc0ch52b-0&JLP{GY_t9Kc|WpcQRi!9=kCg9`d6)Z#aaj$$`#psWpj(Q+w|TxV>aN7bii@h8 zwWkpym4@#&_$I*ejBAE~Xnu)$@Sag>b4hdNS zuw7-za?~yPQ?%r4Lc*QVB?uZZSqr6Kk6(6A@fGP&A_dV|hgSdlv_$HF1Xx>H`zA~{ zhD%FdWoC~NZEGt!+JqA-#Mz+hP5EJ%4P?c8e2?*Rzoa`9h;Ql1J@*NT~vx z$9*PFcSRtd}acE>$r_GZwvea=9%6X4b$nmF9Cj)Uo=VYXv1JyQs z+#~?eXuM*wjDib1B8nskN=gE;vTJQpBqW(rEr>mFd>(VlLLA$vJ#*e)(c+B%s zI5v+rCjC+0c4I&P|MR(-6nLS8g}ItmNF3@j{zaLSmG#fe8shRh%=4s6c`2FQR512l zC`aRsA^-$}vCd5Z)n?!!I<%31Rw@Y3;k8##1?>&3*>g%RCKi&xtTi(T$;5;urTr2n z5i#RH<&&LIk(A9Sa&*Z(Bx&}}H&%?ZM;f@OS{r##NEFPHTe4|yq|i?<lwKkKq{ck26JVI!$h#c^Y-F)ty_t8M*+3mqery3rBiJ6e%LOv(XllH} zTo@5luRrlHV9i>~qlP=oitglQGB^Ef{^=sD<+E0aT~6+PaJw_ERNmL+!3R%c1 zf*3WxLK9xX5}LyeN>u7j6!uA(wLtT$3{pu6rHxH;T9i1y@dZSf}FEbS+g%~C^^URgqQ1U?|s7L z`OI<_k>**}9ECf_D`n{Oh+J*?&1urg{4mwjw+gXiTSXDVOi+V`?315tm%>&IGFlhqT!4zk$P}zdasr&u_Z(VNU7yq*yLRSlQL9|v`r8RArPRIOE6?6=4NhI zcrjE_FA zqH-c&d4;lda@oS_dR8->)XJ`+l8^d(bb2}g5|>(-)=1Z*rfmav}Egm z1Y%j(V<|NnZ-<*tVdY;Gk!NMBu`TJWs;zyN34Qo>|IjgZ-;nCke)Xf7l2o{cQwahf zc2fm8L>&z5SJ3F$5X5fCs&cY^o2;jy{Kd)f-4jR*tr;gu z+NeZJQn?FAEiy(E=0Zfx4+eSr%lO_WTV~!J`DLu7VWz&8$uR_|!-(v8c>bDOQ-0oY z{8x(pNuL7adCEPIIYZ4=;Z>aov>S40t&}d7mKLbQWfoe<69HhxJ+m1FI%Xm5??h* zxouWBsDd0e(wbyZMP&y?(Ow{@uyww{B96O& z?8BIDM$nmR#3t6A>eH84yb&unaem+7)iI{&d`&E{R!o2~jhhx6NM?A@%%W;v0Z0OXgBgG}(9WpS z3dn4Uknh{IHkMKba;e0`-gw)i!1s3Kp@xKKfukZ*%A1&xI+y~76_2yE za}EFQ=Kt{sZ+Cy?wq0$yhnF!ejRmJ|T%^kFep?$qg|%udaD6NaUCee*_ul)M;x_;L zq-67e1X@~KdkHi8Y6%OEVdy&%HCb`&Fmq|CA+7zBnfbM&)kIgNL?ILjPFu`!O2#z{ zcS#3A;6g8Gd1lBoh=ec%h+`nUcOw`lSm~roIcBn;tBaStv5nd5oo?P87)yz$xuL~-T(@#$)|tHsIlY!!<=5UWT4XuYi~f!)w^cp zN&{9F&0Eo8>}g86FlR+d&*|A%mj0QqI{vzk5^R+?uVgUz!RZ77IcQ9c!F zu88U)4j2g1g`KdV5O}agh2wxJfz+f%8toM%qDqc^otOm;l~T|?tL|l@*>PiCv_m}~ z7+iwx&f1^#uMYqFv}D|X6gF8}`z$ijWT{JkWnyVj!DDIdq|r%}q3yY}3FUY7^&pl0 zh={EI^_F8YigKFHj}ZoT4RMmAUKtEOg15$E;gyqJR1h29~F%}K7}#jtjzGVNQhEt zR*MImZe|kM4FT-Z*SpTN&UdF$w!1UR#Sx3cYc&Th4cOPs%vR+ow|u*QZmfOkgJO_c znI-?TtsL~L4f99#*zAz|9KB@Gi&C=-bfQ6k8gH4wE7akKjS?M7AYcPB4s9KZ0LDc{ znPLD$h3a(6!90#SwczTrYPS2=+k83|e>J*aO-gUq*q{6WT^89@W;;@i?VOcORaJ`o zs_5LtA-$P@`#!YtL!E4f3>8Tb!e*FrW)KB7+_CUelEvk-poQ#q8BTX$?j7EG?~lYp%eRl2YPxP_g%2*JQy_mU3HiRTm}f z{mNY2vMC&Om5z&3QaGA>_xyfY0&S_zpYc`X&DQ=hqF98IF)i=*>%2QW;~7`+LIjLe zP+Cn9K$$@{_cj0=ka!(Zty&O~jaUW{lEl?~6r~GOc}R#CGDuOl_&b7(FR4neBjHNV zS17*3#ul+c1_uM`?i6%?uAdN~*GsN%o3M<FW+TGx?1N%{HC zvu6ZjiFKWSv3Bjq2G#BRO|$;>SmBh$DSERUPSZfgbXj!Qkrtn>mS6gQhhiAYGlUo@ zXb#jW+-eAdk|klV54b={#sIH~MO;~`E=4pF%8;i7vwog|(V{yyjd9@_d&p++mr`jw z;_d<^m(uG+me)pdv85zZ%k0sH99{RK^C1%3?R8+8*QbqW>+@eyEG8J{{~E2FQ|)7J znCNAXZq-ryvy)j^{HcMB^&VSSfUnzO~@F97-n+P)@Vk_BHo@TeV0?2ANaUWV4|c4RNm^G>*aq(Brz zkDf)G@sx3oyvtWmIbAsZu9S!uuls&`FmSJJu-suvA_k7Jj-y5~i$V~H2mvIM#1;W8 z89PORX(EUS0V_2k6VVW6^~QIFn-pgh!lVV79wnk4p5mjcC@Gv*vwdWH4Qr$aZSg&9 zZp~p4^i$*St*3zpWEUUqcD`}F-5ABrV2n$1HhHiNQW_QJFMs*lGiqybnQZ7Beot=p z)oG0|*4mSf(WgMt2PP}&dzqQExVe!75lK7@gkZ2p7?7zp24IYZx~io}-rc~qbuc(LZVCXWwSB=l9AyfUM+cNYgZ z5;!8<;i873&EJE@gQ5y$o?!v{G@CAZ!`Uoj%)8IR77K6oTe<2%c#eoaihHOaJ`f`6 z-D03(4OsXlzviB%BBh&1Da8+`%T%dp6BS~ktixq>7CiJMelm42Nn~OIAeU3w6N`{d z)QFJRITefmUGQq7Oh2wzE;c4KEW^7ic;7Bv%kydxOmnBCy$>Y@Nri3P6KOTJFuF5P zgnXgy3zbxj^Mjg?+QiF&qBU!A{ubz=Z1Ugy{zCue#sfqWw(b8l>XzoIUm&Vv&e<&V z2{Yc7T@0hFjj3#vrU)q%lcWfZN*>wDC{TbAL_|CQWXqm_gqdY%`1hdNh2K~^vgn31 z@`rYwtldJ`a-C60f&&ZQJm-GA3t0kmUxe+v5# zWh1IsMQvxSy*26~tF1khq8*LvB+R26Mv~30iFI^LvZJE9h!j(4T8jb@0Q@u(LfirX zT2v0$+5^!9f(lX8gqe@bGuPj&rf^$5H)GZ8lWEsN-kE)B(G zgHK_>>e5r)%@7a=2*{FTwM-#}A$KsB3);%l1r(n`=(3eyjX>;%WRR31U63L2U8D;VV|%BRboQS8 ze@59|TGFGXePpA^M7->zI7EjA^P7Eqz5H-jCwnls?a0>(G%}Xnf==6*qeU{RA&CVf zoxtLafsB($kP#qspg*`UH7_Ovh(}SBsk6d*03j$a6{ru3OGKuLwdx?WwCN4S*Q>}b zTNxo9vgs+?DEmf|ToT=SKI-(EX-@QzZ|4ibrlTDunSDAjH2qOcFHT}k;o{OoO15g3 z_ioOkFLC0}h~+ywA03aTXhF=$gqIsLj@FnX+%dD7vl2QB6<`L5=plm2ZQY62|P+cKF1oN`Zt4p7-ji-!O(P(z+3 zL4qEE;Q$>p6FMzkY5yoC6~+kI)i~mZe0%0lU2Z}3OX5=v3YUt>Gca<3G^ws-=5e~~ ze3I-{Y3lp4^X{v|PN9M;&u0D?&XC;3+RZ(!px_)$;#J(lgDIq@3!*%T90vgj;t;}^ z9%_h5Fi>@ch64z}6-0Uld|UWFEdSY!Q$E_MLG`J!r>3h?I~SjSA%@ajDP|Y)q{lmz z>q#qCiDvDT(w<582`r%~{M5DXpNT?ofxkSRTpf8fhLIa~F;J1~&9F~8kMPWctIk!- zGcB5yYU*SWfx>azV+??_gER?O%`&W}NZWG$E%r)UBr%Cmx~McX3v===syxXAlZqy! zY{NoHQ7VLsv}EG|1PxW% zdkGujX(>B@X#;u@)q;%P*=e^Wnmljh!STITkKMHD%+1%SYF3=DAb%cV31~_i4xRX8QVUGUJr$g*l*CFRRW&9jr-PoV&a!Ck zfjJS)GBX(>LWwyhhEr3FA*_b|frS`ZbkAq-IwY6bbu;>lX^yzh6ONlb6qv*%2(?*j zF?bzFV(fSklIWa`?&tBdta~>X(6OoFFra+a@@V>Z7^f3QTQk7Vng_oCmo>*=JM}y6 zniugW{@?D6VB7w%Bw4#va}b-BOM;hZ0b4IpSt*%*0Wm}Kxl%;3m?6@XTpoWu7z;2O|4i|P zC6QnvwKE?qB;Tztet%Q0U0&I?L{euKXk;D8=cA7tLSq$aDeCB!%_^GD>9PO&q-6Mj z1Z7rPYb-Y zOftc$ht36#n|4AFf+&@X1%;owL=zgY$O1T_4}65i0FDJXSnbUT3(Zl?O5NzQ!?Pk3 z;0sD2BqThEwUh%VhuTqb2qN_3n|#7GV$*XFvk5knbd>LXpmoW;=a`4aXS%-83i5_C z3Cn)m6Y#pKmfftgjw-uUwY9dK6wQ2UQ`p1G3*EM!_#@Jgte(w?n?myPlNg=M*+>(K z)(4!YNo6+DD5EUhG2DB=i-b;M40hZR(1>y(sy@sC?o)SJx}K8DpUu&O{k8Ca?IZ?ww2MOTQ zS9o+*GC}|Qv}Di#1h`vT`x;2-b!YouWrKSWrEh2Ku@8aZqU}AF4fx3(k>QCMfW4wB zj3C!ojZkqQQOTQl-UQ`y(QRqc6GSj?i(XR^&B}}p%*47cy7_}P@)sn79?xafy?eQ< zTUT2*U8h?op)Y*f273@VB@;FWmrFdZ^Xq&11IKm?cH8mqm zR9AZ;Ljchv6H2UCAp~FJqE$t#Ac6qVOjv9hvr}+_J-G1FRsuDrH%Pec2%~t}{uG4< zwOFu{_@D+Tf^pW)p6jeg>5d~XT&foL77>!U7M_Y)L}8~p%S!Ea49e=PKBgeJ=#cSv zc#FQcs2>yB#niRFsb4qOJx$3$9jWYcwDTsoew9afmS-R#H&d7x2NVtoI#?1VsTVCk zLk<|lV24}PhI(R9%sB76u{YhU$ohdRT6-9~32NiiAdL5MV{9!DmKY5frjXfXQBc-A zQmI8m^E8%}@My7PVpdi^yQ@-js$%Y{hKCZXl~&VVRCeFmnB=sYf}F*@@yxA_&mOGT zZ8x&x%9KRZp(z4N6jQ*H(wc-UB%TY5kYE*;F+%!j&JR)&lg`Cg^Mug24~cCLYD>>qlm!*cSYm|B)Nxp^H?@ZuXjFT4fJc<2$u8 zoxlHzd~3#O$HeuVy-JPY0HniJlfCVXJoX5DqtZwk=h(O#y zhH7O{B*SrOQMLd3v_#ba1T0$GdkjNpgR5JAVJL}Ed24O#FwLp(Ep0V~jrcc(I(8B} z96b_bo4~up#3wzBT^Tcw;TfBs*s7>qD8QgW791T>7xb8-YyZMTg=7+IDR z@{DFMVP^xgN2A#=jQ~kFDE{iUcrT1T27MJ5(GTzjP6_apX2=sV?2Kg~_#m?_V?KVa z>jU1ryCy)r+3M~qlAMm@t#X;Ln)?*cOlmO4D>()Vgi7>W)-hO0_A%!EPo8df@76|2 zqSEOTF!ui`BbmXV;aZcWrdL*R;v*hSWwKj>k~-w{vquH#d<00$Nk$F>ih`M?O9-@s zTUe9FSRx349b8H!cg?)o?mhnbV^5j83yUR&-EUy?^$~Vbc~9@~7w6Mp7A8R30|Z1* zi7JYe{&_PwX7<7$Sspk1r1{Aei!W=)xg*k@E*DCeS>BvtKagvP70#lyK4 z8Q)CS=J^X}SHFL0XfR+n4A%!IQ+18oNuW<`Oij15$CaPFo0$IgBK&7)&S(GKot&Pu zA*~VS`?cq2g4tWJTeLCHbEWuc-T4G{8aWkCV^YA(LL$sOR5JY27-))mEOGz)v}E3Z1Zi8_dnrVCcQhCGEYWjp=}I zdn$fJR4cu#R9I3v=ltLL4;|W}F!Xab#$zH9!D731=WNYIkCpy*79JwRZt4Gg_+FVP zKuAv!-qR=IdwJ1w=gJ6%b(j9;9*&oL%n?yBGYJKTF2FuPw;dqjex=AV-4vU>g8K4PetkdI!29jlVjBF}qnuy&R z_pIZ#eQQshM+xpGejC1rf3<0}DeZ47QQ~bUGg4As&^_KuZ9fi?ry_Iav-h@zRu+i@ zSP(#1%eN-WRlptEdr)DB$_(YUPP40J7_|)4?!*QWM1-ImK_G!}kr0pICR&hk3b4IQ zp%&sSdDC2NEx|(*GAu?pg~XyVYq-HGTPw)`#Cy!Mm-ia0l(W&HkOBOXuTAY0|L9hE zCFOL7K>F45FD+(9%e9dn{a45->C-g0IR9_14+ zqJ6o z^XvX+%Bo9O(#AX#!_^bFp!xs%v}EQ01lwBLdn`11ZwV`JWdnN=m1%SAq|a&Ssct=o zp**iqbtB*EuD^N1{ij|PGMZbF5 zrHKmyb7QiAo|D1Jm+0upR5pb30NSoH<Lz;m?*9SsJBPd41kNQ3NSdnOSOUC^O5SMV|jqrG_+mhiRa94hPrW&YBvEI)2yKIH5!tPQnJfc|y6{ zg0_#VQn1@Z&5fz6hJzl67w~YDR(WF-Fd-6(m>UEFgOuE(=3`VI5fuT#U8&PePRN5} z8kbihH%xZ*n)rnD88b(6yoA6+)dXYE`` zFIdf=clLBMS~dG;d7RX08J}JIOq;Lr>R$b2*CTu9C5(OC!$MF9eC?3cjLxTCBsJIBPm)@dx#>8dTch7Gwzx5`RlBQ@sg9)u{8srYCWX};CKZB`&`!c5ODH=Xcm0Z|M;i>)(; zM^h0X0ZGfmRU!!387cydr=ch;<5mGS3vLg%K#?J`M2jS4=Yyfh__z+g%T4ZfbBsQG zxwvgDmtR=zY?fPI^Q--p1#b2w6k|iRm*}2CP^5kV()Hk!zEX{;?fzx%&%MppKeEs5 zO?A2ZH=W3Rye^;LB6P*<=c4hmYWW#m%71ot^qMJCt5{}H0D=Wcm7<8WQ(!7j(?x+c zpC~FW6ak2@656{&LbJ$znf<1b`S(4VlqyFDh6oo`Qp1q7T=x+J(fC6mr~Ci$uV4Sy z#3+X7@8JNTw%qFl?t!Gg4CJ?mJ6t+htCwO! z1e@co2@YbHxoFldnOtQFpcDXVdIP|4Z1N#dZ1HeN6%RCz(E|q?INAh`#jQM=q^Z6N z!d^?tEXo2YJ(%T9snczdY10eUy(^YaHe1s(6q`tyk{HV8Vdkalf3NAXcZG5orp8w( zM;BdGm%nq3OJ%zC5@Nr}N>y{NhLFh$6c%j?_K^Z*)|1Ir6`55;FkG8>a$E*NSg7z} zRagRG?lmff19q6I#A*%NWx6&?dtx(CE$ni>?E=;3V6y~g}bp-Mh2pzDCu^ zpEB6YwnqCLfA(gguox1a#GHpg%7>Q9s0jvqY{{hBib(AOQ@gfSXNI37zp7%d2z0_(tEpa#1x^UTQiXyg%D* zGBFV7e&gJsNGp(NvWr3%X+TO$K(g40jD#}(`?O@*00f>} z+4~Gj*mKKkZ)C!c63uOC?6EN+z8)<-hmEvR(1HTM$dZA>5s{Zu@Qe??TFA#v;|ge! z#_mvH#!ayyC&U6yw*nNiWwroYkAo*jUR~k%a1!>thIhb4dCMv7+ZQQ3%3s8YTxsp0 zdFxl6{GWKM!soqtRYxWMsGIX|eb=gj$g*G7f0F;nb3!)OJiF%R{WgUhl6IeL z?XmzQAccS7&{+`bZLm<2ItK|c!BvUzM27**Y=Mc2;CWjZdv8aw_?QgnwYo7>l}wtc zvn&QvuMv_1i81K3qKc(7 z5j3rN&1tJ+=<-lw`j28n$WXC+z7@=QwuXci5klG63NgPoG1?Z~`=PfQ*gY<}s+}=l z@O9KKG<9nVcq%Ot<))8SXcQ=Kj%rjEN|eQ|ed}nBc@+~>(l2`Uqr=cLDl1Wy$_HV< z*|SwzQbPa)bdZ4&47!CXbC*CEd@gEzo*u0IrHVYff;PAJ!L36NYzOCM@|+#pP{2Y9 z6Wvn}mc?H41?{l|G)SWCyP znL*0TBBfrgh*J%2tN3#JMjo{dr9AO5W%KvH@Q_V+r~G`#6AIa_cQAU>sD2~CLx)B& zLjnp&r9cD_oIhw*7r~kULJTzv)ZKxaN=d|=l%S5ba!5hdO9!H*$^#?li|2xqZfW(U zs!eC{*q|iJWLx+UC529rmB`Jm**kqF5s{l=8*GcRLQX44NTn$+7SWX7_~9NB#9Yn zEfbSNQ4!^s#S{rCGLM~X$a^&>#=Pm6$h9Nw^j_S>zSQ1&fv~;9IBzQAO zvh;Zzw(cGF_Aa*a)wQtHxcf=?xrmvGN_v<-qFUm5c!jyQnE1ZG{-gi@|HM}f3&EBk zIMKZuV-BTMhKWN}Fp81Ofg%D81SOs*aEU3pB;k^#!lQp29MXlpaj&rGVl2ATF_OQl z9VriBsAEl2wkTQ(X4p^&EL=2MM#0>TGpwlUas^H=1){~8t*lwyp5en>d|M}4SpL2a z;fgq2LZaPYwf2L!XuiJJ=OM>U#PKx?vg{{$7z zN?k)KyFx|9vHL~eWlKfYw$PI>+hW4u5a6iCs$HVy47iB&i?eZ)V;v$Pc(oX)%h}~^ z^1EGTx+t40x|X{H1D60fxKKcDlMy#+@@QR06!J0)6w-ON^MP zEu>TLrHrfvfj)MbQngor=q9ySMv9dq$O$d&?P3WlwG#Fjn`?N&p00bFS+ItK{l7EXkO<{;!P-Sar>?IE=^DQkkgrXtVckYnTgfl@Bi3ufAAXz1W zSH2@E?GS{>L<2Ucn&B$G$0D9ANceQsXll&FnJoo{g>Nb2(2KR^fi$zg z`P~Epxr?VrW|^1`8E95S$~rM2foeON6{n%eWe**3Rdc*6u*4wiXo#A;aKQ_@M63SN z=y7EYso^h+W-QSXD&<<5DUduoXc>~rN|^xw3LvNgAUz@lJS9S_Dixui8W74SEW}`D zEWIph#TN*!xwu=oT+uT|} zyK0ss7>%+i3GC8F=N+C}?k^%}c&NW#EMPn$4IN8$!*W1QK$7-@s!J{0kr-f?sySk9 z422aKv&4TD(9BO4R*Ox{;sv84%{s-ZU6`ZX${nc)%t1}Eo^r#s2n`sbpM{4M3lBmh zEkU z|DdA@Q@Wr3`?N&#fCODy*?SK{`h4k2Phlf}QK@fdtUV3k{4H(0gqfv2GwW$>O}Ra% z_$+FDvfEy}%yyGLJ8m~@gg~2q_5azt;muC&-sgAj)FLq>l~zP^A`(cakW2?GoO(k5 zfOMr|#ZUx1%A|~E9bj*(;NVR;^&BQo8JIwE3T1(0Y&V1R_-wki(1gh8#+G8(jjIVb zD1+lKkAzrYi5d}^%Q7zi^SyRSS@GMq&-YL+U)Js8peTCWmA{p;`>Fbf<5|hGH~WPV zuuayTzwRNmG~^o7j9P96C=F3KRCGi^3At^)ay+S8YKje+uqX>^rA$p$-i@x->l)sp zQs(NtW~J}993A6byzNv72x-Sru%?@nZE-0rFW6v*b+d@KqOBr5t(m(VOsxnD^UeM` z8i*3juT0Pqs7Tb#mH7ylCFytXCD8xO{LjGxyBhHbxve|F5s(mKjZ6p#Zt&9yh&BNg zbXtX`oTiwpY{3#Srpnt^sT_f9Dio2JwJk2KY44yoL$aJTWg$9~wZx)nF34@7_;p(roraVxz zVkWL7^8=|1o+gqKx#YpHsc!>DnB25AEeK=K-WCv$fP~#GLGz^StJ(Gr38v$gt}m=uN|(&{*+r1T5Tn1tAmYGPo7 zbU)cL3u;!d!-%Zx4Gk?>_Uk7@`p2TZWuWrOCJi(v?_cKnGa4#oB~a&GZc7jY(;uE1 z_-cq%;$GIWgYn0Lpy8H?JL1+eN)H`q`Tj0!VH1A0*L}nxLUL4lO7|njB58M&1tMw5 zT$}<0m^!IqX(YQYM0h0|S#pg-WFF?f$|ma8<}KoXO_GB*Em)6=ox6*i(Wrs8Ue?Wh zmA>-90y|fiqj7TSKEm-35l_^h_@_3Uvqa>>=NoLen!eg%l=WQl^p_^JLv{YDzWoY3 zT7CWT|5+&W&#dpMt=|l__?Y9B?{S*YMNG`dVg#0&PMlaALZ~5;7?4gxG<9W!$6C?l zyzs@4RF(*2R#1wTeXG*t^BHLRIax;Q6MX?K9UaT=>Hpty>=t+C z%1W3=3Php6AQ0;AP>^*DZ5G}0zh8etD zfKZ%GZRftXtZG^$_anPbecGUP!+iN4e@iHPH*fnh^OiCYHkepbLkg6Uxr_!zffFSw z!#g zMKC;aB8Cb$%Zjje*hm##h2ll0`z%hW4S~@oT}q4Je4VC|#0sG-GRK&)CZ@&gv!C-m zg8~DHV#W$M^07lpaBK?MYTQ_%ihDE&0v%7evvjABr`47`j;imNAUQbsP5*3ExnSr< zo$gY>+@(D83 zm_37`^z7?rI$ZGh3f|;0sw7zd`?O^HfCO_|+WRRr>UwK?Uu9#D676wi?4g;V;36!& zg_h8yt8Cijc4Xg(x*(wPGpUGeY=R)>a(I=Ul_l1T2IIEOh~Ctd_JOgMfmX`Pz6bCVLFpmsNd zLq$Nw(s*P!X~>9-WpIZE(HR*q)K(+SQdFu5F%I0jO)(#EtxiC+7gT|H$BTC=^ZB@L z;_8V2a?)l}WaV5|!QvB)Vrp!-kU|hj0_1a! z1VX~01o>D6LArG@ZTZ~U9%xVZT&EQtc=z8zbFAwy$jd|trk%oR;;N*1K;Gr2;$~(H z0fIZYt&S0gFGE}v2k7~R8#6T0qs*?SK{VuwpxA7KW+Q2}jd?BNIE z9IdTAhoOA9GnwtXc%l+NWRL4-uVOcpiwUFZy#fk$fgo0Rx|g7v_bN5qNI-JPOc^>dI7RiDI~O-CKX7;0LEPb2~sJr zAxdW_xQs6J+?`aWC#N z6nz*^r#*x-K_GM(jUY-MyJ!FBzN$+9VPx=ygA>2JOtM>PygE1VnTKSE1yrmk-m1EaEBr!Y9R%uF=_pjA5u$meUi{=;y2Avl=#}QJYW+PqUyfqTX}#`M zxj04=X$LN*hy}{oQwZXigw0>WOiQcD9GxRZWa^#DjW=eemB)q`N?6dCgM1>4eRs1~ zT0=nI9gM+gm0C@s6fmfi2nVCzX0^^!mnWM4`?N&+fCP$K+IufTc$dp-Eny?s5M60$ ztUU+n8ZB-8gqkI0X0}I5DeHKApXc3Hy!dMy2k2;zhh-$sz2;Q}=ek($@x_Fk43r@9 zYHMoQn(tSJ<6125_hxmArL^^LOQT32Nl7|xMF#?#_L3k0atjWctxY5v!z);2Q3L0Q zW~QO;OOACPeV^qZ2~htcvNH+*@KqCI*zuvo4dXQ$B9Y znSKmE_;OIjJhU>Ee`am)#{+pHdhxE95obnPY)GD|zs}wJWzJ!;S}{~ro^>|qTi-r( zwWYTtN*GfiOt)mv-&svHRd9r7&pvx=?5+tRS6^{6PblISpDB}+l<(-&n0 zRU=8Fc2T1IJz_Z&rlz-A?l*FeI=1U$jRlvw-pFmDN_UjdPKbw0|DYJi9-7*>;lDvF>d?}U0w0&K2Ad<{g)LnD< zg@oe|7f4ftVlp<2qo8;t z)3nyU)NZbECRFv|K`*-K5>Y8C=irg?H**VpNWl{S`?N&x00b#pS!*maXof3mEoJ6T z5*=-4>@gau7bz`0gpT9}_@TBOy-xM2#-z3aI?tLl6O4pziwdd$iD?xuw^6ucthX|@OXa94R)ywHH(4`_@$Wy9Mbqt-KPIe~U~4xW@|!j; zt#LkDzx(9U&1tOO_479&RoRyf^KjT%=u;e%R`_PAM8evaN22?!MUg;@wZRF103l^A zZ4yTm9uQPQ=T&l86Bt@-4G-$U>y=h=s-z-d)F3$$N%OEwvb^%PtObOPF)?Dn-TQai z_b%g05SV-co2+v!LrPK{X5#Ae>YS^hU@<_18Df8RIqgvf#lN3uPy)V0im zZDKASeo|H3%ekMs`l4+G38GCT)+Ahk>1FE*hZ6}W3EsmV&5_U`?N&u00e7US$hmbdW1_` zPhlo~5uI^m>@g4G7_F@Jh9TwKnNJ}QaXjdRkcoPnA5X~fXoO}MFlHQIDM$ASLoSJp zznLene2`z#yP5T4#?6W(#6)V+`^uc0z57Swf@1_xMWW?PTNl_qEOi5Pm^L#q15G8& z0Aav_3nGSqgVn*DIFqK7ffEdX^GXQ_3YtApVeoF0CjU+?k$!hB}WAZS;eH48FUkjXr#fCXhK=@-qW<`gKJ}6UYf(D z1VqHrYE^d>EaW0_8lV00-<#r9Sl_Du|LzbBfrq2iQ;xLDFkpRA*035YA|26OnaMBa zfW~Hu?W!6Ae5n(I4^HH$l!!*a^2_F$lq|BHbgXE!c%?Wsd}bsA)(luI?^xCe20ihr zM11l}Kun=%8T0?TN%~NNx~+`ki!>XOa{lAKl%k|!*Kmr#2&lHY#i_;Cejcm|8{+N% zn~MB%y13vtHBl!*0TjVhAmz9_oTyUXq5{(r(u<<0Y?AsJr)~{eGb%tUOGlRpn6@}& ztWrl~i!oQ*vr^qyOCS0ACxbz4aN)}|pK>1Jpdv^7=h#mC4?w$GeKV9Qjv=ddB(Mf3 zUP}6!=V2UyjGSKGQwM_O0C{V<`;~eq=rLz%<*sO)H+%I@Us&@35FjQ}>Iao*Fu@EK zi0B6$NwC5SjmpEUpaHKhM0ZunB(Mrv(iThan*&P@gPN45jP!g^y8LuRGx>kW)>L2@~D6!HlYRCgC;9J;ox(T5ht> zebskyS*S99-NR~Ynl=PNea%%WnceA}H4jg0*Sh@Z7)nzqvXCGn7>&E{F1EvU|L?+3 zflMau<1%2c|EQok)v7g=cLh-p%a+-~LXifr3(PS)IMy}V9H9UoF`}k= zom}AL;{?#J{bEa@7?Mk-nZ9`$c15cEzU5NhzocLgq+%d&Rfy;{gW;${gjWYc0Za|I z$f#UF7$0KSpa_X)0X|7LGMC%pm;-qsEDM$kLq0U)hk20yDeYYEw-c6qRYt_hO%`I) z>(b`h38*jw!X=`s@B5K~@OwX2T|+}mhaz*Hr;ELyq2S@It<;x7sxVZLYeIMVO8emA zpSil)rg^y)C+q#E*rizGFhv$d7C}n{7k(((l;f`a0?XTRuvo+)Zp%tr*VTr}k9bo)-v*2zg(Icw z%O+XUdC}PN#{??Ly|GOg`Bg_`VRyvkP(VM?@EwO(aX;n4Vkia!?(Vg-^# z;#0RIUj+oseHz|m7MH2hDXK`xSJEOP+k zB%`g%GOklE30<}mfh`4%#*oPqLDLN9WpcE8$CaN=YG``QzL~Pmr8?+N#~ycT;!M-- zGsM9oRMOEVtSNE+a~!y&AWfW9&D@QW0x%qEy+cDhY%eBTM;Gh$Xms7y(KGOQwZv;* zUyBGuAU6@1UBxcsSa@?{SXvHBTm=w}Fu2}5JW>ea@E1sM%)BmCHW8`5E``rn6wk{y z+mf0DOWjJ9vW8Y#%-1IK)mLfwulmwXsgU$3vnpjg*aqH2pB+Q#q#nNVdZLYki24}$cs$!fQk_( zBXfdCwpwYBW1}*84uG>TKrxJtUGKfM>v+@b^&H~!7JZqo~} zyjE?vMZ4HXVF)ialwxWr47=FdN{XR5`F-^dk2X4inZ7778ch9UKv8jPI&}sA`?O@* z00fp>S$hvedV?!lFJS}AQ#EgE>@h7NL8FSt*B2yr_zZ&Z4;uOLrbX)}3 znudueFwoQ7phFC?XDtXi6mLL~VMRJqXcJ9X;D;-YQn3tt-OM%ASWJ_U2NAGZB@`2v z9z8nc!<)wsF4K_Utc?OQ<%kIk*AL<&sPJ+X-XA*4!Dh=vBFOyF%P^tAQxz>O*HOC5 zh;*+Ah=vN6UAH~fWtN1==&=Bqy)BpWPn5L@vSfIW2oSCQ?en;Q z*q`+Z{r4P!N@dyrc~8L@7Ob!0>;85eT}l7q;!EP3carA$E+f@c&l5cpK$$)mX5j6@*+ z`^03^fCj@`*=sLk_<+lMPhlvI5bbGktR&E>a|^CLhm_gyBZ^Lvlj}J{RTLTS_EJ_A6qs5hbeylpa1qJ*Pm0Xj;-I)KiA3sc@;;SnPfu(ifKEMoAC#_}e<@iU(a!kq5M*O2D5Z3h=ce&dh9eGa_0H0KMR|0c1wIn$ZJA zqOdH!Y4__rL2(KmiJl&eQVk2Y>LU!rY+j$c3QHp~!oC~&M3a;H!HKmN`wK@mOTO>);FP8?h z5;)P#7D0?jr4ehYvR}P4R}c9~x6|NfFArftb_40lQa6_sZ9b&|+nfJv7CP2Jpz%Zm>q{y=b7#RhUOY;?c(Eb~B289%v zyV-xoYsMOo79b)u&oNl`$CE9MjU;85 zkv&6;32k(ZB9a10j2M}kl;Ra>leDUYJpvx==T$l^i%nj$^2imibjFQaQZFs*Pn`n$ ze<4xbzCG{mUR}ecYQ3M2ul4-rcbii+;Ut0n;JhT>TA73lfJy;#c+(qap{IpKZh%rn zlyb~L(G}o$+M?T-Z6$R%-C>U|->W*K;&R!gtVO7s$|akN@%2B^2Ryp1KXpbp@R7IX zE?>I28dlx^`?O@^fCO_`+WRas>Rjr3pJc*wQDIkc?Ih1>!mTZRloqY(?#r_+{+P5vKv~6+h~=2VnBrZjO1G4x~S~&k5j0UAv;o3(D+DZ^e z$b(p(lg+}Vg^x7>kqJ;U+n|isLM?shITl*DB5*yc${4UJ*nra|+$J(`h}wc=4Fjh% z*=&%CfMq2yr!5GiCuN5unM-=eC}I+v5G{F_c{x=4J5Ye)5t_|+Js zgVL%Hs<*6(8=g5{B;}%0lSMRflC&P-v4GDCO&6_vcBd%fD?u?eaj!JZpoO(^aFP%q zYba#MG6uk5W5onuAnwZGgzsHW?7-v_rCiH`QL9TB1qTt(mF-cIX4x-6b#M9c!ip;? z>ZEf)*s%w+Wun>^F`GZ<#h#L81+q0Bsm(^3HD#A%Ln1*b+l_+2p^uEU0;xL#LK6&J z10)2iR)zp5A$?l^`=n(400dK8+ItB!Fku3Fk74Oq5&>;*>?F{kbdRpRh6&_$=UWSJ zER-^s{QWF$AE#su_3R;uJ_O00VH40I20Xw#84_U~7|7oygCvpE`7N?plo5i{`!m9%MPutH3&Ul%Q0Dx+X20m9Nj`_8_;rNVYmn2v{b`q}6H_W%BPGN1?`+S5~tN2MaavF5fq z5tq%Xbq^6KJZ#iEBSC19FDlAl$N-X|l%Zt<3gFAEbkdBBNa=b4@9JggTaPvq?WM^v4RaOCO$}+tYFh; zypi2Vks~<@C?t(&;@~pm!Uch`&Aa81$B1IjsA$G~F)XHxeXY{~k}+lHIG-wodd;8C zXUtc+mm!z8tX=18X)iI(Y;9#tfmTASuOx&DOhm^ksPl#321pc3R187|E#*XK0ys2rmWOQ~fUs24U0RU}+u(Sqta!|cBadhV?{i>NkO;ZZ0! zatdT9yjzyf5MFdh_gZ**qNj$TY~NicYkT4OiJFNytDB3wzheu&d2Z|V78DRx;-A_f zAp?g&&6qkBppy(aaB7Kph=z%y5}w`BtVJEM5rD-5ZWQ*fqd2l)G3S~n2G;7fAfxM2Beh*edo?!Fc3TxkBB}#mrV5sHBhb{_v8^>X zrSntlS50_ORqsP5~{V#E#ps5QTgJ& z)fjxLJ6JpkCnJ@OxJ4q)6( zcX!KXmeloRP&E|y587FewAHPOZMmIOtqlJ;R7pgE8D0!bOe9irBQ_L`< zS6GHNU?h~2oB=gu6e%&w053`z4J~~z#N|YovoKhU?a+S2fQe!8C@e$1=}{>&@%v>; zq?sc7X$vT`aZNE_qdU(i3Q?2OX}!_$6Mq`lpY|=M zTJOX*DcI|Y^Mvwo|GfWL$6#(j4CeHtNQZXz2@ok1OQ43PSnSn$mkT0bDi#DRb|$O? zup1Eu?KVUlR38&f7+m(WQ^&ofQN5C*li8K8x_G(|W&x2>P(fvF>?F?V{wpoDh7EmYg43Z;8^b&9;!>C`wU#{?qZSYPiudVs79_)gKjNT zRhP->EpwIC@2s^Z^MO%1>ce-cl`q9Q|N8-8l2A_rybwi8B1)ud1`Of!yAH6JQXx&% zy@9gTl`g%0;z_0>X+o&2W%n6uMwMDWiq+pYQE{ws7MZ;r#1bn~A?biSOb!GL=-D)+ zw2$ApE?H*DMYTF-NisPJ2W14bR4};;(Mng99JFQ$ppf>I^Yl9Sa#J=87v7)R0)TW5Kfo!CJTubT!R9mRgk>-i%2j^L%8TnrA?tJE3g5pQ zop{xsVcAdboN`x=`tRAQoT6cgET*hC-4=+URZ!Vb5@nkDR>bE^)nZp8=;)=$NKY9X z@a0j<;`gGhQ;=*zChUT0QvuUi*H&V^xb&-fh!gK&96b4gqb~^UHT$vu`?O^500fd+ zT6-@_+Ifo`Jz*nzQL$xftT4~%y((>egbr8)M-XbrT_Tsw6!VCAz}nE@+#u+pRZOWW zOTX$r)C#7i$imh~fM8F``+>)^vP5r@ zyot`x?4eY_G689P;c~paq%J>}2reHs(^&FzD^i_VNSr?Ftoy6K+Z3uRF|TC1I>XN4 zv}m!}V{e(+#Yy`{CAAP|cN?|o#Z=eDzE0I`=F}u7?ucTSuXb)Jh6d@HwHT|`RYg_> z$i|dLScnBBY2{4JNdX;3DB$6ZWsQ;7K@m66Vi05&x2fzySmzErZFS?uOHFa~ql{i4 z8oYI+3M!Nbkj0q7Vi7)3irTh|b3LE?zX)g6)>_=+*%QVRqw0-HM|cmtk#Ft)`=n&} zfCOJ#TYD@+_-^XEPho<7Qb}!T?6GgD$eC?@l#0#wzy4bP&Ku(>O5p##3#v1QRzgDn zNGZF`hXouY1!g>75DIWw0b7&$%=u&?RB9iyES+k#I9XYmd(v^W|lh_iAj(U z6f7iP!3E5PM4|Kgm)gmoItm<%7X-D1l4e9EnEF`5Vk z*wJ9g3S7W3(Xh1Ua04oy6VQAQ16zPN(Ha|hlg9bgk`p8dhmoNL$qBy1>{351O}S!# zZTr*zvaMc2X~WW_$Qj4HmLNjoYz339!;v1Q(}6zFP>#A;*;Y$|DK zE(LZ8Plv3DRV<`JVJ91x15+w42Pk+D66+Xsac{we2!dQo#fjBT7dfy{HK+w%!cmL6rk|_&r9|7%Hmp;morT=SIrn)Q9+jLN1klj8CG1pH8W~*F8zLGa9tc#4 znE(y(AluOY`?O@%fCSN5+4~tt@^;C4K4Bx9QSD`G?67gk{VgqhmyNwtqW6xJ^OCM4 zqXiWRzBlERlNeJ>xHr~fH92Q7Yn(GOLoJHO95&Z7TX1sP`Xppn9+A&yk^VNt7aH9- zWAB&uzxYUAWyk*i{;wlRf1nBpLM1C}2sLvMz>R>R(7_Q0_~O=aJl7-Oa1bGCy-}_# z32IiBXChK06K+e)Wrbo9DA3fAj0$?U!b7kE%eE}wcBonl4F^;xmoFGtkG)dytQyf_ zZ7VqJ727rW$xeEhnKnHxE$Yt0fum%m>Q@UR?VMe-MynR;Rw~Oa$ZAHFw&qD3Osq9j z^>GdFKPlG}e8(FMsA;QMy7(wFJI^g66%CW&njRelh`=opo&;D{2c#%@P^Fbla*U#^ zuoW)_2t`-L6k3GtJsb=&hh-e z{;Iou&8?Znb*GIE-iuZDeDyh%xQ~Xa{i|iK8O?0wmF!EluD^QjAwr)a(ieW3b@oZ{PxsPh*FNw zm7i$k-P9qho`>~$t$p{DsWRJ_wwCyN@jg%$QLA^TZOY>OV^^nDb08E*7mJ)7@=>l~ z(73cn9vC5jAc?8}`?N&VfCLU(+IuWRaDS@1Z()W_QI&6L?7b-B9ILH;gqkhC(KUc_ zmAP6X%4X5asv@N@`k_SU#v-iw<&-%Xi4nCaqYJWG2SVzO2en3|pkTF|6A`BMSL}11l+O$VY=If;<7f;V$Ji@A_ zl^;zx^g8;Cvr9{85`uOx8JxbP(OT8YU#eAP4+vnzdW#s`J>3vLGFE*3lZAGnb)8)n zVef2c*1Eo987Va*2AbF0u+fsQ6AVB)T~zb^D>8zi#fUJ6QG;HiI(QYeMODmM809r}Bg=QuhB0M9BOiUCwU0~}Vz#fVtv0gIfGgeDSDcKLeMt%rlSfEpfCMw=Skkyfhe%?5nuJ$z5=S?-e~K+R68aX8Mt%<{^ubuD}@I|!qO zn^8+eR-84sR9Cr$HdhR1ezl!G!iWZ^S??zq&nIZwBpA(wr&)*KvwDc}5``*Y&tr4T zy9$&vhO7jtS)$^&&r4Jz%uhoQYn z*|j69x`1=No!NeCa;y&qEpqSYw?)fR{1&WTZjzi6G|TV}o{BH(gF1Q8_oR zqBxK!tkCR+hD3y#ZxWSj4N1@vf=U~VUZr+kq=1C6ITJtx$5S&h=Q8lUkZghTDuo+` zY|od0bQUGn*p9g=+?6_})=pkIQP%vi0-DSft3caq7BvkprAeJc?Sm8SoRb9MLI)r~ zfWkC$BY9_>5-KBD03ku%zHOp*;f;zFDv1_~Co%x|to)csmebUEIYtQKOtmHUm0&h? zrj<%5wd7rO7JFGCgaQyGs$PQi1-=0Y^+GC~>S`plGiK4Hki<|B=mNe+1&Pkoxv#wY zbt6>hqI~Qn$P&DK)W+}Hqe2oa^DJ)q>fT~5LI7%{?c4kmqxd0e($^WP(YVvY5kDJ@ zjh|{PA_{|MX18=B$m-Cn*?5 z+e3ji{Z#-{I3jWo0tkhjU||piNElTu3Ki@@#b+oRT9LrYr5JfBEI!k^mrE|oE7ZNI zJy zR-{YD4U*T7>x+7WOu33*iMOtVA&0Fu*EO@m5RqUnW)5*3jars*106gM|-uZiD_ zvF8NPZ0&et>tYvHTZuji(X+Se-WK=Z|pqH;o2&# zJ%o+-i$i7V#9xuf*s|&|nRLEFUC4z{Was*I)>$WaSTZw2 zC6eoaFB6D209Kdi7C`S3k-88iZy*t{MOTh$mcah=99A6AhDHjEhL_ujB_DTE#@%Ju zRW2Q9u)r96Wl|c%DBN}AvC@ZS#K#p`HvDyria4`+b*u_L})`~Q?5OTu4W%-t~hxw@2JugERK#2*!V z!SN5O1(sD~F%T4ODa1v~!KW!{lvqfhz>D;x+nU{cRD^v%;;U9qap;RiBkK>_u?=cK z;|lQiD$;O?>7at)VOV$ADH7~S>fK5NB7n0GBXe!eROB5_!ur$AB018^U4($(@f{=6 zdcQ#cKpI$sBj38}cyu0pGFE&pMcb+nASFvo&G!|9py5UXLZHNlIVv1kM}k|cA)y)u zB%Ad5fyIu!z(xv~Xev~lgGIj=V~qX>Pg=RgvC8Gzl(QGRetNv2cw5728Hr*?v)Tti zT_j$~kqBmcHR?Scrt6CKykLbZf4pD;sU9Sbe1|}o%>RiE7GL76e;pw zrf2xW!U&ZCsUI=t1*lgbbRbJiw}eHoG1bS0FqZ+kP*^(9P?2_%9CD=1hQk=K04b7& zO0Z-~44>KwZXR%V={%HxwdPr6+d))i*E1~txc#NRwo(#mSMi_8WfauN$-LA1&Q}7X zKdSbVLqGlIe7JGxBx+~2&C5kCGd9($ z2>Xaam^f8#H}UKWZ-|0Z{E?@^q6z{+Q1P3JJ}uSnd_E0`M5z~(j_*&_-mF`x1vqwM z{9YA+a@xtWiHa_W-AQKUeRm9S>35*5)@3lL|NFFL_5cKlTw41nL}+^JTVG)Vy;1>j zY3#7kq28(Oy^|KzQC>@=k&I)Q7(|MMWa!O6gE0v^RMXo>BmH}4t@gJ}NaqCD`I|z$ z0%&A1QzQvQmxM?rkr2%=zznsb3C*yA=)@5b-ZV>@C_Dssq*(}iGWumM*u_NM*cB$4 zEl6J2&;;oYqm2sN5;LA~_4mtmZ*x z7|5!t8M!g$WM%ONj6fn_)5Vqa69?O($?&oD8M{9YDbR!Lv?%!?(e>oFg1!4)j#Z@^ z2$X1YOjC7pPCt0%3T0X?`yR7v91oy_`j&L1BAlw$x#6apmk@^zrQ?rZ`-_vh|7!00 zy8Dm+|A#(CBhBhMj^gCFuP#WUNOIe_q0pc)BuJaBhSDMdu9&JqRMie5pad)x0zlnd z%MXhmWI_f>!WB><(oO;sVAFK#Y3SK+ZMXHsU3F`M23{eX_(`KA^|?U zdm0gf^Qz4X&~UQNftsC@1AvBw0Em{Ta3ZQGsPP7R)Y(JY;MBhtkI6#@kM42v1TW;V z9QH?8x0`F$3}pDbSR+h``tuYZEHE{G)0LVm95@Rm|NEq5`TzuhTv_`sLfC>!D?eq3 zrcr5YYwV>E$;7IyJ*E}$R%8BYKm3FdJG1!RTQU(pZ*MREXDA^w*|_l|h*mKn08~vo zjrz?1NS3exWV!*Jm-r29GZH~`B|6}4DiQ|E9kkoL6;uV52#{Qzv*BUR6lal?%u+(y zQS3-e=y2srG-VRhom^JZKZ!x75EB#4D=&0$jy?gnP_()qV~QKibT!W(|HQ=opnPbJ zP4y2Lpvt>{6>&qx51b8`k?GsMZ=NI4XwdC#a@DQ4mvdOU&Sa zK!8{a1Btl4CHH+M z2M#Kc{y4aTP+axd;d*l!|}{P#p}E|NFFL(0~M) zTv>ZBLvU^C%RglWv=Sw4XYDZ$$?K}@{gxHHQoDiEnVpzopFkO}gNjtho~+4lz*PQU zL6~VVLg&ZRgPCicdL-^kGaFICRpZd!CdauUymc|y>8qXtr4_AJsfZvS2SzHM=0$fQ z3Me~5Wp{O3IM)94svQhDlJ4`p={cP5`POD<7(oUg7Kn&aK?Ff9Hvq?q0mJ|-`lC9S*LX~A|xlzqx?HUCN6SlzzP z$uo;ky>y?cKSC+auA=1{bdcw~mphKM>6Mi(*JJj4jm|?rVPct#iay59X){j9q>Tuh zyMl=_Hgu*GYVj=TXF`MnH3r@Eg)Y=m7*{Uzehbb!7?_aCnLWmX3Scr62nB;;k5-Oa#Rtz`+jc%4gg<&ery{&=4x+22yeJ(@G>^Z&caUWjtHDiVF%| zNk^5rs?xHta;RDj&iHaDnWdvVzRxcvl*lc9lvg%Wv&K`hD;Z)GmCZrkPXr=I|NFFL z*Z>5)RNDIqHF|h!D?ed{wNeR1Z|o%13AHA!J(7-fXPh1|Kqb5^>Tp03s*P6LKZVTT z<8}g$#F%MV+#-fBS%ag(G_GNRO=CId6sUdncK*kIL4`KbS-Z}QnZi9~=PC-yoSi<> zDGb;krNN_#Bz;t8Pp(2^=U-1lCTc{diF8sB0Z1pz<`gg}knuP`N)d&72tp1>2yB@l zsTe8&=vEMk<}57{Az{}~4mDxdU1k?7%b4uB(?A#t_CT?U?#D4R2`Z?G?POrm7B&xr zz(tgO%l3_N+ntiS?9EvFI{nEUd|XQCceAtPmr|F~%&4YlKH6aR|2uu%*7)?E9KCb+ ziAoPQ$d-3e5K1K};koBc%>dc}S+EdL<};%PO@39|=m}%c-S}4QQZ*icMxz?zTE~@; zEONXf-Moq+eX;r6&dM-+6j$k^(SOXM*KqSIuUk7D>#+)b}tiLdS@=wbIg==i!)X>=kkQGYHulbe8q5uDs z|NFFL-v9(iSX_GyGg@nk>yKcgiBU~iZR{k`iIpGjy^M^k_&Mx)&oU+`8GO&YW6;zo ztYdB~1~9qhF~nd5fmD%tb7w~Y#kSQ&sZ~TW5J_p>!thFvD+Q1axWWvQFqxh|t!8ml zn|Fo`OZF@<85t;R!b=4~AmVNt#)L zX+D{?Wgc@s+}*as&}S<$=P>M@e#_>O!|fSSNFOrKryohoITn)8vu1gsW-oH#=eg8D zFDlX|T~&=CEk;bMDv?0blWqc$0fB=B2w?$Ph(hcd1{Vo1a%PSD!;-2?#4?f2%6zh; zEItYiBTJ@l|7tFYEDG7vhrmT8qV`g3`XhY^S4oC*7 z1yBhBHo(n+LLnifV8|N)!t-YXD2O=4&I?JF;~=5cmIVmcq6nfv0Tb7>2 z!8g9IH63b-U1WCwN3FYKVlomf&D+?6yi6Fi2Leo@7+5GVxWs~hP@|y@EkG$B39JH% zqVN}@G1o2OPW z5J*Y8iBJOuBMCT+z*(`z@D3uuWe|-6eIXj_wI(GJ2w^h#6(Iq`z*ihW8e!m3MvkEB zn9V{jOJ=7TCko82N~;jG8n+&XlU6Mdidqu#>@l-?g(y%K399Bch@vgpZ&tK2Ra|g- zPl8G&c0d7mNtHx?1b2VMhjBh%5 z=iR=KMR_SSYWASXK@SU0|NFFL+JFRNRNH$gL_%H(dw*oYgc22RZR{}3!RM|my^)rj zAZJM>sQNRfOJ#3ct=HbxweRDlf5*|C!#9n;=4|NvAxs43I@KvO(x?OpKBQZb|Lx*z2B|D6};2b!KYt^=RI< zr>{K`2&o92ySNc4L-@o{m^68DLQ&wzF{Oj1(iBou|ENP5M|Aq#IT}z3kUr8D2@c@O ziE_7aNxe$w>gtt4Ew}qi<_z z@#-xM%AnJ8bd?(52OOr&`AO-~AS{Te;a5*?r$# zD}0}?4O_O7nYTXDlb

Os=wlbJ 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≤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

N@+w=HmNMxOznfac2{<-JbJa=xoj+_ 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�A88~uJ1GWLn@9jZo7lt_Px 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

wGUL9O!PE$RYR3V`& zVM9}uh{x6}jx}*k45_}Jq&dYXa^RJ8{*8fG?j-$|(v@*vyp**h&k2GF9VE8Jm$g_d4B%(K=5!Y_2 zoo)*4JCCc$!l}?CH!O6b9V;y77oMk(g_dcLuFaXD4{TuF2OD#-1VOr@H~hVq^M z$0uaa*L^|f77wq2`U4}3Rh^-HT@kc?H2QO>KN-g{u9ytH!PEx&3SzY^KY<(dwGxr1 zhk`LSaj)Z;l`2ZcGY+GUl6%N2b&{AwpsQ0e>5x`FzUpg%2jvwSM>J+@bP2gC1A`0m zmrX@FVlVHh^kJ@rWCKuPgKCzN$b)A<%iLZ~J12V(k56AFZ$?E37gDlgTW~SUQ{tH> zZ1}c)aKGgciWxe`msw8RXVOvPp&CXueY1e{G_doHX38nu5k z{rXe0m`XHipC(rNB;(Mp)Be$q#?dG8{x+xRYtIa$rkZym%03-0y2J?-BFC;Q;M<8) z_f5sY`|TrFgfpbE3?WY7R(XFm@9ow_O70xmXJLjhi?Jv^L40in(7~$!u zHV24%2I1WpiCJOqN@cl8x27Jw6toNlgXU+vL8E+a zY919b*-yi>_<9ejeor-t(Da|v{$tEM&Hm?PVXai)^+8u%biVUdjZt)a-RnQafpTwz zyuumXFp5$J#xZ0{RVsu(@S*u17)hvre^k!w(Ef_UJ#l{628B|Mn<#XYXO!(qFBsAN z)6Yr}0<6CN3o?bQKgvfjQG5(QBDlsoR_2lasfjh{`0fc*to(($(QeGl3c6*h*hd)evaomgl{^^O1nm z4_e&ea>*;3QD`|4u(o<;cF>%=FA`tFQaXRZ)1lZ-@q}dN^O*C+uV@sl_xp$!=KuxVB&Q zv1LPE2{}OrDD6olM%yWxsL3U%1^uY_Nkv6nERL;$3in4LW8c@xBMZr12lrNpZ&#pd zOv0ixj6|Kz0pFBguae)d5V(N4j~Q-_K{r`QqVcH$plaQP;j-B&`MQ1nwE5*m-VYxf zPe?&p`{5Jtl@7ga52un9V611f)7hHfTzEMqiQlfpGMo^i&J(U8Wrd*sjTW>-Ae*!n zsvZ|xbI6FGf-~j>USinJQO2YBB0r>LFgxUC>d3S^=IhJ0RZvBep1HTK2~-EU^IMDsY>S9>ry8A~} z-MV6#S&y#q@-H?rdxjtFas7{#&docV&WqG#V-V5wCm~WSToT+lh-EAVkj3YTj3Tq!lgU> z?BTF3rwyv_cNi{9+!RO)=TQDWPi8iW#MBHI`-8KHMndh@QW18T+3=d`l)6Uu(1lIBsC2wrkhC5ek^mISeteaCAV&?E=u`#ukk`&DDgb#Z)RIejUa*(fEXR9Jk0es!>U6FzHcZe- z)Iq5@X#!XI$q&tP(wr7)HXDQf=K*i{Z7gCr2_!C;x1X!}szhcp&@XbGXzz!-`s0*~tL^C-WHWr>rYE&cc8oM>O zOGd|KyOaw2n?L(72!hajD3;`G;Do)BDM~MnEi|7+xoXGAe8v-&y&K3TJ|VW6>3wsP z%Xd-4pIk;fG5`K$qO?gYjuS|QH_Q`B!vERUOQ_j?Qh)nE?AA9&UVKeSB*yyNOz*y* zk>inms|qf%b*pWik?n-Yx8mi-m1ME>WLhm>X~X~$*|ea1X%n1H5FV3ZFnmTsR7t9J z12OC-$!D%z$a*N#(Gt#L>Swq~C5_4ti6&Nv3h{S;Fl_q#)hR$8jRi0nPi?L5D&D_o z!LAWo%gLU;AKga+TG6SL{X2DQt0bE=dV@2jppH`kyT=$y19sR~P3St7$* zdg*BD%mLHTQY-uHTSGVjRrQf@monh6^$~jc5DI%baeVPgneoadF*QA1X^xh?a$BqV zvfj1PlUQ1n7gLJ0yO5F8 z{YYGutOTW>5po0BuHV4;*o>LDS!U6C7&aVHdV)mfOlWQiEtlNZcjm9TQ}aGpf)|DfOV)O1$^JB{{X3Qb@tfx)+YAV2y8W zynHw^x)w&nV&^Vuc4?GD@@<|KAjMu~UB)tKM`V@mVTmZ1A}2826^Aon_eyM*ULh`x zN``^pkY-A%ftfizIB&Qu^O2i@UP(@E)--_)(zh)S0}Ro%h9mAoDJi~0CNIXl0ZxM4Xhr5;`?xe`%IdQT>F zV>3UcG(>{d-DxA5XC~{TAu%QDXpzRdP-$Rvv^-hg0jO)l`Q^B}B)=>v99?pq^)+3v zyLEi$-oWU$+`0?DNBe=J2%Di5hmMKMwCOPCe~U79z>NKd#@tO~Qkr``qsvG&k8}%f zK(|NTVvS3!5D}I|)70Do6HLso;4Z7H|oevBX_;#A;`1P3fCQZb{ zji1b5^q3GUX;z;T%s6SBQ|h3L0y*i4%>XGSdtH?!XDSjo^@2Sf+QH_OE_O*o!0c-E z=R0avl=^`vLMx${8PCN`{yPrZ>B41dp)B0)$Oz%FOY#;LJ44Kz8sgS@=Skl#z4V{O z!u_1YeK~U5grq`w|MUa(2ST8HZ)R!I+!+0T{n}8x5;PxyaLYR!iq($Vz z%$7t{TuoiSuy;)3o&F|H$=k<#%lAq|P#%71c1=6=?)&Ncfvd61p0k^nQ}&r2lcu06 zFSX73N_1(DO@N|wouy0hs8InUvyf(^Szn*D1mnbNTQo{6={#hk4qY0i+Kt;PO{=WZ z3rWwwgJnV^Qjz)O$No&DeXb3FB$@aU<+~MuG9(y&L6PtzbEb}jUfJ(K*z3y#^c%5=66b{)u@#&HIn{MBc2T+0`%k_LRiAW zw2}*rlXKN)s;@_IL;Z$%)Jd?;E}PToQooWk>rA6r$5Ya;$0Xo_HZxDj=?gm5F0Dg? zaBBC1A33DE+{u>h!8$jQ>&KIuTp9qsJo4=SQ2& zX;(G=1#V<1r7dBA|LF(HCzONcL$SELeB~!TnbMSE-+i%$?x#RNmTLD1(%BBz76GFO z!;km8)j0Z>HGxHCruyHx8QevCS}tC_T^&<=Fs7_HNdPa6CuG|M{S|L2%7>2* zp#6Pv`Erd|`H4fGsqL0nih<;#ZF0`cu%NCv$UJVt>RiTwp0L9H=KIMUOIMZCbwrFx zvoR0+$bhQ>`%CwISGzVL<{%5MMm{{FO{A0x9j&YiL&0;Db6m!^5>_g1G6~DFe%23KmL!7g$ zZG^K_Fm-gM1xg<=kx5t|PIZVJ$F)iWZGW3E2NmyX!Dvi-JCLlx_cbq?++JJbcngiD zcdraQr4ET?x-$LGNK_C|R*M|PD%s%u$=Dww%cebPQup=Zve&K2D}R-86yo$>WrlV0 zRZ)CvN0sd$s7kk0Jj9S{>C0>NTV_+LO->7lJ--1jd6SE(kT`k*wow~MDUP6H3p~hI zxh&w2CSAnv{ysVj8}m;;8&H2BbU%(R#R+`~|KI%!{EyF!Ma}S!k3mg!X}tTh&)qPI zzs)`Qs(Tu9m$27zDeNb~Q8>tLU7EdpF(-Qq3U5HgS9{~tc>w8w6|6-_=|--cc@z_Y zg@sZFrPoP0S;buuMYg}eO-KrMd$U0IpYj4ej|>;sru%*Od}$MW09jn6iXd@0{1==s z{1W&Ks^{pqupg)76OPew3o0F zZs-a=pr1~K%B)S*Yz!aPZ!RoOe14PbH9xmJtUa{#_mS@Tt=`a|ZTJITzI%KGQ_&mN zQryeh@;jA=wOPajm=m*}tr(g*RmD$&?6epdkMM zkmt?)>9WMdc@aFb757fQZLHsfNCuS{MQdO(0@2tE=QfBveVvg_7UKgKR_bz+eVCIQGf6O+yweMM4y z>dtuQlVKR%Di_`A{HLF-Aow$N{TCFnXUJ~_Xg_JZs(}5MGZw;A1ZX}z6iY+P>TO@d zHPvgvOfe(@xfj?4`XnlIk8FJ7$h_aWnT`sR!eGX`KvP{m&!VP1=!mpZqXvYr8KE0AjuUH{so zJ;6ek#S&p!DMaooOseUmlpF#~-%oUG?kaLC900O}%SAr9ZRhVigUJ}1#BI$6AfG*yK^HCVknQDYLyWsE1c|k9<$fAQP@AO9b6B<%h z#+t7d8at@>%Z0?dhZ1uf04>to=n*sW@GlBVBEIq5G;$2L5O3*0$siz{od zP5MQSoQf_-ue{k-IedFLUItD-mUlAIFlf+7mBHhKaHI%gL$qM$STu}`;=UsE+01eb z%16cZIKmk#Uw)FbK-T_WzY_HPtfseSkIu^&IU)FFGCHIxVQpD0Jcmli0`&(L(nd9N zT2XKh9b!|wg~a(9vzXp^_yx6VS8VFYGjmXB{JKWQG%z!4?zrDSdP7x6>Xt})o6{FW zGoYB_LUu8pU%|c+#%w#GTm@&D5*$&tj}ps1e_g8<9Fii&L9Ya-XX~N>RvAcww@Gat zwX&@vbQQyBlxcKR2Rnus*GPfVrUfa@>rxrv@@+a>@dKI%T8hd{GBm4gHhn+}1}{JM zJ?qH=bb-$twPPL)>`H^Eq~4`FxcBUyN`a8C)zd>+sMRl%QiTdDu3|G}E<-tz39S5! zPwf{zO$V;UHi26F(Jna6RP>nAQjYktj7Z#4va`H#D=@bL67a>zmh4uC-6X%O%-z?} ze;hZjZhQYyBUU97uD~!w-pr|k*0s3R+RbM0PJTduf09!Tfj4w9<}=5_88cqKh@>ao zYa`?NcJf=>FTu8mf^AtQurrHX#7+3N>U6@ZsImm=q+DNzv2d19gxY(z2qCi-6qc}eMtvc%! zBxFPulW`$cFUeweAC41=uE@-pI~*G(UekWayL=PToRMGex%LI~Q+ahAu9)KOxUpLn zPHH|Er`Cor4tgSgw41BCRB4oktT5?@K?GtYNPG_sg>8um#e)|8^+$vuJ^X^kf~~!O zVng-tioU)Hch}#z5QNAAIP5Fc`S`}b!R5Mp7 z(o?1YnSki>9@JhSmtE$W2?~=9D#9;mAhGKX&Dp@colUx#6i=T<_e1+!+cljED$bg--opZ`-4EWc zVp1DD0hfgha2Shuq{g3`Ue9la6rCKKM7drw9!|11)2KC)K%@^CkuAj)o^gvmoyTlb zkxP*|Md^0E5tFb8f0bjiCtZaJIqJIdwB5bOH7}9wL>NWeom12h z3BDGV(70$Z+dW?)hCb98IXvX)NX7mJ3R4@cfF62Cr8+fXqJ8+D|l(vDwJb>^Rs`aQ|1&JXlx(`$Xjk> zma`9Y)cuKJRXd;*z|Gb4q2+L4_i`b{+GZo1l)6(j0OQlE+H;Ybq{Ae;AbxUOrj>5? z`+$z+@S^T=)=us~LvY*7V{#zTfw(jzqqeoMwdmO+R3C!y^CHe0{OOh|^Pz}>k;lQA zRbPE#eE!=!8nr{Lj*6cEdAEiVGel3?8!nX3!`pz^~ z^oOvvBn3xAL#vFkv1dtU+K7nypMK7Q5CHnR_9$Gl+5h&N(EC?|E|l+$dWz2I0Oh~6 z=y+#Yr)LP8Y5XmFCC3oocG~;&w;UM{3 zuOKnxC|+MnwpYb0O%AN^3{k?KGF;6X1g4 z@(SCOMjn$Kwmt6;g+-+It;;>7zB-%XWo*UeWGNJow*?4|*XCmSwEms8wES@p5LJkc zrw3P|?^Xks4Wu6ivA{AmYR9r8s*9KF?H~^4ua4-F7#Ia8Ya-@rWiMx<)%JJ9g*nEM zO-aS53YZN^@_vz3rQME?uIH&d{imNJ7z9LJT_`{BItWcj#1!bI(xGX4#y)X!Tf@Q= zK~=(vLRRN^7GMD(!Xvoio7B29XVuq4?AxOAwaa~S*Lcyr|6%3@v3Syyvl@nAUyQO? zaxp@%qcxGV!YsIOV=(xBg_yy&Vsf@+f;4ga068cYAg~p$KHmIkwO<`*m!-ln`bWeN zF2NcTZle@8kt&NCXPd#L6UTptgcJwroW0F$)9HtwE2frHQfdlGa}4ySy##eXKWQ3w zHZO8KQ;&2})i7vD34EPWzM)tbvF>^Bxg3w_z4tfD@)gL+%=(g#k!FQItMA@_^s64J zj7VKYd`P?jJMLD;f;3GiHvA}B;>wG)MHb8TF_5`1NP}e;zri9T^beY(yhRMKR|B|b z)nEH%9S{QL&|1@*GxB0J23TOx@Gl%68+n%Q(?lat_MMOv+8;WyjHP~+eOP|UGTXM2 zGDXKQ^RUo(u|AWcG>|rD=-ZS`@(mgQRJfO=Ez#76Ia{_!2qARMWxVki7Rb|Vd7+%g zMad57i1%^u*OAtx2QC(tY$hqV$d?8sD$wGx=g$M_8PZ9Puu+ffNQS6?ZVF~F0P}1H z8CH5^Eq`q;A6I12dUA3J$R|-Pbv5&l$V~3=J1qI-Q?*BXOH9-gn8ov|xZ=q6;eU2e zTV}i~C#j*r=c#U5cQO-X( z)k2QKu-gys#PNU*DpSXny;Q9D7U3F=_9CA02<=5J;+<85277I&s-^zF44au81cjFm z6OtA7sy5jvdjvy92c#^jy_t2KB`ZK4j3yb0UV3j#N4wP7A=x+{xeLluy(i1K9N5Lh z=4F${7jdl$NfloF3~;#fXDBFB^2vYjwGhScUl*+vVSkoyHaeL+jcL`_sfe-~yevo2 z)*0UVtQIf%;uyXJG^i*!QDiVsWvRhA^t<6WtglG>+KqOO_|Lp?ZSU`I_#ezRgJnQp zwpx&%bk)|fI+7>vQ>E=?;$|8STFPU0<|l1ee2r*?Bs#M~z})J;venq}N%7`4f0DJy z6ORr?b@veZdVIAi&#@YXVBz5@2#@Rq%2P=%a6_Wq>fqx98NH7DKl;9c=_y#WXGl=@P?$7t>hyMx>kc;bf5@(K36gxdzMF`<`?UaL=7oX z7og6H_aV>!eFAvcP!R}ew8bdTUuwEfCKwEDTUKCUOxXnbOsqxP+?C3{Bw#oYp@s<>k{xjxMr z`H2?#MFk4M;()Xt4e+VGNu>iMJizqDIQcBt$eKnha_b`A>jBwcDH|Ym)ugsS&=<+~ zm>(Mn`cCm#a5*FPv{Je11;M?f-Rryl^RMRQX&_(F=JmsjPyyn*fsO1Q__g~4zG?%(qa zzi4<1J$s{_VFBN7PER3lars13g(RS(Z+u{HB(=eRyGeR=388`{$$Z%P!cMk^0vKAU zH}Kn85!BEz>oBKRWn)j7N#VY4J>TvVXHiaR&rRL~TisXC)~&CN7jOD4=_CSG!wsy( zGBw0MD``bxac8jy;r3`)X`#_5DQ-+`!!*JF{qI3 zHYxK_g#J1vLrRQtiTA|C{bv|vBC*dz77|`<_|*^NjG7C3_khM~h#78~ILqj;;n}=0 znd@q&Z2h#wUsl%?s*(GY;8_RJzM8&Hc>}+Y(kO7QL4$?vd0-G|lKg{z+M=H&^j*3v zyN+iqUncPa%|n!|0gn56o&da!Nw3al=zY?oqcjH`0Q4tx+&V?BOW5DPl28g9`LAt% z@=0I6UAzyMJLr>WDv4&RR{qxMZP{uB!7?oIUqg68q!qK}gCM$FMh|s zaYY7BCyxU8iE-< zJGNl=ap^ceIYME;1}~1E+F?#Ql;mhaVlv$bM3_*vFY{69|QW-k`QsmCki~ z&RVqFsAnczCW?IAIo^y@?Qi0{iilYMNl!>#`=yIT<)d;uAoy-#%S0L7om9 z=YQIY3|^O)30)bumds*9e6kENFFz;5=Xm7z@p| z5i*P6CC($DHZbsE6FD-q@yr8J>HstcgA0_^k8xoBLe_Tqqmy4{rX%fNJVufL7(hVl zSK^p_>!_^W42mG65q|q>6K>yj4H^++_UrjNJq{Ms)CQvT=GCoHb?h-WYbyK06!xyU zc>jiuhQ6*hi-4wbS}o`9P}6@3yk;BuJE|c7XJ7`JGq$oqba_+yx=}bH`Glo-eWD{x z9E0XT_6*6S)r8*qldHLs<<8iPybV<`i=H~rSPa`UP^Q@6_i2&~LmFr_ZzUjK$fQ?^U1sN|6E8J|ucS|lS(_9@Lhe-;FX;zKo#>}=}*orP z>E8Cq(S7BN;to=!=P3-(pBWiBd*&{FNuso&5OqQ~hP^XGPBQIPCB^`1o@t%2o*S*= z5Chhi2Bb{4C*zc#4Q78|yMt?ey{0seI6mkX=nJ1uo5KXZ9=64C*p5NFevim(dlXtV zbEABCy8W(;C*qtFkjD-~^wv{xCZ{%#6}!-B5kpc9x62$Yogfo$!Ns4)NknH@&D^NU zzM}S;*fp7uz2r#SM^|T9*I)J8y1DrC-v3%Iu>s-9A?4*T^pC#QE6vPG*qwih>3h-! z2Pqwz5;x<$SA&HLkyk(}8;m&MrL-Or#jMm)TR-&HvNS zEduhZnsE>g%|%!eC;WZwLLmIs?TT;df~@fh{yysQ@4j=-LQla+@mh!>l7a(hrUmp; zjsg#VA4{w@?gkl?Zyi0$#^irFHZTLKASFAhv)dtXDZubrIBsNG<)VME*0T#v;{ZV4 z<=uE)%N!bXeZHIPmw4}#5#`i_@3_8j2kNeR zn99`x=j;keY}9sNd}xeonL;J)C#p3B)zjOZM1yigTh4RUuPo`E-}b<7Wg>_+L`8fa zafFQF04$9%uA>p679sU2efFOLHrxFU1hR8DnfXw06}vVAlVJ^tDJ|ty5lfpDoq>i= zMgeS=^Bz-8Qi%qr%QnPUm^FHzJd9g-EvCxo!xOBuHGOL}2pg_4Ex-k0wHu#s2KW=k zbBvs+JM9MThg3w~mzPxou>w;N1CuB-%ef$koW971Qlal^WZ%6S#w*2Z>%4D!YJork zjE6*>=usoGyXx3;nu4goD<%#Dh5`|(1ALzX%&oBGd`U{3t=T5@n5H+(QppJ}lp;Yw z$v6Z+J`LT~@s+}9>4Nv??|NP(+d047I&62}T4E|6_{A9aMpT7nt1DM+DXw@KBq(M& z3kL`$TBCx&qHMpB3FfS77uZ*bB^d}M13lUE0w^?+OzIe|mfUu3#1-f;o#-hSM=Mk9 z%jtk~tf|IE`LtqdI=c3UXm1_E*x$<>DPvMB{P{!C5l=JU71@iGm?})|r)U=iMljX* z?|t+fj(lfeHSaAt^!eQa5%OQu19Mve2` zKQ?!@Y#5UCYRkQ$H)C0v=)vDkq!I1%c8Xp3;D5xk$DN`y-xLMxgAgRwL8&p+hDGx0 zWxxHNY3jVrQwRMkW1V}Y#rx+J1XkSytFr%GBQTR2+;Yj)efSi5Vi2a;CFd~AWA|iu zW8|w`is?{!h7h03H?&hWiW&zCM(BTvjRh1+i>t%4AB;?oK}VC4#%w4P)K$^R)XX^=(d%a`=Dq3} z7}3>_vj@1L!gpc#UhCWuRg$PbuHGy#Siv?-3wv-9NmcyIfbjxIyN;Ts8IgmFa*&NT2zW(zCE)Z)mE5XI$HjgCK8iP7Bkw^fvH4F zETn^iI$>PZy1qh7Rk=_*;)K@>Rj^I?xEgo?HjoKcHtcK)QvP_!zG&qyVjU>WMeBhw zYBrUsoY}JyFfh8r^(VO&vM4s?P)-t~P^uGZM}{gV-zGp2Oe9bXmQ}E7#<$%KK3EK> zI&^)$7uf?lAhW{#;c)*90t%k?<_njgV`2mK|Nk$?a6TkIZaG$6qi`&h&O^N10)2aO z?u96}v^@vcd#2H$xwsf;HK-NCnjqx$HJ|P+Nk-6Y=tk-tW$|?dPE-aGr^t`dM@jng zhv#>U)(2WFSsik$UdwtRZ5bDk0lVgUjY&>*A{}_jQGGgjD4~%IN|d=zsSPT8;0~lP zCo?KyUaK$#nHhbmU2d*j-3ax`HLM=c8}Sp#7O-3zRXp=_DRE=MEnvdGPvokP%aW$? z_3|y?1Mxbp-^J-Fx_+}X=t+FY^*!DWd%8Klg^2on*tgj9^0b%>0Ve80D)8Ko?h|da ztYUy*hCC)FRU9vQ3u^!iWf(?zY(r&mVqI2mNX7`SVB8j&+0JBDfYY7Ks=d_$?UZ6f z!w*>;>#BG)c}Z@~dv|4e!K_5R>-VbTc2@1vgGvQ1&jL30t%A3z?kYhLxuY3YSdjjc zGcg;iW@7v`e>XeND^^hfi}!xwhYQ&k_HJJOlrl_NCbeL+JPDKv6_&=8Ey?>;YTQ%! zf`*_lm!-1T_K{O5j9st??3?*1D^PT+d!Ti!JKOnO@Ku4Vcd4Ey9X!v<#Pz3I{cldL z+cG)>I@)+oDrBED-(%?r1KBH4zn?1x)*Gz;Mo?IKQssR&&onNcw(hvN?Xsh;sR~ji z^CG5^`!8E!ntq#mU4DdxixK^Xgb4j1?M%;`y3{JhR%VZ3PyYHqd8k9TWX#PlW{xX) z;LK>!A`;$=8}q{d`4UIrC=~GdEsoH~5RM?+cf-xvI#8=dioitp{8l(FpI_H!R-QYw z16Mh-{?sK&Z`#Ug+o}x$?7-xP?QzUI2M&~^NqR2LTBmIkiTu&M{+sALf56uy!G{P+ zIdfV4`=}jGrK*nN3Bj1-6aHnS$By^KiDaVvDk4FY1tPIsl-Oc$^yPM6i1ICci?j1N zW1vB)@w0q!@n(E!)v{gfTj0s)*FVD|HL#h#LbnDzM+LT1URZt`b-}^PmbI~qF=fF& zCY~VOVf5~HezQMDN5Yn0?L_~Dx{wwJ821j0RkFbn5OR^T_+15cD7mQEEGt3mk%%y9 z;`E&Q?}2$n*7)C-SR2i4j7Jd?nh$<06jWspBMI7@oqMAVPBclQQ+|8 z_n=yC8YXXPXW1p~3;de&KHamBZG)6U-R9zxJhmEJrr0Xfdk6^tWtRvU6u79uv9-0t zcIoRS{}6tlQ;CU@kwB{eI+wf%sGdG$!XMEGaL)#ZGy0V%21#LWNrp6;8_YGOs%|mJ zMGhcIz1-Qxj_ik68GQ%HRcxR1tXj@Go>DwLCmHq(z6t&Gb8qZ#>)q>$`sF6?inHz0 zSUXbAd>1F#vWBxAAG_(A(eD}O9N#LihYhnnaN0UDLq3x~8>lUdtYpUkBUey>IPt3= z@z|xC>~WcBXM)^O$WTzfsTyL-sF(98bK$~KL@~od6ft_T9%o;<#M);F<|8SLt8LR7 zYbzKQ$5Yj82FMBnQ{eMA`28dt`NhcC2}7tp2#f04CMsBmTiWI^E*y)f(W$E?9FbRc zi}Sr_bnqFVD+Bn&N#)>6;> zQM5UU&GtS)jVnb|_}_XpWr$l?<22XA{=`_J{}m~kLAZ;Y2S!z%ygqJhp-Kqq(?ONL z?Ep&Pzk8TT)?2}qZ1y7o&elX~j{ptj&ds(>`yfnPK|P2^hm`@znqHz7h zCZV72CDS8Re!g15XAsBFMy|oZkX@_;4hzSkn+QXWh+OD>r*Vg!^rlsu^eZ@K=-+I7 z7@8$%S#?jJq-U{jw@yt`qMFUy+ZyW}_NGhL@63-b-Z4wf%daX-T^NutV$G?JfQLno zNXQTnU>#1h+Ts}2aV*L`+Bi`>4Q#Q6yld4|w8&�s$wHT-%f4#aXP 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�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%0DGL>(&H?P+)yE4KLWdKB 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 H?|c3~IfF|Y literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 93b05a39ecb..f54ff92e324 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1792,8 +1792,10 @@ export default class BattleScene extends SceneBase { return 13.950; case "battle_johto_champion": //B2W2 Johto Champion Battle return 23.498; - case "battle_hoenn_champion": //B2W2 Hoenn Champion Battle + case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle return 11.328; + case "battle_hoenn_champion_g6": //ORAS Hoenn Champion Battle + return 11.762; case "battle_sinnoh_champion": //B2W2 Sinnoh Champion Battle return 12.235; case "battle_champion_alder": //BW Unova Champion Battle diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 2cc228a93cf..8d61463f316 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1404,7 +1404,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })), - [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"],true).setBattleBgm("battle_hoenn_champion").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") + [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"],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], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); })) @@ -1413,7 +1413,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })), - [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"],true).setBattleBgm("battle_hoenn_champion").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") + [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"],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(); diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts index 2a247e51a44..3877aeea9bd 100644 --- a/src/locales/de/bgm-name.ts +++ b/src/locales/de/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "S2W2 Vs. Kanto Champion", "battle_johto_champion": "S2W2 Vs. Johto Champion", - "battle_hoenn_champion": "S2W2 Vs. Hoenn Champion", + "battle_hoenn_champion_g5": "S2W2 Vs. Hoenn Champion", + "battle_hoenn_champion_g6": "ORAS Vs. Hoenn Champion", "battle_sinnoh_champion": "S2W2 Vs. Champion Cynthia", "battle_champion_alder": "SW Vs. Champion Lauro", "battle_champion_iris": "S2W2 Vs. Champion Lilia", diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts index 01fb86b281d..be9a8f621c7 100644 --- a/src/locales/en/bgm-name.ts +++ b/src/locales/en/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g5": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g6": "ORAS Hoenn Champion Battle", "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", "battle_champion_alder": "BW Unova Champion Battle", "battle_champion_iris": "B2W2 Unova Champion Battle", diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts index ab6de0b81b5..f7316ca1166 100644 --- a/src/locales/es/bgm-name.ts +++ b/src/locales/es/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", - "battle_hoenn_champion": "B2W2 - ¡Vs Campeón de Hoenn!", + "battle_hoenn_champion_g5": "B2W2 - ¡Vs Campeón de Hoenn!", + "battle_hoenn_champion_g6": "ORAS - ¡Vs Campeón de Hoenn!", "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts index da344fe001e..e66c8102e46 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", - "battle_hoenn_champion": "N2B2 - Vs. Maitre de Hoenn", + "battle_hoenn_champion_g5": "N2B2 - Vs. Maitre de Hoenn", + "battle_hoenn_champion_g6": "ROSA - Vs. Maitre de Hoenn", "battle_sinnoh_champion": "N2B2 - Vs. Maitresse de Sinnoh", "battle_champion_alder": "NB - Vs. Maitre d’Unys", "battle_champion_iris": "N2B2 - Vs. Maitresse d’Unys", diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts index 01fb86b281d..be9a8f621c7 100644 --- a/src/locales/it/bgm-name.ts +++ b/src/locales/it/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g5": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g6": "ORAS Hoenn Champion Battle", "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", "battle_champion_alder": "BW Unova Champion Battle", "battle_champion_iris": "B2W2 Unova Champion Battle", diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts index 69697b07774..81052560fc4 100644 --- a/src/locales/ko/bgm-name.ts +++ b/src/locales/ko/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "BW2 관동 챔피언 배틀", "battle_johto_champion": "BW2 성도 챔피언 배틀", - "battle_hoenn_champion": "BW2 호연 챔피언 배틀", + "battle_hoenn_champion_g5": "BW2 호연 챔피언 배틀", + "battle_hoenn_champion_g6": "ORAS 호연 챔피언 배틀", "battle_sinnoh_champion": "BW2 신오 챔피언 배틀", "battle_champion_alder": "BW 하나 챔피언 배틀", "battle_champion_iris": "BW2 하나 챔피언 배틀", diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts index ae2756e74be..01baf93c2a5 100644 --- a/src/locales/pt_BR/bgm-name.ts +++ b/src/locales/pt_BR/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries": "{{name}}", "battle_kanto_champion": "B2W2 Batalha do Campeão de Kanto", "battle_johto_champion": "B2W2 Batalha do Campeão de Johto", - "battle_hoenn_champion": "B2W2 Batalha do Campeão de Hoenn", + "battle_hoenn_champion_g5": "B2W2 Batalha do Campeão de Hoenn", + "battle_hoenn_champion_g6": "ORAS Batalha do Campeão de Hoenn", "battle_sinnoh_champion": "B2W2 Batalha do Campeão de Sinnoh", "battle_champion_alder": "BW Batalha do Campeão de Unova", "battle_champion_iris": "B2W2 Batalha do Campeão de Unova", diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts index 71db565eb05..6039a259fd3 100644 --- a/src/locales/zh_CN/bgm-name.ts +++ b/src/locales/zh_CN/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "黑2白2「决战!关都冠军」", "battle_johto_champion": "黑2白2「决战!城都冠军」", - "battle_hoenn_champion": "黑2白2「决战!丰缘冠军」", + "battle_hoenn_champion_g5": "黑2白2「决战!丰缘冠军」", + "battle_hoenn_champion_g6": "Ω红宝石α蓝宝石「决战!丰缘冠军」", "battle_sinnoh_champion": "黑2白2「决战!神奥冠军」", "battle_champion_alder": "黑白「决战!合众冠军」", "battle_champion_iris": "黑2白2「决战!合众冠军」", diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts index 01fb86b281d..be9a8f621c7 100644 --- a/src/locales/zh_TW/bgm-name.ts +++ b/src/locales/zh_TW/bgm-name.ts @@ -5,7 +5,8 @@ export const bgmName: SimpleTranslationEntries = { "missing_entries" : "{{name}}", "battle_kanto_champion": "B2W2 Kanto Champion Battle", "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g5": "B2W2 Hoenn Champion Battle", + "battle_hoenn_champion_g6": "ORAS Hoenn Champion Battle", "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", "battle_champion_alder": "BW Unova Champion Battle", "battle_champion_iris": "B2W2 Unova Champion Battle", From 32d4102594c43a2d303d22bef3203c40393b6732 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:19:49 -0700 Subject: [PATCH 159/321] [Bug] Fix Make It Rain and Clanging Scales stat drop trigger logic (#3355) * Fix Make It Rain + Clanging Scales stat drop logic * Use "includes" instead of "<" for firstTarget logic instead --- src/data/move.ts | 2 +- src/phases.ts | 17 +++++++++++-- src/test/moves/make_it_rain.test.ts | 39 ++++++++++++++++------------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 13282a1a3d1..a00d81e5980 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7905,7 +7905,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) - .attr(StatChangeAttr, BattleStat.DEF, -1, true) + .attr(StatChangeAttr, BattleStat.DEF, -1, true, null, true, false, MoveEffectTrigger.HIT, true) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.DRAGON_HAMMER, Type.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), diff --git a/src/phases.ts b/src/phases.ts index 362f5f22cc2..ac233896b68 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2966,6 +2966,8 @@ export class MoveEffectPhase extends PokemonPhase { // Move animation only needs one target new MoveAnim(move.id as Moves, user, this.getTarget()?.getBattlerIndex()).play(this.scene, () => { + /** Has the move successfully hit a target (for damage) yet? */ + let hasHit: boolean = false; for (const target of targets) { if (!targetHitChecks[target.getBattlerIndex()]) { this.stopMultiHit(target); @@ -2981,7 +2983,6 @@ export class MoveEffectPhase extends PokemonPhase { const isProtected = !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); - const firstTarget = (moveHistoryEntry.result === MoveResult.PENDING); if (firstHit) { user.pushMoveHistory(moveHistoryEntry); @@ -2991,6 +2992,18 @@ export class MoveEffectPhase extends PokemonPhase { const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; + const dealsDamage = [ + HitResult.EFFECTIVE, + HitResult.SUPER_EFFECTIVE, + HitResult.NOT_VERY_EFFECTIVE, + HitResult.ONE_HIT_KO + ].includes(hitResult); + + const firstTarget = dealsDamage && !hasHit; + if (firstTarget) { + hasHit = true; + } + const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); if (lastHit) { @@ -3008,7 +3021,7 @@ export class MoveEffectPhase extends PokemonPhase { if (hitResult !== HitResult.NO_EFFECT) { applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { - if (hitResult < HitResult.NO_EFFECT && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { const flinched = new Utils.BooleanHolder(false); user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); if (flinched.value) { diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index 83543c4e530..fcfb1daa2cf 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,6 +1,6 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { - CommandPhase, + MoveEffectPhase, MoveEndPhase, StatChangePhase, } from "#app/phases"; @@ -10,7 +10,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -44,16 +44,8 @@ describe("Moves - Make It Rain", () => { await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); - expect(playerPokemon.length).toBe(2); - playerPokemon.forEach(p => expect(p).toBeDefined()); - - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon.length).toBe(2); - enemyPokemon.forEach(p => expect(p).toBeDefined()); game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); - - await game.phaseInterceptor.to(CommandPhase); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(MoveEndPhase); @@ -68,10 +60,7 @@ describe("Moves - Make It Rain", () => { await game.startBattle([Species.CHARIZARD]); const playerPokemon = game.scene.getPlayerPokemon(); - expect(playerPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); @@ -87,14 +76,9 @@ describe("Moves - Make It Rain", () => { await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => expect(p).toBeDefined()); - const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); - - await game.phaseInterceptor.to(CommandPhase); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(StatChangePhase); @@ -102,4 +86,23 @@ describe("Moves - Make It Rain", () => { enemyPokemon.forEach(p => expect(p.isFainted()).toBe(true)); expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); }, TIMEOUT); + + it("should reduce Sp. Atk if it only hits the second target", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + // Make Make It Rain miss the first target + const moveEffectPhase = game.scene.getCurrentPhase() as MoveEffectPhase; + vi.spyOn(moveEffectPhase, "hitCheck").mockReturnValueOnce(false); + + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); }); From a301507f801fcbb441e3e50f28c22ac8ee2410f0 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 5 Aug 2024 06:46:34 -0700 Subject: [PATCH 160/321] [Test] Remove held items from all tests when there are no item overrides (#3358) --- src/test/abilities/intimidate.test.ts | 19 +-------------- src/test/moves/octolock.test.ts | 4 +-- src/test/utils/gameManager.ts | 35 ++++++++++++--------------- src/test/utils/testUtils.ts | 1 + 4 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 3ed7a01b98e..959f53b2022 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -8,15 +8,10 @@ import { generateStarter, getMovePosition } from "#app/test/utils/gameManagerUti import { Command } from "#app/ui/command-ui-handler"; import { Status, StatusEffect } from "#app/data/status-effect"; import { GameModes, getGameMode } from "#app/game-mode"; -import { - CommandPhase, DamagePhase, EncounterPhase, - EnemyCommandPhase, SelectStarterPhase, - TurnInitPhase, -} from "#app/phases"; +import { CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, SelectStarterPhase, TurnInitPhase } from "#app/phases"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { removeEnemyHeldItems } from "../utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -45,7 +40,6 @@ describe("Abilities - Intimidate", () => { it("single - wild with switch", async () => { await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -76,7 +70,6 @@ describe("Abilities - Intimidate", () => { it("single - boss should only trigger once then switch", async () => { game.override.startingWave(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -106,7 +99,6 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once with switch", async () => { game.override.startingWave(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -137,7 +129,6 @@ describe("Abilities - Intimidate", () => { game.override.battleType("double"); game.override.startingWave(5); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -164,7 +155,6 @@ describe("Abilities - Intimidate", () => { game.override.battleType("double"); game.override.startingWave(3); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -191,7 +181,6 @@ describe("Abilities - Intimidate", () => { game.override.battleType("double"); game.override.startingWave(10); await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -218,7 +207,6 @@ describe("Abilities - Intimidate", () => { game.override.startingWave(2); game.override.moveset([Moves.AERIAL_ACE]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -245,7 +233,6 @@ describe("Abilities - Intimidate", () => { game.override.startingWave(2); game.override.moveset([Moves.SPLASH]); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -271,7 +258,6 @@ describe("Abilities - Intimidate", () => { game.override.enemyMoveset([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -311,7 +297,6 @@ describe("Abilities - Intimidate", () => { game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); - removeEnemyHeldItems(game.scene); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -351,7 +336,6 @@ describe("Abilities - Intimidate", () => { game.override.startingWave(3); vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); await game.runToSummon([Species.MIGHTYENA]); - removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -378,7 +362,6 @@ describe("Abilities - Intimidate", () => { }); await game.phaseInterceptor.run(EncounterPhase); - removeEnemyHeldItems(game.scene); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 8ef161d2131..1e19a3dc1c2 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -8,7 +8,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { removeEnemyHeldItems, SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Octolock", () => { describe("integration tests", () => { @@ -41,7 +41,6 @@ describe("Moves - Octolock", () => { it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => { await game.startBattle([Species.GRAPPLOCT]); - removeEnemyHeldItems(game.scene); const enemyPokemon = game.scene.getEnemyField(); @@ -63,7 +62,6 @@ describe("Moves - Octolock", () => { it("Traps the target pokemon", { timeout: 10000 }, async () => { await game.startBattle([Species.GRAPPLOCT]); - removeEnemyHeldItems(game.scene); const enemyPokemon = game.scene.getEnemyField(); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 1938d57dfd1..1bab99db83d 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -1,31 +1,21 @@ import GameWrapper from "#app/test/utils/gameWrapper"; -import {Mode} from "#app/ui/ui"; -import {generateStarter, waitUntil} from "#app/test/utils/gameManagerUtils"; -import { - CommandPhase, - EncounterPhase, - FaintPhase, - LoginPhase, - NewBattlePhase, - SelectStarterPhase, - SelectTargetPhase, - TitlePhase, TurnEndPhase, TurnInitPhase, - TurnStartPhase, -} from "#app/phases"; +import { Mode } from "#app/ui/ui"; +import { generateStarter, waitUntil } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EncounterPhase, FaintPhase, LoginPhase, NewBattlePhase, SelectStarterPhase, SelectTargetPhase, TitlePhase, TurnEndPhase, TurnInitPhase, TurnStartPhase } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; import PhaseInterceptor from "#app/test/utils/phaseInterceptor"; import TextInterceptor from "#app/test/utils/TextInterceptor"; -import {GameModes, getGameMode} from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; import fs from "fs"; -import {AES, enc} from "crypto-js"; -import {updateUserInfo} from "#app/account"; +import { AES, enc } from "crypto-js"; +import { updateUserInfo } from "#app/account"; import InputsHandler from "#app/test/utils/inputsHandler"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import {EnemyPokemon, PlayerPokemon} from "#app/field/pokemon"; -import {MockClock} from "#app/test/utils/mocks/mockClock"; -import {Command} from "#app/ui/command-ui-handler"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { MockClock } from "#app/test/utils/mocks/mockClock"; +import { Command } from "#app/ui/command-ui-handler"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import PartyUiHandler, {PartyUiMode} from "#app/ui/party-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import Trainer from "#app/field/trainer"; import { ExpNotification } from "#enums/exp-notification"; import { GameDataType } from "#enums/game-data-type"; @@ -36,6 +26,8 @@ import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import { OverridesHelper } from "./overridesHelper"; import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type.js"; +import overrides from "#app/overrides.js"; +import { removeEnemyHeldItems } from "./testUtils"; /** * Class to manage the game state and transitions between phases. @@ -140,6 +132,9 @@ export default class GameManager { }); await this.phaseInterceptor.run(EncounterPhase); + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + removeEnemyHeldItems(this.scene); + } } /** diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index 4a807c7d892..476775fd268 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -34,4 +34,5 @@ export function arrayOfRange(start: integer, end: integer) { export function removeEnemyHeldItems(scene: BattleScene) { scene.clearEnemyHeldItemModifiers(); scene.clearEnemyModifiers(); + console.log("Enemy held items removed"); } From 68d3d27d47df7a3dd6e0782685d423f0e045ed20 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 5 Aug 2024 06:47:54 -0700 Subject: [PATCH 161/321] [Test] Fix Power Spot test so Stonjourner always moves second (#3357) --- src/test/abilities/power_spot.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 018002fe541..441b405fd06 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(MoveEffectPhase); @@ -54,7 +54,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(MoveEffectPhase); @@ -68,7 +68,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([Species.STONJOURNER, Species.PIKACHU]); + await game.startBattle([Species.STONJOURNER, Species.REGIELEKI]); game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(TurnEndPhase); From 063e6dbd2d3521f2a61488b930ee244286ce57e2 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 5 Aug 2024 07:22:06 -0700 Subject: [PATCH 162/321] [Bug] Player pokemon shouldn't generate an NPC moveset (#3356) * Player pokemon shouldn't generate an NPC moveset * Make sure Keldeo starts new runs in the correct form --- src/field/pokemon.ts | 2 +- src/phases.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 1bd9f8db491..7fc5f14d0e1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3222,7 +3222,7 @@ export class PlayerPokemon extends Pokemon { } if (!dataSource) { - this.generateAndPopulateMoveset(); + this.moveset = []; } this.generateCompatibleTms(); } diff --git a/src/phases.ts b/src/phases.ts index ac233896b68..c4062b470a2 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -642,6 +642,10 @@ export class SelectStarterPhase extends Phase { this.scene.arena.init(); this.scene.sessionPlayTime = 0; this.scene.lastSavePlayTime = 0; + // Ensures Keldeo (or any future Pokemon that have this type of form change) starts in the correct form + this.scene.getParty().forEach((p: PlayerPokemon) => { + this.scene.triggerPokemonFormChange(p, SpeciesFormChangeMoveLearnedTrigger); + }); this.end(); }); } From 97e362368c708b1a73b15746252fa935d7303f1c Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Mon, 5 Aug 2024 08:41:38 -0700 Subject: [PATCH 163/321] [GH] Replace `Feature request` template with form (#3126) * replace feature_request.md with feature_request.yml (form) * fix typo and formatting in feature_request.yml --- .github/ISSUE_TEMPLATE/feature_request.md | 18 ---------- .github/ISSUE_TEMPLATE/feature_request.yml | 39 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 18 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index cb5c8a1b6f3..00000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[Feature]" -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** - - -**Describe the Feature** - - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000000..1543236ff37 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,39 @@ +name: Feature Request +description: Suggest an idea for this project +title: "[Feature] " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + - type: textarea + id: relation + attributes: + label: Is your feature request related to a problem? Please describe. + description: Clear and concise description of what the problem is. + placeholder: E.g. "I'm always frustrated when [...]" + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: description + attributes: + label: Describe the Feature + description: A clear and concise description of what you want to happen. Add a link to the feature if it is an existing move/ability/etc. + validations: + required: true + - type: markdown + attributes: + value: | + --- + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: true From 91b32132d071f51248695137f5255ebe9e1eddf3 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 6 Aug 2024 00:42:15 +0900 Subject: [PATCH 164/321] [Bug,Enhancement] Fix and improve Starter selector UI (#3340) * apply offset to all hybrid filter * make dropDownType to public for offsetHybridFilter function * refactoring defaultSettings to additional suport default cursor. * fix to remember last cursor on hover mode * remove unnecessary reset code * fix sort reset function * update resetFilter function * update requested changes * remove log msg * fix checking default on sort * refactoring hasDefaultValues function for readability * fix lastdir bug --- src/ui/dropdown.ts | 99 +++++++++++++++-------------- src/ui/filter-bar.ts | 14 ++-- src/ui/starter-select-ui-handler.ts | 23 +++---- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 4338e11e0c6..80935d16a71 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -27,10 +27,10 @@ export class DropDownLabel { public text: string; public sprite?: Phaser.GameObjects.Sprite; - constructor(label: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + constructor(label: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.OFF) { this.text = label || ""; this.sprite = sprite; - this.state = state || DropDownState.ON; + this.state = state; } } @@ -262,12 +262,13 @@ export class DropDown extends Phaser.GameObjects.Container { public options: DropDownOption[]; private window: Phaser.GameObjects.NineSlice; private cursorObj: Phaser.GameObjects.Image; - private dropDownType: DropDownType = DropDownType.MULTI; + public dropDownType: DropDownType = DropDownType.MULTI; public cursor: number = 0; + private lastCursor: number = -1; public defaultCursor: number = 0; private onChange: () => void; private lastDir: SortDirection = SortDirection.ASC; - private defaultValues: any[]; + private defaultSettings: any[]; constructor(scene: BattleScene, x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { const windowPadding = 5; @@ -292,7 +293,7 @@ export class DropDown extends Phaser.GameObjects.Container { this.options.unshift(new DropDownOption(scene, "ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); } - this.defaultValues = this.getVals(); + this.defaultSettings = this.getSettings(); // Place ui elements in the correct spot options.forEach((option, index) => { @@ -339,8 +340,8 @@ export class DropDown extends Phaser.GameObjects.Container { resetCursor(): boolean { // If we are an hybrid dropdown in "hover" mode, don't move the cursor back to 0 - if (this.dropDownType === DropDownType.HYBRID && this.checkForAllOff() && this.cursor > 0) { - return false; + if (this.dropDownType === DropDownType.HYBRID && this.checkForAllOff()) { + return this.setCursor(this.lastCursor); } return this.setCursor(this.defaultCursor); } @@ -361,6 +362,7 @@ export class DropDown extends Phaser.GameObjects.Container { 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(); } } @@ -457,23 +459,43 @@ export class DropDown extends Phaser.GameObjects.Container { } } + /** + * Get the current selected settings dictionary for each option + * @returns an array of dictionaries with the current state of each option + * - the settings dictionary is like this { val: any, state: DropDownState, cursor: boolean, dir: SortDirection } + */ + private getSettings(): any[] { + const settings = []; + 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 }); + } + return settings; + } + /** * Check whether the values of all options are the same as the default ones * @returns true if they are the same, false otherwise */ public hasDefaultValues(): boolean { - const currentValues = this.getVals(); + 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]) + ); + }; switch (this.dropDownType) { case DropDownType.MULTI: - case DropDownType.HYBRID: - return currentValues.length === this.defaultValues.length && currentValues.every((value, index) => value === this.defaultValues[index]); - case DropDownType.RADIAL: - return currentValues.every((value, index) => value["val"] === this.defaultValues[index]["val"] && value["state"] === this.defaultValues[index]["state"]); + return compareValues(["val", "state"]); + + case DropDownType.HYBRID: + return compareValues(["val", "state", "cursor"]); case DropDownType.SINGLE: - return currentValues[0]["dir"] === this.defaultValues[0]["dir"] && currentValues[0]["val"] === this.defaultValues[0]["val"]; + return compareValues(["val", "state", "dir"]); default: return false; @@ -484,46 +506,29 @@ export class DropDown extends Phaser.GameObjects.Container { * Set all values to their default state */ public resetToDefault(): void { - this.setCursor(this.defaultCursor); + if (this.defaultSettings.length > 0) { + this.setCursor(this.defaultCursor); + this.lastDir = SortDirection.ASC; - for (let i = 0; i < this.options.length; i++) { - const option = this.options[i]; - // reset values - switch (this.dropDownType) { - case DropDownType.HYBRID: - case DropDownType.MULTI: - if (this.defaultValues.includes(option.val)) { - option.setOptionState(DropDownState.ON); + for (let i = 0; i < this.options.length; i++) { + // reset values with the defaultValues + if (this.dropDownType === DropDownType.SINGLE) { + if (this.defaultSettings[i].state === DropDownState.OFF) { + this.options[i].setOptionState(DropDownState.OFF); + this.options[i].setDirection(SortDirection.ASC); + this.options[i].toggle.setVisible(false); + } else { + this.options[i].setOptionState(DropDownState.ON); + this.options[i].setDirection(SortDirection.ASC); + this.options[i].toggle.setVisible(true); + } } else { - option.setOptionState(DropDownState.OFF); - } - break; - case DropDownType.RADIAL: - const targetValue = this.defaultValues.find(value => value.val === option.val); - option.setOptionState(targetValue.state); - break; - case DropDownType.SINGLE: - if (option.val === this.defaultValues[0].val) { - if (option.state !== DropDownState.ON) { - this.toggleOptionState(i); - } - if (option.dir !== this.defaultValues[0].dir) { - this.toggleOptionState(i); + if (this.defaultSettings[i]) { + this.options[i].setOptionState(this.defaultSettings[i]["state"]); } } - break; } } - - // Select or unselect "ALL" button if applicable - if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { - if (this.checkForAllOn()) { - this.options[0].setOptionState(DropDownState.ON); - } else { - this.options[0].setOptionState(DropDownState.OFF); - } - } - } /** diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index e163284bad3..072d258085b 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -1,5 +1,5 @@ import BattleScene from "#app/battle-scene.js"; -import { DropDown } from "./dropdown"; +import { DropDown, DropDownType } from "./dropdown"; import { StarterContainer } from "./starter-container"; import { addTextObject, getTextColor, TextStyle } from "./text"; import { UiTheme } from "#enums/ui-theme"; @@ -120,11 +120,13 @@ export class FilterBar extends Phaser.GameObjects.Container { /** * Move the leftmost dropdown to the left of the FilterBar instead of below it */ - offsetFirstFilter(): void { - if (this.dropDowns[0]) { - this.dropDowns[0].autoSize(); - this.dropDowns[0].x -= this.dropDowns[0].getWidth(); - this.dropDowns[0].y = 0; + offsetHybridFilters(): void { + for (let i=0; i Date: Tue, 6 Aug 2024 00:43:47 +0900 Subject: [PATCH 165/321] [Enhancement] add filters for pokerus, HA, cost reduction (#3343) * add filters for pokerus, HA, cost reduction * add entries for translation * Update src/ui/starter-select-ui-handler.ts Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> * Update src/ui/starter-select-ui-handler.ts Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> --------- Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> --- src/locales/de/filter-bar.ts | 9 +++++ src/locales/en/filter-bar.ts | 9 +++++ src/locales/es/filter-bar.ts | 9 +++++ src/locales/fr/filter-bar.ts | 9 +++++ src/locales/it/filter-bar.ts | 9 +++++ src/locales/ko/filter-bar.ts | 9 +++++ src/locales/pt_BR/filter-bar.ts | 9 +++++ src/locales/zh_CN/filter-bar.ts | 9 +++++ src/locales/zh_TW/filter-bar.ts | 9 +++++ src/ui/starter-select-ui-handler.ts | 54 ++++++++++++++++++++++++++++- 10 files changed, 134 insertions(+), 1 deletion(-) diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts index 9c1009171e2..5ab2ae23f25 100644 --- a/src/locales/de/filter-bar.ts +++ b/src/locales/de/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Passive freigeschaltet", "passiveLocked": "Passive gesperrt", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Band", "hasWon": "Hat Klassik-Modus gewonnen", "hasNotWon": "Hat Klassik-Modus nicht gewonnen", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "Pokédex-Nummer", "sortByCost": "Kosten", "sortByCandies": "Anzahl Bonbons", diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts index 18b6ba77e21..aa234c6ac65 100644 --- a/src/locales/en/filter-bar.ts +++ b/src/locales/en/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Passive Unlocked", "passiveLocked": "Passive Locked", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Ribbon", "hasWon": "Ribbon - Yes", "hasNotWon": "Ribbon - No", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "No.", "sortByCost": "Cost", "sortByCandies": "Candy Count", diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts index 33b60cfa427..5ed91f81c25 100644 --- a/src/locales/es/filter-bar.ts +++ b/src/locales/es/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Pasiva Desbloq.", "passiveLocked": "Pasiva Bloq.", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Ribbon", "hasWon": "Ya ha ganado", "hasNotWon": "Aún no ha ganado", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "Núm.", "sortByCost": "Coste", "sortByCandies": "# Caramelos", diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index 8e2c1a53afa..0fba91ca458 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passif", "passiveUnlocked": "Passif débloqué", "passiveLocked": "Passif verrouillé", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Ruban", "hasWon": "Ruban - Oui", "hasNotWon": "Ruban - Non", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "Par N°", "sortByCost": "Par cout", "sortByCandies": "Par bonbons", diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts index 88745d2c4f8..37b66a2023e 100644 --- a/src/locales/it/filter-bar.ts +++ b/src/locales/it/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Passiva sbloccata", "passiveLocked": "Passiva bloccata", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Ribbon", "hasWon": "Ribbon - Yes", "hasNotWon": "Ribbon - No", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "Num. Dex", "sortByCost": "Costo", "sortByCandies": "Caramelle", diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts index 821a80d78ee..69f625b2ba1 100644 --- a/src/locales/ko/filter-bar.ts +++ b/src/locales/ko/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "패시브", "passiveUnlocked": "패시브 해금", "passiveLocked": "패시브 잠김", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "클리어 여부", "hasWon": "클리어 함", "hasNotwon": "클리어 안함", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "도감번호", "sortByCost": "코스트", "sortByCandies": "사탕 수", diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index 01f37f55eab..b0d34c16d0c 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passiva", "passiveUnlocked": "Passiva Desbloq.", "passiveLocked": "Passiva Bloq.", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "Fita", "hasWon": "Fita - Sim", "hasNotWon": "Fita - Não", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "Número", "sortByCost": "Custo", "sortByCandies": "# Doces", diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts index 5ccc5b8d9d9..e2f3204e8ae 100644 --- a/src/locales/zh_CN/filter-bar.ts +++ b/src/locales/zh_CN/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "被动", "passiveUnlocked": "被动解锁", "passiveLocked": "被动未解锁", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "缎带", "hasWon": "有缎带", "hasNotWon": "无缎带", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "编号", "sortByCost": "费用", "sortByCandies": "糖果", diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts index 0290bda62de..c338a77e4dc 100644 --- a/src/locales/zh_TW/filter-bar.ts +++ b/src/locales/zh_TW/filter-bar.ts @@ -13,9 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "被動", "passiveUnlocked": "被動解鎖", "passiveLocked": "被動未解鎖", + "costReduction": "Cost Reduction", + "costReductionUnlocked": "Cost Reduction Unlocked", + "costReductionLocked": "Cost Reduction Locked", "ribbon": "緞帶", "hasWon": "有緞帶", "hasNotWon": "無緞帶", + "hiddenAbility": "Hidden Ability", + "hasHiddenAbility": "Hidden Ability - Yes", + "noHiddenAbility": "Hidden Ability - No", + "pokerus": "Pokerus", + "hasPokerus": "Pokerus - Yes", + "noPokerus": "Pokerus - No", "sortByNumber": "編號", "sortByCost": "花費", "sortByCandies": "糖果", diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index c17cf643651..6554c489fca 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -431,8 +431,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), ]; + + 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:costReductionLocked"), undefined, DropDownState.EXCLUDE), + ]; + const unlocksOptions = [ new DropDownOption(this.scene, "PASSIVE", passiveLabels), + new DropDownOption(this.scene, "COST_REDUCTION", costReductionLabels), ]; this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); @@ -443,8 +451,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownLabel(i18next.t("filterBar:hasWon"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:hasNotWon"), undefined, DropDownState.EXCLUDE), ]; + const hiddenAbilityLabels = [ + new DropDownLabel(i18next.t("filterBar:hiddenAbility"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE), + ]; + const pokerusLabels = [ + new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:noPokerus"), undefined, DropDownState.EXCLUDE), + ]; const miscOptions = [ new DropDownOption(this.scene, "WIN", winLabels), + new DropDownOption(this.scene, "HIDDEN_ABILITY", hiddenAbilityLabels), + new DropDownOption(this.scene, "POKERUS", pokerusLabels), ]; this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); @@ -2100,9 +2120,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isCaught = !!(caughtVariants & DexAttr.NON_SHINY); const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0; + const isCostReduced = this.scene.gameData.starterData[container.species.speciesId].valueReduction > 0; const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; + const isHA = this.scene.gameData.starterData[container.species.speciesId].abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); @@ -2132,6 +2154,16 @@ 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 isCostReduced; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + return !isCostReduced; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (container.species.speciesId < 10) { } @@ -2144,7 +2176,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); - if (fitsGen && fitsType && fitsShiny && fitsPassive && fitsWin) { + const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { + return isHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + return !isHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + return true; + } + }); + + 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) { + return !this.pokerusSpecies.includes(container.species); + } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + return true; + } + }); + + if (fitsGen && fitsType && fitsShiny && fitsPassive && fitsCostReduction && fitsWin && fitsHA && fitsPokerus) { this.filteredStarterContainers.push(container); } }); From 0a77dcdb4fd781f6c8a9e55075838a7ef2db1a8e Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 5 Aug 2024 08:51:36 -0700 Subject: [PATCH 166/321] [Bug] Sand Spit should only activate when hit with a damaging move (#3337) * Sand Spit should only activate when hit with a damaging move * Add tests for Sand Spit --- src/data/ability.ts | 9 ++++- src/test/abilities/sand_spit.test.ts | 57 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/test/abilities/sand_spit.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 491a14ba621..9e77013ff13 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -941,14 +941,19 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { private weatherType: WeatherType; + protected condition: PokemonDefendCondition | null; - constructor(weatherType: WeatherType) { + constructor(weatherType: WeatherType, condition?: PokemonDefendCondition) { super(); this.weatherType = weatherType; + this.condition = condition ?? null; } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if (this.condition !== null && !this.condition(pokemon, attacker, move)) { + return false; + } if (!pokemon.scene.arena.weather?.isImmutable()) { return pokemon.scene.arena.trySetWeather(this.weatherType, true); } @@ -5092,7 +5097,7 @@ 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), + .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS), new Ability(Abilities.ICE_SCALES, 8) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5) .ignorable(), diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts new file mode 100644 index 00000000000..de75ba833dd --- /dev/null +++ b/src/test/abilities/sand_spit.test.ts @@ -0,0 +1,57 @@ +import GameManager from "#app/test/utils/gameManager"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { WeatherType } from "#app/enums/weather-type.js"; + + +describe("Ability Timing", () => { + 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.SILICOBRA); + game.override.ability(Abilities.SAND_SPIT); + game.override.moveset([Moves.SPLASH, Moves.COIL]); + }); + + it("should trigger when hit with damaging move", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(game.scene.arena.weather.weatherType).toBe(WeatherType.SANDSTORM); + }, 20000); + + it("should not trigger when targetted with status moves", async() => { + game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.COIL)); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.SANDSTORM); + }, 20000); +}); From 6a58d1b928f1feeb571a7196fd4eca221368292f Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Mon, 5 Aug 2024 12:02:53 -0400 Subject: [PATCH 167/321] [Misc] Update pull request template (#3360) --- .github/pull_request_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e4f1fa5ebf5..acfe341c075 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -5,12 +5,12 @@ ## What are the changes? -## Why am I doing these changes? +## Why am I doing these changes the user will see? -## What did change? +## What are the changes from a developer perspective? @@ -30,6 +30,7 @@ - [ ] The PR is self-contained and cannot be split into smaller PRs? - [ ] Have I provided a clear explanation of the changes? - [ ] Have I considered writing automated tests for the issue? +- [ ] If I have text, did I add placeholders for them in locales? - [ ] Have I tested the changes (manually)? - [ ] Are all unit tests still passing? (`npm run test`) - [ ] Are the changes visual? From 1ec7190abae53fb937a52131ef756a100a7aec70 Mon Sep 17 00:00:00 2001 From: Mason S <132116525+ElizaAlex@users.noreply.github.com> Date: Mon, 5 Aug 2024 20:07:13 -0400 Subject: [PATCH 168/321] [Bug] Cosplay Pikachu and Rotom forms not starting with signature moves (#3365) Changed the level of the signature moves for Cosplay Pikachu and Rotom forms to be 1 instead of 0. --- src/data/pokemon-level-moves.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index b23c43ef215..ccf6ac022ae 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -18666,7 +18666,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 3: [ - [ EVOLVE_MOVE, Moves.METEOR_MASH ], + [ 1, Moves.METEOR_MASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18690,7 +18690,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 4: [ - [ EVOLVE_MOVE, Moves.ICICLE_CRASH ], + [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18714,7 +18714,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 5: [ - [ EVOLVE_MOVE, Moves.DRAINING_KISS ], + [ 1, Moves.DRAINING_KISS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18738,7 +18738,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 6: [ - [ EVOLVE_MOVE, Moves.ELECTRIC_TERRAIN ], + [ 1, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18762,7 +18762,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.PIKA_PAPOW ], ], 7: [ - [ EVOLVE_MOVE, Moves.FLYING_PRESS ], + [ 1, Moves.FLYING_PRESS ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_SHOCK ], @@ -18886,7 +18886,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.ROTOM]: { 1: [ - [ EVOLVE_MOVE, Moves.OVERHEAT ], + [ 1, Moves.OVERHEAT ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18902,7 +18902,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 2: [ - [ EVOLVE_MOVE, Moves.HYDRO_PUMP ], + [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18918,7 +18918,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 3: [ - [ EVOLVE_MOVE, Moves.BLIZZARD ], + [ 1, Moves.BLIZZARD ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18934,7 +18934,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 4: [ - [ EVOLVE_MOVE, Moves.AIR_SLASH ], + [ 1, Moves.AIR_SLASH ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], @@ -18950,7 +18950,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 55, Moves.UPROAR ], ], 5: [ - [ EVOLVE_MOVE, Moves.LEAF_STORM ], + [ 1, Moves.LEAF_STORM ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ASTONISH ], [ 5, Moves.THUNDER_SHOCK ], From dba2adf44ea6ee74948d2fb3bc03c9e08813cbd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Fleury=20Oliveira?= Date: Mon, 5 Aug 2024 21:08:12 -0300 Subject: [PATCH 169/321] [Localization] Updated Portuguese filter-bar.ts and confirmExit in the starter select UI (#3363) * [Localization] Updated Portuguese filter-bar.ts and confirmExit in the starter select UI * typo --- src/locales/pt_BR/filter-bar.ts | 22 +++++++++---------- .../pt_BR/starter-select-ui-handler.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index b0d34c16d0c..2977493b237 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -11,20 +11,20 @@ export const filterBar: SimpleTranslationEntries = { "normal": "Normal", "uncaught": "Não Capturado", "passive": "Passiva", - "passiveUnlocked": "Passiva Desbloq.", - "passiveLocked": "Passiva Bloq.", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", + "passiveUnlocked": "Passiva Desbloqueada", + "passiveLocked": "Passiva Bloqueada", + "costReduction": "Redução de Custo", + "costReductionUnlocked": "Redução de Custo Desbloq.", + "costReductionLocked": "Redução de Custo Bloq.", "ribbon": "Fita", "hasWon": "Fita - Sim", "hasNotWon": "Fita - Não", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "hiddenAbility": "Habilidade Oculta", + "hasHiddenAbility": "Habilidade Oculta - Sim", + "noHiddenAbility": "Habilidade Oculta - Não", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sim", + "noPokerus": "Pokérus - Não", "sortByNumber": "Número", "sortByCost": "Custo", "sortByCandies": "# Doces", diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index a6407b5368d..660076da413 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Começar com esses Pokémon?", - "confirmExit": "Do you want to exit?", + "confirmExit": "Deseja sair?", "invalidParty": "Essa equipe de iniciais não é válida!", "gen1": "G1", "gen2": "G2", From 1711b6c7ae4cfaeb89e1d4174ba3725c33bec43a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:00:57 -0400 Subject: [PATCH 170/321] [Balance] Set White Herb weight to 0 (#3366) * Old Yeller White Herb * ESLint, the accident was 5 years ago, you need to move on * 'It is nothing, it is nothing...' -Archduke Franz Ferdinand --- 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 235b48067b1..9c7c3f8949a 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1569,7 +1569,7 @@ const modifierPool: ModifierPool = { p => !p.getHeldItems().some(i => i instanceof Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 2 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier : 0); + return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0); }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), @@ -1637,7 +1637,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, 1) + new WeightedModifierType(modifierTypes.WHITE_HERB, 0) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1667,7 +1667,7 @@ const trainerModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, 1), + new WeightedModifierType(modifierTypes.WHITE_HERB, 0), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), From 1aa2c219bb9be4cca274e53cea8ccebd08d723bc Mon Sep 17 00:00:00 2001 From: damocleas Date: Mon, 5 Aug 2024 22:30:27 -0400 Subject: [PATCH 171/321] Update pokemon-species.ts (#3368) --- src/data/pokemon-species.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ac79b6223c0..4774b372065 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2765,7 +2765,7 @@ export const speciesStarters = { [Species.SENTRET]: 1, [Species.HOOTHOOT]: 2, [Species.LEDYBA]: 1, - [Species.SPINARAK]: 2, + [Species.SPINARAK]: 1, [Species.CHINCHOU]: 2, [Species.PICHU]: 2, [Species.CLEFFA]: 2, @@ -2819,7 +2819,7 @@ export const speciesStarters = { [Species.CELEBI]: 6, [Species.TREECKO]: 3, - [Species.TORCHIC]: 3, + [Species.TORCHIC]: 4, [Species.MUDKIP]: 3, [Species.POOCHYENA]: 2, [Species.ZIGZAGOON]: 2, @@ -2986,7 +2986,7 @@ export const speciesStarters = { [Species.ZORUA]: 3, [Species.MINCCINO]: 3, [Species.GOTHITA]: 3, - [Species.SOLOSIS]: 4, + [Species.SOLOSIS]: 3, [Species.DUCKLETT]: 2, [Species.VANILLITE]: 3, [Species.DEERLING]: 2, @@ -3205,7 +3205,7 @@ export const speciesStarters = { [Species.LECHONK]: 2, [Species.TAROUNTULA]: 1, [Species.NYMBLE]: 3, - [Species.PAWMI]: 4, + [Species.PAWMI]: 3, [Species.TANDEMAUS]: 4, [Species.FIDOUGH]: 2, [Species.SMOLIV]: 3, From 20e52ed9a76a8961de7374e9106e5412ac9a7a71 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:54:31 +0900 Subject: [PATCH 172/321] [QoL] Change Dex filter name to Caught (#3361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * change filter name `Dex` to `Caught` * fix mis changed entry * Update src/locales/fr/filter-bar.ts Co-authored-by: Lugiad' * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/ko/filter-bar.ts Co-authored-by: Enoch * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> --------- Co-authored-by: Lugiad' Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Enoch Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> --- src/locales/de/filter-bar.ts | 2 +- src/locales/en/filter-bar.ts | 2 +- src/locales/es/filter-bar.ts | 2 +- src/locales/fr/filter-bar.ts | 2 +- src/locales/it/filter-bar.ts | 2 +- src/locales/ko/filter-bar.ts | 2 +- src/locales/pt_BR/filter-bar.ts | 2 +- src/locales/zh_CN/filter-bar.ts | 2 +- src/locales/zh_TW/filter-bar.ts | 2 +- src/ui/filter-bar.ts | 2 +- src/ui/starter-select-ui-handler.ts | 20 ++++++++++---------- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts index 5ab2ae23f25..1094b0fd43a 100644 --- a/src/locales/de/filter-bar.ts +++ b/src/locales/de/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen.", "typeFilter": "Typ", - "dexFilter": "Dex.", + "caughtFilter": "Gefangen", "unlocksFilter": "Freisch.", "miscFilter": "Sonst.", "sortFilter": "Sort.", diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts index aa234c6ac65..7a3174957ea 100644 --- a/src/locales/en/filter-bar.ts +++ b/src/locales/en/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Type", - "dexFilter": "Dex", + "caughtFilter": "Caught", "unlocksFilter": "Unlocks", "miscFilter": "Misc", "sortFilter": "Sort", diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts index 5ed91f81c25..b55a35c1adf 100644 --- a/src/locales/es/filter-bar.ts +++ b/src/locales/es/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen.", "typeFilter": "Tipo", - "dexFilter": "Dex", + "caughtFilter": "Caught", "unlocksFilter": "Otros", "miscFilter": "Misc", "sortFilter": "Orden", diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index 0fba91ca458..13656192116 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Type", - "dexFilter": "Dex", + "caughtFilter": "Capturés", "unlocksFilter": "Débloq.", "miscFilter": "Divers", "sortFilter": "Tri", diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts index 37b66a2023e..c6fcb2f0623 100644 --- a/src/locales/it/filter-bar.ts +++ b/src/locales/it/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Tipo", - "dexFilter": "Dex", + "caughtFilter": "Caught", "unlocksFilter": "Altro", "miscFilter": "Misc", "sortFilter": "Ordina", diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts index 69f625b2ba1..a07a96a1ee8 100644 --- a/src/locales/ko/filter-bar.ts +++ b/src/locales/ko/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "세대", "typeFilter": "타입", - "dexFilter": "도감", + "caughtFilter": "포획", "unlocksFilter": "해금", "miscFilter": "기타", "sortFilter": "정렬", diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index 2977493b237..d08d2d28707 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Ger.", "typeFilter": "Tipo", - "dexFilter": "Dex", + "caughtFilter": "Capturado", "unlocksFilter": "Desbloqueios", "miscFilter": "Outros", "sortFilter": "Ordem", diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts index e2f3204e8ae..4ee38521a0a 100644 --- a/src/locales/zh_CN/filter-bar.ts +++ b/src/locales/zh_CN/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "世代", "typeFilter": "属性", - "dexFilter": "Dex", + "caughtFilter": "捕获", "unlocksFilter": "解锁", "miscFilter": "混合", "sortFilter": "排序", diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts index c338a77e4dc..8916088d884 100644 --- a/src/locales/zh_TW/filter-bar.ts +++ b/src/locales/zh_TW/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "世代", "typeFilter": "屬性", - "dexFilter": "Dex", + "caughtFilter": "捕獲", "unlocksFilter": "解鎖", "miscFilter": "混合", "sortFilter": "排序", diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 072d258085b..52266a3a06b 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -8,7 +8,7 @@ import { addWindow, WindowVariant } from "./ui-theme"; export enum DropDownColumn { GEN, TYPES, - DEX, + CAUGHT, UNLOCKS, MISC, SORT diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 6554c489fca..6735f5f1251 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -398,7 +398,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); - // shiny filter + // caught filter const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); shiny1Sprite.setOrigin(0.15, 0.2); shiny1Sprite.setScale(0.6); @@ -415,7 +415,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { shiny3Sprite.setFrame(getVariantIcon(2)); shiny3Sprite.setTint(getVariantTint(2)); - const shinyOptions = [ + const caughtOptions = [ new DropDownOption(this.scene, "SHINY3", new DropDownLabel("", shiny3Sprite)), new DropDownOption(this.scene, "SHINY2", new DropDownLabel("", shiny2Sprite)), new DropDownOption(this.scene, "SHINY", new DropDownLabel("", shiny1Sprite)), @@ -423,7 +423,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption(this.scene, "UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) ]; - this.filterBar.addFilter(DropDownColumn.DEX, i18next.t("filterBar:dexFilter"), new DropDown(this.scene, 0, 0, shinyOptions, this.updateStarters, DropDownType.HYBRID)); + this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(this.scene, 0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); // unlocks filter const passiveLabels = [ @@ -2130,16 +2130,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); - const fitsShiny = this.filterBar.getVals(DropDownColumn.DEX).some(variant => { - if (variant === "SHINY3") { + const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { + if (caught === "SHINY3") { return isVariant3Caught; - } else if (variant === "SHINY2") { + } else if (caught === "SHINY2") { return isVariant2Caught && !isVariant3Caught; - } else if (variant === "SHINY") { + } else if (caught === "SHINY") { return isVariantCaught && !isVariant2Caught && !isVariant3Caught; - } else if (variant === "NORMAL") { + } else if (caught === "NORMAL") { return isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; - } else if (variant === "UNCAUGHT") { + } else if (caught === "UNCAUGHT") { return isUncaught; } }); @@ -2196,7 +2196,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); - if (fitsGen && fitsType && fitsShiny && fitsPassive && fitsCostReduction && fitsWin && fitsHA && fitsPokerus) { + if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsWin && fitsHA && fitsPokerus) { this.filteredStarterContainers.push(container); } }); From 151e2647cb12ef3561b93c6ec8a0b305b3a83ea1 Mon Sep 17 00:00:00 2001 From: Enoch Date: Tue, 6 Aug 2024 15:08:04 +0900 Subject: [PATCH 173/321] [Localization][ko] Translate missed texts in filter bar. (#3370) * Add missed translation and fix wrong message key * change some text * Update src/locales/ko/filter-bar.ts * Update src/locales/ko/filter-bar.ts * Add confirmExit translation --- src/locales/ko/filter-bar.ts | 22 ++++++++++----------- src/locales/ko/starter-select-ui-handler.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/locales/ko/filter-bar.ts b/src/locales/ko/filter-bar.ts index a07a96a1ee8..b4dcb48b581 100644 --- a/src/locales/ko/filter-bar.ts +++ b/src/locales/ko/filter-bar.ts @@ -13,18 +13,18 @@ export const filterBar: SimpleTranslationEntries = { "passive": "패시브", "passiveUnlocked": "패시브 해금", "passiveLocked": "패시브 잠김", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", + "costReduction": "코스트 줄이기", + "costReductionUnlocked": "코스트 절감됨", + "costReductionLocked": "코스트 절감 없음", "ribbon": "클리어 여부", - "hasWon": "클리어 함", - "hasNotwon": "클리어 안함", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "hasWon": "클리어 완료", + "hasNotWon": "클리어 안함", + "hiddenAbility": "숨겨진 특성", + "hasHiddenAbility": "숨겨진 특성 보유", + "noHiddenAbility": "숨겨진 특성 없음", + "pokerus": "포켓러스", + "hasPokerus": "포켓러스 감염", + "noPokerus": "포켓러스 없음", "sortByNumber": "도감번호", "sortByCost": "코스트", "sortByCandies": "사탕 수", diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index c57a37788fa..25bb006059e 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", - "confirmExit": "Do you want to exit?", + "confirmExit": "나가시겠습니까?", "invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!", "gen1": "1세대", "gen2": "2세대", From 7e81b5021442543903e45b952b02b7b41b0d9877 Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 6 Aug 2024 02:24:05 -0400 Subject: [PATCH 174/321] Passive Changes (#3372) --- src/data/pokemon-species.ts | 72 ++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 4774b372065..64e3fa70ad6 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -3319,14 +3319,14 @@ export const starterPassiveAbilities = { [Species.SQUIRTLE]: Abilities.STURDY, [Species.CATERPIE]: Abilities.MAGICIAN, [Species.WEEDLE]: Abilities.TINTED_LENS, - [Species.PIDGEY]: Abilities.GALE_WINGS, + [Species.PIDGEY]: Abilities.FLARE_BOOST, [Species.RATTATA]: Abilities.STRONG_JAW, [Species.SPEAROW]: Abilities.MOXIE, [Species.EKANS]: Abilities.REGENERATOR, [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, [Species.NIDORAN_F]: Abilities.FLARE_BOOST, [Species.NIDORAN_M]: Abilities.GUTS, - [Species.VULPIX]: Abilities.SOLAR_POWER, + [Species.VULPIX]: Abilities.FUR_COAT, [Species.ZUBAT]: Abilities.INTIMIDATE, [Species.ODDISH]: Abilities.TRIAGE, [Species.PARAS]: Abilities.TRIAGE, @@ -3345,16 +3345,16 @@ export const starterPassiveAbilities = { [Species.PONYTA]: Abilities.MAGIC_GUARD, [Species.SLOWPOKE]: Abilities.UNAWARE, [Species.MAGNEMITE]: Abilities.LEVITATE, - [Species.FARFETCHD]: Abilities.HUGE_POWER, + [Species.FARFETCHD]: Abilities.SNIPER, [Species.DODUO]: Abilities.PARENTAL_BOND, [Species.SEEL]: Abilities.WATER_BUBBLE, [Species.GRIMER]: Abilities.WATER_ABSORB, [Species.SHELLDER]: Abilities.ICE_SCALES, [Species.GASTLY]: Abilities.SHADOW_SHIELD, [Species.ONIX]: Abilities.ROCKY_PAYLOAD, - [Species.DROWZEE]: Abilities.BAD_DREAMS, + [Species.DROWZEE]: Abilities.MAGICIAN, [Species.KRABBY]: Abilities.UNBURDEN, - [Species.VOLTORB]: Abilities.ELECTRIC_SURGE, + [Species.VOLTORB]: Abilities.TRANSISTOR, [Species.EXEGGCUTE]: Abilities.RIPEN, [Species.CUBONE]: Abilities.PARENTAL_BOND, [Species.LICKITUNG]: Abilities.THICK_FAT, @@ -3374,7 +3374,7 @@ export const starterPassiveAbilities = { [Species.EEVEE]: Abilities.SIMPLE, [Species.PORYGON]: Abilities.PROTEAN, [Species.OMANYTE]: Abilities.STURDY, - [Species.KABUTO]: Abilities.SHARPNESS, + [Species.KABUTO]: Abilities.TOUGH_CLAWS, [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, [Species.ARTICUNO]: Abilities.SNOW_WARNING, [Species.ZAPDOS]: Abilities.DRIZZLE, @@ -3476,7 +3476,7 @@ export const starterPassiveAbilities = { [Species.CACNEA]: Abilities.SAND_RUSH, [Species.SWABLU]: Abilities.ADAPTABILITY, [Species.ZANGOOSE]: Abilities.POISON_HEAL, - [Species.SEVIPER]: Abilities.INTIMIDATE, + [Species.SEVIPER]: Abilities.MULTISCALE, [Species.LUNATONE]: Abilities.SHADOW_SHIELD, [Species.SOLROCK]: Abilities.DROUGHT, [Species.BARBOACH]: Abilities.SIMPLE, @@ -3495,16 +3495,16 @@ export const starterPassiveAbilities = { [Species.SNORUNT]: Abilities.SNOW_WARNING, [Species.SPHEAL]: Abilities.UNAWARE, [Species.CLAMPERL]: Abilities.DRIZZLE, - [Species.RELICANTH]: Abilities.SOLID_ROCK, + [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, [Species.LUVDISC]: Abilities.MULTISCALE, - [Species.BAGON]: Abilities.ADAPTABILITY, + [Species.BAGON]: Abilities.DRAGONS_MAW, [Species.BELDUM]: Abilities.LEVITATE, [Species.REGIROCK]: Abilities.SAND_STREAM, [Species.REGICE]: Abilities.SNOW_WARNING, [Species.REGISTEEL]: Abilities.FILTER, - [Species.LATIAS]: Abilities.SOUL_HEART, + [Species.LATIAS]: Abilities.PRISM_ARMOR, [Species.LATIOS]: Abilities.TINTED_LENS, - [Species.KYOGRE]: Abilities.RAIN_DISH, + [Species.KYOGRE]: Abilities.MOLD_BREAKER, [Species.GROUDON]: Abilities.TURBOBLAZE, [Species.RAYQUAZA]: Abilities.UNNERVE, [Species.JIRACHI]: Abilities.COMATOSE, @@ -3523,7 +3523,7 @@ export const starterPassiveAbilities = { [Species.COMBEE]: Abilities.INTIMIDATE, [Species.PACHIRISU]: Abilities.HONEY_GATHER, [Species.BUIZEL]: Abilities.MOXIE, - [Species.CHERUBI]: Abilities.DROUGHT, + [Species.CHERUBI]: Abilities.ORICHALCUM_PULSE, [Species.SHELLOS]: Abilities.REGENERATOR, [Species.DRIFLOON]: Abilities.MAGIC_GUARD, [Species.BUNEARY]: Abilities.ADAPTABILITY, @@ -3537,13 +3537,13 @@ export const starterPassiveAbilities = { [Species.CHATOT]: Abilities.PUNK_ROCK, [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, [Species.GIBLE]: Abilities.SAND_STREAM, - [Species.MUNCHLAX]: Abilities.RIPEN, + [Species.MUNCHLAX]: Abilities.HARVEST, [Species.RIOLU]: Abilities.MINDS_EYE, [Species.HIPPOPOTAS]: Abilities.UNAWARE, [Species.SKORUPI]: Abilities.SUPER_LUCK, [Species.CROAGUNK]: Abilities.MOXIE, [Species.CARNIVINE]: Abilities.ARENA_TRAP, - [Species.FINNEON]: Abilities.DRIZZLE, + [Species.FINNEON]: Abilities.WATER_BUBBLE, [Species.MANTYKE]: Abilities.UNAWARE, [Species.SNOVER]: Abilities.THICK_FAT, [Species.ROTOM]: Abilities.HADRON_ENGINE, @@ -3557,7 +3557,7 @@ export const starterPassiveAbilities = { [Species.GIRATINA]: Abilities.SHADOW_SHIELD, [Species.CRESSELIA]: Abilities.MAGIC_BOUNCE, [Species.PHIONE]: Abilities.SIMPLE, - [Species.MANAPHY]: Abilities.SIMPLE, + [Species.MANAPHY]: Abilities.PRIMORDIAL_SEA, [Species.DARKRAI]: Abilities.UNNERVE, [Species.SHAYMIN]: Abilities.WIND_RIDER, [Species.ARCEUS]: Abilities.ADAPTABILITY, @@ -3590,13 +3590,13 @@ export const starterPassiveAbilities = { [Species.SANDILE]: Abilities.TOUGH_CLAWS, [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, - [Species.DWEBBLE]: Abilities.ANGER_SHELL, + [Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD, [Species.SCRAGGY]: Abilities.PROTEAN, - [Species.SIGILYPH]: Abilities.MAGICIAN, + [Species.SIGILYPH]: Abilities.FLARE_BOOST, [Species.YAMASK]: Abilities.PURIFYING_SALT, - [Species.TIRTOUGA]: Abilities.ANGER_SHELL, + [Species.TIRTOUGA]: Abilities.WATER_ABSORB, [Species.ARCHEN]: Abilities.MULTISCALE, - [Species.TRUBBISH]: Abilities.TOXIC_DEBRIS, + [Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS, [Species.ZORUA]: Abilities.DARK_AURA, [Species.MINCCINO]: Abilities.FUR_COAT, [Species.GOTHITA]: Abilities.UNNERVE, @@ -3611,7 +3611,7 @@ export const starterPassiveAbilities = { [Species.ALOMOMOLA]: Abilities.MULTISCALE, [Species.JOLTIK]: Abilities.TRANSISTOR, [Species.FERROSEED]: Abilities.ROUGH_SKIN, - [Species.KLINK]: Abilities.STEELWORKER, + [Species.KLINK]: Abilities.STEELY_SPIRIT, [Species.TYNAMO]: Abilities.POISON_HEAL, [Species.ELGYEM]: Abilities.PRISM_ARMOR, [Species.LITWICK]: Abilities.SOUL_HEART, @@ -3625,7 +3625,7 @@ export const starterPassiveAbilities = { [Species.GOLETT]: Abilities.SHADOW_SHIELD, [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, [Species.BOUFFALANT]: Abilities.ROCK_HEAD, - [Species.RUFFLET]: Abilities.GALE_WINGS, + [Species.RUFFLET]: Abilities.SPEED_BOOST, [Species.VULLABY]: Abilities.THICK_FAT, [Species.HEATMOR]: Abilities.CONTRARY, [Species.DURANT]: Abilities.COMPOUND_EYES, @@ -3651,12 +3651,12 @@ export const starterPassiveAbilities = { [Species.SCATTERBUG]: Abilities.PRANKSTER, [Species.LITLEO]: Abilities.BEAST_BOOST, [Species.FLABEBE]: Abilities.GRASSY_SURGE, - [Species.SKIDDO]: Abilities.GRASSY_SURGE, + [Species.SKIDDO]: Abilities.SEED_SOWER, [Species.PANCHAM]: Abilities.FUR_COAT, [Species.FURFROU]: Abilities.FLUFFY, [Species.ESPURR]: Abilities.FUR_COAT, [Species.HONEDGE]: Abilities.SHARPNESS, - [Species.SPRITZEE]: Abilities.MISTY_SURGE, + [Species.SPRITZEE]: Abilities.FUR_COAT, [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, [Species.INKAY]: Abilities.UNNERVE, [Species.BINACLE]: Abilities.SAP_SIPPER, @@ -3670,17 +3670,17 @@ export const starterPassiveAbilities = { [Species.CARBINK]: Abilities.SOLID_ROCK, [Species.GOOMY]: Abilities.REGENERATOR, [Species.KLEFKI]: Abilities.LEVITATE, - [Species.PHANTUMP]: Abilities.RIPEN, + [Species.PHANTUMP]: Abilities.SHADOW_TAG, [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, [Species.BERGMITE]: Abilities.ICE_SCALES, [Species.NOIBAT]: Abilities.PUNK_ROCK, - [Species.XERNEAS]: Abilities.MISTY_SURGE, + [Species.XERNEAS]: Abilities.HARVEST, [Species.YVELTAL]: Abilities.SOUL_HEART, [Species.ZYGARDE]: Abilities.HUGE_POWER, [Species.DIANCIE]: Abilities.LEVITATE, [Species.HOOPA]: Abilities.OPPORTUNIST, [Species.VOLCANION]: Abilities.FILTER, - [Species.ROWLET]: Abilities.UNBURDEN, + [Species.ROWLET]: Abilities.SNIPER, [Species.LITTEN]: Abilities.FUR_COAT, [Species.POPPLIO]: Abilities.PUNK_ROCK, [Species.PIKIPEK]: Abilities.TECHNICIAN, @@ -3714,7 +3714,7 @@ export const starterPassiveAbilities = { [Species.BRUXISH]: Abilities.MULTISCALE, [Species.DRAMPA]: Abilities.THICK_FAT, [Species.DHELMISE]: Abilities.WATER_BUBBLE, - [Species.JANGMO_O]: Abilities.PUNK_ROCK, + [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, [Species.TAPU_KOKO]: Abilities.TRANSISTOR, [Species.TAPU_LELE]: Abilities.SHEER_FORCE, [Species.TAPU_BULU]: Abilities.TRIAGE, @@ -3726,7 +3726,7 @@ export const starterPassiveAbilities = { [Species.XURKITREE]: Abilities.TRANSISTOR, [Species.CELESTEELA]: Abilities.HEATPROOF, [Species.KARTANA]: Abilities.SHARPNESS, - [Species.GUZZLORD]: Abilities.INNARDS_OUT, + [Species.GUZZLORD]: Abilities.POISON_HEAL, [Species.NECROZMA]: Abilities.BEAST_BOOST, [Species.MAGEARNA]: Abilities.STEELY_SPIRIT, [Species.MARSHADOW]: Abilities.IRON_FIST, @@ -3738,13 +3738,13 @@ export const starterPassiveAbilities = { [Species.GROOKEY]: Abilities.GRASS_PELT, [Species.SCORBUNNY]: Abilities.NO_GUARD, [Species.SOBBLE]: Abilities.SUPER_LUCK, - [Species.SKWOVET]: Abilities.RIPEN, + [Species.SKWOVET]: Abilities.HARVEST, [Species.ROOKIDEE]: Abilities.IRON_BARBS, [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, [Species.NICKIT]: Abilities.MAGICIAN, [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, [Species.WOOLOO]: Abilities.SIMPLE, - [Species.CHEWTLE]: Abilities.ROCK_HEAD, + [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, [Species.YAMPER]: Abilities.SHEER_FORCE, [Species.ROLYCOLY]: Abilities.SOLID_ROCK, [Species.APPLIN]: Abilities.DRAGONS_MAW, @@ -3757,7 +3757,7 @@ export const starterPassiveAbilities = { [Species.SINISTEA]: Abilities.SHADOW_SHIELD, [Species.HATENNA]: Abilities.FAIRY_AURA, [Species.IMPIDIMP]: Abilities.FUR_COAT, - [Species.MILCERY]: Abilities.MISTY_SURGE, + [Species.MILCERY]: Abilities.REGENERATOR, [Species.FALINKS]: Abilities.PARENTAL_BOND, [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, [Species.SNOM]: Abilities.SNOW_WARNING, @@ -3776,7 +3776,7 @@ export const starterPassiveAbilities = { [Species.ZAMAZENTA]: Abilities.STAMINA, [Species.ETERNATUS]: Abilities.SUPREME_OVERLORD, [Species.KUBFU]: Abilities.IRON_FIST, - [Species.ZARUDE]: Abilities.GRASSY_SURGE, + [Species.ZARUDE]: Abilities.TOUGH_CLAWS, [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE, [Species.REGIDRAGO]: Abilities.MULTISCALE, [Species.GLASTRIER]: Abilities.FILTER, @@ -3785,7 +3785,7 @@ export const starterPassiveAbilities = { [Species.ENAMORUS]: Abilities.FAIRY_AURA, [Species.SPRIGATITO]: Abilities.MAGICIAN, [Species.FUECOCO]: Abilities.PUNK_ROCK, - [Species.QUAXLY]: Abilities.DEFIANT, + [Species.QUAXLY]: Abilities.OPPORTUNIST, [Species.LECHONK]: Abilities.SIMPLE, [Species.TAROUNTULA]: Abilities.HONEY_GATHER, [Species.NYMBLE]: Abilities.GUTS, @@ -3833,7 +3833,7 @@ export const starterPassiveAbilities = { [Species.IRON_MOTH]: Abilities.LEVITATE, [Species.IRON_THORNS]: Abilities.SAND_STREAM, [Species.FRIGIBAX]: Abilities.SNOW_WARNING, - [Species.GIMMIGHOUL]: Abilities.CONTRARY, + [Species.GIMMIGHOUL]: Abilities.HONEY_GATHER, [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, [Species.CHIEN_PAO]: Abilities.INTREPID_SWORD, [Species.TING_LU]: Abilities.STAMINA, @@ -3864,7 +3864,7 @@ export const starterPassiveAbilities = { [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, - [Species.GALAR_PONYTA]: Abilities.PIXILATE, + [Species.GALAR_PONYTA]: Abilities.MOXIE, [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, @@ -3876,7 +3876,7 @@ export const starterPassiveAbilities = { [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, - [Species.HISUI_VOLTORB]: Abilities.ELECTRIC_SURGE, + [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, [Species.HISUI_QWILFISH]: Abilities.MERCILESS, [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, From 877d0c6db8ec8ee30caf4f16761b3b493bad6200 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 6 Aug 2024 07:06:25 -0700 Subject: [PATCH 175/321] [Test] Stylistic consistency pass on tests (#3378) * Modify tests to use overrides helper functions * Apply stylistic consistency to overrides in tests Also remove some non-test-related expects() --- src/test/abilities/ability_timing.test.ts | 4 +- src/test/abilities/aura_break.test.ts | 6 +- src/test/abilities/battery.test.ts | 6 +- src/test/abilities/costar.test.ts | 10 +- src/test/abilities/dry_skin.test.ts | 7 +- src/test/abilities/hustle.test.ts | 6 +- src/test/abilities/ice_face.test.ts | 11 +- src/test/abilities/intimidate.test.ts | 13 +-- src/test/abilities/intrepid_sword.test.ts | 6 +- src/test/abilities/libero.test.ts | 6 +- src/test/abilities/magic_guard.test.ts | 110 ++++++------------ src/test/abilities/moxie.test.ts | 10 +- src/test/abilities/parental_bond.test.ts | 6 +- src/test/abilities/pastel_veil.test.ts | 20 ++-- src/test/abilities/power_spot.test.ts | 6 +- src/test/abilities/protean.test.ts | 6 +- src/test/abilities/quick_draw.test.ts | 4 +- src/test/abilities/sand_spit.test.ts | 4 +- src/test/abilities/sand_veil.test.ts | 8 +- src/test/abilities/sap_sipper.test.ts | 8 +- src/test/abilities/screen_cleaner.test.ts | 4 +- src/test/abilities/serene_grace.test.ts | 9 +- src/test/abilities/sheer_force.test.ts | 9 +- src/test/abilities/shield_dust.test.ts | 9 +- src/test/abilities/steely_spirit.test.ts | 6 +- src/test/abilities/sturdy.test.ts | 9 +- src/test/abilities/sweet_veil.test.ts | 35 +++--- src/test/abilities/unseen_fist.test.ts | 4 +- src/test/abilities/volt_absorb.test.ts | 8 +- src/test/abilities/wind_power.test.ts | 10 +- src/test/abilities/wind_rider.test.ts | 10 +- src/test/abilities/wonder_skin.test.ts | 6 +- src/test/abilities/zen_mode.test.ts | 17 +-- src/test/achievements/achievement.test.ts | 2 +- src/test/arena/arena_gravity.test.ts | 9 +- src/test/arena/weather_fog.test.ts | 8 +- src/test/arena/weather_strong_winds.test.ts | 8 +- src/test/battle-stat.spec.ts | 6 +- src/test/battle/battle-order.test.ts | 9 +- src/test/battle/battle.test.ts | 17 +-- src/test/battle/double_battle.test.ts | 13 +-- src/test/battle/error-handling.test.ts | 2 +- src/test/battle/special_battle.test.ts | 6 +- src/test/eggs/egg.test.ts | 4 +- src/test/evolution.test.ts | 2 +- src/test/evolutions/evolutions.test.ts | 2 +- src/test/game-mode.test.ts | 10 +- src/test/imports.test.ts | 4 +- src/test/inputs/inputs.test.ts | 6 +- src/test/internals.test.ts | 2 +- src/test/items/eviolite.test.ts | 2 +- src/test/items/exp_booster.test.ts | 2 +- src/test/items/grip_claw.test.ts | 8 +- src/test/items/leek.test.ts | 2 +- src/test/items/leftovers.test.ts | 8 +- src/test/items/light_ball.test.ts | 2 +- src/test/items/metal_powder.test.ts | 2 +- src/test/items/quick_powder.test.ts | 2 +- src/test/items/scope_lens.test.ts | 2 +- src/test/items/thick_club.test.ts | 2 +- src/test/items/toxic_orb.test.ts | 11 +- src/test/localization/battle-stat.test.ts | 47 ++++---- src/test/localization/french.test.ts | 8 +- src/test/localization/status-effect.test.ts | 11 +- src/test/localization/terrain.test.ts | 4 +- src/test/moves/astonish.test.ts | 6 +- src/test/moves/aurora_veil.test.ts | 8 +- src/test/moves/beat_up.test.ts | 23 ++-- src/test/moves/belly_drum.test.ts | 23 ++-- src/test/moves/ceaseless_edge.test.ts | 23 +--- src/test/moves/clangorous_soul.test.ts | 30 ++--- src/test/moves/double_team.test.ts | 8 +- src/test/moves/dragon_rage.test.ts | 6 +- src/test/moves/dynamax_cannon.test.ts | 4 +- src/test/moves/fillet_away.test.ts | 30 ++--- src/test/moves/fissure.test.ts | 6 +- src/test/moves/flame_burst.test.ts | 28 ++--- src/test/moves/flower_shield.test.ts | 10 +- src/test/moves/follow_me.test.ts | 10 +- src/test/moves/fusion_bolt.test.ts | 23 ++-- src/test/moves/fusion_flare.test.ts | 21 ++-- src/test/moves/fusion_flare_bolt.test.ts | 25 ++-- src/test/moves/gastro_acid.test.ts | 10 +- src/test/moves/glaive_rush.test.ts | 4 +- src/test/moves/growth.test.ts | 10 +- src/test/moves/hard_press.test.ts | 10 +- src/test/moves/hyper_beam.test.ts | 4 +- src/test/moves/light_screen.test.ts | 8 +- src/test/moves/magnet_rise.test.ts | 2 +- src/test/moves/make_it_rain.test.ts | 12 +- src/test/moves/multi_target.test.ts | 7 +- src/test/moves/octolock.test.ts | 6 +- src/test/moves/purify.test.ts | 8 +- src/test/moves/rage_powder.test.ts | 10 +- src/test/moves/reflect.test.ts | 8 +- src/test/moves/rollout.test.ts | 6 +- src/test/moves/roost.test.ts | 8 +- src/test/moves/spikes.test.ts | 6 +- src/test/moves/spit_up.test.ts | 4 +- src/test/moves/spotlight.test.ts | 10 +- src/test/moves/stockpile.test.ts | 6 +- src/test/moves/swallow.test.ts | 4 +- src/test/moves/tackle.test.ts | 9 +- src/test/moves/tail_whip.test.ts | 10 +- src/test/moves/tailwind.test.ts | 10 +- src/test/moves/thousand_arrows.test.ts | 9 +- src/test/moves/tidy_up.test.ts | 6 +- src/test/phases/phases.test.ts | 4 +- src/test/settingMenu/helpers/inGameManip.ts | 9 +- src/test/settingMenu/helpers/menuManip.ts | 14 +-- .../settingMenu/rebinding_setting.test.ts | 17 ++- src/test/sprites/pokemonSprite.test.ts | 10 +- src/test/ui/starter-select.test.ts | 22 ++-- src/test/ui/transfer-item.test.ts | 9 +- src/test/utils/gameManager.ts | 14 +-- src/test/utils/gameWrapper.ts | 30 ++--- src/test/utils/inputsHandler.ts | 4 +- src/test/utils/misc.test.ts | 10 +- src/test/utils/mocks/mockTextureManager.ts | 14 +-- .../mocks/mocksContainer/mockContainer.ts | 2 +- .../utils/mocks/mocksContainer/mockImage.ts | 2 +- .../mocks/mocksContainer/mockNineslice.ts | 2 +- .../utils/mocks/mocksContainer/mockPolygon.ts | 2 +- src/test/utils/overridesHelper.ts | 11 ++ src/test/utils/phaseInterceptor.ts | 6 +- src/test/vitest.setup.ts | 2 +- 126 files changed, 500 insertions(+), 771 deletions(-) diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts index 0004479ed8c..bb025d7fc53 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/src/test/abilities/ability_timing.test.ts @@ -1,13 +1,13 @@ import { CommandPhase, MessagePhase, TurnInitPhase } from "#app/phases"; import i18next, { initI18n } from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Ability Timing", () => { diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 918905fc00a..a34475cb1ad 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -1,13 +1,13 @@ import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 9c3248f39c0..2345e63d987 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -1,13 +1,13 @@ import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Battery", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 1d58d899565..ef3fb3a2ab0 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -5,9 +5,9 @@ import { Species } from "#app/enums/species.js"; import { CommandPhase, MessagePhase } from "#app/phases.js"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -42,8 +42,6 @@ describe("Abilities - COSTAR", () => { await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon).toBeDefined(); - expect(rightPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.NASTY_PLOT)); await game.phaseInterceptor.to(CommandPhase); @@ -73,8 +71,6 @@ describe("Abilities - COSTAR", () => { await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - expect(leftPokemon).toBeDefined(); - expect(rightPokemon).toBeDefined(); expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index 5434974c583..6da5ad08571 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,12 +1,12 @@ import { Species } from "#app/enums/species.js"; import { TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Dry Skin", () => { let phaserGame: Phaser.Game; @@ -83,7 +83,6 @@ describe("Abilities - Dry Skin", () => { await game.startBattle(); const enemy = game.scene.getEnemyPokemon(); - expect(enemy).toBeDefined(); const initialHP = 1000; enemy.hp = initialHP; diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index 6d78846071d..63e54dfb157 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -2,13 +2,13 @@ import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { Stat } from "#app/enums/stat.js"; import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Hustle", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index ed04aa8bac2..a08a6a01b60 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -1,12 +1,7 @@ import { QuietFormChangePhase } from "#app/form-change-phase"; -import { - MoveEffectPhase, - MoveEndPhase, - TurnEndPhase, - TurnInitPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase, MoveEndPhase, TurnEndPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 959f53b2022..2c2b68bc5df 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -1,10 +1,9 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Mode } from "#app/ui/ui"; import { BattleStat } from "#app/data/battle-stat"; -import { generateStarter, getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { generateStarter, getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Status, StatusEffect } from "#app/data/status-effect"; import { GameModes, getGameMode } from "#app/game-mode"; @@ -12,6 +11,7 @@ import { CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, SelectSta import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -35,7 +35,7 @@ describe("Abilities - Intimidate", () => { game.override.enemyPassiveAbility(Abilities.HYDRATION); game.override.ability(Abilities.INTIMIDATE); game.override.startingWave(3); - game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); it("single - wild with switch", async () => { @@ -294,7 +294,7 @@ describe("Abilities - Intimidate", () => { it("single - trainer should only trigger once whatever turn we are", async () => { game.override.moveset([Moves.SPLASH]); - game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); game.override.startingWave(5); await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; @@ -334,7 +334,6 @@ describe("Abilities - Intimidate", () => { it("double - wild vs only 1 on player side", async () => { game.override.battleType("double"); game.override.startingWave(3); - vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); await game.runToSummon([Species.MIGHTYENA]); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index 5292bcd7c82..bc83c9bb44b 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -1,8 +1,6 @@ import { BattleStat } from "#app/data/battle-stat"; -import { - CommandPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import { CommandPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 58e67a6ebe6..c38ec082169 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -10,9 +10,9 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts index 60a3cda3b08..18e28284f72 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/src/test/abilities/magic_guard.test.ts @@ -1,17 +1,17 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase, MoveEffectPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { WeatherType } from "#app/data/weather.js"; import { StatusEffect, getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; import { BattlerTagType } from "#enums/battler-tag-type"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; // 20 sec timeout @@ -33,16 +33,15 @@ describe("Abilities - Magic Guard", () => { game = new GameManager(phaserGame); /** Player Pokemon overrides */ - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); - vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.ability(Abilities.MAGIC_GUARD); + game.override.moveset([Moves.SPLASH]); + game.override.startingLevel(100); /** Enemy Pokemon overrides */ - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyLevel(100); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) @@ -50,15 +49,13 @@ describe("Abilities - Magic Guard", () => { it( "ability should prevent damage caused by weather", async () => { - vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SANDSTORM); + game.override.weather(WeatherType.SANDSTORM); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -78,15 +75,11 @@ describe("Abilities - Magic Guard", () => { "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 - vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + game.override.statusEffect(StatusEffect.POISON); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -105,16 +98,12 @@ describe("Abilities - Magic Guard", () => { it( "ability effect should not persist when the ability is replaced", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED,Moves.WORRY_SEED]); - vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.POISON); + 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]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -131,18 +120,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", async () => { - vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.BURN); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + game.override.enemyStatusEffect(StatusEffect.BURN); + game.override.enemyAbility(Abilities.MAGIC_GUARD); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect (leadPokemon).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); await game.phaseInterceptor.to(TurnEndPhase); @@ -159,18 +144,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", async () => { - vi.spyOn(overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.TOXIC); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + game.override.enemyStatusEffect(StatusEffect.TOXIC); + game.override.enemyAbility(Abilities.MAGIC_GUARD); await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect (leadPokemon).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); const toxicStartCounter = enemyPokemon.status.turnCount; //should be 0 @@ -197,12 +178,10 @@ describe("Abilities - Magic Guard", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); await game.phaseInterceptor.to(TurnEndPhase); @@ -225,12 +204,10 @@ describe("Abilities - Magic Guard", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); await game.phaseInterceptor.to(TurnEndPhase); @@ -250,16 +227,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents against damage from volatile status effects", async () => { await game.startBattle([Species.DUSKULL]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CURSE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MAGIC_GUARD); + game.override.moveset([Moves.CURSE]); + game.override.enemyAbility(Abilities.MAGIC_GUARD); const leadPokemon = game.scene.getPlayerPokemon(); - expect (leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.CURSE)); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); await game.phaseInterceptor.to(TurnEndPhase); @@ -276,11 +251,10 @@ describe("Abilities - Magic Guard", () => { ); it("Magic Guard prevents crash damage", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HIGH_JUMP_KICK]); + game.override.moveset([Moves.HIGH_JUMP_KICK]); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.HIGH_JUMP_KICK)); await game.phaseInterceptor.to(MoveEffectPhase, false); @@ -297,11 +271,10 @@ describe("Abilities - Magic Guard", () => { ); it("Magic Guard prevents damage from recoil", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAKE_DOWN]); + game.override.moveset([Moves.TAKE_DOWN]); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.TAKE_DOWN)); @@ -316,11 +289,10 @@ describe("Abilities - Magic Guard", () => { ); it("Magic Guard does not prevent damage from Struggle's recoil", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STRUGGLE]); + game.override.moveset([Moves.STRUGGLE]); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.STRUGGLE)); @@ -336,11 +308,10 @@ describe("Abilities - Magic Guard", () => { //This tests different move attributes than the recoil tests above it("Magic Guard prevents self-damage from attacking moves", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEEL_BEAM]); + game.override.moveset([Moves.STEEL_BEAM]); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.STEEL_BEAM)); @@ -365,11 +336,10 @@ describe("Abilities - Magic Guard", () => { */ it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BELLY_DRUM]); + game.override.moveset([Moves.BELLY_DRUM]); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); @@ -385,15 +355,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async() => { //Tests the ability Bad Dreams - vi.spyOn(overrides, "STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + game.override.statusEffect(StatusEffect.SLEEP); //enemy pokemon is given Spore just in case player pokemon somehow awakens during test - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BAD_DREAMS); + game.override.enemyMoveset([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); + game.override.enemyAbility(Abilities.BAD_DREAMS); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -411,16 +380,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async() => { //Tests the abilities Innards Out/Aftermath - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AFTERMATH); + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.AFTERMATH); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); enemyPokemon.hp = 1; game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); @@ -438,16 +405,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async() => { //Tests the abilities Iron Barbs/Rough Skin - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.IRON_BARBS); + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.IRON_BARBS); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); await game.phaseInterceptor.to(TurnEndPhase); @@ -464,16 +429,14 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async() => { //Tests the ability Liquid Ooze - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIQUID_OOZE); + game.override.moveset([Moves.ABSORB]); + game.override.enemyAbility(Abilities.LIQUID_OOZE); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.ABSORB)); await game.phaseInterceptor.to(TurnEndPhase); @@ -490,12 +453,11 @@ describe("Abilities - Magic Guard", () => { it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async() => { //Tests the abilities Solar Power/Dry Skin - vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SOLAR_POWER); - vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.SUNNY); + game.override.passiveAbility(Abilities.SOLAR_POWER); + game.override.weather(WeatherType.SUNNY); await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index 469a4e2947f..f99068dea41 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -1,12 +1,8 @@ import { BattleStat } from "#app/data/battle-stat"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - EnemyCommandPhase, - VictoryPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EnemyCommandPhase, VictoryPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index bc7be2fae96..45d65fca083 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -8,9 +8,9 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts index f19b395677f..8035d54a7e5 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/src/test/abilities/pastel_veil.test.ts @@ -1,14 +1,10 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#enums/species"; -import { - CommandPhase, - TurnEndPhase, -} from "#app/phases"; +import { CommandPhase, TurnEndPhase } from "#app/phases"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { StatusEffect } from "#app/data/status-effect.js"; import { allAbilities } from "#app/data/ability.js"; import { Abilities } from "#app/enums/abilities.js"; @@ -30,11 +26,11 @@ describe("Abilities - Pastel Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD]); + game.override.battleType("double"); + game.override.moveset([Moves.SPLASH]); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyMoveset([Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD, Moves.TOXIC_THREAD]); }); it("prevents the user and its allies from being afflicted by poison", async () => { diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 441b405fd06..368f8a48110 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -1,13 +1,13 @@ import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Power Spot", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index d02c87662cf..7c6cca2eccd 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -10,9 +10,9 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index e6177639bac..56f21cab838 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,7 +1,7 @@ import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; import { FaintPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts index de75ba833dd..dacfe7ad27e 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/src/test/abilities/sand_spit.test.ts @@ -1,10 +1,10 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { WeatherType } from "#app/enums/weather-type.js"; diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 4394df3ce97..6aab362634a 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -7,8 +7,8 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; @@ -45,10 +45,6 @@ describe("Abilities - Sand Veil", () => { await game.startBattle([Species.SNORLAX, Species.BLISSEY]); const leadPokemon = game.scene.getPlayerField(); - leadPokemon.forEach(p => expect(p).toBeDefined()); - - const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 2ed1df05652..20a677a3244 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -1,10 +1,8 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { TerrainType } from "#app/data/terrain.js"; -import { - MoveEndPhase, TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index 2d2dc70b907..a73f56dd3eb 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -1,7 +1,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 13da444454e..25ffc2ed2c6 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,11 +1,8 @@ import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 1e7657611a1..8d315e3caad 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,11 +1,8 @@ import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 35e4015e8bc..6050e6d4c9a 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -1,11 +1,8 @@ import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - MoveEffectPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index 7ac78eb11fa..e21067539df 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -2,13 +2,13 @@ import { allAbilities } from "#app/data/ability.js"; import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { MoveEffectPhase, SelectTargetPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Steely Spirit", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 9bfb3bd0085..4caa7b0bd14 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,10 +1,7 @@ import { EnemyPokemon } from "#app/field/pokemon.js"; -import { - DamagePhase, - MoveEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { DamagePhase, MoveEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts index 5a8022958ad..19c1210b443 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/src/test/abilities/sweet_veil.test.ts @@ -1,19 +1,14 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#enums/species"; -import { - CommandPhase, - MoveEffectPhase, - MovePhase, - TurnEndPhase, -} from "#app/phases"; +import { CommandPhase, MoveEffectPhase, MovePhase, TurnEndPhase } from "#app/phases"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { Abilities } from "#app/enums/abilities.js"; import { BattlerIndex } from "#app/battle.js"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Sweet Veil", () => { let phaserGame: Phaser.Game; @@ -31,11 +26,11 @@ describe("Abilities - Sweet Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.REST]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER]); + game.override.battleType("double"); + game.override.moveset([Moves.SPLASH, Moves.REST]); + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset([Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER]); }); it("prevents the user and its allies from falling asleep", async () => { @@ -50,7 +45,7 @@ describe("Abilities - Sweet Veil", () => { }); it("causes Rest to fail when used by the user or its allies", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -62,7 +57,7 @@ describe("Abilities - Sweet Veil", () => { }); it("causes Yawn to fail if used on the user or its allies", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + game.override.enemyMoveset([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); @@ -74,10 +69,10 @@ describe("Abilities - Sweet Veil", () => { }); it("prevents the user and its allies already drowsy due to Yawn from falling asleep.", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIKACHU); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + game.override.enemySpecies(Species.PIKACHU); + game.override.enemyLevel(5); + game.override.startingLevel(5); + game.override.enemyMoveset([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index 2156c5eb588..0ee4dbef513 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -4,8 +4,8 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 419c3a612d5..985459e133b 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -1,9 +1,7 @@ import { BattleStat } from "#app/data/battle-stat.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index cfdb2e745fe..8a4c2969cc4 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -1,15 +1,13 @@ import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Wind Power", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 88da929fbf1..855def63b6f 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -1,15 +1,13 @@ import { BattleStat } from "#app/data/battle-stat.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index bc964134e45..a2815152df6 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -1,14 +1,14 @@ import { allAbilities } from "#app/data/ability.js"; import { allMoves } from "#app/data/move.js"; import { MoveEffectPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Wonder Skin", () => { let phaserGame: Phaser.Game; diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 8f4c8b42af5..f11694b061c 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -1,20 +1,9 @@ import { Stat } from "#app/data/pokemon-stat"; import { Status, StatusEffect } from "#app/data/status-effect.js"; import { QuietFormChangePhase } from "#app/form-change-phase"; -import { - CommandPhase, - DamagePhase, - EnemyCommandPhase, - MessagePhase, - PostSummonPhase, - SwitchPhase, - SwitchSummonPhase, - TurnEndPhase, - TurnInitPhase, - TurnStartPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, DamagePhase, EnemyCommandPhase, MessagePhase, PostSummonPhase, SwitchPhase, SwitchSummonPhase, TurnEndPhase, TurnInitPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index 83d24d1f0ee..14466a71086 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.js"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { IntegerHolder, NumberHolder } from "#app/utils.js"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index f89846dd999..66d6994fb80 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -1,12 +1,9 @@ import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { - MoveEffectPhase, - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index 9b0630f5c2b..e5718b73a3c 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -1,11 +1,9 @@ import { allMoves } from "#app/data/move.js"; import { WeatherType } from "#app/data/weather.js"; import { Abilities } from "#app/enums/abilities.js"; -import { - MoveEffectPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index 6c977401f20..0fd45173033 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -1,9 +1,7 @@ import { allMoves } from "#app/data/move.js"; -import { - TurnStartPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnStartPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/battle-stat.spec.ts b/src/test/battle-stat.spec.ts index 46f25f66bcd..775dd40ff34 100644 --- a/src/test/battle-stat.spec.ts +++ b/src/test/battle-stat.spec.ts @@ -1,8 +1,4 @@ -import { - BattleStat, - getBattleStatLevelChangeDescription, - getBattleStatName, -} from "#app/data/battle-stat.js"; +import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "#app/data/battle-stat.js"; import { describe, expect, it } from "vitest"; import { arrayOfRange, mockI18next } from "./utils/testUtils"; diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 14ff1bcec0d..6aa919186b4 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -1,10 +1,7 @@ import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, EnemyCommandPhase, SelectTargetPhase, - TurnStartPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EnemyCommandPhase, SelectTargetPhase, TurnStartPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; import { Mode } from "#app/ui/ui"; diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index a91cd1e8352..35eae9b96d2 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -1,20 +1,9 @@ import { allSpecies } from "#app/data/pokemon-species"; import { GameModes } from "#app/game-mode"; import { getGameMode } from "#app/game-mode.js"; -import { - CommandPhase, DamagePhase, - EncounterPhase, - EnemyCommandPhase, - LoginPhase, - SelectGenderPhase, - SelectModifierPhase, - SelectStarterPhase, - SummonPhase, - TitlePhase, - TurnInitPhase, VictoryPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { generateStarter, getMovePosition, } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, LoginPhase, SelectGenderPhase, SelectModifierPhase, SelectStarterPhase, SummonPhase, TitlePhase, TurnInitPhase, VictoryPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { generateStarter, getMovePosition, } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts index e2d8dee562c..fb73fd70099 100644 --- a/src/test/battle/double_battle.test.ts +++ b/src/test/battle/double_battle.test.ts @@ -1,14 +1,11 @@ -import { - BattleEndPhase, - TurnInitPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition, } from "#app/test/utils/gameManagerUtils"; +import { BattleEndPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition, } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; import { Status, StatusEffect } from "#app/data/status-effect.js"; describe("Test Battle Phase", () => { @@ -43,8 +40,6 @@ describe("Test Battle Phase", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); for (const pokemon of game.scene.getPlayerField()) { - expect(pokemon).toBeDefined(); - pokemon.hp = 0; pokemon.status = new Status(StatusEffect.FAINT); expect(pokemon.isFainted()).toBe(true); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index a823887b4f8..f244b57ce1b 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,4 +1,4 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index e4243ea1418..b8a29e82f69 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -1,7 +1,5 @@ -import { - CommandPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import { CommandPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index 91d1153edfc..0bc2972e2dc 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,4 +1,4 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import BattleScene from "../../battle-scene"; import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; import { Species } from "#enums/species"; @@ -6,7 +6,7 @@ import Phaser from "phaser"; import { EggSourceType } from "#app/enums/egg-source-types.js"; import { EggTier } from "#app/enums/egg-type.js"; import { VariantTier } from "#app/enums/variant-tiers.js"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import EggData from "#app/system/egg-data.js"; import * as Utils from "#app/utils.js"; diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 70682666f32..acb012741ff 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -1,7 +1,7 @@ import { pokemonEvolutions } from "#app/data/pokemon-evolutions.js"; import { Abilities } from "#app/enums/abilities.js"; import { Species } from "#app/enums/species.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/evolutions/evolutions.test.ts b/src/test/evolutions/evolutions.test.ts index 4e38e72bb7c..e6e9e0d56e2 100644 --- a/src/test/evolutions/evolutions.test.ts +++ b/src/test/evolutions/evolutions.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/utils/gameManager"; import { Species } from "#enums/species"; import * as Utils from "#app/utils"; diff --git a/src/test/game-mode.test.ts b/src/test/game-mode.test.ts index 04376c20361..4a1960a05ff 100644 --- a/src/test/game-mode.test.ts +++ b/src/test/game-mode.test.ts @@ -1,13 +1,5 @@ import { GameMode, GameModes, getGameMode } from "#app/game-mode.js"; -import { - afterEach, - beforeAll, - beforeEach, - describe, - expect, - it, - vi, -} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import GameManager from "./utils/gameManager"; import * as Utils from "../utils"; describe("game-mode", () => { diff --git a/src/test/imports.test.ts b/src/test/imports.test.ts index 5c0272e191d..69c145236bc 100644 --- a/src/test/imports.test.ts +++ b/src/test/imports.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, it} from "vitest"; -import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; +import { describe, expect, it } from "vitest"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; async function importModule() { try { diff --git a/src/test/inputs/inputs.test.ts b/src/test/inputs/inputs.test.ts index 5acee145011..7182ac2c02c 100644 --- a/src/test/inputs/inputs.test.ts +++ b/src/test/inputs/inputs.test.ts @@ -1,9 +1,9 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; -import InputsHandler from "#app/test/utils/inputsHandler"; +import InputsHandler from "#test/utils/inputsHandler"; describe("Inputs", () => { diff --git a/src/test/internals.test.ts b/src/test/internals.test.ts index a54b8b01544..2ada42d0c8c 100644 --- a/src/test/internals.test.ts +++ b/src/test/internals.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/utils/gameManager"; import { Species } from "#app/enums/species.js"; import { Abilities } from "#app/enums/abilities.js"; diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 5b18cc3a249..0fe90866de8 100644 --- a/src/test/items/eviolite.test.ts +++ b/src/test/items/eviolite.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/data/pokemon-stat"; import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; import Phase from "phaser"; diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts index e80b12d7fc9..7ea457eda1f 100644 --- a/src/test/items/exp_booster.test.ts +++ b/src/test/items/exp_booster.test.ts @@ -1,6 +1,6 @@ import { Abilities } from "#app/enums/abilities.js"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 495bc5de223..40ef81fed73 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -5,10 +5,10 @@ import { BerryType } from "#app/enums/berry-type.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { CommandPhase, MoveEndPhase, SelectTargetPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; // 20 seconds @@ -54,11 +54,7 @@ describe("Items - Grip Claw", () => { async () => { await game.startBattle([Species.PANSEAR, Species.ROWLET, Species.PANPOUR, Species.PANSAGE, Species.CHARMANDER, Species.SQUIRTLE]); - const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => expect(p).toBeDefined()); - const enemyPokemon = game.scene.getEnemyField(); - enemyPokemon.forEach(p => expect(p).toBeDefined()); const enemyHeldItemCt = enemyPokemon.map(p => p.getHeldItems.length); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts index 73444a54c30..7a2dd369e4e 100644 --- a/src/test/items/leek.test.ts +++ b/src/test/items/leek.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { CritBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index 8c9195b07af..6850528a664 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -1,6 +1,6 @@ import { DamagePhase, TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -41,10 +41,6 @@ describe("Items - Leftovers", () => { expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); // We should have full hp expect(leadPokemon.isFullHp()).toBe(true); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index eb0c6cc044f..fef5793d26c 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; import Phase from "phaser"; diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 937fd8feb62..da5d9109c9a 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; import Phase from "phaser"; diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index e662b398cd4..939d25070bc 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; import Phase from "phaser"; diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index c9fb3ba52d3..59702ee51ac 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { CritBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 13714c441c0..6b56cf98099 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; import Phase from "phaser"; diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 2f2b7e4e16a..b5e9b6c4d65 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -1,13 +1,8 @@ import { StatusEffect } from "#app/data/status-effect"; -import { - CommandPhase, - EnemyCommandPhase, - MessagePhase, - TurnEndPhase, -} from "#app/phases"; +import { CommandPhase, EnemyCommandPhase, MessagePhase, TurnEndPhase } from "#app/phases"; import i18next, { initI18n } from "#app/plugins/i18n"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/localization/battle-stat.test.ts b/src/test/localization/battle-stat.test.ts index ea2714b3852..b99ed2b7064 100644 --- a/src/test/localization/battle-stat.test.ts +++ b/src/test/localization/battle-stat.test.ts @@ -1,27 +1,26 @@ -import {beforeAll, describe, expect, it} from "vitest"; -import {getBattleStatName, getBattleStatLevelChangeDescription} from "#app/data/battle-stat.js"; -import {BattleStat} from "#app/data/battle-stat.js"; -import {pokemonInfo as enPokemonInfo} from "#app/locales/en/pokemon-info.js"; -import {battle as enBattleStat} from "#app/locales/en/battle.js"; -import {pokemonInfo as dePokemonInfo} from "#app/locales/de/pokemon-info.js"; -import {battle as deBattleStat} from "#app/locales/de/battle.js"; -import {pokemonInfo as esPokemonInfo} from "#app/locales/es/pokemon-info.js"; -import {battle as esBattleStat} from "#app/locales/es/battle.js"; -import {pokemonInfo as frPokemonInfo} from "#app/locales/fr/pokemon-info.js"; -import {battle as frBattleStat} from "#app/locales/fr/battle.js"; -import {pokemonInfo as itPokemonInfo} from "#app/locales/it/pokemon-info.js"; -import {battle as itBattleStat} from "#app/locales/it/battle.js"; -import {pokemonInfo as koPokemonInfo} from "#app/locales/ko/pokemon-info.js"; -import {battle as koBattleStat} from "#app/locales/ko/battle.js"; -import {pokemonInfo as ptBrPokemonInfo} from "#app/locales/pt_BR/pokemon-info.js"; -import {battle as ptBrBattleStat} from "#app/locales/pt_BR/battle.js"; -import {pokemonInfo as zhCnPokemonInfo} from "#app/locales/zh_CN/pokemon-info.js"; -import {battle as zhCnBattleStat} from "#app/locales/zh_CN/battle.js"; -import {pokemonInfo as zhTwPokemonInfo} from "#app/locales/zh_TW/pokemon-info.js"; -import {battle as zhTwBattleStat} from "#app/locales/zh_TW/battle.js"; - -import i18next, {initI18n} from "#app/plugins/i18n"; -import {KoreanPostpositionProcessor} from "i18next-korean-postposition-processor"; +import { beforeAll, describe, expect, it } from "vitest"; +import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; +import { BattleStat} from "#app/data/battle-stat.js"; +import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; +import { battle as enBattleStat } from "#app/locales/en/battle.js"; +import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; +import { battle as deBattleStat } from "#app/locales/de/battle.js"; +import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; +import { battle as esBattleStat } from "#app/locales/es/battle.js"; +import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; +import { battle as frBattleStat } from "#app/locales/fr/battle.js"; +import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; +import { battle as itBattleStat } from "#app/locales/it/battle.js"; +import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; +import { battle as koBattleStat } from "#app/locales/ko/battle.js"; +import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; +import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; +import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; +import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; +import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; +import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; +import i18next, { initI18n } from "#app/plugins/i18n"; +import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; interface BattleStatTestUnit { stat: BattleStat, diff --git a/src/test/localization/french.test.ts b/src/test/localization/french.test.ts index 45429b1b157..b03a8ee64e8 100644 --- a/src/test/localization/french.test.ts +++ b/src/test/localization/french.test.ts @@ -1,9 +1,9 @@ -import {afterEach, beforeAll, describe, expect, it} from "vitest"; +import { afterEach, beforeAll, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import {Species} from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { Species } from "#enums/species"; import i18next from "i18next"; -import {initI18n} from "#app/plugins/i18n"; +import { initI18n } from "#app/plugins/i18n"; describe("Lokalization - french", () => { let phaserGame: Phaser.Game; diff --git a/src/test/localization/status-effect.test.ts b/src/test/localization/status-effect.test.ts index ad33a59a675..8a9effe1672 100644 --- a/src/test/localization/status-effect.test.ts +++ b/src/test/localization/status-effect.test.ts @@ -1,14 +1,7 @@ import { beforeAll, describe, afterEach, expect, it, vi } from "vitest"; -import { - StatusEffect, - getStatusEffectActivationText, - getStatusEffectDescriptor, - getStatusEffectHealText, - getStatusEffectObtainText, - getStatusEffectOverlapText, -} from "#app/data/status-effect"; +import { StatusEffect, getStatusEffectActivationText, getStatusEffectDescriptor, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect"; import i18next from "i18next"; -import { mockI18next } from "../utils/testUtils"; +import { mockI18next } from "#test/utils/testUtils"; const pokemonName = "PKM"; const sourceText = "SOURCE"; diff --git a/src/test/localization/terrain.test.ts b/src/test/localization/terrain.test.ts index 6450d8574be..f97b7813948 100644 --- a/src/test/localization/terrain.test.ts +++ b/src/test/localization/terrain.test.ts @@ -1,11 +1,11 @@ import { TerrainType, getTerrainName } from "#app/data/terrain"; import { getTerrainBlockMessage, getTerrainClearMessage, getTerrainStartMessage } from "#app/data/weather"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#enums/species"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { mockI18next } from "../utils/testUtils"; +import { mockI18next } from "#test/utils/testUtils"; describe("terrain", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts index c8c013026b3..c5d59f82102 100644 --- a/src/test/moves/astonish.test.ts +++ b/src/test/moves/astonish.test.ts @@ -6,8 +6,8 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; @@ -44,10 +44,8 @@ describe("Moves - Astonish", () => { await game.startBattle([Species.MEOWSCARADA]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); game.doAttack(getMovePosition(game.scene, 0, Moves.ASTONISH)); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 80da8087576..f98e9e9cc0c 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -4,11 +4,9 @@ import { WeatherType } from "#app/data/weather.js"; import { Abilities } from "#app/enums/abilities.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import Pokemon from "#app/field/pokemon.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts index 751b91fefa3..e720c625956 100644 --- a/src/test/moves/beat_up.test.ts +++ b/src/test/moves/beat_up.test.ts @@ -1,11 +1,10 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#app/enums/species.js"; import { Moves } from "#app/enums/moves.js"; import { Abilities } from "#app/enums/abilities.js"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { MoveEffectPhase } from "#app/phases.js"; import { StatusEffect } from "#app/enums/status-effect.js"; @@ -27,15 +26,15 @@ describe("Moves - Beat Up", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + game.override.battleType("single"); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyLevel(100); + game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyAbility(Abilities.INSOMNIA); - vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BEAT_UP]); + game.override.startingLevel(100); + game.override.moveset([Moves.BEAT_UP]); }); it( @@ -82,7 +81,7 @@ describe("Moves - Beat Up", () => { it( "should hit twice for each player Pokemon if the user has Multi-Lens", async () => { - vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + game.override.startingHeldItems([{name: "MULTI_LENS", count: 1}]); await game.startBattle([Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE]); const playerPokemon = game.scene.getPlayerPokemon(); diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts index 5a9ddd41f0f..5bb27394805 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/src/test/moves/belly_drum.test.ts @@ -1,11 +1,8 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { TurnEndPhase } from "#app/phases"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattleStat } from "#app/data/battle-stat"; @@ -32,10 +29,10 @@ describe("Moves - BELLY DRUM", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); game.override.moveset([Moves.BELLY_DRUM]); game.override.enemyMoveset([Moves.SPLASH]); }); @@ -47,7 +44,6 @@ describe("Moves - BELLY DRUM", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM)); @@ -63,7 +59,6 @@ describe("Moves - BELLY DRUM", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); // Here - BattleStat.ATK -> -3 and BattleStat.SPATK -> 6 @@ -84,7 +79,6 @@ describe("Moves - BELLY DRUM", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; @@ -101,7 +95,6 @@ describe("Moves - BELLY DRUM", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index ab3da3d51b8..288ea6ac277 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -2,12 +2,9 @@ import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -import { - MoveEffectPhase, - TurnEndPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; @@ -48,11 +45,7 @@ describe("Moves - Ceaseless Edge", () => { async () => { await game.startBattle([ Species.ILLUMISE ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); const enemyStartingHp = enemyPokemon.hp; @@ -77,11 +70,7 @@ describe("Moves - Ceaseless Edge", () => { game.override.startingHeldItems([{name: "MULTI_LENS"}]); await game.startBattle([ Species.ILLUMISE ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); const enemyStartingHp = enemyPokemon.hp; @@ -108,12 +97,6 @@ describe("Moves - Ceaseless Edge", () => { await game.startBattle([ Species.ILLUMISE ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - game.doAttack(getMovePosition(game.scene, 0, Moves.CEASELESS_EDGE)); await game.phaseInterceptor.to(MoveEffectPhase, false); // Spikes should not have any layers before move effect is applied diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts index 1b3d16f402f..251225e7068 100644 --- a/src/test/moves/clangorous_soul.test.ts +++ b/src/test/moves/clangorous_soul.test.ts @@ -1,19 +1,17 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { TurnEndPhase } from "#app/phases"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattleStat } from "#app/data/battle-stat"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; -// RATIO : HP Cost of Move +/** HP Cost of Move */ const RATIO = 3; -// PREDAMAGE : Amount of extra HP lost +/** Amount of extra HP lost */ const PREDAMAGE = 15; describe("Moves - CLANGOROUS_SOUL", () => { @@ -32,12 +30,12 @@ describe("Moves - CLANGOROUS_SOUL", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); game.override.moveset([Moves.CLANGOROUS_SOUL]); - game.override.enemyMoveset([Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) @@ -47,7 +45,6 @@ describe("Moves - CLANGOROUS_SOUL", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL)); @@ -67,7 +64,6 @@ describe("Moves - CLANGOROUS_SOUL", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); //Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4 @@ -93,7 +89,6 @@ describe("Moves - CLANGOROUS_SOUL", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; leadPokemon.summonData.battleStats[BattleStat.DEF] = 6; @@ -118,7 +113,6 @@ describe("Moves - CLANGOROUS_SOUL", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts index 55820ee957b..48b322f5f11 100644 --- a/src/test/moves/double_team.test.ts +++ b/src/test/moves/double_team.test.ts @@ -1,10 +1,8 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { Abilities } from "#app/enums/abilities.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index b38a6f16513..2facff3428f 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -4,14 +4,14 @@ import { Species } from "#app/enums/species.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import { TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Dragon Rage", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 4c010484c78..8af6a624797 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -1,8 +1,8 @@ import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; import { DamagePhase, MoveEffectPhase, TurnStartPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts index 161bba2c284..a3922b18468 100644 --- a/src/test/moves/fillet_away.test.ts +++ b/src/test/moves/fillet_away.test.ts @@ -1,19 +1,17 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { - TurnEndPhase, -} from "#app/phases"; -import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { TurnEndPhase } from "#app/phases"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattleStat } from "#app/data/battle-stat"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; -// RATIO : HP Cost of Move +/** HP Cost of Move */ const RATIO = 2; -// PREDAMAGE : Amount of extra HP lost +/** Amount of extra HP lost */ const PREDAMAGE = 15; describe("Moves - FILLET AWAY", () => { @@ -32,12 +30,12 @@ describe("Moves - FILLET AWAY", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + game.override.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); game.override.moveset([Moves.FILLET_AWAY]); - game.override.enemyMoveset([Moves.SPLASH]); + game.override.enemyMoveset(SPLASH_ONLY); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) @@ -47,7 +45,6 @@ describe("Moves - FILLET AWAY", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY)); @@ -65,7 +62,6 @@ describe("Moves - FILLET AWAY", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); //Here - BattleStat.SPD -> 0 and BattleStat.SPATK -> 3 @@ -87,7 +83,6 @@ describe("Moves - FILLET AWAY", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); leadPokemon.summonData.battleStats[BattleStat.ATK] = 6; leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6; @@ -108,7 +103,6 @@ describe("Moves - FILLET AWAY", () => { await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 940c32e975a..f2f58212209 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -2,13 +2,13 @@ import { BattleStat } from "#app/data/battle-stat"; import { Species } from "#app/enums/species.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { DamagePhase, TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Fissure", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/flame_burst.test.ts b/src/test/moves/flame_burst.test.ts index 69d11c79f93..0f9e311ca86 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/src/test/moves/flame_burst.test.ts @@ -1,14 +1,10 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import Overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { Species } from "#enums/species"; -import { - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; +import { SelectTargetPhase, TurnEndPhase } from "#app/phases"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#app/enums/abilities.js"; import { allAbilities } from "#app/data/ability.js"; import Pokemon from "#app/field/pokemon.js"; @@ -40,14 +36,14 @@ describe("Moves - Flame Burst", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLAME_BURST, Moves.SPLASH]); - vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); + game.override.battleType("double"); + 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(new Array(4).fill(Moves.SPLASH)); }); it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => { @@ -65,7 +61,7 @@ describe("Moves - Flame Burst", () => { }); it("does not inflict damage to the target's ally if the target was not affected by Flame Burst", async () => { - vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FLASH_FIRE); + game.override.enemyAbility(Abilities.FLASH_FIRE); await game.startBattle([Species.PIKACHU, Species.PIKACHU]); const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index 82476ab5b90..a00c84f8714 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -2,17 +2,15 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; import { Type } from "#app/data/type.js"; import { Biome } from "#app/enums/biome.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Flower Shield", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index eb41bf55a02..420dd7e0762 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -1,13 +1,9 @@ import { BattlerIndex } from "#app/battle.js"; import { Stat } from "#app/data/pokemon-stat"; import { Abilities } from "#app/enums/abilities.js"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, SelectTargetPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/fusion_bolt.test.ts b/src/test/moves/fusion_bolt.test.ts index 368c75b0f54..3ba4148db9f 100644 --- a/src/test/moves/fusion_bolt.test.ts +++ b/src/test/moves/fusion_bolt.test.ts @@ -1,8 +1,7 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; @@ -25,16 +24,16 @@ describe("Moves - Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionBolt ]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.moveset([ fusionBolt ]); + game.override.startingLevel(1); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ROUGH_SKIN); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemySpecies(Species.RESHIRAM); + game.override.enemyAbility(Abilities.ROUGH_SKIN); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.startingWave(97); + game.override.disableCrits(); }); it("should not make contact", async() => { diff --git a/src/test/moves/fusion_flare.test.ts b/src/test/moves/fusion_flare.test.ts index 5ccbd82d25e..9862995be32 100644 --- a/src/test/moves/fusion_flare.test.ts +++ b/src/test/moves/fusion_flare.test.ts @@ -1,9 +1,8 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { TurnStartPhase } from "#app/phases"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { StatusEffect } from "#app/data/status-effect"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; @@ -26,15 +25,15 @@ describe("Moves - Fusion Flare", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare ]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.moveset([ fusionFlare ]); + game.override.startingLevel(1); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemySpecies(Species.RESHIRAM); + game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("single"); + game.override.startingWave(97); + game.override.disableCrits(); }); it("should thaw freeze status condition", async() => { diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/src/test/moves/fusion_flare_bolt.test.ts index 83c7c0e5993..e04d766f848 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/src/test/moves/fusion_flare_bolt.test.ts @@ -1,9 +1,8 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import overrides from "#app/overrides"; +import GameManager from "#test/utils/gameManager"; import { MoveEffectPhase, MovePhase, MoveEndPhase, TurnStartPhase, DamagePhase } from "#app/phases"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Stat } from "#app/data/pokemon-stat"; import { allMoves } from "#app/data/move"; import { BattlerIndex } from "#app/battle"; @@ -29,15 +28,15 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionBolt.id ]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + game.override.moveset([ fusionFlare.id, fusionBolt.id ]); + game.override.startingLevel(1); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RESHIRAM); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemySpecies(Species.RESHIRAM); + game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); - vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + game.override.battleType("double"); + game.override.startingWave(97); + game.override.disableCrits(); vi.spyOn(fusionFlare, "calculateBattlePower"); vi.spyOn(fusionBolt, "calculateBattlePower"); @@ -133,7 +132,7 @@ 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() => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); await game.startBattle([ Species.ZEKROM, Species.ZEKROM @@ -194,7 +193,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async() => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); + game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); await game.startBattle([ Species.ZEKROM, Species.ZEKROM @@ -258,7 +257,7 @@ 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() => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); + game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); await game.startBattle([ Species.ZEKROM, Species.ZEKROM diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 0ffa8d9180b..cd1f0e4ab12 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -1,15 +1,13 @@ import { BattlerIndex } from "#app/battle.js"; import { Stat } from "#app/data/pokemon-stat.js"; import { Abilities } from "#app/enums/abilities.js"; -import { - Moves -} from "#app/enums/moves.js"; +import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { MoveResult } from "#app/field/pokemon.js"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 9548694183c..fc9f6ee1c7f 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -1,8 +1,8 @@ import { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { DamagePhase, TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 3d4a37fda73..bfa3cc54896 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -1,12 +1,8 @@ import { BattleStat } from "#app/data/battle-stat"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - EnemyCommandPhase, - TurnInitPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EnemyCommandPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; 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/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 89f8e14169f..6a45e49137b 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -1,15 +1,13 @@ import { allMoves } from "#app/data/move.js"; -import { - MoveEffectPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Hard Press", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 623b24dbb3c..e7d3454ba32 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -4,10 +4,10 @@ import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { BerryPhase, TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; // 20 sec timeout for all tests diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 52c1b85fa7a..e47b6fe93ea 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -3,11 +3,9 @@ import Move, { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import Pokemon from "#app/field/pokemon.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index e5dfb94468e..9b3c6c457e2 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -1,5 +1,5 @@ import { CommandPhase, TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index fcfb1daa2cf..850f8f644b8 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,17 +1,13 @@ import { BattleStat } from "#app/data/battle-stat.js"; -import { - MoveEffectPhase, - MoveEndPhase, - StatChangePhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEffectPhase, MoveEndPhase, StatChangePhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index b7c4303afb3..a4ed936c5ee 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -2,12 +2,12 @@ import { getMoveTargets } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { Species } from "#app/enums/species.js"; import { TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Moves } from "#enums/moves"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -73,7 +73,6 @@ async function checkTargetMultiplier(game: GameManager, attackMove: Moves, killA await game.startBattle(); const playerPokemonRepr = game.scene.getPlayerField(); - expect(playerPokemonRepr).not.toBeUndefined(); killAllyAndEnemy(game, killAlly, killSecondEnemy); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index 1e19a3dc1c2..8988109f431 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -1,14 +1,14 @@ import { BattleStat } from "#app/data/battle-stat"; import { TrappedTag } from "#app/data/battler-tags.js"; import { CommandPhase, MoveEndPhase, TurnInitPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Octolock", () => { describe("integration tests", () => { diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index cbc107a3def..4d108c43d4b 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -1,10 +1,8 @@ import { Status, StatusEffect } from "#app/data/status-effect.js"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; -import { - MoveEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { MoveEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index bc533e1313e..92cdcc9b4f7 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -1,11 +1,7 @@ import { BattlerIndex } from "#app/battle.js"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, SelectTargetPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 6fcd2268d12..821d9df437a 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -3,11 +3,9 @@ import Move, { allMoves } from "#app/data/move.js"; import { Abilities } from "#app/enums/abilities.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import Pokemon from "#app/field/pokemon.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { NumberHolder } from "#app/utils.js"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index 73457c9dcce..ad323c447f5 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -1,13 +1,13 @@ import { allMoves } from "#app/data/move.js"; import { CommandPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Rollout", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index fe89a0a0a10..9ebd52e457d 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -3,10 +3,10 @@ import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; const TIMEOUT = 20 * 1000; @@ -40,11 +40,7 @@ describe("Moves - Roost", () => { async () => { await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); const enemyStartingHp = enemyPokemon.hp; diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index a19c28b2c1e..1f5bb757ee4 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -1,7 +1,5 @@ -import { - CommandPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import { CommandPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index 0fc01821838..298c96d6d66 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -4,13 +4,13 @@ import { allMoves } from "#app/data/move.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; import { MovePhase, TurnInitPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Spit Up", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index 8170c42dfec..0893ba975d7 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -1,12 +1,8 @@ import { BattlerIndex } from "#app/battle.js"; import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - SelectTargetPhase, - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, SelectTargetPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index 81bd65ce582..604b08745eb 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -2,14 +2,14 @@ import { BattleStat } from "#app/data/battle-stat"; import { StockpilingTag } from "#app/data/battler-tags.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; import { CommandPhase, TurnInitPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Stockpile", () => { describe("integration tests", () => { diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 7c3d3ae1613..9a0a19dce2b 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -3,13 +3,13 @@ import { StockpilingTag } from "#app/data/battler-tags.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { MoveResult, TurnMove } from "#app/field/pokemon.js"; import { MovePhase, TurnInitPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Swallow", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index 94eee4f20fa..512b23ae363 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -1,10 +1,7 @@ import { Stat } from "#app/data/pokemon-stat"; -import { - CommandPhase, - EnemyCommandPhase, TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EnemyCommandPhase, TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 539829f4003..7630b31f7de 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -1,11 +1,7 @@ import { BattleStat } from "#app/data/battle-stat"; -import { - CommandPhase, - EnemyCommandPhase, - TurnInitPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { CommandPhase, EnemyCommandPhase, TurnInitPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; 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/tailwind.test.ts b/src/test/moves/tailwind.test.ts index d2a90dd2ed5..d88de680d8a 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -1,16 +1,14 @@ import { ArenaTagSide } from "#app/data/arena-tag.js"; import { Stat } from "#app/data/pokemon-stat.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; -import { - TurnEndPhase, -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Wind Rider", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index a7fbee3bebd..3b15610f896 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -1,11 +1,8 @@ import { Abilities } from "#app/enums/abilities.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; -import { - BerryPhase, - MoveEffectPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BerryPhase, MoveEffectPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index b1292de0d27..83e1dda07cb 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -1,14 +1,14 @@ import { BattleStat } from "#app/data/battle-stat.js"; import { ArenaTagType } from "#app/enums/arena-tag-type.js"; import { MoveEndPhase, TurnEndPhase } from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; -import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Moves - Tidy Up", () => { diff --git a/src/test/phases/phases.test.ts b/src/test/phases/phases.test.ts index 3d6da362004..c61eb1d41b8 100644 --- a/src/test/phases/phases.test.ts +++ b/src/test/phases/phases.test.ts @@ -1,9 +1,9 @@ import BattleScene from "#app/battle-scene.js"; import { LoginPhase, TitlePhase, UnavailablePhase } from "#app/phases.js"; import { Mode } from "#app/ui/ui.js"; -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/utils/gameManager"; describe("Phases", () => { let phaserGame: Phaser.Game; diff --git a/src/test/settingMenu/helpers/inGameManip.ts b/src/test/settingMenu/helpers/inGameManip.ts index 1edab75fd27..e18a82ca571 100644 --- a/src/test/settingMenu/helpers/inGameManip.ts +++ b/src/test/settingMenu/helpers/inGameManip.ts @@ -1,9 +1,6 @@ -import { - getIconForLatestInput, - getSettingNameWithKeycode -} from "#app/configs/inputs/configHandler"; -import {expect} from "vitest"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import { getIconForLatestInput, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { expect } from "vitest"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; export class InGameManip { private config; diff --git a/src/test/settingMenu/helpers/menuManip.ts b/src/test/settingMenu/helpers/menuManip.ts index 7b4080c3d75..f33867476cf 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/src/test/settingMenu/helpers/menuManip.ts @@ -1,14 +1,6 @@ -import {expect} from "vitest"; -import { - deleteBind, - getIconWithKeycode, - getIconWithSettingName, - getKeyWithKeycode, - getKeyWithSettingName, - assign, - getSettingNameWithKeycode, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting -} from "#app/configs/inputs/configHandler"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import { expect } from "vitest"; +import { deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, assign, getSettingNameWithKeycode, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting } from "#app/configs/inputs/configHandler"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; export class MenuManip { private config; diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/src/test/settingMenu/rebinding_setting.test.ts index 010ad427d6e..3bc17109c95 100644 --- a/src/test/settingMenu/rebinding_setting.test.ts +++ b/src/test/settingMenu/rebinding_setting.test.ts @@ -1,14 +1,11 @@ -import {beforeEach, describe, expect, it} from "vitest"; -import {deepCopy} from "#app/utils"; -import { - getKeyWithKeycode, - getKeyWithSettingName, -} from "#app/configs/inputs/configHandler"; -import {MenuManip} from "#app/test/settingMenu/helpers/menuManip"; -import {InGameManip} from "#app/test/settingMenu/helpers/inGameManip"; -import {InterfaceConfig} from "#app/inputs-controller"; +import { beforeEach, describe, expect, it } from "vitest"; +import { deepCopy } from "#app/utils"; +import { getKeyWithKeycode, getKeyWithSettingName } from "#app/configs/inputs/configHandler"; +import { MenuManip } from "#test/settingMenu/helpers/menuManip"; +import { InGameManip } from "#test/settingMenu/helpers/inGameManip"; +import { InterfaceConfig } from "#app/inputs-controller"; import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; -import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { Device } from "#enums/devices"; import { Button } from "#enums/buttons"; diff --git a/src/test/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index 0fd725b2f58..ce847751b6b 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/src/test/sprites/pokemonSprite.test.ts @@ -2,7 +2,7 @@ import { beforeAll, describe, expect, it } from "vitest"; import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; import fs from "fs"; import path from "path"; -import { getAppRootDir } from "#app/test/sprites/spritesUtils"; +import { getAppRootDir } from "#test/sprites/spritesUtils"; type PokemonVariantMasterlist = typeof _masterlist; @@ -29,10 +29,10 @@ describe("check if every variant's sprite are correctly set", () => { }); it("data should not be undefined", () => { - expect(masterlist).not.toBeUndefined(); - expect(expVariant).not.toBeUndefined(); - expect(femaleVariant).not.toBeUndefined(); - expect(backVariant).not.toBeUndefined(); + expect(masterlist).toBeDefined(); + expect(expVariant).toBeDefined(); + expect(femaleVariant).toBeDefined(); + expect(backVariant).toBeDefined(); }); function getMissingMasterlist(mlist: any, dirpath: string, excludes: string[] = []): string[] { diff --git a/src/test/ui/starter-select.test.ts b/src/test/ui/starter-select.test.ts index 95a4605fd68..eae5b3fe3a5 100644 --- a/src/test/ui/starter-select.test.ts +++ b/src/test/ui/starter-select.test.ts @@ -1,20 +1,16 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import { - EncounterPhase, - SelectStarterPhase, - TitlePhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {GameModes} from "#app/game-mode"; +import GameManager from "#test/utils/gameManager"; +import { EncounterPhase, SelectStarterPhase, TitlePhase } from "#app/phases"; +import { Mode } from "#app/ui/ui"; +import { GameModes } from "#app/game-mode"; import StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; -import {OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; -import {Gender} from "#app/data/gender"; -import {allSpecies} from "#app/data/pokemon-species"; -import {Nature} from "#app/data/nature"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { Gender } from "#app/data/gender"; +import { allSpecies } from "#app/data/pokemon-species"; +import { Nature} from "#app/data/nature"; import { Button } from "#enums/buttons"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index c00e40b8ebd..bbb9a823ad9 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -2,18 +2,15 @@ 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, - SelectModifierPhase -} from "#app/phases"; -import GameManager from "#app/test/utils/gameManager"; +import { BattleEndPhase, SelectModifierPhase } from "#app/phases"; +import GameManager from "#test/utils/gameManager"; 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 Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { getMovePosition } from "../utils/gameManagerUtils"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; describe("UI - Transfer Items", () => { diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 1bab99db83d..ac7f7aea4d2 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -1,18 +1,18 @@ -import GameWrapper from "#app/test/utils/gameWrapper"; +import GameWrapper from "#test/utils/gameWrapper"; import { Mode } from "#app/ui/ui"; -import { generateStarter, waitUntil } from "#app/test/utils/gameManagerUtils"; +import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; import { CommandPhase, EncounterPhase, FaintPhase, LoginPhase, NewBattlePhase, SelectStarterPhase, SelectTargetPhase, TitlePhase, TurnEndPhase, TurnInitPhase, TurnStartPhase } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; -import PhaseInterceptor from "#app/test/utils/phaseInterceptor"; -import TextInterceptor from "#app/test/utils/TextInterceptor"; +import PhaseInterceptor from "#test/utils/phaseInterceptor"; +import TextInterceptor from "#test/utils/TextInterceptor"; import { GameModes, getGameMode } from "#app/game-mode"; import fs from "fs"; import { AES, enc } from "crypto-js"; import { updateUserInfo } from "#app/account"; -import InputsHandler from "#app/test/utils/inputsHandler"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import InputsHandler from "#test/utils/inputsHandler"; +import ErrorInterceptor from "#test/utils/errorInterceptor"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { MockClock } from "#app/test/utils/mocks/mockClock"; +import { MockClock } from "#test/utils/mocks/mockClock"; import { Command } from "#app/ui/command-ui-handler"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index de32215fabb..7edb69aef8a 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -8,23 +8,23 @@ import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import MockGraphics from "#app/test/utils/mocks/mocksContainer/mockGraphics"; -import MockTextureManager from "#app/test/utils/mocks/mockTextureManager"; +import MockGraphics from "#test/utils/mocks/mocksContainer/mockGraphics"; +import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import Phaser from "phaser"; -import {blobToString} from "#app/test/utils/gameManagerUtils"; -import {vi} from "vitest"; -import mockLocalStorage from "#app/test/utils/mocks/mockLocalStorage"; -import mockConsoleLog from "#app/test/utils/mocks/mockConsoleLog"; -import MockLoader from "#app/test/utils/mocks/mockLoader"; -import {MockFetch} from "#app/test/utils/mocks/mockFetch"; +import { blobToString } from "#test/utils/gameManagerUtils"; +import { vi } from "vitest"; +import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; +import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; +import MockLoader from "#test/utils/mocks/mockLoader"; +import { MockFetch } from "#test/utils/mocks/mockFetch"; import * as Utils from "#app/utils"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; -import {MockClock} from "#app/test/utils/mocks/mockClock"; +import { MockClock } from "#test/utils/mocks/mockClock"; import BattleScene from "#app/battle-scene.js"; -import {MoveAnim} from "#app/data/battle-anims"; +import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as battleScene from "#app/battle-scene"; -import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; +import MockImage from "#test/utils/mocks/mocksContainer/mockImage.js"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; Object.defineProperty(window, "localStorage", { @@ -41,7 +41,7 @@ Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); - }) + }); return null; }; navigator.getGamepads = vi.fn().mockReturnValue([]); @@ -101,7 +101,7 @@ export default class GameWrapper { injectMandatory() { this.game.config = { seed: ["test"], - } + }; this.scene.game = this.game; this.game.renderer = { maxTextures: -1, @@ -139,7 +139,7 @@ export default class GameWrapper { setPostPipeline: () => null, removePostPipeline: () => null, }, - } + }; this.scene.tweens = { add: (data) => { @@ -254,4 +254,4 @@ function createFetchBadResponse(data) { json: () => Promise.resolve(data), text: () => Promise.resolve(JSON.stringify(data)), }; -} \ No newline at end of file +} diff --git a/src/test/utils/inputsHandler.ts b/src/test/utils/inputsHandler.ts index 043dcffbdb9..e41667dc873 100644 --- a/src/test/utils/inputsHandler.ts +++ b/src/test/utils/inputsHandler.ts @@ -1,8 +1,8 @@ import BattleScene from "#app/battle-scene"; import Phaser from "phaser"; -import {InputsController} from "#app/inputs-controller"; +import { InputsController } from "#app/inputs-controller"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import {holdOn} from "#app/test/utils/gameManagerUtils"; +import { holdOn } from "#test/utils/gameManagerUtils"; import TouchControl from "#app/touch-controls"; import { JSDOM } from "jsdom"; import fs from "fs"; diff --git a/src/test/utils/misc.test.ts b/src/test/utils/misc.test.ts index da67fb48192..c1947dbe8a2 100644 --- a/src/test/utils/misc.test.ts +++ b/src/test/utils/misc.test.ts @@ -1,8 +1,8 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import {apiFetch} from "#app/utils"; -import {waitUntil} from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/utils/gameManager"; +import { apiFetch } from "#app/utils"; +import { waitUntil } from "#test/utils/gameManagerUtils"; describe("Test misc", () => { let phaserGame: Phaser.Game; @@ -59,7 +59,7 @@ describe("Test misc", () => { it("test apifetch mock sync", async () => { const data = await game.scene.cachedFetch("./battle-anims/splishy-splash.json"); - expect(data).not.toBeUndefined(); + expect(data).toBeDefined(); }); it("testing wait phase queue", async () => { diff --git a/src/test/utils/mocks/mockTextureManager.ts b/src/test/utils/mocks/mockTextureManager.ts index e207f96b722..36a09efcf5a 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/src/test/utils/mocks/mockTextureManager.ts @@ -1,10 +1,10 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; -import MockSprite from "#app/test/utils/mocks/mocksContainer/mockSprite"; -import MockRectangle from "#app/test/utils/mocks/mocksContainer/mockRectangle"; -import MockNineslice from "#app/test/utils/mocks/mocksContainer/mockNineslice"; -import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage"; -import MockText from "#app/test/utils/mocks/mocksContainer/mockText"; -import MockPolygon from "#app/test/utils/mocks/mocksContainer/mockPolygon"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite"; +import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; +import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; +import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; +import MockText from "#test/utils/mocks/mocksContainer/mockText"; +import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; export default class MockTextureManager { diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 2e2b9567796..b74c46b4e86 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -1,4 +1,4 @@ -import MockTextureManager from "#app/test/utils/mocks/mockTextureManager"; +import MockTextureManager from "#test/utils/mocks/mockTextureManager"; export default class MockContainer { protected x; diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/src/test/utils/mocks/mocksContainer/mockImage.ts index 601dfd22811..be183a0dd89 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/src/test/utils/mocks/mocksContainer/mockImage.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/src/test/utils/mocks/mocksContainer/mockNineslice.ts index 3edbbb18c31..a8e10036a72 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/src/test/utils/mocks/mocksContainer/mockNineslice.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/src/test/utils/mocks/mocksContainer/mockPolygon.ts index cf448883ce0..12b60904a96 100644 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ b/src/test/utils/mocks/mocksContainer/mockPolygon.ts @@ -1,4 +1,4 @@ -import MockContainer from "#app/test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; export default class MockPolygon extends MockContainer { diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 2858076e3b6..e51928cc784 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -124,6 +124,17 @@ export class OverridesHelper { return this; } + /** + * Override the player (pokemon) {@linkcode StatusEffect | status-effect} + * @param statusEffect the {@linkcode StatusEffect | status-effect} to set + * @returns + */ + statusEffect(statusEffect: StatusEffect): this { + vi.spyOn(Overrides, "STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); + this.log(`Player Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); + return this; + } + /** * Override each wave to not have standard trainer battles * @returns this diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index e8cec7c9989..383624bf298 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -34,10 +34,10 @@ import { UnavailablePhase, VictoryPhase } from "#app/phases"; -import UI, {Mode} from "#app/ui/ui"; -import {Phase} from "#app/phase"; +import UI, { Mode } from "#app/ui/ui"; +import { Phase } from "#app/phase"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import {QuietFormChangePhase} from "#app/form-change-phase"; +import { QuietFormChangePhase } from "#app/form-change-phase"; export default class PhaseInterceptor { public scene; diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 7cddf4bf3b7..b2861b7071c 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -1,4 +1,4 @@ -import "#app/test/fontFace.setup"; +import "#test/fontFace.setup"; import "vitest-canvas-mock"; import { initLoggedInUser } from "#app/account"; From ed1605de58729e3b85992c071bc2fd1d4f4c2609 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Tue, 6 Aug 2024 10:15:54 -0400 Subject: [PATCH 176/321] [Sprite] Clean up extra Drifblim-related files (#3371) * Delete public/images/pokemon/variant/back/426_3.png * Delete public/images/pokemon/variant/back/426_3.json --- public/images/pokemon/variant/back/426_3.json | 1532 ----------------- public/images/pokemon/variant/back/426_3.png | Bin 10994 -> 0 bytes 2 files changed, 1532 deletions(-) delete mode 100644 public/images/pokemon/variant/back/426_3.json delete mode 100644 public/images/pokemon/variant/back/426_3.png diff --git a/public/images/pokemon/variant/back/426_3.json b/public/images/pokemon/variant/back/426_3.json deleted file mode 100644 index 72c1bf371ad..00000000000 --- a/public/images/pokemon/variant/back/426_3.json +++ /dev/null @@ -1,1532 +0,0 @@ -{ - "textures": [ - { - "image": "426_3.png", - "format": "RGBA8888", - "size": { - "w": 335, - "h": 335 - }, - "scale": 1, - "frames": [ - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 63, - "h": 58 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 63, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 126, - "y": 0, - "w": 64, - "h": 59 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 67, - "h": 59 - }, - "frame": { - "x": 190, - "y": 0, - "w": 67, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 64, - "h": 60 - }, - "frame": { - "x": 257, - "y": 0, - "w": 64, - "h": 60 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 57, - "w": 63, - "h": 60 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 57, - "w": 63, - "h": 60 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 61 - }, - "frame": { - "x": 63, - "y": 58, - "w": 62, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 62, - "h": 61 - }, - "frame": { - "x": 63, - "y": 58, - "w": 62, - "h": 61 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 67, - "h": 60 - }, - "frame": { - "x": 125, - "y": 59, - "w": 67, - "h": 60 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 8, - "w": 67, - "h": 60 - }, - "frame": { - "x": 125, - "y": 59, - "w": 67, - "h": 60 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 64, - "h": 61 - }, - "frame": { - "x": 192, - "y": 59, - "w": 64, - "h": 61 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 69, - "h": 60 - }, - "frame": { - "x": 256, - "y": 60, - "w": 69, - "h": 60 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 69, - "h": 60 - }, - "frame": { - "x": 256, - "y": 60, - "w": 69, - "h": 60 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 63, - "h": 62 - }, - "frame": { - "x": 0, - "y": 117, - "w": 63, - "h": 62 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 70, - "h": 60 - }, - "frame": { - "x": 63, - "y": 119, - "w": 70, - "h": 60 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 70, - "h": 60 - }, - "frame": { - "x": 63, - "y": 119, - "w": 70, - "h": 60 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 69, - "h": 61 - }, - "frame": { - "x": 133, - "y": 120, - "w": 69, - "h": 61 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 61 - }, - "frame": { - "x": 202, - "y": 120, - "w": 71, - "h": 61 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 62, - "h": 62 - }, - "frame": { - "x": 273, - "y": 120, - "w": 62, - "h": 62 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 179, - "w": 64, - "h": 61 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 179, - "w": 64, - "h": 61 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 11, - "w": 69, - "h": 61 - }, - "frame": { - "x": 64, - "y": 179, - "w": 69, - "h": 61 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 1, - "y": 11, - "w": 69, - "h": 61 - }, - "frame": { - "x": 64, - "y": 179, - "w": 69, - "h": 61 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 11, - "w": 66, - "h": 61 - }, - "frame": { - "x": 133, - "y": 181, - "w": 66, - "h": 61 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 11, - "w": 66, - "h": 61 - }, - "frame": { - "x": 133, - "y": 181, - "w": 66, - "h": 61 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 62 - }, - "frame": { - "x": 199, - "y": 181, - "w": 64, - "h": 62 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 69, - "h": 62 - }, - "frame": { - "x": 263, - "y": 182, - "w": 69, - "h": 62 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 66, - "h": 62 - }, - "frame": { - "x": 0, - "y": 240, - "w": 66, - "h": 62 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 62 - }, - "frame": { - "x": 66, - "y": 240, - "w": 64, - "h": 62 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 62 - }, - "frame": { - "x": 66, - "y": 240, - "w": 64, - "h": 62 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 63, - "h": 63 - }, - "frame": { - "x": 130, - "y": 242, - "w": 63, - "h": 63 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 63, - "h": 63 - }, - "frame": { - "x": 130, - "y": 242, - "w": 63, - "h": 63 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 64, - "h": 63 - }, - "frame": { - "x": 193, - "y": 243, - "w": 64, - "h": 63 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 64, - "h": 63 - }, - "frame": { - "x": 193, - "y": 243, - "w": 64, - "h": 63 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 63 - }, - "frame": { - "x": 257, - "y": 244, - "w": 65, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 72 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 63 - }, - "frame": { - "x": 257, - "y": 244, - "w": 65, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5a260d2a6180d3a382a352c076369741:e26f8902d45a6e7b427d7dd3cc82c868:b81a75872f1ff6f03d9cd643388500e3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/426_3.png b/public/images/pokemon/variant/back/426_3.png deleted file mode 100644 index e994a22f91722787e56030eb4218df543e96a3dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10994 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 luYsegM7AcXcAA Date: Tue, 6 Aug 2024 18:17:34 +0200 Subject: [PATCH 177/321] [Localization] More French adjuestments (#3382) * Update battle.ts * Update starter-select-ui-handler.ts * Update battle.ts --- src/locales/fr/battle.ts | 18 +++++++++--------- src/locales/fr/starter-select-ui-handler.ts | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index 861dc6fd73c..6a209eb9f08 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -61,7 +61,7 @@ export const battle: SimpleTranslationEntries = { "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", "eggHatching": "Hein ?", - "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", + "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?", "wildPokemonWithAffix": "{{pokemonName}} sauvage", "foePokemonWithAffix": "{{pokemonName}} ennemi", "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", @@ -74,21 +74,21 @@ export const battle: SimpleTranslationEntries = { "statsAnd": "et", "stats": "Les stats", "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", - "statRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent !", + "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !", "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", - "statSharplyRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent beaucoup !", + "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !", "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", - "statRoseDrastically_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent énormément !", + "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !", "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", - "statWontGoAnyHigher_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus augmenter !", + "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !", "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", - "statFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent !", + "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !", "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", - "statHarshlyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent beaucoup !", + "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !", "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", - "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent énormément !", + "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !", "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", - "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus baisser !", + "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !", "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", "retryBattle": "Voulez-vous réessayer depuis le début du combat ?", diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index c49c326385f..dbd056cbf2a 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Commencer avec ces Pokémon ?", - "confirmExit": "Do you want to exit?", + "confirmExit": "Êtes-vous sûr·e de vouloir quitter ?", "invalidParty": "Cette équipe de départ est invalide !", "gen1": "1G", "gen2": "2G", From af56eee1cf23383164a2ac390afb94ba01bdde4d Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:20:23 -0400 Subject: [PATCH 178/321] [Bug] Fix Storm moves having accuracy drops in sun/sand (#3381) --- src/data/move.ts | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index a00d81e5980..0ea4e4221c5 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3565,6 +3565,9 @@ export class VariableAccuracyAttr extends MoveAttr { } } +/** + * Attribute used for Thunder and Hurricane that sets accuracy to 50 in sun and never miss in rain + */ export class ThunderAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { @@ -3572,7 +3575,6 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { case WeatherType.SUNNY: - case WeatherType.SANDSTORM: case WeatherType.HARSH_SUN: accuracy.value = 50; return true; @@ -3587,6 +3589,28 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { } } +/** + * Attribute used for Bleakwind Storm, Wildbolt Storm, and Sandsear Storm that sets accuracy to never + * miss in rain + * Springtide Storm does NOT have this property + */ +export class StormAccuracyAttr extends VariableAccuracyAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + const accuracy = args[0] as Utils.NumberHolder; + const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + switch (weatherType) { + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + accuracy.value = -1; + return true; + } + } + + return false; + } +} + /** * Attribute used for moves which never miss * against Pokemon with the {@linkcode BattlerTagType.MINIMIZED} @@ -8396,17 +8420,17 @@ export function initMoves() { .attr(AddArenaTrapTagHitAttr, ArenaTagType.SPIKES) .slicingMove(), new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) - .attr(ThunderAccuracyAttr) + .attr(StormAccuracyAttr) .attr(StatChangeAttr, BattleStat.SPD, -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.WILDBOLT_STORM, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) - .attr(ThunderAccuracyAttr) + .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) - .attr(ThunderAccuracyAttr) + .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), From d66d4d1eeb4f66c85f72f0f3349e24f2bc8a80d5 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Tue, 6 Aug 2024 19:46:11 +0200 Subject: [PATCH 179/321] [Localization] Missing translation placeholders of Fresh Start challenge in some languages (#3383) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update achv.ts * Update challenges.ts * Update achv.ts * Update achv.ts * Update challenges.ts * Update challenges.ts * Update achv.ts * Update challenges.ts * Update achv.ts * Update src/locales/de/achv.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/pt_BR/challenges.ts Co-authored-by: José Ricardo Fleury Oliveira * Update achv.ts * Update challenges.ts * Update achv.ts * Update challenges.ts * Update achv.ts * Update challenges.ts * Update achv.ts * Update challenges.ts --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira --- src/locales/de/achv.ts | 5 +++++ src/locales/en/achv.ts | 2 +- src/locales/en/challenges.ts | 2 +- src/locales/es/achv.ts | 4 ++++ src/locales/es/challenges.ts | 6 ++++++ src/locales/it/achv.ts | 6 +++++- src/locales/it/challenges.ts | 6 ++++++ src/locales/pt_BR/challenges.ts | 6 ++++++ src/locales/zh_TW/achv.ts | 4 ++++ src/locales/zh_TW/challenges.ts | 6 ++++++ 10 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/locales/de/achv.ts b/src/locales/de/achv.ts index 6040c3ea916..6c84988883d 100644 --- a/src/locales/de/achv.ts +++ b/src/locales/de/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Ein ewiges Abenteuer!", }, + "FRESH_START": { + name: "Hussa, noch einmal von vorn!", + description: "Schließe die 'Neuanfang' Herausforderung ab" + } } as const; // Achievement translations for the when the player character is female @@ -373,5 +377,6 @@ export const PGFachv: AchievementTranslationEntries = { "MONO_DRAGON": PGMachv.MONO_DRAGON, "MONO_DARK": PGMachv.MONO_DARK, "MONO_FAIRY": PGMachv.MONO_FAIRY, + "FRESH_START": PGMachv.FRESH_START } as const; diff --git a/src/locales/en/achv.ts b/src/locales/en/achv.ts index 3063488c659..6123b735c4e 100644 --- a/src/locales/en/achv.ts +++ b/src/locales/en/achv.ts @@ -266,7 +266,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "FRESH_START": { name: "First Try!", - description: "Complete the fresh start challenge." + description: "Complete the Fresh Start challenge." } } as const; diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts index a3b45d31792..e3302876201 100644 --- a/src/locales/en/challenges.ts +++ b/src/locales/en/challenges.ts @@ -25,7 +25,7 @@ export const challenges: TranslationEntries = { }, "freshStart": { "name": "Fresh Start", - "desc": "You can only use the original starters, and only as if you had just started pokerogue.", + "desc": "You can only use the original starters, and only as if you had just started PokéRogue.", "value.0": "Off", "value.1": "On", } diff --git a/src/locales/es/achv.ts b/src/locales/es/achv.ts index 47348903b28..ed734f21d0a 100644 --- a/src/locales/es/achv.ts +++ b/src/locales/es/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Mono FAIRY", }, + "FRESH_START": { + name: "First Try!", + description: "Complete the Fresh Start challenge." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/es/challenges.ts b/src/locales/es/challenges.ts index 711be39b116..063933a5e27 100644 --- a/src/locales/es/challenges.ts +++ b/src/locales/es/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "Solo puedes usar Pokémon with the {{type}} type.", "desc_default": "Solo puedes usar Pokémon del tipo elegido.", }, + "freshStart": { + "name": "Fresh Start", + "desc": "You can only use the original starters, and only as if you had just started PokéRogue.", + "value.0": "Off", + "value.1": "On", + } } as const; diff --git a/src/locales/it/achv.ts b/src/locales/it/achv.ts index 50baae41790..e7e35a1a47b 100644 --- a/src/locales/it/achv.ts +++ b/src/locales/it/achv.ts @@ -99,7 +99,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "MEGA_EVOLVE": { name: "Megamorfosi", - description: "Megaevolvi un pokémon", + description: "Megaevolvi un Pokémon", }, "GIGANTAMAX": { name: "Grosso e Cattivo", @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Follettini e follettine", }, + "FRESH_START": { + name: "First Try!", + description: "Complete the Fresh Start challenge." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/it/challenges.ts b/src/locales/it/challenges.ts index 2643b16d0f7..784791f5425 100644 --- a/src/locales/it/challenges.ts +++ b/src/locales/it/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "Puoi usare solo Pokémon di tipo {{type}}.", "desc_default": "Puoi usare solo Pokémon del tipo selezionato." }, + "freshStart": { + "name": "Fresh Start", + "desc": "You can only use the original starters, and only as if you had just started PokéRogue.", + "value.0": "Off", + "value.1": "On", + } } as const; diff --git a/src/locales/pt_BR/challenges.ts b/src/locales/pt_BR/challenges.ts index 7c991189bc8..31f29da48f3 100644 --- a/src/locales/pt_BR/challenges.ts +++ b/src/locales/pt_BR/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "Você só pode user Pokémon do tipo {{type}}.", "desc_default": "Você só pode user Pokémon de um único tipo." }, + "freshStart": { + "name": "Novo Começo", + "desc": "Você só pode usar os iniciais originais, como se tivesse acabado de começar o PokéRogue.", + "value.0": "Desligado", + "value.1": "Ligado", + } } as const; diff --git a/src/locales/zh_TW/achv.ts b/src/locales/zh_TW/achv.ts index 8b85f59447e..7c945e794a2 100644 --- a/src/locales/zh_TW/achv.ts +++ b/src/locales/zh_TW/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "林克,醒醒!", }, + "FRESH_START": { + name: "First Try!", + description: "Complete the Fresh Start challenge." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/zh_TW/challenges.ts b/src/locales/zh_TW/challenges.ts index e702ec4f278..15571e11912 100644 --- a/src/locales/zh_TW/challenges.ts +++ b/src/locales/zh_TW/challenges.ts @@ -22,4 +22,10 @@ export const challenges: TranslationEntries = { "desc": "你只能使用{{type}}\n屬性的寶可夢", "desc_default": "你只能使用所選\n屬性的寶可夢" }, + "freshStart": { + "name": "Fresh Start", + "desc": "You can only use the original starters, and only as if you had just started PokéRogue.", + "value.0": "Off", + "value.1": "On", + } } as const; From c722490f6097372fad4e71ae574cda1299ce938e Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:05:19 -0400 Subject: [PATCH 180/321] [Feature] Allow Phione eggs to have a 1/8 chance to hatch Manaphy (#2787) * Add feature and debug DO NOT MERGE * Remove debug stuff --- src/data/egg.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/egg.ts b/src/data/egg.ts index a7a1b167238..cb889951488 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -205,7 +205,11 @@ export class Egg { this._species = this.rollSpecies(scene); } - const pokemonSpecies = getPokemonSpecies(this._species); + let pokemonSpecies = getPokemonSpecies(this._species); + // Special condition to have Phione eggs also have a chance of generating Manaphy + if (this._species === Species.PHIONE) { + 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 if the same species egg hits the chance From 06ed89ef13560a7a31234ee5bd345fd15b2a1278 Mon Sep 17 00:00:00 2001 From: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:25:20 -0400 Subject: [PATCH 181/321] [Bug] Fix sketch being able to copy some unsketchable moves (#3386) * Cherrypicks due to beta issues * Adds flags to some unsketchable moves, adds typedoc * Cherrypicks due to beta issues #2 --- src/data/move.ts | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 0ea4e4221c5..3d1e7820582 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5419,10 +5419,26 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { } } +/** + * Attribute for {@linkcode Moves.SKETCH} that causes the user to copy the opponent's last used move + * This move copies the last used non-virtual move + * e.g. if Metronome is used, it copies Metronome itself, not the virtual move called by Metronome + * Fails if the opponent has not yet used a move. + * Fails if used on an uncopiable move, listed in unsketchableMoves in getCondition + * Fails if the move is already in the user's moveset + */ export class SketchAttr extends MoveEffectAttr { constructor() { super(true); } + /** + * User copies the opponent's last used move, if possible + * @param {Pokemon} user Pokemon that used the move and will replace Sketch with the copied move + * @param {Pokemon} target Pokemon that the user wants to copy a move from + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds, otherwise false + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { @@ -5453,14 +5469,28 @@ export class SketchAttr extends MoveEffectAttr { return false; } - const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) { + const targetMove = target.getMoveHistory().filter(m => !m.virtual).at(-1); + if (!targetMove) { return false; } - const sketchableMove = targetMoves[0]; + const unsketchableMoves = [ + Moves.CHATTER, + Moves.MIRROR_MOVE, + Moves.SLEEP_TALK, + Moves.STRUGGLE, + Moves.SKETCH, + Moves.REVIVAL_BLESSING, + Moves.TERA_STARSTORM, + Moves.BREAKNECK_BLITZ__PHYSICAL, + Moves.BREAKNECK_BLITZ__SPECIAL + ]; - if (user.getMoveset().find(m => m.moveId === sketchableMove.move)) { + if (unsketchableMoves.includes(targetMove.move)) { + return false; + } + + if (user.getMoveset().find(m => m.moveId === targetMove.move)) { return false; } From 9eadce80c61ba9aed3a31aff757c7d34bb95a1b7 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:34:43 -0700 Subject: [PATCH 182/321] [Bug] Fix tier weights and remove unnecessary `Math.min()` (#3359) --- src/modifier/modifier-type.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 9c7c3f8949a..6123ecd3b80 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1809,7 +1809,7 @@ export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool return pool; } -const tierWeights = [ 769 / 1024, 192 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; +const tierWeights = [ 768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount: integer = 0) { const pool = getModifierPoolForType(poolType); @@ -2023,10 +2023,6 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } while (upgraded); } tier = tierValue > 255 ? ModifierTier.COMMON : tierValue > 60 ? ModifierTier.GREAT : tierValue > 12 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER; - // Does this actually do anything? - if (!upgradeCount) { - upgradeCount = Math.min(upgradeCount, ModifierTier.MASTER - tier); - } tier += upgradeCount; while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) { tier--; From 9875fcc59d5e5e5de9d685523e1ea8f5ba0fa8af Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Wed, 7 Aug 2024 04:18:47 +0800 Subject: [PATCH 183/321] [Ability] Partially implement Gulp Missile (#3327) * implement gulp missile * add tests * change fly to dive * show ability when reverting to normal form * update ai score, tests * update score condition * adjust conditions, damage * add underwater test * update damage in test * partial commit --- src/data/ability.ts | 51 ++++- src/data/battler-tags.ts | 36 ++++ src/data/move.ts | 46 +++- src/data/pokemon-forms.ts | 6 + src/enums/battler-tag-type.ts | 4 +- src/test/abilities/gulp_missile.test.ts | 266 ++++++++++++++++++++++++ 6 files changed, 404 insertions(+), 5 deletions(-) create mode 100644 src/test/abilities/gulp_missile.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 9e77013ff13..b483998612e 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6,7 +6,7 @@ import { BattleStat, getBattleStatName } from "./battle-stat"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; -import { BattlerTag, GroundedTag } from "./battler-tags"; +import { BattlerTag, GroundedTag, GulpMissileTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move"; @@ -496,6 +496,49 @@ export class PostDefendAbAttr extends AbAttr { } } +/** + * Applies the effects of Gulp Missile when the user is hit by an attack. + * @extends PostDefendAbAttr + */ +export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr { + constructor() { + super(true); + } + + /** + * Damages the attacker and triggers the secondary effect based on the form or the BattlerTagType. + * @param {Pokemon} pokemon - The defending Pokemon. + * @param passive - n/a + * @param {Pokemon} attacker - The attacking Pokemon. + * @param {Move} move - The move being used. + * @param {HitResult} hitResult - n/a + * @param {any[]} args - n/a + * @returns Whether the effects of the ability are applied. + */ + applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise { + const battlerTag = pokemon.getTag(GulpMissileTag); + if (!battlerTag || move.category === MoveCategory.STATUS) { + return false; + } + + const cancelled = new Utils.BooleanHolder(false); + applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled); + + if (!cancelled.value) { + attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), HitResult.OTHER); + } + + if (battlerTag.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ BattleStat.DEF ], -1)); + } else { + attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon); + } + + pokemon.removeTag(battlerTag.tagType); + return true; + } +} + export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { @@ -5087,7 +5130,11 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .unimplemented(), + .attr(UncopiableAbilityAbAttr) + .attr(UnswappableAbilityAbAttr) + .attr(PostDefendGulpMissileAbAttr) + // Does not transform when Surf/Dive misses/is protected + .partial(), new Ability(Abilities.STALWART, 8) .attr(BlockRedirectAbAttr), new Ability(Abilities.STEAM_ENGINE, 8) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 94df265ff5e..d2f462d5a44 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1647,6 +1647,39 @@ export class StockpilingTag extends BattlerTag { } } +/** + * Battler tag for Gulp Missile used by Cramorant. + * @extends BattlerTag + */ +export class GulpMissileTag extends BattlerTag { + constructor(tagType: BattlerTagType, sourceMove: Moves) { + super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove); + } + + /** + * Gulp Missile's initial form changes are triggered by using Surf and Dive. + * @param {Pokemon} pokemon The Pokemon with Gulp Missile ability. + * @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 isCramorant = pokemon.species.speciesId === Species.CRAMORANT; + + return isSurfOrDive && isNormalForm && isCramorant; + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } + + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } +} + export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: @@ -1770,6 +1803,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new StockpilingTag(sourceMove); case BattlerTagType.OCTOLOCK: return new OctolockTag(sourceId); + case BattlerTagType.GULP_MISSILE_ARROKUDA: + case BattlerTagType.GULP_MISSILE_PIKACHU: + return new GulpMissileTag(tagType, sourceMove); 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 3d1e7820582..8ddc984e304 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,7 +1,7 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { BattleEndPhase, MoveEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag, HelpingHandTag, SemiInvulnerableTag, StockpilingTag, TypeBoostTag } from "./battler-tags"; +import { EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, StockpilingTag, TypeBoostTag } from "./battler-tags"; import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; @@ -4300,6 +4300,46 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } } +/** + * Adds the appropriate battler tag for Gulp Missile when Surf or Dive is used. + * @extends MoveEffectAttr + */ +export class GulpMissileTagAttr extends MoveEffectAttr { + constructor() { + super(true, MoveEffectTrigger.POST_APPLY); + } + + /** + * Adds BattlerTagType from GulpMissileTag based on the Pokemon's HP ratio. + * @param {Pokemon} user The Pokemon using the move. + * @param {Pokemon} target The Pokemon being targeted by the move. + * @param {Move} move The move being used. + * @param {any[]} args Additional arguments, if any. + * @returns Whether the BattlerTag is applied. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + if (!super.apply(user, target, move, args)) { + return false; + } + + if (user.hasAbility(Abilities.GULP_MISSILE) && user.species.speciesId === Species.CRAMORANT) { + if (user.getHpRatio() >= .5) { + user.addTag(BattlerTagType.GULP_MISSILE_ARROKUDA, 0, move.id); + } else { + user.addTag(BattlerTagType.GULP_MISSILE_PIKACHU, 0, move.id); + } + return true; + } + + return false; + } + + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + const isCramorant = user.hasAbility(Abilities.GULP_MISSILE) && user.species.speciesId === Species.CRAMORANT; + return isCramorant && !user.getTag(GulpMissileTag) ? 10 : 0; + } +} + export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { @@ -6157,7 +6197,8 @@ export function initMoves() { 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) .target(MoveTarget.ALL_NEAR_OTHERS) - .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true), + .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true) + .attr(GulpMissileTagAttr), new AttackMove(Moves.ICE_BEAM, Type.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) @@ -6822,6 +6863,7 @@ export function initMoves() { .partial(), new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", {pokemonName: "{USER}"}), BattlerTagType.UNDERWATER) + .attr(GulpMissileTagAttr) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 93781063061..7e29ea994e9 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -828,6 +828,12 @@ export const pokemonFormChanges: PokemonFormChanges = { [Species.EISCUE]: [ new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true), + ], + [Species.CRAMORANT]: [ + new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)), + new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)), + new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true), + new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true), ] }; diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 52f6402861e..7ef73bef281 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -63,5 +63,7 @@ export enum BattlerTagType { ICE_FACE = "ICE_FACE", STOCKPILING = "STOCKPILING", RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", - ALWAYS_GET_HIT = "ALWAYS_GET_HIT" + ALWAYS_GET_HIT = "ALWAYS_GET_HIT", + GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA", + GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU" } diff --git a/src/test/abilities/gulp_missile.test.ts b/src/test/abilities/gulp_missile.test.ts new file mode 100644 index 00000000000..f9329017006 --- /dev/null +++ b/src/test/abilities/gulp_missile.test.ts @@ -0,0 +1,266 @@ +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { + MoveEndPhase, + TurnEndPhase, + TurnStartPhase, +} from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { StatusEffect } from "#app/enums/status-effect.js"; +import { GulpMissileTag } from "#app/data/battler-tags.js"; +import Pokemon from "#app/field/pokemon.js"; + +describe("Abilities - Gulp Missile", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const NORMAL_FORM = 0; + const GULPING_FORM = 1; + const GORGING_FORM = 2; + + /** + * Gets the effect damage of Gulp Missile + * See Gulp Missile {@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(Ability)} + * @param {Pokemon} pokemon The pokemon taking the effect damage. + * @returns The effect damage of Gulp Missile + */ + const getEffectDamage = (pokemon: Pokemon): number => { + return Math.max(1, Math.floor(pokemon.getMaxHp() * 1/4)); + }; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemyLevel(5); + }); + + it("changes to Gulping Form if HP is over half when Surf or Dive is used", async () => { + await game.startBattle([Species.CRAMORANT]); + const cramorant = game.scene.getPlayerPokemon(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DIVE)); + await game.toNextTurn(); + game.doAttack(getMovePosition(game.scene, 0, Moves.DIVE)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(.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.startBattle([Species.CRAMORANT]); + const cramorant = game.scene.getPlayerPokemon(); + + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.49); + expect(cramorant.getHpRatio()).toBe(.49); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeDefined(); + expect(cramorant.formIndex).toBe(GORGING_FORM); + }); + + it("deals ¼ of the attacker's maximum HP when hit by a damaging attack", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle([Species.CRAMORANT]); + + const enemy = game.scene.getEnemyPokemon(); + vi.spyOn(enemy, "damageAndUpdate"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + }); + + it("does not have any effect when hit by non-damaging attack", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TAIL_WHIP)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("lowers the attacker's Defense by 1 stage when hit in Gulping form", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "damageAndUpdate"); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(-1); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("paralyzes the enemy when hit in Gorging form", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "damageAndUpdate"); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.45); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeDefined(); + expect(cramorant.formIndex).toBe(GORGING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy)); + expect(enemy.status.effect).toBe(StatusEffect.PARALYSIS); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_PIKACHU)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("does not activate the ability when underwater", async () => { + game.override + .enemyMoveset(Array(4).fill(Moves.SURF)) + .enemySpecies(Species.REGIELEKI) + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(5); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DIVE)); + await game.toNextTurn(); + + // Turn 2 underwater, enemy moves first + game.doAttack(getMovePosition(game.scene, 0, Moves.DIVE)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.formIndex).toBe(NORMAL_FORM); + expect(cramorant.getTag(GulpMissileTag)).toBeUndefined(); + + // Turn 2 Cramorant comes out and changes form + await game.phaseInterceptor.to(TurnEndPhase); + expect(cramorant.formIndex).not.toBe(NORMAL_FORM); + expect(cramorant.getTag(GulpMissileTag)).toBeDefined(); + }); + + it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)).enemyAbility(Abilities.MAGIC_GUARD); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + const enemyHpPreEffect = enemy.hp; + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.hp).toBe(enemyHpPreEffect); + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(-1); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); + expect(cramorant.formIndex).toBe(NORMAL_FORM); + }); + + it("cannot be suppressed", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.hasAbility(Abilities.GULP_MISSILE)).toBe(true); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("cannot be swapped with another ability", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)); + await game.startBattle([Species.CRAMORANT]); + + const cramorant = game.scene.getPlayerPokemon(); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURF)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(cramorant.hasAbility(Abilities.GULP_MISSILE)).toBe(true); + expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); + expect(cramorant.formIndex).toBe(GULPING_FORM); + }); + + it("cannot be copied", async () => { + game.override.enemyAbility(Abilities.TRACE); + + await game.startBattle([Species.CRAMORANT]); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnStartPhase); + + expect(game.scene.getEnemyPokemon().hasAbility(Abilities.GULP_MISSILE)).toBe(false); + }); +}); From da51d6ae123b227902f91d006cf4c754077f508d Mon Sep 17 00:00:00 2001 From: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:59:17 -0400 Subject: [PATCH 184/321] [Bug] Fix moveset flyout not updating PP from Spite (#3388) --- src/data/move.ts | 3 ++- src/phases.ts | 4 ++-- src/ui/battle-flyout.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 8ddc984e304..28cfc6f2668 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -27,6 +27,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { MoveUsedEvent } from "#app/events/battle-scene.js"; export enum MoveCategory { PHYSICAL, @@ -5337,7 +5338,7 @@ export class ReducePpMoveAttr extends MoveEffectAttr { movesetMove.ppUsed = Math.min(movesetMove.ppUsed + this.reduction, movesetMove.getMovePp()); const message = i18next.t("battle:ppReduced", {targetName: getPokemonNameWithAffix(target), moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); - + user.scene.eventTarget.dispatchEvent(new MoveUsedEvent(target?.id, movesetMove.getMove(), movesetMove.ppUsed)); user.scene.queueMessage(message); return true; diff --git a/src/phases.ts b/src/phases.ts index c4062b470a2..e88f0699918 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2733,7 +2733,7 @@ export class MovePhase extends BattlePhase { if (this.cancelled || this.failed) { if (this.failed) { this.move.usePp(ppUsed); // Only use PP if the move failed - this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); + this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed)); } // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock @@ -2766,7 +2766,7 @@ export class MovePhase extends BattlePhase { if (!moveQueue.length || !moveQueue.shift().ignorePP) { // using .shift here clears out two turn moves once they've been used this.move.usePp(ppUsed); - this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); + this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed)); } if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index fdce9661793..6204fa2f928 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -147,7 +147,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { const foundInfo = this.moveInfo.find(x => x?.move.id === moveUsedEvent.move.id); if (foundInfo) { - foundInfo.ppUsed = Math.min(foundInfo.ppUsed + moveUsedEvent.ppUsed, foundInfo.maxPp); + foundInfo.ppUsed = moveUsedEvent.ppUsed; } else { this.moveInfo.push({move: moveUsedEvent.move, maxPp: moveUsedEvent.move.pp, ppUsed: moveUsedEvent.ppUsed}); } From 2bdfe9315c7c7d14ba7417a4dda61c6f1d5ee15f Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 6 Aug 2024 17:30:05 -0400 Subject: [PATCH 185/321] [Balance] Starter Costs Adjustments (Hitmon family, Jynx family, Bidoof) (#3389) --- src/data/pokemon-species.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 64e3fa70ad6..fa6587145ad 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2725,8 +2725,8 @@ export const speciesStarters = { [Species.VOLTORB]: 2, [Species.EXEGGCUTE]: 3, [Species.CUBONE]: 3, - [Species.HITMONLEE]: 4, - [Species.HITMONCHAN]: 4, + [Species.HITMONLEE]: 5, + [Species.HITMONCHAN]: 5, [Species.LICKITUNG]: 3, [Species.KOFFING]: 2, [Species.RHYHORN]: 3, @@ -2738,7 +2738,7 @@ export const speciesStarters = { [Species.STARYU]: 3, [Species.MR_MIME]: 3, [Species.SCYTHER]: 5, - [Species.JYNX]: 3, + [Species.JYNX]: 4, [Species.ELECTABUZZ]: 4, [Species.MAGMAR]: 4, [Species.PINSIR]: 4, @@ -2805,8 +2805,8 @@ export const speciesStarters = { [Species.PHANPY]: 3, [Species.STANTLER]: 3, [Species.SMEARGLE]: 1, - [Species.TYROGUE]: 2, - [Species.SMOOCHUM]: 2, + [Species.TYROGUE]: 3, + [Species.SMOOCHUM]: 3, [Species.ELEKID]: 3, [Species.MAGBY]: 3, [Species.MILTANK]: 4, @@ -2898,7 +2898,7 @@ export const speciesStarters = { [Species.CHIMCHAR]: 3, [Species.PIPLUP]: 3, [Species.STARLY]: 3, - [Species.BIDOOF]: 3, + [Species.BIDOOF]: 2, [Species.KRICKETOT]: 1, [Species.SHINX]: 2, [Species.BUDEW]: 3, From 98ae2bc665257b985f57ac87b0e94d46b5d163d1 Mon Sep 17 00:00:00 2001 From: Tempoanon <163687446+Tempo-anon@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:36:07 -0400 Subject: [PATCH 186/321] [Localization] Add Japanese Localization (#3332) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update fonts * Add locales/ja files * Add some more files * Add more ui stuff * Fix failing typescript doc being generated * Add the 4 ui handlers * Add i18n.ts * Try something in text.ts * Fix some more errors * Add ja type icons * Add missed message keys * Update src/plugins/i18n.ts Co-authored-by: Enoch * Update src/ui/text.ts Co-authored-by: Enoch * Update src/plugins/i18n.ts Co-authored-by: Enoch * Apply TLs from xsn34kzx Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> * Translate essential text (move, ability descriptions) * Translate missed move/ability * Translated battle.ts - All phrases are taken from USUM script via Poké Corpus https://abcboy101.github.io/poke-corpus/ (I used the USUM script because it is in hiragana/katakana. If we decide to change these phrases to Kanji later, I will refer to the SV script to modify them again.) - * Update battle.ts * Update battle.ts * Update src/locales/ja/battle.ts Co-authored-by: Enoch * Update battle.ts --------- Co-authored-by: EnochG1 Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> Co-authored-by: Chapybara-jp --- public/fonts/Galmuri11.subset.woff2 | Bin 0 -> 275512 bytes public/fonts/Galmuri9.subset.woff2 | Bin 0 -> 214072 bytes public/fonts/PokePT_Wansung.ttf | Bin 586876 -> 0 bytes public/fonts/PokePT_Wansung.woff2 | Bin 0 -> 37032 bytes public/fonts/unifont-15.1.05.otf | Bin 5105508 -> 0 bytes public/fonts/unifont-15.1.05.subset.woff2 | Bin 0 -> 609096 bytes public/images/types_ja.json | 440 ++ public/images/types_ja.png | Bin 0 -> 9300 bytes src/locales/ja/ability-trigger.ts | 62 + src/locales/ja/ability.ts | 1244 ++++++ src/locales/ja/achv.ts | 274 ++ src/locales/ja/arena-flyout.ts | 49 + src/locales/ja/arena-tag.ts | 50 + src/locales/ja/battle-info.ts | 5 + src/locales/ja/battle-message-ui-handler.ts | 10 + src/locales/ja/battle.ts | 159 + src/locales/ja/battler-tags.ts | 12 + src/locales/ja/berry.ts | 48 + src/locales/ja/bgm-name.ts | 145 + src/locales/ja/biome.ts | 40 + src/locales/ja/challenges.ts | 32 + src/locales/ja/command-ui-handler.ts | 9 + src/locales/ja/common.ts | 10 + src/locales/ja/config.ts | 117 + src/locales/ja/dialogue.ts | 2746 ++++++++++++ src/locales/ja/egg.ts | 28 + src/locales/ja/fight-ui-handler.ts | 9 + src/locales/ja/filter-bar.ts | 21 + src/locales/ja/game-mode.ts | 10 + src/locales/ja/game-stats-ui-handler.ts | 44 + src/locales/ja/growth.ts | 10 + src/locales/ja/menu-ui-handler.ts | 28 + src/locales/ja/menu.ts | 62 + src/locales/ja/modifier-select-ui-handler.ts | 14 + src/locales/ja/modifier-type.ts | 456 ++ src/locales/ja/modifier.ts | 14 + src/locales/ja/move-trigger.ts | 62 + src/locales/ja/move.ts | 3812 +++++++++++++++++ src/locales/ja/nature.ts | 29 + src/locales/ja/party-ui-handler.ts | 54 + src/locales/ja/pokeball.ts | 10 + src/locales/ja/pokemon-form.ts | 197 + src/locales/ja/pokemon-info-container.ts | 9 + src/locales/ja/pokemon-info.ts | 43 + src/locales/ja/pokemon-summary.ts | 20 + src/locales/ja/pokemon.ts | 1086 +++++ src/locales/ja/save-slot-select-ui-handler.ts | 9 + src/locales/ja/settings.ts | 100 + src/locales/ja/splash-messages.ts | 38 + src/locales/ja/starter-select-ui-handler.ts | 49 + src/locales/ja/status-effect.ts | 67 + src/locales/ja/trainers.ts | 302 ++ src/locales/ja/tutorial.ts | 44 + src/locales/ja/voucher.ts | 11 + src/locales/ja/weather.ts | 66 + src/plugins/i18n.ts | 103 +- src/system/settings/settings.ts | 4 + src/ui/abstact-option-select-ui-handler.ts | 22 +- src/ui/ball-ui-handler.ts | 29 +- src/ui/egg-gacha-ui-handler.ts | 14 +- src/ui/menu-ui-handler.ts | 17 +- src/ui/modifier-select-ui-handler.ts | 2 +- .../settings/abstract-settings-ui-handler.ts | 6 +- .../settings/settings-display-ui-handler.ts | 6 + src/ui/starter-select-ui-handler.ts | 4 + src/ui/text.ts | 48 +- src/ui/title-ui-handler.ts | 11 +- src/ui/ui.ts | 2 +- src/utils.ts | 1 + 69 files changed, 12336 insertions(+), 89 deletions(-) create mode 100644 public/fonts/Galmuri11.subset.woff2 create mode 100644 public/fonts/Galmuri9.subset.woff2 delete mode 100644 public/fonts/PokePT_Wansung.ttf create mode 100644 public/fonts/PokePT_Wansung.woff2 delete mode 100644 public/fonts/unifont-15.1.05.otf create mode 100644 public/fonts/unifont-15.1.05.subset.woff2 create mode 100644 public/images/types_ja.json create mode 100644 public/images/types_ja.png create mode 100644 src/locales/ja/ability-trigger.ts create mode 100644 src/locales/ja/ability.ts create mode 100644 src/locales/ja/achv.ts create mode 100644 src/locales/ja/arena-flyout.ts create mode 100644 src/locales/ja/arena-tag.ts create mode 100644 src/locales/ja/battle-info.ts create mode 100644 src/locales/ja/battle-message-ui-handler.ts create mode 100644 src/locales/ja/battle.ts create mode 100644 src/locales/ja/battler-tags.ts create mode 100644 src/locales/ja/berry.ts create mode 100644 src/locales/ja/bgm-name.ts create mode 100644 src/locales/ja/biome.ts create mode 100644 src/locales/ja/challenges.ts create mode 100644 src/locales/ja/command-ui-handler.ts create mode 100644 src/locales/ja/common.ts create mode 100644 src/locales/ja/config.ts create mode 100644 src/locales/ja/dialogue.ts create mode 100644 src/locales/ja/egg.ts create mode 100644 src/locales/ja/fight-ui-handler.ts create mode 100644 src/locales/ja/filter-bar.ts create mode 100644 src/locales/ja/game-mode.ts create mode 100644 src/locales/ja/game-stats-ui-handler.ts create mode 100644 src/locales/ja/growth.ts create mode 100644 src/locales/ja/menu-ui-handler.ts create mode 100644 src/locales/ja/menu.ts create mode 100644 src/locales/ja/modifier-select-ui-handler.ts create mode 100644 src/locales/ja/modifier-type.ts create mode 100644 src/locales/ja/modifier.ts create mode 100644 src/locales/ja/move-trigger.ts create mode 100644 src/locales/ja/move.ts create mode 100644 src/locales/ja/nature.ts create mode 100644 src/locales/ja/party-ui-handler.ts create mode 100644 src/locales/ja/pokeball.ts create mode 100644 src/locales/ja/pokemon-form.ts create mode 100644 src/locales/ja/pokemon-info-container.ts create mode 100644 src/locales/ja/pokemon-info.ts create mode 100644 src/locales/ja/pokemon-summary.ts create mode 100644 src/locales/ja/pokemon.ts create mode 100644 src/locales/ja/save-slot-select-ui-handler.ts create mode 100644 src/locales/ja/settings.ts create mode 100644 src/locales/ja/splash-messages.ts create mode 100644 src/locales/ja/starter-select-ui-handler.ts create mode 100644 src/locales/ja/status-effect.ts create mode 100644 src/locales/ja/trainers.ts create mode 100644 src/locales/ja/tutorial.ts create mode 100644 src/locales/ja/voucher.ts create mode 100644 src/locales/ja/weather.ts diff --git a/public/fonts/Galmuri11.subset.woff2 b/public/fonts/Galmuri11.subset.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0b626506255cb515850e8618d019b2852399a602 GIT binary patch literal 275512 zcmV)uK$gFEPew8T0RR911T;7R3;+NCAtN*Z1T*3Q0%TeM00000000000000000000 z0000RARK{y24Db!fFuh3_ejBnd;vBBBm;rsNDG1DPyhrV1%pTjAe+ZG5qsfz?ARWW zvH8Pj*ibrj=vD=}NeHmEnw<9C81R$b5a+NXBKoV_5MW`M9iN*GB%s_r1t@n_wG@n> z^XAR||NsC0|NsC0|NsC0|65LeM84bZyZN&__3o$r0BIyj5^Kc7f{lnJpopko!-|U7 zYQ?4XBGRQ|Eylg{B2w77($cvXsYJK~iS%)*vzq6;Ov9FjE|0mgy1Z72&(30K#ClE% zjQ-q!^N_iY5*K1As)eeKs&yu09=t)cGL1c_1f719Xv=*qB7o1%_Q36korsv%L4R?; zE@ZB|#NHzzwTOrScgQ^WQKFdV<~$Sl>|7e^?(QD7&%i#s#E=vcsyX0wN$Y*;7wLW-#W_dgfX&GcyAbkQwsuXD-)KT4^AA@9tVy zRaHRmkQp)$e)bqL1NVLsu_&ynx}miMWQNS}IimeB4_C)r)Iq1ipC1~rn@gFs)9LUR zUWCjbbMMOXSc`}VaEHvpUxF{c0-0+aN72x-U{zHC-61pCtFJ+3ka6`iQwyu=x_}7C z44Luk@ESvAka_aPJj*Jps!m#GLgvA561??xwQbYc#c8rib9S!ZfXpD}op(cO5lI2= zkQp)$ze#j1P9g#s-3o0hX78CGrMpGjirM=nNa=2uhPamoT4BV6YqKs=eNgq)vbbG$ zV5Jux{2|fmIDVv)1E;$~+l%{M7o_wb6E(9t%Yu~t6QXAJX$n%h&uH7>!Z&^yDKl}*~ z{@UJ`GsGhv3dCDSEt#zAIwcVjIcZ3mU}(*W+A+-j4{_-)=38h>NcYrM0+t#hbGvBH zFIB96&lbhBNhlwU$U2b`S=WJiF1?iJ^4wkOpaU8#XcnR^CRcw!vYYv3y248R-eejk zuVEnxK#;q8_$}~n3pB#ot0o+Ub*7?w5y(7wi>qr;XXF<+cS%en%Rn*-EnCJM{PQw( zSobblAJx|XWfXdNVl<4$u8qN1`8t@Q`+-!aft|xT7S}^=Sp!h

ENm=pG#ee-j|1hMGLP{y5X_`tYrIl7%Ys<21 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

xM%$1*~#Fc`GHpQ*uK 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�MEIOz>$P8^Su-b!qg`EB)>9jgS);KW{SpZ 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�Z{NOCQgG94QX6txcKG8{P=b6G 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�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 z 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