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

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

( + phaseFilter: (phase: P) => boolean, + ): P | undefined { return this.phaseQueue.find(phaseFilter) as P; } - tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { + tryReplacePhase( + phaseFilter: (phase: Phase) => boolean, + phase: Phase, + ): boolean { const phaseIndex = this.phaseQueue.findIndex(phaseFilter); if (phaseIndex > -1) { this.phaseQueue[phaseIndex] = phase; @@ -2502,11 +3067,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase | Phase [], targetPhase: Constructor): boolean { + prependToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1) { this.phaseQueue.splice(targetIndex, 0, ...phase); @@ -2523,11 +3093,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + appendToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { this.phaseQueue.splice(targetIndex + 1, 0, ...phase); @@ -2546,7 +3121,13 @@ export default class BattleScene extends SceneBase { * @param promptDelay optional param for MessagePhase constructor * @param defer boolean for which queue to add it to, false -> add to PhaseQueuePrepend, true -> nextCommandPhaseQueue */ - queueMessage(message: string, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null, defer?: boolean | null) { + queueMessage( + message: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + defer?: boolean | null, + ) { const phase = new MessagePhase(message, callbackDelay, prompt, promptDelay); if (!defer) { // adds to the end of PhaseQueuePrepend @@ -2578,98 +3159,126 @@ export default class BattleScene extends SceneBase { getWaveMoneyAmount(moneyMultiplier: number): number { const waveIndex = this.currentBattle.waveIndex; const waveSetIndex = Math.ceil(waveIndex / 10) - 1; - const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; + const moneyValue = + Math.pow( + (waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, + 1 + 0.005 * waveSetIndex, + ) * moneyMultiplier; return Math.floor(moneyValue / 10) * 10; } - addModifier(modifier: Modifier | null, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean, cost?: number): Promise { + addModifier( + modifier: Modifier | null, + ignoreUpdate?: boolean, + playSound?: boolean, + virtual?: boolean, + instant?: boolean, + cost?: number, + ): boolean { if (!modifier) { - return Promise.resolve(false); + return false; } - return new Promise(resolve => { - let success = false; - const soundName = modifier.type.soundName; - this.validateAchvs(ModifierAchv, modifier); - const modifiersToRemove: PersistentModifier[] = []; - const modifierPromises: Promise[] = []; - if (modifier instanceof PersistentModifier) { - if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { - if (modifier instanceof PokemonFormChangeItemModifier) { - const pokemon = this.getPokemonById(modifier.pokemonId); - if (pokemon) { - success = modifier.apply(pokemon, true); - } + let success = false; + const soundName = modifier.type.soundName; + this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof PersistentModifier) { + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { + if (modifier instanceof PokemonFormChangeItemModifier) { + const pokemon = this.getPokemonById(modifier.pokemonId); + if (pokemon) { + success = modifier.apply(pokemon, true); } - if (playSound && !this.sound.get(soundName)) { - this.playSound(soundName); - } - } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, false, 3000); - return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } - - for (const rm of modifiersToRemove) { - this.removeModifier(rm); - } - - if (!ignoreUpdate && !virtual) { - return this.updateModifiers(true, instant).then(() => resolve(success)); - } - } else if (modifier instanceof ConsumableModifier) { if (playSound && !this.sound.get(soundName)) { this.playSound(soundName); } - - if (modifier instanceof ConsumablePokemonModifier) { - for (const p in this.party) { - const pokemon = this.party[p]; - - const args: unknown[] = []; - if (modifier instanceof PokemonHpRestoreModifier) { - if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.NumberHolder(1); - this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); - args.push(hpRestoreMultiplier.value); - } else { - args.push(1); - } - } else if (modifier instanceof FusePokemonModifier) { - args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); - } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { - args.push(cost); - } - - if (modifier.shouldApply(pokemon, ...args)) { - const result = modifier.apply(pokemon, ...args); - if (result instanceof Promise) { - modifierPromises.push(result.then(s => success ||= s)); - } else { - success ||= result; - } - } - } - - return Promise.allSettled([ this.party.map(p => p.updateInfo(instant)), ...modifierPromises ]).then(() => resolve(success)); - } else { - const args = [ this ]; - if (modifier.shouldApply(...args)) { - const result = modifier.apply(...args); - if (result instanceof Promise) { - return result.then(success => resolve(success)); - } else { - success ||= result; - } - } - } + } else if (!virtual) { + const defaultModifierType = getDefaultModifierTypeForTier( + modifier.type.tier, + ); + this.queueMessage( + i18next.t("battle:itemStackFull", { + fullItemName: modifier.type.name, + itemName: defaultModifierType.name, + }), + undefined, + false, + 3000, + ); + return this.addModifier( + defaultModifierType.newModifier(), + ignoreUpdate, + playSound, + false, + instant, + ); } - resolve(success); - }); + for (const rm of modifiersToRemove) { + this.removeModifier(rm); + } + + if (!ignoreUpdate && !virtual) { + this.updateModifiers(true, instant); + } + } else if (modifier instanceof ConsumableModifier) { + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + + if (modifier instanceof ConsumablePokemonModifier) { + for (const p in this.party) { + const pokemon = this.party[p]; + + const args: unknown[] = []; + if (modifier instanceof PokemonHpRestoreModifier) { + if (!(modifier as PokemonHpRestoreModifier).fainted) { + const hpRestoreMultiplier = new Utils.NumberHolder(1); + this.applyModifiers( + HealingBoosterModifier, + true, + hpRestoreMultiplier, + ); + args.push(hpRestoreMultiplier.value); + } else { + args.push(1); + } + } else if (modifier instanceof FusePokemonModifier) { + args.push( + this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon, + ); + } else if ( + modifier instanceof RememberMoveModifier && + !Utils.isNullOrUndefined(cost) + ) { + args.push(cost); + } + + if (modifier.shouldApply(pokemon, ...args)) { + const result = modifier.apply(pokemon, ...args); + success ||= result; + } + } + + this.party.map((p) => p.updateInfo(instant)); + } else { + const args = [ this ]; + if (modifier.shouldApply(...args)) { + const result = modifier.apply(...args); + success ||= result; + } + } + } + return success; } - addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { - return new Promise(resolve => { + addEnemyModifier( + modifier: PersistentModifier, + ignoreUpdate?: boolean, + instant?: boolean, + ): Promise { + return new Promise((resolve) => { const modifiersToRemove: PersistentModifier[] = []; if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { if (modifier instanceof PokemonFormChangeItemModifier) { @@ -2683,7 +3292,8 @@ export default class BattleScene extends SceneBase { } } if (!ignoreUpdate) { - this.updateModifiers(false, instant).then(() => resolve()); + this.updateModifiers(false, instant); + resolve(); } else { resolve(); } @@ -2704,86 +3314,128 @@ export default class BattleScene extends SceneBase { * @param itemLost If `true`, treat the item's current holder as losing the item (for now, this simply enables Unburden). Default is `true`. * @returns `true` if the transfer was successful */ - tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, playSound: boolean, transferQuantity: number = 1, instant?: boolean, ignoreUpdate?: boolean, itemLost: boolean = true): Promise { - return new Promise(resolve => { - const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; - const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(!!source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source! /* checked in condition*/, cancelled)).then(() => { - if (cancelled.value) { - return resolve(false); - } - const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; - newItemModifier.pokemonId = target.id; - const matchingModifier = this.findModifier(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier; - let removeOld = true; - if (matchingModifier) { - const maxStackCount = matchingModifier.getMaxStackCount(); - if (matchingModifier.stackCount >= maxStackCount) { - return resolve(false); - } - const countTaken = Math.min(transferQuantity, itemModifier.stackCount, maxStackCount - matchingModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = matchingModifier.stackCount + countTaken; - removeOld = !itemModifier.stackCount; - } else { - const countTaken = Math.min(transferQuantity, itemModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = countTaken; - } - removeOld = !itemModifier.stackCount; - if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { - const addModifier = () => { - if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { - if (target.isPlayer()) { - this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } else { - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } - } else { - resolve(false); + tryTransferHeldItemModifier( + itemModifier: PokemonHeldItemModifier, + target: Pokemon, + playSound: boolean, + transferQuantity: number = 1, + instant?: boolean, + ignoreUpdate?: boolean, + itemLost: boolean = true, + ): boolean { + const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; + newItemModifier.pokemonId = target.id; + const matchingModifier = this.findModifier( + (m) => + m instanceof PokemonHeldItemModifier && + m.matchType(itemModifier) && + m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min( + transferQuantity, + itemModifier.stackCount, + maxStackCount - matchingModifier.stackCount, + ); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = matchingModifier.stackCount + countTaken; + } else { + const countTaken = Math.min(transferQuantity, itemModifier.stackCount); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = countTaken; + } + + const removeOld = itemModifier.stackCount === 0; + + if ( + !removeOld || + !source || + this.removeModifier(itemModifier, !source.isPlayer()) + ) { + const addModifier = () => { + if ( + !matchingModifier || + this.removeModifier(matchingModifier, !target.isPlayer()) + ) { + if (target.isPlayer()) { + this.addModifier( + newItemModifier, + ignoreUpdate, + playSound, + false, + instant, + ); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); } - }; - if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { - this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); + return true; } else { - addModifier(); + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); + } + return true; } - return; } - resolve(false); - }); - }); + return false; + }; + if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { + this.updateModifiers(source.isPlayer(), instant); + addModifier(); + } else { + addModifier(); + } + return true; + } + return false; } removePartyMemberModifiers(partyMemberIndex: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { const pokemonId = this.getPlayerParty()[partyMemberIndex].id; - const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); + const modifiersToRemove = this.modifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).pokemonId === pokemonId, + ); for (const m of modifiersToRemove) { this.modifiers.splice(this.modifiers.indexOf(m), 1); } - this.updateModifiers().then(() => resolve()); + this.updateModifiers(); + resolve(); }); } - generateEnemyModifiers(heldModifiersConfigs?: HeldModifierConfig[][]): Promise { - return new Promise(resolve => { + generateEnemyModifiers( + heldModifiersConfigs?: HeldModifierConfig[][], + ): Promise { + return new Promise((resolve) => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); } - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); - const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty( + this.currentBattle.waveIndex, + ); + const isFinalBoss = this.gameMode.isWaveFinal( + this.currentBattle.waveIndex, + ); let chances = Math.ceil(difficultyWaveIndex / 10); if (isFinalBoss) { chances = Math.ceil(chances * 2.5); @@ -2801,8 +3453,12 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { - if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i]) { - heldModifiersConfigs[i].forEach(mt => { + if ( + heldModifiersConfigs && + i < heldModifiersConfigs.length && + heldModifiersConfigs[i] + ) { + heldModifiersConfigs[i].forEach((mt) => { let modifier: PokemonHeldItemModifier; if (mt.modifier instanceof PokemonHeldItemModifierType) { modifier = mt.modifier.newModifier(enemyPokemon); @@ -2811,11 +3467,15 @@ export default class BattleScene extends SceneBase { modifier.pokemonId = enemyPokemon.id; } modifier.stackCount = mt.stackCount ?? 1; - modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable; + modifier.isTransferable = + mt.isTransferable ?? modifier.isTransferable; this.addEnemyModifier(modifier, true); }); } else { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); + const isBoss = + enemyPokemon.isBoss() || + (this.currentBattle.battleType === BattleType.TRAINER && + !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -2823,96 +3483,115 @@ export default class BattleScene extends SceneBase { if (isFinalBoss) { upgradeChance /= 8; } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line let count = 0; for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { + if (!Utils.randSeedInt(this.gameMode.getEnemyModifierChance(isBoss))) { count++; } } if (isBoss) { count = Math.max(count, Math.floor(chances / 2)); } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false)); + getEnemyModifierTypesForWave( + difficultyWaveIndex, + count, + [ enemyPokemon ], + this.currentBattle.battleType === BattleType.TRAINER + ? ModifierPoolType.TRAINER + : ModifierPoolType.WILD, + upgradeChance, + ).map((mt) => + mt.newModifier(enemyPokemon).add(this.enemyModifiers, false), + ); } return true; }); - this.updateModifiers(false).then(() => resolve()); + this.updateModifiers(false); + resolve(); }); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type - */ + * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type + */ clearEnemyModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => m instanceof PersistentModifier, + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type - * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} - */ + * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type + * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} + */ clearEnemyHeldItemModifiers(pokemon?: Pokemon): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon() === pokemon)); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (!pokemon || m.getPokemon() === pokemon), + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); + [ this.modifierBar, this.enemyModifierBar ].map((m) => m.setVisible(visible)); } - updateModifiers(player?: boolean, instant?: boolean): Promise { - if (player === undefined) { - player = true; + updateModifiers(player: boolean = true, instant?: boolean): void { + const modifiers = player + ? this.modifiers + : (this.enemyModifiers as PersistentModifier[]); + for (let m = 0; m < modifiers.length; m++) { + const modifier = modifiers[m]; + if ( + modifier instanceof PokemonHeldItemModifier && + !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId) + ) { + modifiers.splice(m--, 1); + } } - return new Promise(resolve => { - const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; - for (let m = 0; m < modifiers.length; m++) { - const modifier = modifiers[m]; - if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) { - modifiers.splice(m--, 1); - } - } - for (const modifier of modifiers) { - if (modifier instanceof PersistentModifier) { - (modifier as PersistentModifier).virtualStackCount = 0; - } + for (const modifier of modifiers) { + if (modifier instanceof PersistentModifier) { + (modifier as PersistentModifier).virtualStackCount = 0; } + } - const modifiersClone = modifiers.slice(0); - for (const modifier of modifiersClone) { - if (!modifier.getStackCount()) { - modifiers.splice(modifiers.indexOf(modifier), 1); - } + const modifiersClone = modifiers.slice(0); + for (const modifier of modifiersClone) { + if (!modifier.getStackCount()) { + modifiers.splice(modifiers.indexOf(modifier), 1); } + } - this.updatePartyForModifiers(player ? this.getPlayerParty() : this.getEnemyParty(), instant).then(() => { - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); - if (!player) { - this.updateUIPositions(); - } - resolve(); - }); - }); + this.updatePartyForModifiers( + player ? this.getPlayerParty() : this.getEnemyParty(), + instant, + ); + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers( + modifiers, + ); + if (!player) { + this.updateUIPositions(); + } } updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { - return new Promise(resolve => { - Promise.allSettled(party.map(p => { - p.calculateStats(); - return p.updateInfo(instant); - })).then(() => resolve()); + return new Promise((resolve) => { + Promise.allSettled( + party.map((p) => { + p.calculateStats(); + return p.updateInfo(instant); + }), + ).then(() => resolve()); }); } @@ -2924,7 +3603,10 @@ export default class BattleScene extends SceneBase { * @param enemy If `true`, remove an item owned by the enemy. If `false`, remove an item owned by the player. Default is `false`. * @returns `true` if the item exists and was successfully removed, `false` otherwise. */ - removeModifier(modifier: PersistentModifier, enemy: boolean = false): boolean { + removeModifier( + modifier: PersistentModifier, + enemy: boolean = false, + ): boolean { const modifiers = !enemy ? this.modifiers : this.enemyModifiers; const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { @@ -2947,8 +3629,13 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that matched `modifierType`. */ - getModifiers(modifierType: Constructor, player: boolean = true): T[] { - return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); + getModifiers( + modifierType: Constructor, + player: boolean = true, + ): T[] { + return (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType, + ); } /** @@ -2957,8 +3644,13 @@ export default class BattleScene extends SceneBase { * @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that passed the `modifierFilter` function */ - findModifiers(modifierFilter: ModifierPredicate, isPlayer: boolean = true): PersistentModifier[] { - return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter); + findModifiers( + modifierFilter: ModifierPredicate, + isPlayer: boolean = true, + ): PersistentModifier[] { + return (isPlayer ? this.modifiers : this.enemyModifiers).filter( + modifierFilter, + ); } /** @@ -2967,7 +3659,10 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed */ - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined { + findModifier( + modifierFilter: ModifierPredicate, + player: boolean = true, + ): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter); } @@ -2978,18 +3673,31 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyShuffledModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - let modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); - this.executeWithSeedOffset(() => { - const shuffleModifiers = mods => { - if (mods.length < 1) { - return mods; - } - const rand = Utils.randSeedInt(mods.length); - return [ mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand)) ]; - }; - modifiers = shuffleModifiers(modifiers); - }, this.currentBattle.turn << 4, this.waveSeed); + applyShuffledModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + let modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); + this.executeWithSeedOffset( + () => { + const shuffleModifiers = (mods) => { + if (mods.length < 1) { + return mods; + } + const rand = Utils.randSeedInt(mods.length); + return [ + mods[rand], + ...shuffleModifiers(mods.filter((_, i) => i !== rand)), + ]; + }; + modifiers = shuffleModifiers(modifiers); + }, + this.currentBattle.turn << 4, + this.waveSeed, + ); return this.applyModifiersInternal(modifiers, player, args); } @@ -3000,13 +3708,23 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); return this.applyModifiersInternal(modifiers, player, args); } /** Helper function to apply all passed modifiers */ - applyModifiersInternal(modifiers: T[], player: boolean, args: Parameters): T[] { + applyModifiersInternal( + modifiers: T[], + player: boolean, + args: Parameters, + ): T[] { const appliedModifiers: T[] = []; for (const modifier of modifiers) { if (modifier.apply(...args)) { @@ -3025,8 +3743,14 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the first modifier that matches `modifierType` and was applied; return `null` if none matched */ - applyModifier(modifierType: Constructor, player: boolean = true, ...args: Parameters): T | null { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifier( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T | null { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); for (const modifier of modifiers) { if (modifier.apply(...args)) { console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); @@ -3037,22 +3761,42 @@ export default class BattleScene extends SceneBase { return null; } - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, delayed: boolean = false, modal: boolean = false): boolean { + triggerPokemonFormChange( + pokemon: Pokemon, + formChangeTriggerType: Constructor, + delayed: boolean = false, + modal: boolean = false, + ): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - // in case this is NECROZMA, determine which forms this - const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + const matchingFormChangeOpts = pokemonFormChanges[ + pokemon.species.speciesId + ].filter( + (fc) => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), + ); let matchingFormChange: SpeciesFormChange | null; - if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { + if ( + pokemon.species.speciesId === Species.NECROZMA && + matchingFormChangeOpts.length > 1 + ) { // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. - const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem); + const formChangeItemModifiers = ( + this.findModifiers( + (m) => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[] + ) + .filter((m) => m.active) + .map((m) => m.formChangeItem); - - matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? - matchingFormChangeOpts[0] : - formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? - matchingFormChangeOpts[1] : - null; + matchingFormChange = formChangeItemModifiers.includes( + FormChangeItem.N_LUNARIZER, + ) + ? matchingFormChangeOpts[0] + : formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) + ? matchingFormChangeOpts[1] + : null; } else { matchingFormChange = matchingFormChangeOpts[0]; } @@ -3063,7 +3807,11 @@ export default class BattleScene extends SceneBase { } else { phase = new QuietFormChangePhase(pokemon, matchingFormChange); } - if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { + if ( + pokemon instanceof PlayerPokemon && + !matchingFormChange.quiet && + modal + ) { this.overridePhase(phase); } else if (delayed) { this.pushPhase(phase); @@ -3077,8 +3825,17 @@ export default class BattleScene extends SceneBase { return false; } - triggerPokemonBattleAnim(pokemon: Pokemon, battleAnimType: PokemonAnimType, fieldAssets?: Phaser.GameObjects.Sprite[], delayed: boolean = false): boolean { - const phase: Phase = new PokemonAnimPhase(battleAnimType, pokemon, fieldAssets); + triggerPokemonBattleAnim( + pokemon: Pokemon, + battleAnimType: PokemonAnimType, + fieldAssets?: Phaser.GameObjects.Sprite[], + delayed: boolean = false, + ): boolean { + const phase: Phase = new PokemonAnimPhase( + battleAnimType, + pokemon, + fieldAssets, + ); if (delayed) { this.pushPhase(phase); } else { @@ -3088,15 +3845,20 @@ export default class BattleScene extends SceneBase { } validateAchvs(achvType: Constructor, ...args: unknown[]): void { - const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); + const filteredAchvs = Object.values(achvs).filter( + (a) => a instanceof achvType, + ); for (const achv of filteredAchvs) { this.validateAchv(achv, args); } } validateAchv(achv: Achv, args?: unknown[]): boolean { - if ((!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) - && achv.validate(args)) { + if ( + (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || + Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && + achv.validate(args) + ) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { @@ -3109,7 +3871,10 @@ export default class BattleScene extends SceneBase { } validateVoucher(voucher: Voucher, args?: unknown[]): boolean { - if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { + if ( + !this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && + voucher.validate(args) + ) { this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; @@ -3125,19 +3890,21 @@ export default class BattleScene extends SceneBase { gameMode: this.currentBattle ? this.gameMode.getName() : "Title", biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", wave: this.currentBattle?.waveIndex ?? 0, - party: this.party ? this.party.map((p) => { - return { - name: p.name, - form: p.getFormKey(), - types: p.getTypes().map((type) => Type[type]), - teraType: Type[p.getTeraType()], - isTerastallized: p.isTerastallized, - level: p.level, - currentHP: p.hp, - maxHP: p.getMaxHp(), - status: p.status?.effect ? StatusEffect[p.status.effect] : "" - }; - }) : [], + party: this.party + ? this.party.map((p) => { + return { + name: p.name, + form: p.getFormKey(), + types: p.getTypes().map((type) => Type[type]), + teraType: Type[p.getTeraType()], + isTerastallized: p.isTerastallized, + level: p.level, + currentHP: p.hp, + maxHP: p.getMaxHp(), + status: p.status?.effect ? StatusEffect[p.status.effect] : "", + }; + }) + : [], modeChain: this.ui?.getModeChain() ?? [], }; (window as any).gameInfo = gameInfo; @@ -3171,26 +3938,44 @@ export default class BattleScene extends SceneBase { * @param pokemon The (enemy) pokemon */ initFinalBossPhaseTwo(pokemon: Pokemon): void { - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { + if ( + pokemon instanceof EnemyPokemon && + pokemon.isBoss() && + !pokemon.formIndex && + pokemon.bossSegmentIndex < 1 + ) { this.fadeOutBgm(Utils.fixedInt(2000), false); - this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { - const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier; - finalBossMBH.setTransferrableFalse(); - this.addEnemyModifier(finalBossMBH, false, true); - pokemon.generateAndPopulateMoveset(1); - this.setFieldScale(0.75); - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.currentBattle.double = true; - const availablePartyMembers = this.getPlayerParty().filter((p) => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.pushPhase(new ToggleDoublePositionPhase(true)); - if (!availablePartyMembers[1].isOnField()) { - this.pushPhase(new SummonPhase(1)); + this.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, + pokemon.species.name, + undefined, + () => { + const finalBossMBH = getModifierType( + modifierTypes.MINI_BLACK_HOLE, + ).newModifier(pokemon) as TurnHeldItemTransferModifier; + finalBossMBH.setTransferrableFalse(); + this.addEnemyModifier(finalBossMBH, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange( + pokemon, + SpeciesFormChangeManualTrigger, + false, + ); + this.currentBattle.double = true; + const availablePartyMembers = this.getPlayerParty().filter((p) => + p.isAllowedInBattle(), + ); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(1)); + } } - } - this.shiftPhase(); - }); + this.shiftPhase(); + }, + ); return; } @@ -3204,33 +3989,62 @@ export default class BattleScene extends SceneBase { * @param useWaveIndexMultiplier Default false. If true, will multiply expValue by a scaling waveIndex multiplier. Not needed if expValue is already scaled by level/wave * @param pokemonParticipantIds Participants. If none are defined, no exp will be given. To spread evenly among the party, should pass all ids of party members. */ - applyPartyExp(expValue: number, pokemonDefeated: boolean, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set): void { - const participantIds = pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; + applyPartyExp( + expValue: number, + pokemonDefeated: boolean, + useWaveIndexMultiplier?: boolean, + pokemonParticipantIds?: Set, + ): void { + const participantIds = + pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; const party = this.getPlayerParty(); - const expShareModifier = this.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; - const expBalanceModifier = this.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const multipleParticipantExpBonusModifier = this.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; - const nonFaintedPartyMembers = party.filter(p => p.hp); - const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.getMaxExpLevel()); + const expShareModifier = this.findModifier( + (m) => m instanceof ExpShareModifier, + ) as ExpShareModifier; + const expBalanceModifier = this.findModifier( + (m) => m instanceof ExpBalanceModifier, + ) as ExpBalanceModifier; + const multipleParticipantExpBonusModifier = this.findModifier( + (m) => m instanceof MultipleParticipantExpBonusModifier, + ) as MultipleParticipantExpBonusModifier; + const nonFaintedPartyMembers = party.filter((p) => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter( + (p) => p.level < this.getMaxExpLevel(), + ); const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue if (useWaveIndexMultiplier) { - expValue = Math.floor(expValue * this.currentBattle.waveIndex / 5 + 1); + expValue = Math.floor((expValue * this.currentBattle.waveIndex) / 5 + 1); } if (participantIds.size > 0) { - if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + if ( + this.currentBattle.battleType === BattleType.TRAINER || + this.currentBattle.mysteryEncounter?.encounterMode === + MysteryEncounterMode.TRAINER_BATTLE + ) { expValue = Math.floor(expValue * 1.5); - } else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) { - expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier); + } else if ( + this.currentBattle.isBattleMysteryEncounter() && + this.currentBattle.mysteryEncounter + ) { + expValue = Math.floor( + expValue * this.currentBattle.mysteryEncounter.expMultiplier, + ); } for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; const participated = participantIds.has(pId); if (participated && pokemonDefeated) { partyMember.addFriendship(FRIENDSHIP_GAIN_FROM_BATTLE); - const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); - if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount()) { + const machoBraceModifier = partyMember + .getHeldItems() + .find((m) => m instanceof PokemonIncrementingStatModifier); + if ( + machoBraceModifier && + machoBraceModifier.stackCount < + machoBraceModifier.getMaxStackCount() + ) { machoBraceModifier.stackCount++; this.updateModifiers(true, true); partyMember.updateInfo(); @@ -3245,12 +4059,14 @@ export default class BattleScene extends SceneBase { } let expMultiplier = 0; if (participated) { - expMultiplier += (1 / participantIds.size); + expMultiplier += 1 / participantIds.size; if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { - expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; + expMultiplier += + multipleParticipantExpBonusModifier.getStackCount() * 0.2; } } else if (expShareModifier) { - expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; + expMultiplier += + (expShareModifier.getStackCount() * 0.2) / participantIds.size; } if (partyMember.pokerus) { expMultiplier *= 1.5; @@ -3259,7 +4075,12 @@ export default class BattleScene extends SceneBase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + this.applyModifiers( + PokemonExpBoosterModifier, + true, + partyMember, + pokemonExp, + ); partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -3280,10 +4101,16 @@ export default class BattleScene extends SceneBase { } }); - const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + const splitExp = Math.floor( + totalExp / recipientExpPartyMemberIndexes.length, + ); expPartyMembers.forEach((_partyMember, pm) => { - partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + partyMemberExp[pm] = Phaser.Math.Linear( + partyMemberExp[pm], + recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, + 0.2 * expBalanceModifier.getStackCount(), + ); }); } @@ -3292,7 +4119,11 @@ export default class BattleScene extends SceneBase { if (exp) { const partyMemberIndex = party.indexOf(expPartyMembers[pm]); - this.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(partyMemberIndex, exp) : new ShowPartyExpBarPhase(partyMemberIndex, exp)); + this.unshiftPhase( + expPartyMembers[pm].isOnField() + ? new ExpPhase(partyMemberIndex, exp) + : new ShowPartyExpBarPhase(partyMemberIndex, exp), + ); } } } @@ -3303,9 +4134,19 @@ export default class BattleScene extends SceneBase { * Even if returns `true`, does not guarantee that a wave will actually be a ME. * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. */ - isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); - return this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave; + isMysteryEncounterValidForWave( + battleType: BattleType, + waveIndex: number, + ): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = + this.gameMode.getMysteryEncounterLegalWaves(); + return ( + this.gameMode.hasMysteryEncounters && + battleType === BattleType.WILD && + !this.gameMode.isBoss(waveIndex) && + waveIndex < highestMysteryEncounterWave && + waveIndex > lowestMysteryEncounterWave + ); } /** @@ -3315,31 +4156,56 @@ export default class BattleScene extends SceneBase { * @param newBattleType * @param waveIndex */ - private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + private isWaveMysteryEncounter( + newBattleType: BattleType, + waveIndex: number, + ): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = + this.gameMode.getMysteryEncounterLegalWaves(); if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor - const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; + const sessionEncounterRate = + this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well) // Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET // Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256 - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave); - const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length; - const favoredEncounterRate = sessionEncounterRate + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); + const expectedEncountersByFloor = + (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / + (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * + (waveIndex - lowestMysteryEncounterWave); + const currentRunDiffFromAvg = + expectedEncountersByFloor - encounteredEvents.length; + const favoredEncounterRate = + sessionEncounterRate + + Math.min( + currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, + MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2, + ); - const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; + const successRate = isNullOrUndefined( + Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE, + ) + ? favoredEncounterRate + : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = encounteredEvents.length === 0 || (waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex) > 3 || !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); + const canSpawn = + encounteredEvents.length === 0 || + waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > + 3 || + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); if (canSpawn) { let roll = MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT; // Always rolls the check on the same offset to ensure no RNG changes from reloading session - this.executeWithSeedOffset(() => { - roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); - }, waveIndex * 3 * 1000); + this.executeWithSeedOffset( + () => { + roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); + }, + waveIndex * 3 * 1000, + ); return roll < successRate; } } @@ -3353,10 +4219,16 @@ export default class BattleScene extends SceneBase { * @param canBypass optional boolean to indicate that the request is coming from a function that needs to access a Mystery Encounter outside of gameplay requirements * @returns */ - getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter { + getMysteryEncounter( + encounterType?: MysteryEncounterType, + canBypass?: boolean, + ): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter | null; - if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + if ( + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && + allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) + ) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; if (canBypass) { return encounter; @@ -3365,13 +4237,22 @@ export default class BattleScene extends SceneBase { encounter = allMysteryEncounters[encounterType ?? -1]; return encounter; } else { - encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null; + encounter = !isNullOrUndefined(encounterType) + ? allMysteryEncounters[encounterType] + : null; } // Check for queued encounters first - if (!encounter && this.mysteryEncounterSaveData?.queuedEncounters && this.mysteryEncounterSaveData.queuedEncounters.length > 0) { + if ( + !encounter && + this.mysteryEncounterSaveData?.queuedEncounters && + this.mysteryEncounterSaveData.queuedEncounters.length > 0 + ) { let i = 0; - while (i < this.mysteryEncounterSaveData.queuedEncounters.length && !!encounter) { + while ( + i < this.mysteryEncounterSaveData.queuedEncounters.length && + !!encounter + ) { const candidate = this.mysteryEncounterSaveData.queuedEncounters[i]; const forcedChance = candidate.spawnPercent; if (Utils.randSeedInt(100) < forcedChance) { @@ -3389,34 +4270,56 @@ export default class BattleScene extends SceneBase { } // See Enum values for base tier weights - const tierWeights = [ MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE ]; + const tierWeights = [ + MysteryEncounterTier.COMMON, + MysteryEncounterTier.GREAT, + MysteryEncounterTier.ULTRA, + MysteryEncounterTier.ROGUE, + ]; // Adjust tier weights by previously encountered events to lower odds of only Common/Great in run - this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => { - if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { - tierWeights[0] = tierWeights[0] - 6; - } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { - tierWeights[1] = tierWeights[1] - 4; - } - }); + this.mysteryEncounterSaveData.encounteredEvents.forEach( + (seenEncounterData) => { + if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { + tierWeights[0] = tierWeights[0] - 6; + } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { + tierWeights[1] = tierWeights[1] - 4; + } + }, + ); const totalWeight = tierWeights.reduce((a, b) => a + b); const tierValue = Utils.randSeedInt(totalWeight); const commonThreshold = totalWeight - tierWeights[0]; const greatThreshold = totalWeight - tierWeights[0] - tierWeights[1]; - const ultraThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; - let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE; + const ultraThreshold = + totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; + let tier: MysteryEncounterTier | null = + tierValue > commonThreshold + ? MysteryEncounterTier.COMMON + : tierValue > greatThreshold + ? MysteryEncounterTier.GREAT + : tierValue > ultraThreshold + ? MysteryEncounterTier.ULTRA + : MysteryEncounterTier.ROGUE; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } let availableEncounters: MysteryEncounter[] = []; - const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.length > 0 ? - this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1].type - : null; - const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); - const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; + const previousEncounter = + this.mysteryEncounterSaveData.encounteredEvents.length > 0 + ? this.mysteryEncounterSaveData.encounteredEvents[ + this.mysteryEncounterSaveData.encounteredEvents.length - 1 + ].type + : null; + const disabledEncounters = + this.eventManager.getEventMysteryEncountersDisabled(); + const biomeMysteryEncounters = + mysteryEncountersByBiome + .get(this.arena.biomeType) + ?.filter((enc) => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters @@ -3425,34 +4328,57 @@ export default class BattleScene extends SceneBase { if (!encounterCandidate) { return false; } - if (this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier) { + if ( + this.eventManager.getMysteryEncounterTierForEvent( + encounterType, + encounterCandidate.encounterTier, + ) !== tier + ) { return false; } const disallowedGameModes = encounterCandidate.disallowedGameModes; - if (disallowedGameModes && disallowedGameModes.length > 0 - && disallowedGameModes.includes(this.gameMode.modeId)) { + if ( + disallowedGameModes && + disallowedGameModes.length > 0 && + disallowedGameModes.includes(this.gameMode.modeId) + ) { return false; } if (this.gameMode.modeId === GameModes.CHALLENGE) { - const disallowedChallenges = encounterCandidate.disallowedChallenges; - if (disallowedChallenges && disallowedChallenges.length > 0 && this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id))) { + const disallowedChallenges = + encounterCandidate.disallowedChallenges; + if ( + disallowedChallenges && + disallowedChallenges.length > 0 && + this.gameMode.challenges.some((challenge) => + disallowedChallenges.includes(challenge.id), + ) + ) { return false; } } if (!encounterCandidate.meetsRequirements()) { return false; } - if (previousEncounter !== null && encounterType === previousEncounter) { + if ( + previousEncounter !== null && + encounterType === previousEncounter + ) { return false; } - if (this.mysteryEncounterSaveData.encounteredEvents.length > 0 && - (encounterCandidate.maxAllowedEncounters && encounterCandidate.maxAllowedEncounters > 0) - && this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= encounterCandidate.maxAllowedEncounters) { + if ( + this.mysteryEncounterSaveData.encounteredEvents.length > 0 && + encounterCandidate.maxAllowedEncounters && + encounterCandidate.maxAllowedEncounters > 0 && + this.mysteryEncounterSaveData.encounteredEvents.filter( + (e) => e.type === encounterType, + ).length >= encounterCandidate.maxAllowedEncounters + ) { return false; } return true; }) - .map((m) => (allMysteryEncounters[m])); + .map((m) => allMysteryEncounters[m]); // Decrement tier if (tier === MysteryEncounterTier.ROGUE) { tier = MysteryEncounterTier.ULTRA; @@ -3467,10 +4393,13 @@ export default class BattleScene extends SceneBase { // If absolutely no encounters are available, spawn 0th encounter if (availableEncounters.length === 0) { - console.log("No Mystery Encounters found, falling back to Mysterious Challengers."); + console.log( + "No Mystery Encounters found, falling back to Mysterious Challengers.", + ); return allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS]; } - encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; + encounter = + availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(); diff --git a/src/data/ability.ts b/src/data/ability.ts index 95601dc2010..65da3753cde 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,6 +1,6 @@ -import type { EnemyPokemon } from "../field/pokemon"; +import type { EnemyPokemon, PokemonMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; -import { HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import { HitResult, MoveResult, PlayerPokemon } from "../field/pokemon"; import { Type } from "#enums/type"; import type { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -44,6 +44,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; export class Ability implements Localizable { public id: Abilities; @@ -143,7 +144,7 @@ export class Ability implements Localizable { } } -type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean | Promise; +type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean; type AbAttrCondition = (pokemon: Pokemon) => boolean; // TODO: Can this be improved? @@ -159,7 +160,7 @@ export abstract class AbAttr { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { return false; } @@ -215,7 +216,7 @@ export class DoubleBattleChanceAbAttr extends AbAttr { } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -250,7 +251,7 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { @@ -268,7 +269,15 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { return false; } } @@ -546,7 +555,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { * @param args `[0]` a container for the move's current type effectiveness multiplier * @returns `true` if the move's effectiveness is reduced; `false` otherwise */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + override applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { const typeMultiplier = args[0]; if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) { return false; @@ -572,7 +589,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { } export class PostDefendAbAttr extends AbAttr { - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -593,7 +618,14 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { } export class PostStatStageChangeAbAttr extends AbAttr { - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean | Promise { + applyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: integer, + selfTarget: boolean, + args: any[], + ): boolean { return false; } } @@ -1142,7 +1174,14 @@ export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChang } export class PreAttackAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean | Promise { + applyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[], + ): boolean { return false; } } @@ -1208,7 +1247,13 @@ export class VariableMovePowerAbAttr extends PreAttackAbAttr { } export class FieldPreventExplosiveMovesAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { cancelled.value = true; return true; } @@ -1562,8 +1607,15 @@ export class StatMultiplierAbAttr extends AbAttr { this.condition = condition ?? null; } - applyStatStage(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { - const move = (args[0] as Move); + applyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[], + ): boolean { + const move = args[0] as Move; if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) { statValue.value *= this.multiplier; return true; @@ -1588,7 +1640,15 @@ export class PostAttackAbAttr extends AbAttr { * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} * for an example of an effect that does not require a damaging move. */ - applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. // If attackRequired is false, we always defer to the secondary requirements. if (this.attackCondition(pokemon, defender, move)) { @@ -1601,7 +1661,15 @@ export class PostAttackAbAttr extends AbAttr { /** * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -1626,7 +1694,15 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { * @param args n/a * @returns `true` if the ability is applied */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { if (simulated) { return simulated; } @@ -1649,23 +1725,36 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { this.stealCondition = stealCondition ?? null; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.stealCondition || this.stealCondition(pokemon, defender, move)) + ) { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postAttackStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + defenderName: defender.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1742,23 +1831,37 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move)) && !move.hitsSubstitute(attacker, pokemon)) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostDefend( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult, + _args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.condition || this.condition(pokemon, attacker, move)) && + !move.hitsSubstitute(attacker, pokemon) + ) { + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postDefendStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + attackerName: attacker.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1781,7 +1884,14 @@ export class PostSetStatusAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute. * @returns `true` if application of the ability succeeds. */ - applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]) : boolean | Promise { + applyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -1823,7 +1933,7 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -1839,10 +1949,8 @@ class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { this.stages = stages; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1859,7 +1967,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -1873,7 +1981,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { return false; } } @@ -1889,10 +1997,8 @@ export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { this.stages = stages; } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1905,7 +2011,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { if (!simulated) { globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); @@ -2015,7 +2121,7 @@ export class PostSummonAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2035,7 +2141,7 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!simulated) { for (const arenaTag of this.arenaTags) { globalScene.arena.removeTag(arenaTag); @@ -2383,9 +2489,9 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt * @param pokemon - The Pokémon that triggered the ability. * @param passive - n/a * @param args - n/a - * @returns A boolean or a promise that resolves to a boolean indicating the result of the ability application. + * @returns A boolean that resolves to a boolean indicating the result of the ability application. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); const allowedParty = party.filter(p => p.isAllowedInBattle()); @@ -2445,12 +2551,11 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true, false); } - async applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): Promise { + override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): boolean { const targets = pokemon.getOpponents(); if (simulated || !targets.length) { return simulated; } - const promises: Promise[] = []; let target: Pokemon; if (targets.length > 1) { @@ -2476,41 +2581,14 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { return false; } - pokemon.summonData.speciesForm = target.getSpeciesForm(); - pokemon.summonData.gender = target.getGender(); + globalScene.unshiftPhase(new PokemonTransformPhase(pokemon.getBattlerIndex(), target.getBattlerIndex(), true)); - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - pokemon.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - pokemon.setStatStage(s, target.getStatStage(s)); - } - - pokemon.summonData.moveset = target.getMoveset().map((m) => { - if (m) { - // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. - return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); - } else { - console.warn(`Imposter: somehow iterating over a ${m} value when copying moveset!`); - return new PokemonMove(Moves.NONE); - } - }); - pokemon.summonData.types = target.getTypes(); - promises.push(pokemon.updateInfo()); - - globalScene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); - globalScene.playSound("battle_anims/PRSFX- Transform"); - promises.push(pokemon.loadAssets(false).then(() => { - pokemon.playAnim(); - pokemon.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - pokemon.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); + globalScene.queueMessage( + i18next.t("abilityTriggers:postSummonTransform", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + targetName: target.name, + }), + ); return true; } @@ -2627,13 +2705,13 @@ export class PreSwitchOutAbAttr extends AbAttr { super(true); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status) { if (!simulated) { pokemon.resetStatus(); @@ -2647,9 +2725,72 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { } } +/** + * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. + */ +export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { + /** + * @param pokemon The {@linkcode Pokemon} with the ability + * @param passive N/A + * @param args N/A + * @returns {boolean} Returns true if the weather clears, otherwise false. + */ + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; + let turnOffWeather = false; + + // Clear weather only if user's ability matches the weather and no other pokemon has the ability. + switch (weatherType) { + case WeatherType.HARSH_SUN: + if ( + pokemon.hasAbility(Abilities.DESOLATE_LAND) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.HEAVY_RAIN: + if ( + pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.STRONG_WINDS: + if ( + pokemon.hasAbility(Abilities.DELTA_STREAM) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DELTA_STREAM)).length === 0 + ) { + turnOffWeather = true; + } + break; + } + + if (simulated) { + return turnOffWeather; + } + + if (turnOffWeather) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + return true; + } + + return false; + } +} export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!pokemon.isFullHp()) { if (!simulated) { const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); @@ -2685,7 +2826,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { * @param args N/A * @returns true if the form change was successful */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -2700,7 +2841,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { } export class PreLeaveFieldAbAttr extends AbAttr { - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2715,7 +2856,7 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { * @param args N/A * @returns Returns `true` if the weather clears, otherwise `false`. */ - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const weatherType = globalScene.arena.weather?.weatherType; let turnOffWeather = false; @@ -2755,7 +2896,14 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { } export class PreStatStageChangeAbAttr extends AbAttr { - applyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2878,7 +3026,14 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { } export class PreSetStatusAbAttr extends AbAttr { - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2944,7 +3099,14 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3139,7 +3301,14 @@ export class ChangeMovePriorityAbAttr extends AbAttr { export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { - applyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreWeatherEffect( + pokemon: Pokemon, + passive: Boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3420,7 +3589,13 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean | Promise { + applyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[], + ): boolean { return false; } @@ -3516,7 +3691,7 @@ function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -3542,7 +3717,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { * @param {any[]} args N/A * @returns Returns true if healed from status, false if not */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status && this.effects.includes(pokemon.status.effect)) { if (!pokemon.isFullHp()) { if (!simulated) { @@ -3776,7 +3951,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { * @param args N/A * @returns `true` if any opponents are sleeping */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { @@ -3870,7 +4045,14 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { - applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + applyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -3891,7 +4073,14 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * * @return true if the Dancer ability was resolved */ - applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + override applyPostMoveUsed( + dancer: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { // List of tags that prevent the Dancer from replicating the move const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; @@ -3933,7 +4122,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @extends AbAttr */ export class PostItemLostAbAttr extends AbAttr { - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { return false; } } @@ -3954,7 +4143,7 @@ export class PostItemLostApplyBattlerTagAbAttr extends PostItemLostAbAttr { * @param args N/A * @returns true if BattlerTag was applied */ - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { if (!pokemon.getTag(this.tagType) && !simulated) { pokemon.addTag(this.tagType); return true; @@ -3980,7 +4169,13 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { } export class StatStageChangeCopyAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); } @@ -4096,7 +4291,14 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { + applyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[], + ): boolean { return false; } } @@ -4170,7 +4372,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { if (!simulated && postBattleLoot.length && args[0]) { const randItem = Utils.randSeedItem(postBattleLoot); //@ts-ignore - TODO see below - if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { // TODO: fix. This is a promise!? + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); return true; @@ -4841,7 +5043,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { * Checks if the Pokemon should change types if summoned into an active terrain * @returns `true` if there is an active terrain requiring a type change | `false` if not */ - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (globalScene.arena.getTerrainType() !== TerrainType.NONE) { return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); } @@ -4860,27 +5062,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } } -async function applyAbAttrsInternal( - attrType: Constructor, - pokemon: Pokemon | null, - applyFunc: AbAttrApplyFunc, - args: any[], - showAbilityInstant: boolean = false, - simulated: boolean = false, - messages: string[] = [], - gainedMidTurn: boolean = false -) { - for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; - } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); - } -} - -async function applySingleAbAttrs( +function applySingleAbAttrs( pokemon: Pokemon, passive: boolean, attrType: Constructor, @@ -4903,13 +5085,7 @@ async function applySingleAbAttrs( } globalScene.setPhaseQueueSplice(); - - let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked - if (result instanceof Promise) { - result = await result; - } - if (result) { + if (applyFunc(attr, passive)) { if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { pokemon.summonData.abilitiesApplied.push(ability.id); } @@ -5074,7 +5250,14 @@ function calculateShellBellRecovery(pokemon: Pokemon): number { * @extends AbAttr */ export class PostDamageAbAttr extends AbAttr { - public applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { return false; } } @@ -5111,7 +5294,14 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { * @param source The Pokemon that dealt damage * @returns `true` if the switch-out logic was successfully applied */ - public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public override applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { const moveHistory = pokemon.getMoveHistory(); // Will not activate when the Pokémon's HP is lowered by cutting its own HP const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; @@ -5165,44 +5355,164 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { return this.helper.getFailedText(target); } } +function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon | null, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + simulated: boolean = false, + messages: string[] = [], + gainedMidTurn: boolean = false +) { + for (const passive of [ false, true ]) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + continue; + } - -export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); + } } -export function applyPostBattleInitAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), args, false, simulated); +export function applyAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); +export function applyPostBattleInitAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPreDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostMoveUsedAbAttrs(attrType: Constructor, - pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, false, simulated); +export function applyPostDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args); -} -export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated); +export function applyPostMoveUsedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDamageAbAttrs(attrType: Constructor, - pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean = false, args: any[], source?: Pokemon): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), args); +export function applyStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: BattleStat, + statValue: Utils.NumberHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), + args, + ); +} +export function applyPostSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect, + sourcePokemon?: Pokemon | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), + args, + false, + simulated, + ); +} + +export function applyPostDamageAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean = false, + args: any[], + source?: Pokemon, +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), + args, + ); } /** @@ -5215,109 +5525,369 @@ export function applyPostDamageAbAttrs(attrType: Constructor, * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat * @param args unused */ -export function applyFieldStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args); +export function applyFieldStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: Stat, + statValue: Utils.NumberHolder, + checkedPokemon: Pokemon, + hasApplied: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), + args, + ); } -export function applyPreAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon | null, move: Move, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), args, false, simulated); +export function applyPreAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon | null, + move: Move, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), + args, + false, + simulated, + ); } -export function applyPostAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, false, simulated); +export function applyPostAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostKnockOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, knockedOut: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, false, simulated); +export function applyPostKnockOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + knockedOut: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + args, + false, + simulated, + ); } -export function applyPostVictoryAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostVictoryAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostSummonAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostSummonAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPreSwitchOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreSwitchOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), + args, + true, + simulated, + ); } -export function applyPreLeaveFieldAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreLeaveFieldAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + return applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyPreLeaveField(pokemon, passive, simulated, args), + args, + true, + simulated + ); } -export function applyPreStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated); +export function applyPreStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon | null, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, stats: BattleStat[], stages: number, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, false, simulated); +export function applyPostStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stats: BattleStat[], + stages: integer, + selfTarget: boolean, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), + args, + false, + simulated, + ); } -export function applyPreSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, false, simulated); +export function applyPreSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, - pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, false, simulated); +export function applyPreApplyBattlerTagAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreWeatherEffectAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, true, simulated); +export function applyPreWeatherEffectAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), + args, + true, + simulated, + ); } -export function applyPostTurnAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostTurnAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostWeatherChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: WeatherType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: WeatherType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostWeatherLapseAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherLapseAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostTerrainChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, terrain: TerrainType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, false, simulated); +export function applyPostTerrainChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + terrain: TerrainType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), + args, + false, + simulated, + ); } -export function applyCheckTrappedAbAttrs(attrType: Constructor, - pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, false, simulated, messages); +export function applyCheckTrappedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + messages: string[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), + args, + false, + simulated, + messages, + ); } -export function applyPostBattleAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostBattleAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPostFaintAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker?: Pokemon, + move?: Move, + hitResult?: HitResult, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostItemLostAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), args); +export function applyPostItemLostAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), + args, + ); } /** diff --git a/src/data/move.ts b/src/data/move.ts index acc68eb6a26..658534eb48f 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,5 +1,16 @@ -import { ChargeAnim, initMoveAnim, loadMoveAnimAssets, MoveChargeAnim } from "./battle-anims"; -import { CommandedTag, EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, SubstituteTag, TrappedTag, TypeBoostTag } from "./battler-tags"; +import { ChargeAnim, MoveChargeAnim } from "./battle-anims"; +import { + CommandedTag, + EncoreTag, + GulpMissileTag, + HelpingHandTag, + SemiInvulnerableTag, + ShellTrapTag, + StockpilingTag, + SubstituteTag, + TrappedTag, + TypeBoostTag, +} from "./battler-tags"; import { getPokemonNameWithAffix } from "../messages"; import type { AttackMoveResult, TurnMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; @@ -30,7 +41,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, EFFECTIVE_STATS, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { BATTLE_STATS, type BattleStat, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -46,6 +57,10 @@ import { applyChallenges, ChallengeType } from "./challenge"; import { SwitchType } from "#enums/switch-type"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; +import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; +import { MoveAnimPhase } from "#app/phases/move-anim-phase"; export enum MoveCategory { PHYSICAL, @@ -1057,7 +1072,7 @@ export abstract class MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean { return true; } @@ -1200,7 +1215,7 @@ export class MoveEffectAttr extends MoveAttr { } /** Applies move effects so long as they are able based on {@linkcode canApply} */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { return this.canApply(user, target, move, args); } @@ -1866,7 +1881,7 @@ export class FlameBurstAttr extends MoveEffectAttr { * @param args - n/a * @returns A boolean indicating whether the effect was successfully applied. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const targetAlly = target.getAlly(); const cancelled = new Utils.BooleanHolder(false); @@ -2406,32 +2421,27 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { this.chance = chance; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (move.hitsSubstitute(user, target)) { - return resolve(false); - } - const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) { - return resolve(false); - } - const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferable); - if (heldItems.length) { - const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? - const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); - } - resolve(success); - }); - return; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (move.hitsSubstitute(user, target)) { + return false; + } - resolve(false); - }); + const rand = Phaser.Math.RND.realInRange(0, 1); + if (rand >= this.chance) { + return false; + } + const heldItems = this.getTargetHeldItems(target).filter((i) => i.isTransferable); + if (heldItems.length) { + const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const highestItemTier = heldItems.map((m) => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? + const tierHeldItems = heldItems.filter((m) => m.type.getOrInferTier(poolType) === highestItemTier); + const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, user, false)) { + globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); + return true; + } + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -2875,9 +2885,7 @@ export class WeatherInstantChargeAttr extends InstantChargeAttr { } export class OverrideMoveEffectAttr extends MoveAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - //const overridden = args[0] as Utils.BooleanHolder; - //const virtual = arg[1] as boolean; + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return true; } } @@ -2903,26 +2911,27 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { this.chargeText = chargeText; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // Edge case for the move applied on a pokemon that has fainted if (!target) { - return Promise.resolve(true); + return true; } - const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - return new Promise(resolve => { - if (args.length < 2 || !args[1]) { - new MoveChargeAnim(this.chargeAnim, move.id, user).play(false, () => { - (args[0] as Utils.BooleanHolder).value = true; - globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); - globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); - resolve(true); - }); - } else { - globalScene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name }), null, () => resolve(true)); - } - }); + const overridden = args[0] as Utils.BooleanHolder; + const virtual = args[1] as boolean; + + if (!virtual) { + overridden.value = true; + globalScene.unshiftPhase(new MoveAnimPhase(new MoveChargeAnim(this.chargeAnim, move.id, user))); + globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); + user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); + const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); + } else { + globalScene.queueMessage(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name })); + } + + return true; } } @@ -3053,7 +3062,7 @@ export class StatStageChangeAttr extends MoveEffectAttr { * @param args unused * @returns whether stat stages were changed */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; } @@ -3131,7 +3140,7 @@ export class SecretPowerAttr extends MoveEffectAttr { * Used to apply the secondary effect to the target Pokemon * @returns `true` if a secondary effect is successfully applied */ - override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } @@ -3286,8 +3295,8 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr { super(); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const randStats = BATTLE_STATS.filter((s) => target.getStatStage(s) < 6); if (randStats.length > 0) { const boostStat = [ randStats[user.randSeedInt(randStats.length)] ]; globalScene.unshiftPhase(new StatStageChangePhase(target.getBattlerIndex(), this.selfTarget, boostStat, 2)); @@ -3324,17 +3333,14 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { this.messageCallback = messageCallback; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - if (this.messageCallback) { - this.messageCallback(user); - } - resolve(ret); - }); - }); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); + user.updateInfo(); + const ret = super.apply(user, target, move, args); + if (this.messageCallback) { + this.messageCallback(user); + } + return ret; } getCondition(): MoveConditionFunc { @@ -3426,28 +3432,27 @@ export class ResetStatsAttr extends MoveEffectAttr { super(); this.targetAllPokemon = targetAllPokemon; } - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - const promises: Promise[] = []; - if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used + + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (this.targetAllPokemon) { + // Target all pokemon on the field when Freezy Frost or Haze are used const activePokemon = globalScene.getField(true); - activePokemon.forEach(p => promises.push(this.resetStats(p))); + activePokemon.forEach((p) => this.resetStats(p)); globalScene.queueMessage(i18next.t("moveTriggers:statEliminated")); } else { // Affects only the single target when Clear Smog is used if (!move.hitsSubstitute(user, target)) { - promises.push(this.resetStats(target)); + this.resetStats(target); globalScene.queueMessage(i18next.t("moveTriggers:resetStats", { pokemonName: getPokemonNameWithAffix(target) })); } } - - await Promise.all(promises); return true; } - async resetStats(pokemon: Pokemon): Promise { + private resetStats(pokemon: Pokemon): void { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, 0); } - return pokemon.updateInfo(); + pokemon.updateInfo(); } } @@ -3503,43 +3508,28 @@ export class SwapStatStagesAttr extends MoveEffectAttr { } export class HpSplitAttr extends MoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) { - return resolve(false); - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } - const infoUpdates: Promise[] = []; - - const hpValue = Math.floor((target.hp + user.hp) / 2); - if (user.hp < hpValue) { - const healing = user.heal(hpValue - user.hp); + const hpValue = Math.floor((target.hp + user.hp) / 2); + [ user, target ].forEach((p) => { + if (p.hp < hpValue) { + const healing = p.heal(hpValue - p.hp); if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); + globalScene.damageNumberHandler.add(p, healing, HitResult.HEAL); } - } else if (user.hp > hpValue) { - const damage = user.damage(user.hp - hpValue, true); + } else if (p.hp > hpValue) { + const damage = p.damage(p.hp - hpValue, true); if (damage) { - globalScene.damageNumberHandler.add(user, damage); + globalScene.damageNumberHandler.add(p, damage); } } - infoUpdates.push(user.updateInfo()); - - if (target.hp < hpValue) { - const healing = target.heal(hpValue - target.hp); - if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); - } - } else if (target.hp > hpValue) { - const damage = target.damage(target.hp - hpValue, true); - if (damage) { - globalScene.damageNumberHandler.add(target, damage); - } - } - infoUpdates.push(target.updateInfo()); - - return Promise.all(infoUpdates).then(() => resolve(true)); + p.updateInfo(); }); + + return true; } } @@ -6024,44 +6014,44 @@ export class RevivalBlessingAttr extends MoveEffectAttr { * @param args N/A * @returns Promise, true if function succeeds. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - // If user is player, checks if the user has fainted pokemon - if (user instanceof PlayerPokemon - && globalScene.getPlayerParty().findIndex(p => p.isFainted()) > -1) { - (user as PlayerPokemon).revivalBlessing().then(() => { - resolve(true); - }); - // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party - } else if (user instanceof EnemyPokemon - && user.hasTrainer() - && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { - // Selects a random fainted pokemon - const faintedPokemon = globalScene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); - const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; - const slotIndex = globalScene.getEnemyParty().findIndex(p => pokemon.id === p.id); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // If user is player, checks if the user has fainted pokemon + if (user instanceof PlayerPokemon) { + globalScene.unshiftPhase(new RevivalBlessingPhase(user)); + return true; + } else if (user instanceof EnemyPokemon && user.hasTrainer() && globalScene.getEnemyParty().findIndex((p) => p.isFainted() && !p.isBoss()) > -1) { + // If used by an enemy trainer with at least one fainted non-boss Pokemon, this + // revives one of said Pokemon selected at random. + const faintedPokemon = globalScene.getEnemyParty().filter((p) => p.isFainted() && !p.isBoss()); + const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; + const slotIndex = globalScene.getEnemyParty().findIndex((p) => pokemon.id === p.id); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); - if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { - const allyPokemon = user.getAlly(); - if (slotIndex <= 1) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); - } else if (allyPokemon.isFainted()) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); - } + if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { + const allyPokemon = user.getAlly(); + if (slotIndex <= 1) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); + } else if (allyPokemon.isFainted()) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } - resolve(true); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - resolve(false); } - }); + return true; + } + return false; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - if (user.hasTrainer() && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { + getCondition(): MoveConditionFunc { + return (user, target, move) => + (user instanceof PlayerPokemon && globalScene.getPlayerParty().some((p) => p.isFainted())) || + (user instanceof EnemyPokemon && + user.hasTrainer() && + globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())); + } + + override getUserBenefitScore(user: Pokemon, _target: Pokemon, _move: Move): number { + if (user.hasTrainer() && globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())) { return 20; } @@ -6579,7 +6569,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { class CallMoveAttr extends OverrideMoveEffectAttr { protected invalidMoves: Moves[]; protected hasTarget: boolean; - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined; const moveTargets = getMoveTargets(user, move.id, replaceMoveTarget); if (moveTargets.targets.length === 0) { @@ -6589,11 +6579,8 @@ class CallMoveAttr extends OverrideMoveEffectAttr { ? moveTargets.targets : [ this.hasTarget ? target.getBattlerIndex() : moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; // account for Mirror Move having a target already user.getMoveQueue().push({ move: move.id, targets: targets, virtual: true, ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(move.id)); globalScene.unshiftPhase(new MovePhase(user, targets, new PokemonMove(move.id, 0, 0, true), true, true)); - - await Promise.resolve(initMoveAnim(move.id).then(() => { - loadMoveAnimAssets([ move.id ], true); - })); return true; } } @@ -6626,7 +6613,7 @@ export class RandomMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); let moveId: Moves = Moves.NONE; do { @@ -6663,7 +6650,7 @@ export class RandomMovesetMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return super.apply(user, target, allMoves[this.moveId], args); } @@ -6965,145 +6952,141 @@ const invalidCopycatMoves = [ ]; export class NaturePowerAttr extends OverrideMoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - let moveId; - switch (globalScene.arena.getTerrainType()) { - // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (globalScene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; - break; - case Biome.METROPOLIS: - moveId = Moves.TRI_ATTACK; - break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } - break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; - break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; - break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; - break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; - break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; - break; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + let moveId; + switch (globalScene.arena.getTerrainType()) { + // this allows terrains to 'override' the biome move + case TerrainType.NONE: + switch (globalScene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; + break; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; + break; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; + break; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; + break; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; + break; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; + break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } + break; + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match + moveId = Moves.TRI_ATTACK; + break; + } - user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); - globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(moveId).then(() => { - loadMoveAnimAssets([ moveId ], true) - .then(() => resolve(true)); - }); - }); + user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(moveId)); + globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); + return true; } } @@ -7121,7 +7104,7 @@ export class CopyMoveAttr extends CallMoveAttr { this.invalidMoves = invalidMoves; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { this.hasTarget = this.mirrorMove; const lastMove = this.mirrorMove ? target.getLastXMoves()[0].move : globalScene.currentBattle.lastMove; return super.apply(user, target, allMoves[lastMove], args); @@ -7682,50 +7665,15 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * Used by Transform */ export class TransformAttr extends MoveEffectAttr { - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - const promises: Promise[] = []; - user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.gender = target.getGender(); - - // Power Trick's effect will not preserved after using Transform - user.removeTag(BattlerTagType.POWER_TRICK); - - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - user.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - user.setStatStage(s, target.getStatStage(s)); - } - - user.summonData.moveset = target.getMoveset().map((m) => { - if (m) { - // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. - return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); - } else { - console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); - return new PokemonMove(Moves.NONE); - } - }); - user.summonData.types = target.getTypes(); - promises.push(user.updateInfo()); + globalScene.unshiftPhase(new PokemonTransformPhase(user.getBattlerIndex(), target.getBattlerIndex())); globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - promises.push(user.loadAssets(false).then(() => { - user.playAnim(); - user.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - user.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); return true; } } @@ -8128,44 +8076,54 @@ const attackedByItemMessageFunc = (user: Pokemon, target: Pokemon, move: Move) = export type MoveAttrFilter = (attr: MoveAttr) => boolean; -function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const attrPromises: Promise[] = []; - const moveAttrs = move.attrs.filter(a => attrFilter(a)); - for (const attr of moveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - attrPromises.push(result); - } - } - Promise.allSettled(attrPromises).then(() => resolve()); - }); +function applyMoveAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + args: any[], +): void { + move.attrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -function applyMoveChargeAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, args: any[]): Promise { - return new Promise(resolve => { - const chargeAttrPromises: Promise[] = []; - const chargeMoveAttrs = move.chargeAttrs.filter(a => attrFilter(a)); - for (const attr of chargeMoveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - chargeAttrPromises.push(result); - } - } - Promise.allSettled(chargeAttrPromises).then(() => resolve()); - }); +function applyMoveChargeAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + args: any[], +): void { + move.chargeAttrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } -export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal(attrFilter, user, target, move, args); +export function applyFilteredMoveAttrs( + attrFilter: MoveAttrFilter, + user: Pokemon, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal(attrFilter, user, target, move, args); } -export function applyMoveChargeAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, ...args: any[]): Promise { - return applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveChargeAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + ...args: any[] +): void { + applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } export class MoveCondition { diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index ca6b384cfbb..7d3f6f4c5bc 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -151,7 +151,7 @@ async function spawnNextTrainerOrEndEncounter() { // Give 10x Voucher const newModifier = modifierTypes.VOUCHER_PREMIUM().newModifier(); - await globalScene.addModifier(newModifier); + globalScene.addModifier(newModifier); globalScene.playSound("item_fanfare"); await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index f7c70cb7052..454d179c003 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -406,7 +406,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { // Copy old items to new pokemon for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; - await globalScene.addModifier(item, false, false, false, true); + globalScene.addModifier(item, false, false, false, true); } // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats if (shouldGetOldGateau(newPokemon)) { @@ -416,7 +416,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 580aaaf2cc6..be7d11d6cf1 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -326,7 +326,7 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE); const modifier = modType?.newModifier(pokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); pokemon.calculateStats(); } } @@ -359,7 +359,7 @@ export async function applyModifierTypeToPlayerPokemon(pokemon: PlayerPokemon, m return applyModifierTypeToPlayerPokemon(pokemon, fallbackModifierType); } - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 246f82b8164..214c667f1c1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -104,7 +104,6 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; @@ -4510,43 +4509,6 @@ export class PlayerPokemon extends Pokemon { this.friendship = Math.max(this.friendship + friendship, 0); } } - /** - * Handles Revival Blessing when used by player. - * @returns Promise to revive a pokemon. - * @see {@linkcode RevivalBlessingAttr} - */ - revivalBlessing(): Promise { - return new Promise(resolve => { - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:number, option: PartyOption) => { - if (slotIndex >= 0 && slotIndex < 6) { - const pokemon = globalScene.getPlayerParty()[slotIndex]; - if (!pokemon || !pokemon.isFainted()) { - resolve(); - } - - pokemon.resetTurnData(); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); - - if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { - const allyPokemon = this.getAlly(); - if (slotIndex <= 1) { - // Revived ally pokemon - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } else if (allyPokemon.isFainted()) { - // Revived party pokemon, and ally pokemon is fainted - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } - } - - } - globalScene.ui.setMode(Mode.MESSAGE).then(() => resolve()); - }, PartyUiHandler.FilterFainted); - }); - } getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { if (!evolution) { @@ -4728,70 +4690,62 @@ export class PlayerPokemon extends Pokemon { } /** - * Returns a Promise to fuse two PlayerPokemon together - * @param pokemon The PlayerPokemon to fuse to this one - */ - fuse(pokemon: PlayerPokemon): Promise { - return new Promise(resolve => { - this.fusionSpecies = pokemon.species; - this.fusionFormIndex = pokemon.formIndex; - this.fusionAbilityIndex = pokemon.abilityIndex; - this.fusionShiny = pokemon.shiny; - this.fusionVariant = pokemon.variant; - this.fusionGender = pokemon.gender; - this.fusionLuck = pokemon.luck; - this.fusionCustomPokemonData = pokemon.customPokemonData; - if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { - this.pauseEvolutions = true; - } + * Returns a Promise to fuse two PlayerPokemon together + * @param pokemon The PlayerPokemon to fuse to this one + */ + fuse(pokemon: PlayerPokemon): void { + this.fusionSpecies = pokemon.species; + this.fusionFormIndex = pokemon.formIndex; + this.fusionAbilityIndex = pokemon.abilityIndex; + this.fusionShiny = pokemon.shiny; + this.fusionVariant = pokemon.variant; + this.fusionGender = pokemon.gender; + this.fusionLuck = pokemon.luck; + this.fusionCustomPokemonData = pokemon.customPokemonData; + if (pokemon.pauseEvolutions || this.pauseEvolutions) { + this.pauseEvolutions = true; + } - globalScene.validateAchv(achvs.SPLICE); - globalScene.gameData.gameStats.pokemonFused++; + globalScene.validateAchv(achvs.SPLICE); + globalScene.gameData.gameStats.pokemonFused++; - // Store the average HP% that each Pokemon has - const maxHp = this.getMaxHp(); - const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2; + // Store the average HP% that each Pokemon has + const maxHp = this.getMaxHp(); + const newHpPercent = (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; - this.generateName(); - this.calculateStats(); + this.generateName(); + this.calculateStats(); - // Set this Pokemon's HP to the average % of both fusion components - this.hp = Math.round(maxHp * newHpPercent); - if (!this.isFainted()) { - // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum - this.hp = Math.min(this.hp, maxHp); - this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two - } else if (!pokemon.isFainted()) { - // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero - this.hp = Math.max(this.hp, 1); - this.status = pokemon.status; // Inherit the other Pokemon's status - } + // Set this Pokemon's HP to the average % of both fusion components + this.hp = Math.round(maxHp * newHpPercent); + if (!this.isFainted()) { + // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum + this.hp = Math.min(this.hp, maxHp); + this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two + } else if (!pokemon.isFainted()) { + // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero + this.hp = Math.max(this.hp, 1); + this.status = pokemon.status; // Inherit the other Pokemon's status + } - this.generateCompatibleTms(); - this.updateInfo(true); - const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); - let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); - if (partyMemberIndex > fusedPartyMemberIndex) { - partyMemberIndex--; - } - const fusedPartyMemberHeldModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; - const transferModifiers: Promise[] = []; - for (const modifier of fusedPartyMemberHeldModifiers) { - transferModifiers.push(globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false)); - } - Promise.allSettled(transferModifiers).then(() => { - globalScene.updateModifiers(true, true).then(() => { - globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); - globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; - const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); - pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); - pokemon.destroy(); - this.updateFusionPalette(); - resolve(); - }); - }); - }); + this.generateCompatibleTms(); + this.updateInfo(true); + const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); + let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); + if (partyMemberIndex > fusedPartyMemberIndex) { + partyMemberIndex--; + } + const fusedPartyMemberHeldModifiers = globalScene.findModifiers((m) => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + for (const modifier of fusedPartyMemberHeldModifiers) { + globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false); + } + globalScene.updateModifiers(true, true); + globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); + globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; + const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); + pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); + pokemon.destroy(); + this.updateFusionPalette(); } unfuse(): Promise { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 3af2aa2144f..f6a69fcca2d 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -158,7 +158,7 @@ export abstract class Modifier { * Handles applying of {@linkcode Modifier} * @param args collection of all passed parameters */ - abstract apply(...args: unknown[]): boolean | Promise; + abstract apply(...args: unknown[]): boolean; } export abstract class PersistentModifier extends Modifier { @@ -1949,7 +1949,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item * @param args Additional arguments passed to {@linkcode ConsumablePokemonModifier.apply} */ - abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean | Promise; + abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean; getPokemon() { return globalScene.getPlayerParty().find(p => p.id === this.pokemonId); @@ -2288,8 +2288,8 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @param playerPokemon2 {@linkcode PlayerPokemon} that should be fused with {@linkcode playerPokemon} * @returns always Promise */ - override async apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): Promise { - await playerPokemon.fuse(playerPokemon2); + override apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): boolean { + playerPokemon.fuse(playerPokemon2); return true; } } @@ -3136,8 +3136,6 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const heldItemTransferPromises: Promise[] = []; - for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { while (highestItemTier-- && !tierItemModifiers.length) { @@ -3149,19 +3147,15 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; - heldItemTransferPromises.push(globalScene.tryTransferHeldItemModifier(randItem, pokemon, false).then(success => { - if (success) { - transferredModifierTypes.push(randItem.type); - itemModifiers.splice(randItemIndex, 1); - } - })); + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, false)) { + transferredModifierTypes.push(randItem.type); + itemModifiers.splice(randItemIndex, 1); + } } - Promise.all(heldItemTransferPromises).then(() => { - for (const mt of transferredModifierTypes) { - globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); - } - }); + for (const mt of transferredModifierTypes) { + globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); + } return !!transferredModifierTypes.length; } diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index d79b4f6eca5..f504fd0aaa2 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -21,6 +21,7 @@ export class AddEnemyBuffModifierPhase extends Phase { for (let i = 0; i < count; i++) { globalScene.addEnemyModifier(getEnemyBuffModifierForWave(tier, globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false)), true, true); } - globalScene.updateModifiers(false, true).then(() => this.end()); + globalScene.updateModifiers(false, true); + this.end(); } } diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index edffd8498d6..c0922b91809 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -63,6 +63,7 @@ export class BattleEndPhase extends BattlePhase { } } - globalScene.updateModifiers().then(() => this.end()); + globalScene.updateModifiers(); + this.end(); } } diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index c98bb5fff04..93f53bf38c0 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -12,16 +12,22 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - // Sound loaded into game as is - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.fadeIn(250).then(() => { - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => { + globalScene.addModifier(newModifier); + // Sound loaded into game as is + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.fadeIn(250).then(() => { + globalScene.ui.showText( + i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), + null, + () => { globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); resolve(); - }, null, true, 1500); - }); + }, + null, + true, + 1500, + ); }); }); } diff --git a/src/phases/load-move-anim-phase.ts b/src/phases/load-move-anim-phase.ts new file mode 100644 index 00000000000..66cb90744e0 --- /dev/null +++ b/src/phases/load-move-anim-phase.ts @@ -0,0 +1,20 @@ +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import type { Moves } from "#enums/moves"; +import { Phase } from "#app/phase"; + +/** + * Phase for synchronous move animation loading. + * Should be used when a move invokes another move that + * isn't already loaded (e.g. for Metronome) + */ +export class LoadMoveAnimPhase extends Phase { + constructor(protected moveId: Moves) { + super(); + } + + public override start(): void { + initMoveAnim(this.moveId) + .then(() => loadMoveAnimAssets([ this.moveId ], true)) + .then(() => this.end()); + } +} diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 1cdfd6b2721..e4fac33767f 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -22,10 +22,9 @@ export class ModifierRewardPhase extends BattlePhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("item_fanfare"); - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("item_fanfare"); + globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); }); } } diff --git a/src/phases/move-anim-phase.ts b/src/phases/move-anim-phase.ts new file mode 100644 index 00000000000..005445924a0 --- /dev/null +++ b/src/phases/move-anim-phase.ts @@ -0,0 +1,20 @@ +import type { MoveAnim } from "#app/data/battle-anims"; +import { Phase } from "#app/phase"; + +/** + * Plays the given {@linkcode MoveAnim} sequentially. + */ +export class MoveAnimPhase extends Phase { + constructor( + protected anim: Anim, + protected onSubstitute: boolean = false, + ) { + super(); + } + + public override start(): void { + super.start(); + + this.anim.play(this.onSubstitute, () => this.end()); + } +} diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index b0925f1f6cb..6eccdd20254 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -44,10 +44,9 @@ export class MoveChargePhase extends PokemonPhase { new MoveChargeAnim(move.chargeAnim, move.id, user).play(false, () => { move.showChargeText(user, target); - applyMoveChargeAttrs(MoveEffectAttr, user, target, move).then(() => { - user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); - this.end(); - }); + applyMoveChargeAttrs(MoveEffectAttr, user, target, move); + user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); + this.end(); }); } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 65d8d95cde6..f878cb40e2e 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -61,7 +61,7 @@ import { PokemonMultiHitModifier, } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; -import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; +import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils"; import { type nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; @@ -143,86 +143,86 @@ export class MoveEffectPhase extends PokemonPhase { const move = this.move.getMove(); // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual).then(() => { - // If other effects were overriden, stop this phase before they can be applied - if (overridden.value) { - return this.end(); + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual); + + // If other effects were overriden, stop this phase before they can be applied + if (overridden.value) { + return this.end(); + } + + user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + + // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that + // the move executes correctly (ensures all hits of a multi-hit are properly calculated) + if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { + user.turnData.hitsLeft = -1; + user.turnData.hitCount = 0; + user.turnData.extraTurns--; + } + + /** + * If this phase is for the first hit of the invoked move, + * resolve the move's total hit count. This block combines the + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ + if (user.turnData.hitsLeft === -1) { + const hitCount = new NumberHolder(1); + // Assume single target for multi hit + applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); + // If Parental Bond is applicable, add another hit + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); + // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses + globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); + // Set the user's relevant turnData fields to reflect the final hit count + user.turnData.hitCount = hitCount.value; + user.turnData.hitsLeft = hitCount.value; + } + + /** + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ + const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; + + /** + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ + const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); + const hasActiveTargets = targets.some(t => t.isActive(true)); + + /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ + const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) + && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) + && !targets[0]?.getTag(SemiInvulnerableTag); + + const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + + /** + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ + if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + this.stopMultiHit(); + if (hasActiveTargets) { + globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); + moveHistoryEntry.result = MoveResult.MISS; + applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); + } else { + globalScene.queueMessage(i18next.t("battle:attackFailed")); + moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); + return this.end(); + } - user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - - // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that - // the move executes correctly (ensures all hits of a multi-hit are properly calculated) - if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { - user.turnData.hitsLeft = -1; - user.turnData.hitCount = 0; - user.turnData.extraTurns--; - } - - /** - * If this phase is for the first hit of the invoked move, - * resolve the move's total hit count. This block combines the - * effects of the move itself, Parental Bond, and Multi-Lens to do so. - */ - if (user.turnData.hitsLeft === -1) { - const hitCount = new NumberHolder(1); - // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); - // If Parental Bond is applicable, add another hit - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); - // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses - globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); - // Set the user's relevant turnData fields to reflect the final hit count - user.turnData.hitCount = hitCount.value; - user.turnData.hitsLeft = hitCount.value; - } - - /** - * Log to be entered into the user's move history once the move result is resolved. - * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully - * used in the sense of "Does it have an effect on the user?". - */ - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - - /** - * Stores results of hit checks of the invoked move against all targets, organized by battler index. - * @see {@linkcode hitCheck} - */ - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); - const hasActiveTargets = targets.some(t => t.isActive(true)); - - /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) - && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0]?.getTag(SemiInvulnerableTag); - - const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); - - /** - * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target - * (and not random target) and failed the hit check against its target (MISS), log the move - * as FAILed or MISSed (depending on the conditions above) and end this phase. - */ - if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { - this.stopMultiHit(); - if (hasActiveTargets) { - globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); - moveHistoryEntry.result = MoveResult.MISS; - applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - moveHistoryEntry.result = MoveResult.FAIL; - } - user.pushMoveHistory(moveHistoryEntry); - return this.end(); - } - - /** All move effect attributes are chained together in this array to be applied asynchronously. */ - const applyAttrs: Promise[] = []; - - const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; - // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => { + const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; + // Move animation only needs one target + new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play( + move.hitsSubstitute(user, this.getFirstTarget()!), + () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; @@ -313,7 +313,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's first strike? */ - const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstHit = user.turnData.hitsLeft === user.turnData.hitCount; // Only log the move's result on the first strike if (firstHit) { @@ -363,7 +363,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's last strike? */ - const lastHit = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()); + const lastHit = user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive(); /** * If the user can change forms by using the invoked move, @@ -381,43 +381,29 @@ export class MoveEffectPhase extends PokemonPhase { } } - /** - * Create a Promise that applies *all* effects from the invoked move's MoveEffectAttrs. - * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger - * type requires different conditions to be met with respect to the move's hit result. - */ - const k = new Promise((resolve) => { - //Start promise chain and apply PRE_APPLY move attributes - let promiseChain: Promise = applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.PRE_APPLY - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit) - && hitResult !== HitResult.NO_EFFECT, user, target, move); + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.PRE_APPLY && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + hitResult !== HitResult.NO_EFFECT, + user, + target, + move, + ); - /** Don't complete if the move failed */ - if (hitResult === HitResult.FAIL) { - return resolve(); - } - - /** Apply Move/Ability Effects in correct order */ - promiseChain = promiseChain - .then(this.applySelfTargetEffects(user, target, firstHit, lastHit)); + if (hitResult !== HitResult.FAIL) { + this.applySelfTargetEffects(user, target, firstHit, lastHit); if (hitResult !== HitResult.NO_EFFECT) { - promiseChain - .then(this.applyPostApplyEffects(user, target, firstHit, lastHit)) - .then(this.applyHeldItemFlinchCheck(user, target, dealsDamage)) - .then(this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget)) - .then(() => resolve()); + this.applyPostApplyEffects(user, target, firstHit, lastHit); + this.applyHeldItemFlinchCheck(user, target, dealsDamage); + this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget); } else { - promiseChain - .then(() => applyMoveAttrs(NoEffectAttr, user, null, move)) - .then(resolve); + applyMoveAttrs(NoEffectAttr, user, null, move); } - }); - - applyAttrs.push(k); + } } // Apply queued phases @@ -425,41 +411,35 @@ export class MoveEffectPhase extends PokemonPhase { globalScene.appendToPhase(queuedPhases, MoveEndPhase); } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved - const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : - null; - - if (postTarget) { - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1].then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); - } + if (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) { + applyFilteredMoveAttrs( + (attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, + user, + null, + move, + ); } - // Wait for all move effects to finish applying, then end this phase - Promise.allSettled(applyAttrs).then(() => { - /** - * Remove the target's substitute (if it exists and has expired) - * after all targeted effects have applied. - * This prevents blocked effects from applying until after this hit resolves. - */ - targets.forEach(target => { - const substitute = target.getTag(SubstituteTag); - if (substitute && substitute.hp <= 0) { - target.lapseTag(BattlerTagType.SUBSTITUTE); - } - }); - - const moveType = user.getMoveType(move, true); - if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { - user.stellarTypesBoosted.push(moveType); + /** + * Remove the target's substitute (if it exists and has expired) + * after all targeted effects have applied. + * This prevents blocked effects from applying until after this hit resolves. + */ + targets.forEach((target) => { + const substitute = target.getTag(SubstituteTag); + if (substitute && substitute.hp <= 0) { + target.lapseTag(BattlerTagType.SUBSTITUTE); } - - this.end(); }); - }); - }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + + this.end(); + }, + ); } public override end(): void { @@ -500,8 +480,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && attr.selfTarget @@ -518,8 +498,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && !attr.selfTarget @@ -537,8 +517,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): Promise { - return applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit) @@ -554,21 +534,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param hitResult - The {@linkcode HitResult} of the attempted move * @returns a `Promise` intended to be passed into a `then()` call. */ - protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): Promise { - return executeIf(!target.isFainted() || target.canApplyAbility(), () => - applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult) - .then(() => { + protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): void { + if (!target.isFainted() || target.canApplyAbility()) { + applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult); - if (!this.move.getMove().hitsSubstitute(user, target)) { - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); - } + if (!this.move.getMove().hitsSubstitute(user, target)) { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); + } - target.lapseTags(BattlerTagLapseType.AFTER_HIT); - } - - }) - ); + target.lapseTags(BattlerTagLapseType.AFTER_HIT); + } + } } /** @@ -583,17 +560,15 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, isProtected : boolean, hitResult: HitResult, firstTarget: boolean) : () => Promise { - return () => executeIf(!isProtected, () => - this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget).then(() => - this.applyOnGetHitAbEffects(user, target, hitResult)).then(() => - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult)).then(() => { // Item Stealing Effects - - if (this.move.getMove() instanceof AttackMove) { - globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - }) - ); + protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean, isProtected: boolean, hitResult: HitResult, firstTarget: boolean): void { + if (!isProtected) { + this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); + this.applyOnGetHitAbEffects(user, target, hitResult); + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult); + if (this.move.getMove() instanceof AttackMove) { + globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + } } /** @@ -603,20 +578,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param dealsDamage - `true` if the attempted move successfully dealt damage * @returns a function intended to be passed into a `then()` call. */ - protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : () => void { - return () => { - if (this.move.getMove().hasAttr(FlinchAttr)) { - return; - } + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : void { + if (this.move.getMove().hasAttr(FlinchAttr)) { + return; + } - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { - const flinched = new BooleanHolder(false); - globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) { - target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); - } + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { + const flinched = new BooleanHolder(false); + globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); } - }; + } } /** diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index 6a982646b50..5b89548b663 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -22,9 +22,8 @@ export class MoveHeaderPhase extends BattlePhase { super.start(); if (this.canMove()) { - applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()).then(() => this.end()); - } else { - this.end(); + applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()); } + this.end(); } } diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts new file mode 100644 index 00000000000..d67f758b1fd --- /dev/null +++ b/src/phases/pokemon-transform-phase.ts @@ -0,0 +1,77 @@ +import type { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat"; +import { PokemonMove } from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import { PokemonPhase } from "./pokemon-phase"; + +/** + * Transforms a Pokemon into another Pokemon on the field. + * Used for Transform (move) and Imposter (ability) + */ +export class PokemonTransformPhase extends PokemonPhase { + protected targetIndex: BattlerIndex; + private playSound: boolean; + + constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound: boolean = false) { + super(userIndex); + + this.targetIndex = targetIndex; + this.playSound = playSound; + } + + public override start(): void { + const user = this.getPokemon(); + const target = globalScene.getField(true).find((p) => p.getBattlerIndex() === this.targetIndex); + + if (!target) { + return this.end(); + } + + user.summonData.speciesForm = target.getSpeciesForm(); + user.summonData.ability = target.getAbility().id; + user.summonData.gender = target.getGender(); + + // Power Trick's effect is removed after using Transform + user.removeTag(BattlerTagType.POWER_TRICK); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + user.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + } + }); + user.summonData.types = target.getTypes(); + + const promises = [ user.updateInfo() ]; + + if (this.playSound) { + globalScene.playSound("battle_anims/PRSFX- Transform"); + } + + promises.push( + user.loadAssets(false).then(() => { + user.playAnim(); + user.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + user.setTempAbility(target.getAbility()); + }), + ); + + Promise.allSettled(promises).then(() => this.end()); + } +} diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index d76708b7050..b92d79501d4 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -27,12 +27,10 @@ export class PostSummonPhase extends PokemonPhase { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon) - .then(() => { - const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon); + const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); + field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); - this.end(); - }); + this.end(); } } diff --git a/src/phases/revival-blessing-phase.ts b/src/phases/revival-blessing-phase.ts new file mode 100644 index 00000000000..a063e325a31 --- /dev/null +++ b/src/phases/revival-blessing-phase.ts @@ -0,0 +1,61 @@ +import { SwitchType } from "#enums/switch-type"; +import { globalScene } from "#app/global-scene"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import type { PlayerPokemon } from "#app/field/pokemon"; + +/** + * Sets the Party UI and handles the effect of Revival Blessing + * when used by one of the player's Pokemon. + */ +export class RevivalBlessingPhase extends BattlePhase { + constructor(protected user: PlayerPokemon) { + super(); + } + + public override start(): void { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.REVIVAL_BLESSING, + this.user.getFieldIndex(), + (slotIndex: integer, option: PartyOption) => { + if (slotIndex >= 0 && slotIndex < 6) { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + if (!pokemon || !pokemon.isFainted()) { + return this.end(); + } + + pokemon.resetTurnData(); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); + + if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { + const allyPokemon = this.user.getAlly(); + if (slotIndex <= 1) { + // Revived ally pokemon + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } else if (allyPokemon.isFainted()) { + // Revived party pokemon, and ally pokemon is fainted + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } + } + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => this.end()); + }, + PartyUiHandler.FilterFainted, + ); + } +} diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index 8cf15ba8f2c..72a8f4bf37c 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -17,17 +17,16 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { - speciesName: this.species.name, - gameMode: globalScene.gameMode.getName(), - newModifier: newModifier?.type.name - }), null, () => { - resolve(); - }, null, true, 1500); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: globalScene.gameMode.getName(), + newModifier: newModifier?.type.name, + }), null, () => { + resolve(); + }, null, true, 1500); }); } } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index a3a2fa1aa24..36f18a8d64d 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -171,30 +171,21 @@ export class SelectModifierPhase extends BattlePhase { } if (cost && !(modifier.type instanceof RememberMoveModifierType)) { - result.then(success => { - if (success) { - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - globalScene.money -= cost; - globalScene.updateMoneyText(); - globalScene.animateMoneyChanged(false); - } - globalScene.playSound("se/buy"); - (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - globalScene.ui.playError(); + if (result) { + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= cost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); } - }); - } else { - const doEnd = () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); + globalScene.playSound("se/buy"); + (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { - doEnd(); + globalScene.ui.playError(); } + } else { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); } }; @@ -304,7 +295,7 @@ export class SelectModifierPhase extends BattlePhase { ); } - addModifier(modifier: Modifier): Promise { + addModifier(modifier: Modifier): boolean { return globalScene.addModifier(modifier, false, true); } } diff --git a/src/test/abilities/unburden.test.ts b/src/test/abilities/unburden.test.ts index a652f55d591..9c5f6c2d185 100644 --- a/src/test/abilities/unburden.test.ts +++ b/src/test/abilities/unburden.test.ts @@ -391,7 +391,7 @@ describe("Abilities - Unburden", () => { await game.forceEnemyMove(Moves.THIEF, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); - game.doSelectPartyPokemon(0, "MoveEffectPhase"); + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); await game.toNextTurn(); expect(game.scene.getPlayerField()[0]).toBe(treecko); diff --git a/src/test/moves/revival_blessing.test.ts b/src/test/moves/revival_blessing.test.ts new file mode 100644 index 00000000000..cdde3941d30 --- /dev/null +++ b/src/test/moves/revival_blessing.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Revival Blessing", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.REVIVAL_BLESSING, Moves.MEMENTO ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should revive a selected fainted Pokemon when used by the player", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.MEMENTO); + game.doSelectPartyPokemon(1, "SwitchPhase"); + await game.toNextTurn(); + + const player = game.scene.getPlayerPokemon()!; + + expect(player.species.speciesId).toBe(Species.MAGIKARP); + game.move.select(Moves.REVIVAL_BLESSING); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1, "RevivalBlessingPhase"); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getPlayerParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should revive a random fainted enemy when used by an enemy Trainer", async () => { + game.override.enemyMoveset(Moves.REVIVAL_BLESSING).startingWave(8); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getEnemyParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should fail when there are no fainted Pokemon to target", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.REVIVAL_BLESSING); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase", false); + + const player = game.scene.getPlayerPokemon()!; + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should revive a player pokemon and immediately send it back out if used in the same turn it fainted in doubles", async () => { + game.override + .battleType("double") + .enemyMoveset([ Moves.SPLASH, Moves.FISSURE ]) + .enemyAbility(Abilities.NO_GUARD) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC, Species.GYARADOS ]); + + const feebas = game.scene.getPlayerField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REVIVAL_BLESSING, 1); + await game.forceEnemyMove(Moves.FISSURE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(feebas.isFainted()).toBe(true); + + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); + await game.toNextTurn(); + + expect(feebas.isFainted()).toBe(false); + expect(feebas.hp).toBe(toDmgValue(0.5 * feebas.getMaxHp())); + expect(game.scene.getPlayerField()[0]).toBe(feebas); + }); +}); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f105678e71f..f95450bbf44 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -375,6 +375,6 @@ describe("Clowning Around - Mystery Encounter", () => { async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: number, itemType: PokemonHeldItemModifierType) { const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; itemMod.stackCount = stackCount; - await scene.addModifier(itemMod, true, false, false, true); + scene.addModifier(itemMod, true, false, false, true); await scene.updateModifiers(true); } diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 795e6b6650b..ceb457666d7 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -123,8 +123,6 @@ describe("Dancing Lessons - Mystery Encounter", () => { partyLead.level = 1000; partyLead.calculateStats(); await runMysteryEncounterToEnd(game, 1, undefined, true); - // For some reason updateModifiers breaks in this test and does not resolve promise - vi.spyOn(game.scene, "updateModifiers").mockImplementation(() => new Promise(resolve => resolve())); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index f99aa24805e..8121916a4d7 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -123,7 +123,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const amuletCoin = generateModifierType(modifierTypes.AMULET_COIN)!.newModifier() as MoneyMultiplierModifier; amuletCoin.stackCount = 5; - await scene.addModifier(amuletCoin, true, false, false, true); + scene.addModifier(amuletCoin, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 1); @@ -193,7 +193,7 @@ describe("Delibird-y - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -214,7 +214,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -234,13 +234,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const candyJar = generateModifierType(modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; - await scene.addModifier(candyJar, true, false, false, true); + scene.addModifier(candyJar, true, false, false, true); const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; // Sitrus berries on party const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -263,13 +263,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; healingCharm.stackCount = 3; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -292,7 +292,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -321,7 +321,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -355,7 +355,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -376,7 +376,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -396,13 +396,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; healingCharm.stackCount = 5; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -425,7 +425,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -455,7 +455,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index fb5801c941a..60780984014 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -224,7 +224,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -249,7 +249,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 39904c030a3..06bd382879f 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -216,11 +216,11 @@ describe("Uncommon Breed - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); const ganlon = generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ])!; const ganlonMod = ganlon.newModifier(scene.getPlayerParty()[0]) as BerryModifier; ganlonMod.stackCount = 3; - await scene.addModifier(ganlonMod, true, false, false, true); + scene.addModifier(ganlonMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index ca5a67f901a..3ba9cae3c8d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -91,6 +91,7 @@ export default class GameWrapper { Pokemon.prototype.updateFusionPalette = () => null; Pokemon.prototype.cry = () => null; Pokemon.prototype.faintCry = (cb) => { if (cb) cb(); }; + BattleScene.prototype.addPokemonIcon = () => new Phaser.GameObjects.Container(this.scene); } setScene(scene: BattleScene) { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index d60e0e78373..91f98e89ec3 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -60,6 +60,7 @@ import { RibbonModifierRewardPhase } from "#app/phases/ribbon-modifier-reward-ph import { GameOverModifierRewardPhase } from "#app/phases/game-over-modifier-reward-phase"; import { UnlockPhase } from "#app/phases/unlock-phase"; import { PostGameOverPhase } from "#app/phases/post-game-over-phase"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; export interface PromptHandler { phaseTarget?: string; @@ -126,7 +127,8 @@ type PhaseClass = | typeof EncounterPhase | typeof GameOverPhase | typeof UnlockPhase - | typeof PostGameOverPhase; + | typeof PostGameOverPhase + | typeof RevivalBlessingPhase; type PhaseString = | "LoginPhase" @@ -185,7 +187,8 @@ type PhaseString = | "EncounterPhase" | "GameOverPhase" | "UnlockPhase" - | "PostGameOverPhase"; + | "PostGameOverPhase" + | "RevivalBlessingPhase"; type PhaseInterceptorPhase = PhaseClass | PhaseString; @@ -269,6 +272,7 @@ export default class PhaseInterceptor { [ GameOverPhase, this.startPhase ], [ UnlockPhase, this.startPhase ], [ PostGameOverPhase, this.startPhase ], + [ RevivalBlessingPhase, this.startPhase ], ]; private endBySetMode = [ @@ -511,11 +515,11 @@ export default class PhaseInterceptor { if (expireFn) { this.prompts.shift(); } else if ( - currentMode === actionForNextPrompt.mode - && currentPhase === actionForNextPrompt.phaseTarget - && currentHandler.active - && (!actionForNextPrompt.awaitingActionInput - || (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) + currentMode === actionForNextPrompt.mode && + currentPhase === actionForNextPrompt.phaseTarget && + currentHandler.active && + (!actionForNextPrompt.awaitingActionInput || + (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) ) { const prompt = this.prompts.shift(); if (prompt?.callback) { From 39f2fdf4ff323efbed0b8baa62336b0d05b80743 Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 21 Feb 2025 03:43:45 -0500 Subject: [PATCH 09/24] [Bug] Giratina no longer loses its' Hidden Ability going from Origin back to Altered Form #5326 --- src/data/pokemon-species.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 4349cee2cbf..ff9fbdf0bc8 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1848,7 +1848,7 @@ export function initSpecies() { new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), + new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), ), new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), From 180a9cc054d4d3e76a2b43401be7aa5aaf851f88 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:09:00 +0100 Subject: [PATCH 10/24] [UI/UX] Pokedex - Separate shiny icons (#5371) * Separate shiny icons * Added forgotten access modifier --- src/ui/pokedex-page-ui-handler.ts | 83 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 4d30609a020..a086762bb57 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -164,7 +164,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private pokemonFormText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; - private pokemonShinyIcon: Phaser.GameObjects.Sprite; + private pokemonShinyIcons: Phaser.GameObjects.Sprite[]; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -245,6 +245,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private availableVariants: number; + private unlockedVariants: boolean[]; + constructor() { super(Mode.POKEDEX_PAGE); } @@ -381,10 +384,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons"); - this.pokemonShinyIcon.setOrigin(0.15, 0.2); - this.pokemonShinyIcon.setScale(1); - this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); + this.pokemonShinyIcons = []; + for (let i = 0; i < 3; i++) { + const pokemonShinyIcon = globalScene.add.sprite(153 + i * 13, 160, "shiny_icons"); + pokemonShinyIcon.setOrigin(0.15, 0.2); + pokemonShinyIcon.setScale(1); + pokemonShinyIcon.setFrame(getVariantIcon(i as Variant)); + pokemonShinyIcon.setVisible(false); + this.pokemonCaughtHatchedContainer.add(pokemonShinyIcon); + this.pokemonShinyIcons.push(pokemonShinyIcon); + } this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); @@ -672,6 +681,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ) ); } + + this.availableVariants = species.getFullUnlocksData() & DexAttr.VARIANT_3 ? 3 : 1; } // Function to ensure that forms appear in the appropriate biome and tod @@ -795,17 +806,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = 0; } - const unlockedVariants = [ - hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, - hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + this.unlockedVariants = [ + !!(hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_2), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_3) ]; if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { starterAttributes.variant = 0; - } else if (!unlockedVariants[starterAttributes.variant]) { + } else if (!this.unlockedVariants[starterAttributes.variant]) { let highestValidIndex = -1; - for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { - if (unlockedVariants[i] !== 0n) { + for (let i = 0; i <= starterAttributes.variant && i < this.unlockedVariants.length; i++) { + if (this.unlockedVariants[i]) { highestValidIndex = i; } } @@ -1530,11 +1541,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.setSpeciesDetails(this.species, { shiny: true, variant: newVariant }); globalScene.playSound("se/sparkle"); - // Set the variant label to the shiny tint - const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(true); starterAttributes.shiny = true; this.savedStarterAttributes.shiny = starterAttributes.shiny; @@ -1561,14 +1567,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.variant = starterAttributes.variant; if (newVariant > props.variant) { this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); - // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); success = true; } else { this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); - this.pokemonShinyIcon.setVisible(false); success = true; starterAttributes.shiny = false; @@ -2005,7 +2006,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(true); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCandyContainer.setVisible(false); @@ -2031,7 +2034,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(!!species); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); @@ -2232,13 +2237,26 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = defaultProps.variant; - const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(defaultProps.shiny); - this.pokemonCaughtHatchedContainer.setVisible(true); + const variant = defaultProps.variant; + for (let v = 0; v < 3; v++) { + const icon = this.pokemonShinyIcons[v]; + if (v < this.availableVariants) { + if (!this.unlockedVariants[v]) { + icon.setTint(0x000000); + } else if (shiny && v === variant) { + const tint = getVariantTint(v as Variant); + icon.setTint(tint); + } else { + icon.setTint(0x808080); + } + icon.setVisible(true); + } else { + icon.setVisible(false); + } + } + + this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); @@ -2246,7 +2264,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonHatchedIcon.setVisible(false); this.pokemonHatchedCountText.setVisible(false); this.pokemonFormText.setY(36); @@ -2273,7 +2290,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } } // Setting type icons and form text From 7a015e094fef5d39ed3e2659ab4b2e28a7c1af2c Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 12:33:32 -0600 Subject: [PATCH 11/24] [Bug] [Move] Add focus punch lost focus message (#5341) * Add focus punch lost focus message * Rename attribute * Added automated test * Fix failedToTerrain being undefined * Update src/test/moves/focus_punch.test.ts Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 2 +- src/data/move.ts | 84 ++++++++++++++++++++++++------ src/phases/move-phase.ts | 40 +++++++++----- src/test/moves/focus_punch.test.ts | 22 ++++++-- 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 65da3753cde..131b7d0ff7a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6633,7 +6633,7 @@ export function initAbilities() { .bypassFaint(), new Ability(Abilities.CORROSION, 7) .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ]) - .edgeCase(), // Should interact correctly with magic coat/bounce (not yet implemented) + fling with toxic orb (not implemented yet) + .edgeCase(), // Should poison itself with toxic orb. new Ability(Abilities.COMATOSE, 7) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/data/move.ts b/src/data/move.ts index 658534eb48f..30c5ef75491 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -692,19 +692,17 @@ export default class Move implements Localizable { /** * Sees if a move has a custom failure text (by looking at each {@linkcode MoveAttr} of this move) * @param user {@linkcode Pokemon} using the move - * @param target {@linkcode Pokemon} receiving the move - * @param move {@linkcode Move} using the move - * @param cancelled {@linkcode Utils.BooleanHolder} to hold boolean value + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute * @returns string of the custom failure text, or `null` if it uses the default text ("But it failed!") */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { for (const attr of this.attrs) { - const failedText = attr.getFailedText(user, target, move, cancelled); - if (failedText !== null) { + const failedText = attr.getFailedText(user, target, move); + if (failedText) { return failedText; } } - return null; } /** @@ -1089,11 +1087,10 @@ export abstract class MoveAttr { * @param user {@linkcode Pokemon} using the move * @param target {@linkcode Pokemon} target of the move * @param move {@linkcode Move} with this attribute - * @param cancelled {@linkcode Utils.BooleanHolder} which stores if the move should fail * @returns the string representing failure of this {@linkcode Move} */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - return null; + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + return; } /** @@ -1335,6 +1332,54 @@ export class PreMoveMessageAttr extends MoveAttr { } } +/** + * Attribute for moves that can be conditionally interrupted to be considered to + * have failed before their "useMove" message is displayed. Currently used by + * Focus Punch. + * @extends MoveAttr + */ +export class PreUseInterruptAttr extends MoveAttr { + protected message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string); + protected overridesFailedMessage: boolean; + protected conditionFunc: MoveConditionFunc; + + /** + * Create a new MoveInterruptedMessageAttr. + * @param message The message to display when the move is interrupted, or a function that formats the message based on the user, target, and move. + */ + constructor(message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string), conditionFunc?: MoveConditionFunc) { + super(); + this.message = message; + this.conditionFunc = conditionFunc ?? (() => true); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override apply(user: Pokemon, target: Pokemon, move: Move): boolean { + return this.conditionFunc(user, target, move); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + if (this.message && this.conditionFunc(user, target, move)) { + const message = + typeof this.message === "string" + ? (this.message as string) + : this.message(user, target, move); + return message; + } + } +} + /** * Attribute for Status moves that take attack type effectiveness * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) @@ -1754,13 +1799,16 @@ export class AddSubstituteAttr extends MoveEffectAttr { return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + /** + * Get the substitute-specific failure message if one should be displayed. + * @param user The pokemon using the move. + * @returns The substitute-specific failure message if the conditions apply, otherwise `undefined` + */ + getFailedText(user: Pokemon, _target: Pokemon, _move: Move): string | undefined { if (user.getTag(SubstituteTag)) { return i18next.t("moveTriggers:substituteOnOverlap", { pokemonName: getPokemonNameWithAffix(user) }); } else if (user.hp <= Math.floor(user.getMaxHp() / 4) || user.getMaxHp() === 1) { return i18next.t("moveTriggers:substituteNotEnoughHp"); - } else { - return i18next.t("battle:attackFailed"); } } } @@ -6230,10 +6278,12 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move)); } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(_user: Pokemon, target: Pokemon, _move: Move): string | undefined { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + if (blockedByAbility.value) { + return i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }); + } } getSwitchOutCondition(): MoveConditionFunc { @@ -9185,8 +9235,8 @@ export function initMoves() { .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .punchingMove() - .condition((user, target, move) => !user.turnData.attacksReceived.find(r => r.damage)), + .attr(PreUseInterruptAttr, i18next.t("moveTriggers:lostFocus"), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .punchingMove(), new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index c1e4aeaf497..d58c052812f 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -9,7 +9,7 @@ import { PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr, - ReduceStatusEffectDurationAbAttr + ReduceStatusEffectDurationAbAttr, } from "#app/data/ability"; import type { DelayedAttackTag } from "#app/data/arena-tag"; import { CommonAnim } from "#app/data/battle-anims"; @@ -24,7 +24,8 @@ import { frenzyMissFunc, HealStatusEffectAttr, MoveFlags, - PreMoveMessageAttr + PreMoveMessageAttr, + PreUseInterruptAttr, } from "#app/data/move"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; @@ -42,7 +43,7 @@ import { MoveChargePhase } from "#app/phases/move-charge-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { BooleanHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -293,7 +294,18 @@ export class MovePhase extends BattlePhase { } } - this.showMoveText(); + let success: boolean = true; + // Check if there are any attributes that can interrupt the move, overriding the fail message. + for (const move of this.move.getMove().getAttrs(PreUseInterruptAttr)) { + if (move.apply(this.pokemon, targets[0], this.move.getMove())) { + success = false; + break; + } + } + + if (success) { + this.showMoveText(); + } if (moveQueue.length > 0) { // Using .shift here clears out two turn moves once they've been used @@ -329,11 +341,14 @@ export class MovePhase extends BattlePhase { * Move conditions assume the move has a single target * TODO: is this sustainable? */ - const passesConditions = move.applyConditions(this.pokemon, targets[0], move); - const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); - const failedDueToTerrain: boolean = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + let failedDueToTerrain: boolean = false; + if (success) { + const passesConditions = move.applyConditions(this.pokemon, targets[0], move); + const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); + failedDueToTerrain = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + success = passesConditions && !failedDueToWeather && !failedDueToTerrain; + } - const success = passesConditions && !failedDueToWeather && !failedDueToTerrain; // Update the battle's "last move" pointer, unless we're currently mimicking a move. if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { @@ -360,9 +375,8 @@ export class MovePhase extends BattlePhase { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); let failedText: string | undefined; - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); - if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { @@ -398,7 +412,7 @@ export class MovePhase extends BattlePhase { } else { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); this.showMoveText(); this.showFailedText(failureMessage ?? undefined); @@ -566,7 +580,7 @@ export class MovePhase extends BattlePhase { applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } - public showFailedText(failedText?: string): void { - globalScene.queueMessage(failedText ?? i18next.t("battle:attackFailed")); + public showFailedText(failedText: string = i18next.t("battle:attackFailed")): void { + globalScene.queueMessage(failedText); } } diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts index 352e3b60aa4..44d9c92cac1 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/src/test/moves/focus_punch.test.ts @@ -7,8 +7,9 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; +import i18next from "i18next"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Focus Punch", () => { @@ -41,7 +42,7 @@ describe("Moves - Focus Punch", () => { it( "should deal damage at the end of turn if uninterrupted", async () => { - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -68,7 +69,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -95,7 +96,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.SPORE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -119,7 +120,7 @@ describe("Moves - Focus Punch", () => { /** Guarantee a Trainer battle with multiple enemy Pokemon */ game.override.startingWave(25); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); game.forceEnemyToSwitch(); game.move.select(Moves.FOCUS_PUNCH); @@ -130,4 +131,15 @@ describe("Moves - Focus Punch", () => { expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); } ); + it("should replace the 'but it failed' text when the user gets hit", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + game.move.select(Moves.FOCUS_PUNCH); + await game.phaseInterceptor.to("MoveEndPhase", true); + await game.phaseInterceptor.to("MessagePhase", false); + const consoleSpy = vi.spyOn(console, "log"); + await game.phaseInterceptor.to("MoveEndPhase", true); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus")); + }); }); From b1b71dbd6d222fa3fce7e76d3b05c0a7636741a7 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:37:52 -0600 Subject: [PATCH 12/24] [Test] Fix annoying BBCodeText error messages in tests (#5395) --- src/test/utils/gameWrapper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index 3ba9cae3c8d..e8addcfc1d9 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -15,6 +15,7 @@ import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { vi } from "vitest"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import InputManager = Phaser.Input.InputManager; @@ -33,7 +34,8 @@ Object.defineProperty(window, "console", { value: mockConsoleLog(false), }); - +BBCodeText.prototype.destroy = () => null; +BBCodeText.prototype.resize = () => null; InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; Phaser.GameObjects.Image = MockImage; From bd288ad8627a6b3a38547058b0752178de719818 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 23 Feb 2025 00:38:11 +0100 Subject: [PATCH 13/24] [UI] Adding container to set transparency of optionSelectText (#5396) --- src/ui/abstact-option-select-ui-handler.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 10dbedd7b2f..07e43a344dd 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -35,6 +35,7 @@ const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; + protected optionSelectTextContainer: Phaser.GameObjects.Container; protected optionSelectBg: Phaser.GameObjects.NineSlice; protected optionSelectText: BBCodeText; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; @@ -53,6 +54,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected unskippedIndices: number[] = []; protected defaultTextStyle: TextStyle = TextStyle.WINDOW; + protected textContent: string; constructor(mode: Mode | null) { @@ -78,6 +80,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); + this.optionSelectTextContainer = globalScene.add.container(0, 0); + this.optionSelectContainer.add(this.optionSelectTextContainer); + this.optionSelectIcons = []; this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; @@ -123,19 +128,18 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { ); this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); - this.optionSelectContainer.add(this.optionSelectText); + this.optionSelectTextContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); this.optionSelectBg.height = this.getWindowHeight(); - this.optionSelectText.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); + this.optionSelectTextContainer.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); // Now that the container and background widths are established, we can set up the proper text restricted to visible options - this.optionSelectText.setText(optionsWithScroll.map(o => o.item + this.textContent = optionsWithScroll.map(o => o.item ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` - ).join("\n") - - ); + ).join("\n"); + this.optionSelectText.setText(this.textContent); options.forEach((option: OptionSelectItem, i: number) => { if (option.item) { @@ -184,7 +188,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { if (this.config.delay) { this.blockInput = true; - this.optionSelectText.setAlpha(0.5); + this.optionSelectTextContainer.setAlpha(0.5); this.cursorObj?.setAlpha(0.8); globalScene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); } @@ -278,7 +282,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.blockInput = false; - this.optionSelectText.setAlpha(1); + this.optionSelectTextContainer.setAlpha(1); this.cursorObj?.setAlpha(1); } From a51a504155f7e506203a4a5aafc51f2ce5c4a897 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:52:07 -0600 Subject: [PATCH 14/24] [Test] Move test folder out of src (#5398) * move test folder * Update vitest files * rename test/utils to test/testUtils * Remove stray utils/gameManager Got put back from a rebase --- .dependency-cruiser.cjs | 2 +- create-test-boilerplate.js | 8 +++--- eslint.config.js | 4 +-- .../abilities/ability_duplication.test.ts | 2 +- .../abilities/ability_timing.test.ts | 2 +- {src/test => test}/abilities/analytic.test.ts | 2 +- .../abilities/arena_trap.test.ts | 2 +- .../abilities/aroma_veil.test.ts | 2 +- .../abilities/aura_break.test.ts | 2 +- {src/test => test}/abilities/battery.test.ts | 2 +- .../abilities/battle_bond.test.ts | 2 +- .../abilities/beast_boost.test.ts | 2 +- .../test => test}/abilities/commander.test.ts | 2 +- .../abilities/competitive.test.ts | 2 +- {src/test => test}/abilities/contrary.test.ts | 2 +- .../test => test}/abilities/corrosion.test.ts | 2 +- {src/test => test}/abilities/costar.test.ts | 2 +- {src/test => test}/abilities/dancer.test.ts | 2 +- {src/test => test}/abilities/defiant.test.ts | 2 +- .../abilities/desolate-land.test.ts | 2 +- {src/test => test}/abilities/disguise.test.ts | 2 +- {src/test => test}/abilities/dry_skin.test.ts | 2 +- .../abilities/early_bird.test.ts | 2 +- .../abilities/flash_fire.test.ts | 2 +- .../abilities/flower_gift.test.ts | 2 +- {src/test => test}/abilities/forecast.test.ts | 2 +- .../abilities/friend_guard.test.ts | 2 +- .../test => test}/abilities/galvanize.test.ts | 2 +- .../abilities/good_as_gold.test.ts | 2 +- .../abilities/gorilla_tactics.test.ts | 2 +- .../abilities/gulp_missile.test.ts | 2 +- .../test => test}/abilities/heatproof.test.ts | 2 +- .../abilities/honey_gather.test.ts | 2 +- {src/test => test}/abilities/hustle.test.ts | 2 +- .../abilities/hyper_cutter.test.ts | 2 +- {src/test => test}/abilities/ice_face.test.ts | 2 +- .../abilities/illuminate.test.ts | 2 +- {src/test => test}/abilities/imposter.test.ts | 2 +- .../abilities/infiltrator.test.ts | 2 +- .../abilities/intimidate.test.ts | 4 +-- .../abilities/intrepid_sword.test.ts | 2 +- {src/test => test}/abilities/libero.test.ts | 2 +- .../abilities/magic_bounce.test.ts | 2 +- .../abilities/magic_guard.test.ts | 2 +- {src/test => test}/abilities/mimicry.test.ts | 2 +- .../abilities/mirror_armor.test.ts | 2 +- {src/test => test}/abilities/moody.test.ts | 2 +- {src/test => test}/abilities/moxie.test.ts | 2 +- {src/test => test}/abilities/mummy.test.ts | 2 +- .../abilities/mycelium_might.test.ts | 2 +- {src/test => test}/abilities/no_guard.test.ts | 2 +- .../abilities/parental_bond.test.ts | 2 +- .../abilities/pastel_veil.test.ts | 2 +- .../abilities/perish_body.test.ts | 2 +- .../abilities/power_construct.test.ts | 2 +- .../abilities/power_spot.test.ts | 2 +- {src/test => test}/abilities/protean.test.ts | 2 +- .../abilities/protosynthesis.test.ts | 2 +- .../abilities/quick_draw.test.ts | 2 +- .../test => test}/abilities/sand_spit.test.ts | 2 +- .../test => test}/abilities/sand_veil.test.ts | 2 +- .../abilities/sap_sipper.test.ts | 2 +- .../test => test}/abilities/schooling.test.ts | 2 +- .../abilities/screen_cleaner.test.ts | 2 +- .../abilities/seed_sower.test.ts | 2 +- .../abilities/serene_grace.test.ts | 2 +- .../abilities/sheer_force.test.ts | 2 +- .../abilities/shield_dust.test.ts | 2 +- .../abilities/shields_down.test.ts | 2 +- {src/test => test}/abilities/simple.test.ts | 2 +- .../abilities/speed_boost.test.ts | 2 +- {src/test => test}/abilities/stakeout.test.ts | 2 +- {src/test => test}/abilities/stall.test.ts | 2 +- .../abilities/steely_spirit.test.ts | 2 +- {src/test => test}/abilities/sturdy.test.ts | 2 +- .../abilities/supreme_overlord.test.ts | 2 +- .../abilities/sweet_veil.test.ts | 2 +- .../abilities/synchronize.test.ts | 2 +- .../abilities/tera_shell.test.ts | 2 +- {src/test => test}/abilities/trace.test.ts | 2 +- {src/test => test}/abilities/unburden.test.ts | 2 +- .../abilities/unseen_fist.test.ts | 2 +- .../abilities/volt_absorb.test.ts | 2 +- .../abilities/wandering_spirit.test.ts | 2 +- {src/test => test}/abilities/wimp_out.test.ts | 2 +- .../abilities/wind_power.test.ts | 2 +- .../abilities/wind_rider.test.ts | 2 +- .../abilities/wonder_skin.test.ts | 2 +- {src/test => test}/abilities/zen_mode.test.ts | 2 +- .../abilities/zero_to_hero.test.ts | 2 +- {src/test => test}/account.test.ts | 2 +- .../achievements/achievement.test.ts | 4 +-- .../test => test}/arena/arena_gravity.test.ts | 2 +- .../arena/grassy_terrain.test.ts | 2 +- {src/test => test}/arena/weather_fog.test.ts | 2 +- {src/test => test}/arena/weather_hail.test.ts | 2 +- .../arena/weather_sandstorm.test.ts | 2 +- .../arena/weather_strong_winds.test.ts | 2 +- {src/test => test}/battle-scene.test.ts | 2 +- .../test => test}/battle/ability_swap.test.ts | 2 +- .../test => test}/battle/battle-order.test.ts | 2 +- {src/test => test}/battle/battle.test.ts | 6 ++-- .../battle/damage_calculation.test.ts | 2 +- .../battle/double_battle.test.ts | 2 +- .../battle/inverse_battle.test.ts | 2 +- .../battle/special_battle.test.ts | 2 +- .../battlerTags/octolock.test.ts | 2 +- .../battlerTags/stockpiling.test.ts | 2 +- .../battlerTags/substitute.test.ts | 0 {src/test => test}/boss-pokemon.test.ts | 2 +- {src/test => test}/daily_mode.test.ts | 2 +- .../data/splash_messages.test.ts | 0 {src/test => test}/data/status_effect.test.ts | 4 +-- {src/test => test}/eggs/egg.test.ts | 4 +-- {src/test => test}/eggs/manaphy-egg.test.ts | 4 +-- {src/test => test}/endless_boss.test.ts | 2 +- {src/test => test}/enemy_command.test.ts | 2 +- .../test => test}/escape-calculations.test.ts | 2 +- {src/test => test}/evolution.test.ts | 2 +- {src/test => test}/field/pokemon.test.ts | 2 +- {src/test => test}/final_boss.test.ts | 2 +- {src/test => test}/fontFace.setup.ts | 0 {src/test => test}/game-mode.test.ts | 4 +-- {src/test => test}/imports.test.ts | 0 {src/test => test}/inputs/inputs.test.ts | 4 +-- {src/test => test}/internals.test.ts | 2 +- {src/test => test}/items/dire_hit.test.ts | 2 +- .../double_battle_chance_booster.test.ts | 2 +- {src/test => test}/items/eviolite.test.ts | 2 +- {src/test => test}/items/exp_booster.test.ts | 2 +- {src/test => test}/items/grip_claw.test.ts | 2 +- {src/test => test}/items/leek.test.ts | 2 +- {src/test => test}/items/leftovers.test.ts | 2 +- {src/test => test}/items/light_ball.test.ts | 2 +- {src/test => test}/items/lock_capsule.test.ts | 2 +- {src/test => test}/items/metal_powder.test.ts | 2 +- {src/test => test}/items/multi_lens.test.ts | 2 +- {src/test => test}/items/quick_powder.test.ts | 2 +- {src/test => test}/items/scope_lens.test.ts | 2 +- .../items/temp_stat_stage_booster.test.ts | 2 +- {src/test => test}/items/thick_club.test.ts | 2 +- {src/test => test}/items/toxic_orb.test.ts | 2 +- {src/test => test}/misc.test.ts | 4 +-- {src/test => test}/moves/after_you.test.ts | 2 +- .../moves/alluring_voice.test.ts | 2 +- {src/test => test}/moves/aromatherapy.test.ts | 2 +- {src/test => test}/moves/assist.test.ts | 2 +- {src/test => test}/moves/astonish.test.ts | 2 +- {src/test => test}/moves/aurora_veil.test.ts | 2 +- {src/test => test}/moves/autotomize.test.ts | 2 +- {src/test => test}/moves/baddy_bad.test.ts | 2 +- .../moves/baneful_bunker.test.ts | 2 +- {src/test => test}/moves/baton_pass.test.ts | 2 +- {src/test => test}/moves/beak_blast.test.ts | 2 +- {src/test => test}/moves/beat_up.test.ts | 2 +- {src/test => test}/moves/belly_drum.test.ts | 2 +- .../moves/burning_jealousy.test.ts | 2 +- {src/test => test}/moves/camouflage.test.ts | 2 +- .../moves/ceaseless_edge.test.ts | 2 +- .../moves/chilly_reception.test.ts | 2 +- {src/test => test}/moves/chloroblast.test.ts | 2 +- .../moves/clangorous_soul.test.ts | 2 +- {src/test => test}/moves/copycat.test.ts | 2 +- .../test => test}/moves/crafty_shield.test.ts | 2 +- {src/test => test}/moves/defog.test.ts | 2 +- {src/test => test}/moves/destiny_bond.test.ts | 2 +- .../test => test}/moves/diamond_storm.test.ts | 2 +- {src/test => test}/moves/dig.test.ts | 2 +- {src/test => test}/moves/disable.test.ts | 2 +- {src/test => test}/moves/dive.test.ts | 2 +- {src/test => test}/moves/doodle.test.ts | 2 +- {src/test => test}/moves/double_team.test.ts | 2 +- {src/test => test}/moves/dragon_cheer.test.ts | 2 +- {src/test => test}/moves/dragon_rage.test.ts | 2 +- {src/test => test}/moves/dragon_tail.test.ts | 2 +- .../moves/dynamax_cannon.test.ts | 2 +- .../test => test}/moves/effectiveness.test.ts | 2 +- {src/test => test}/moves/electrify.test.ts | 2 +- {src/test => test}/moves/electro_shot.test.ts | 2 +- {src/test => test}/moves/encore.test.ts | 2 +- {src/test => test}/moves/endure.test.ts | 2 +- {src/test => test}/moves/entrainment.test.ts | 2 +- {src/test => test}/moves/fairy_lock.test.ts | 2 +- {src/test => test}/moves/fake_out.test.ts | 2 +- {src/test => test}/moves/fell_stinger.test.ts | 2 +- {src/test => test}/moves/fillet_away.test.ts | 2 +- {src/test => test}/moves/fissure.test.ts | 2 +- {src/test => test}/moves/flame_burst.test.ts | 2 +- .../test => test}/moves/flower_shield.test.ts | 2 +- {src/test => test}/moves/fly.test.ts | 2 +- {src/test => test}/moves/focus_punch.test.ts | 2 +- {src/test => test}/moves/follow_me.test.ts | 2 +- {src/test => test}/moves/foresight.test.ts | 2 +- .../test => test}/moves/forests_curse.test.ts | 2 +- {src/test => test}/moves/freeze_dry.test.ts | 2 +- {src/test => test}/moves/freezy_frost.test.ts | 2 +- {src/test => test}/moves/fusion_bolt.test.ts | 2 +- {src/test => test}/moves/fusion_flare.test.ts | 2 +- .../moves/fusion_flare_bolt.test.ts | 2 +- {src/test => test}/moves/future_sight.test.ts | 2 +- {src/test => test}/moves/gastro_acid.test.ts | 2 +- {src/test => test}/moves/geomancy.test.ts | 2 +- .../moves/gigaton_hammer.test.ts | 2 +- {src/test => test}/moves/glaive_rush.test.ts | 2 +- {src/test => test}/moves/growth.test.ts | 2 +- {src/test => test}/moves/grudge.test.ts | 2 +- {src/test => test}/moves/guard_split.test.ts | 2 +- {src/test => test}/moves/guard_swap.test.ts | 2 +- {src/test => test}/moves/hard_press.test.ts | 2 +- {src/test => test}/moves/haze.test.ts | 2 +- {src/test => test}/moves/heal_bell.test.ts | 2 +- {src/test => test}/moves/heal_block.test.ts | 2 +- {src/test => test}/moves/heart_swap.test.ts | 2 +- {src/test => test}/moves/hyper_beam.test.ts | 2 +- {src/test => test}/moves/imprison.test.ts | 2 +- {src/test => test}/moves/instruct.test.ts | 2 +- {src/test => test}/moves/jaw_lock.test.ts | 2 +- {src/test => test}/moves/lash_out.test.ts | 2 +- .../test => test}/moves/last_respects.test.ts | 2 +- {src/test => test}/moves/light_screen.test.ts | 2 +- {src/test => test}/moves/lucky_chant.test.ts | 2 +- .../moves/lunar_blessing.test.ts | 2 +- {src/test => test}/moves/lunar_dance.test.ts | 2 +- {src/test => test}/moves/magic_coat.test.ts | 2 +- {src/test => test}/moves/magnet_rise.test.ts | 2 +- {src/test => test}/moves/make_it_rain.test.ts | 2 +- {src/test => test}/moves/mat_block.test.ts | 2 +- {src/test => test}/moves/metal_burst.test.ts | 2 +- {src/test => test}/moves/metronome.test.ts | 2 +- {src/test => test}/moves/miracle_eye.test.ts | 2 +- {src/test => test}/moves/mirror_move.test.ts | 2 +- {src/test => test}/moves/mist.test.ts | 2 +- .../moves/moongeist_beam.test.ts | 2 +- {src/test => test}/moves/multi_target.test.ts | 2 +- {src/test => test}/moves/nightmare.test.ts | 2 +- {src/test => test}/moves/obstruct.test.ts | 2 +- {src/test => test}/moves/octolock.test.ts | 2 +- {src/test => test}/moves/order_up.test.ts | 2 +- {src/test => test}/moves/parting_shot.test.ts | 2 +- {src/test => test}/moves/plasma_fists.test.ts | 2 +- {src/test => test}/moves/pledge_moves.test.ts | 2 +- {src/test => test}/moves/powder.test.ts | 2 +- {src/test => test}/moves/power_shift.test.ts | 2 +- {src/test => test}/moves/power_split.test.ts | 2 +- {src/test => test}/moves/power_swap.test.ts | 2 +- {src/test => test}/moves/power_trick.test.ts | 2 +- {src/test => test}/moves/protect.test.ts | 2 +- {src/test => test}/moves/psycho_shift.test.ts | 2 +- {src/test => test}/moves/purify.test.ts | 2 +- {src/test => test}/moves/quash.test.ts | 2 +- {src/test => test}/moves/quick_guard.test.ts | 2 +- {src/test => test}/moves/rage_fist.test.ts | 2 +- {src/test => test}/moves/rage_powder.test.ts | 2 +- {src/test => test}/moves/reflect.test.ts | 2 +- {src/test => test}/moves/reflect_type.test.ts | 2 +- {src/test => test}/moves/relic_song.test.ts | 2 +- {src/test => test}/moves/retaliate.test.ts | 2 +- .../moves/revival_blessing.test.ts | 2 +- {src/test => test}/moves/role_play.test.ts | 2 +- {src/test => test}/moves/rollout.test.ts | 2 +- {src/test => test}/moves/roost.test.ts | 2 +- {src/test => test}/moves/round.test.ts | 2 +- {src/test => test}/moves/safeguard.test.ts | 2 +- {src/test => test}/moves/scale_shot.test.ts | 2 +- {src/test => test}/moves/secret_power.test.ts | 2 +- {src/test => test}/moves/shed_tail.test.ts | 2 +- .../moves/shell_side_arm.test.ts | 2 +- {src/test => test}/moves/shell_trap.test.ts | 2 +- {src/test => test}/moves/simple_beam.test.ts | 2 +- {src/test => test}/moves/sketch.test.ts | 2 +- {src/test => test}/moves/skill_swap.test.ts | 2 +- {src/test => test}/moves/sleep_talk.test.ts | 2 +- {src/test => test}/moves/solar_beam.test.ts | 2 +- .../test => test}/moves/sparkly_swirl.test.ts | 2 +- .../moves/spectral_thief.test.ts | 2 +- {src/test => test}/moves/speed_swap.test.ts | 2 +- {src/test => test}/moves/spikes.test.ts | 2 +- {src/test => test}/moves/spit_up.test.ts | 2 +- {src/test => test}/moves/spotlight.test.ts | 2 +- {src/test => test}/moves/steamroller.test.ts | 2 +- {src/test => test}/moves/stockpile.test.ts | 2 +- {src/test => test}/moves/substitute.test.ts | 2 +- {src/test => test}/moves/swallow.test.ts | 2 +- {src/test => test}/moves/syrup_bomb.test.ts | 2 +- {src/test => test}/moves/tackle.test.ts | 2 +- {src/test => test}/moves/tail_whip.test.ts | 2 +- {src/test => test}/moves/tailwind.test.ts | 2 +- {src/test => test}/moves/tar_shot.test.ts | 2 +- {src/test => test}/moves/taunt.test.ts | 2 +- {src/test => test}/moves/telekinesis.test.ts | 2 +- {src/test => test}/moves/tera_blast.test.ts | 2 +- .../moves/tera_starstorm.test.ts | 2 +- .../moves/thousand_arrows.test.ts | 2 +- {src/test => test}/moves/throat_chop.test.ts | 2 +- {src/test => test}/moves/thunder_wave.test.ts | 2 +- {src/test => test}/moves/tidy_up.test.ts | 2 +- {src/test => test}/moves/torment.test.ts | 2 +- {src/test => test}/moves/toxic.test.ts | 2 +- {src/test => test}/moves/toxic_spikes.test.ts | 2 +- {src/test => test}/moves/transform.test.ts | 2 +- .../moves/trick_or_treat.test.ts | 2 +- .../test => test}/moves/triple_arrows.test.ts | 2 +- {src/test => test}/moves/u_turn.test.ts | 2 +- {src/test => test}/moves/upper_hand.test.ts | 2 +- {src/test => test}/moves/whirlwind.test.ts | 2 +- {src/test => test}/moves/wide_guard.test.ts | 2 +- {src/test => test}/moves/will_o_wisp.test.ts | 2 +- .../mystery-encounter/encounter-test-utils.ts | 2 +- .../a-trainers-test-encounter.test.ts | 4 +-- .../absolute-avarice-encounter.test.ts | 2 +- ...an-offer-you-cant-refuse-encounter.test.ts | 4 +-- .../berries-abound-encounter.test.ts | 4 +-- .../bug-type-superfan-encounter.test.ts | 4 +-- .../clowning-around-encounter.test.ts | 4 +-- .../dancing-lessons-encounter.test.ts | 2 +- .../encounters/delibirdy-encounter.test.ts | 2 +- .../department-store-sale-encounter.test.ts | 2 +- .../encounters/field-trip-encounter.test.ts | 2 +- .../fiery-fallout-encounter.test.ts | 4 +-- .../fight-or-flight-encounter.test.ts | 4 +-- .../fun-and-games-encounter.test.ts | 4 +-- .../global-trade-system-encounter.test.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 4 +-- .../mysterious-challengers-encounter.test.ts | 4 +-- .../encounters/part-timer-encounter.test.ts | 2 +- .../encounters/safari-zone.test.ts | 4 +-- .../teleporting-hijinks-encounter.test.ts | 4 +-- .../the-expert-breeder-encounter.test.ts | 4 +-- .../the-pokemon-salesman-encounter.test.ts | 4 +-- .../the-strong-stuff-encounter.test.ts | 4 +-- .../the-winstrate-challenge-encounter.test.ts | 4 +-- .../trash-to-treasure-encounter.test.ts | 4 +-- .../uncommon-breed-encounter.test.ts | 4 +-- .../encounters/weird-dream-encounter.test.ts | 4 +-- .../mystery-encounter-utils.test.ts | 4 +-- .../mystery-encounter.test.ts | 2 +- .../phases/form-change-phase.test.ts | 2 +- .../phases/frenzy-move-reset.test.ts | 2 +- .../phases/game-over-phase.test.ts | 2 +- .../phases/learn-move-phase.test.ts | 2 +- .../phases/mystery-encounter-phase.test.ts | 2 +- {src/test => test}/phases/phases.test.ts | 2 +- .../phases/select-modifier-phase.test.ts | 4 +-- .../plugins/api/pokerogue-account-api.test.ts | 2 +- .../plugins/api/pokerogue-admin-api.test.ts | 2 +- .../plugins/api/pokerogue-api.test.ts | 2 +- .../plugins/api/pokerogue-daily-api.test.ts | 2 +- .../api/pokerogue-savedata-api.test.ts | 2 +- .../pokerogue-session-savedata-api.test.ts | 2 +- .../api/pokerogue-system-savedata-api.test.ts | 2 +- {src/test => test}/pre.test.ts | 0 {src/test => test}/reload.test.ts | 4 +-- .../settingMenu/helpers/inGameManip.ts | 0 .../settingMenu/helpers/menuManip.ts | 13 ++++++++- .../settingMenu/rebinding_setting.test.ts | 0 .../sprites/pokemonSprite.test.ts | 2 +- {src/test => test}/sprites/spritesUtils.ts | 0 {src/test => test}/system/game_data.test.ts | 4 +-- .../testUtils}/TextInterceptor.ts | 0 .../testUtils}/errorInterceptor.ts | 0 .../utils => test/testUtils}/fakeMobile.html | 0 .../utils => test/testUtils}/gameManager.ts | 28 +++++++++---------- .../testUtils}/gameManagerUtils.ts | 0 .../utils => test/testUtils}/gameWrapper.ts | 18 ++++++------ .../testUtils}/helpers/challengeModeHelper.ts | 0 .../testUtils}/helpers/classicModeHelper.ts | 0 .../testUtils}/helpers/dailyModeHelper.ts | 0 .../testUtils}/helpers/gameManagerHelper.ts | 0 .../testUtils}/helpers/modifiersHelper.ts | 0 .../testUtils}/helpers/moveHelper.ts | 4 +-- .../testUtils}/helpers/overridesHelper.ts | 0 .../testUtils}/helpers/reloadHelper.ts | 0 .../testUtils}/helpers/settingsHelper.ts | 0 .../utils => test/testUtils}/inputsHandler.ts | 4 +-- .../testUtils}/mocks/mockClock.ts | 0 .../testUtils}/mocks/mockConsoleLog.ts | 0 .../testUtils}/mocks/mockFetch.ts | 0 .../testUtils}/mocks/mockGameObject.ts | 0 .../testUtils}/mocks/mockGameObjectCreator.ts | 0 .../testUtils}/mocks/mockLoader.ts | 0 .../testUtils}/mocks/mockLocalStorage.ts | 0 .../testUtils}/mocks/mockTextureManager.ts | 16 +++++------ .../testUtils}/mocks/mockTimedEventManager.ts | 0 .../testUtils}/mocks/mockVideoGameObject.ts | 0 .../mocks/mocksContainer/mockContainer.ts | 2 +- .../mocks/mocksContainer/mockGraphics.ts | 0 .../mocks/mocksContainer/mockImage.ts | 2 +- .../mocks/mocksContainer/mockNineslice.ts | 2 +- .../mocks/mocksContainer/mockPolygon.ts | 2 +- .../mocks/mocksContainer/mockRectangle.ts | 0 .../mocks/mocksContainer/mockSprite.ts | 0 .../mocks/mocksContainer/mockText.ts | 0 .../mocks/mocksContainer/mockTexture.ts | 2 +- .../testUtils}/phaseInterceptor.ts | 2 +- .../testUtils}/saves/data_new.prsv | 0 .../testUtils}/saves/everything.prsv | 0 .../utils => test/testUtils}/testUtils.ts | 0 {src/test => test}/ui/battle_info.test.ts | 2 +- {src/test => test}/ui/starter-select.test.ts | 20 ++++++------- {src/test => test}/ui/transfer-item.test.ts | 2 +- {src/test => test}/ui/type-hints.test.ts | 4 +-- {src/test => test}/vitest.setup.ts | 2 +- tsconfig.json | 6 ++-- vitest.config.ts | 6 ++-- vitest.workspace.ts | 2 +- 405 files changed, 461 insertions(+), 450 deletions(-) rename {src/test => test}/abilities/ability_duplication.test.ts (96%) rename {src/test => test}/abilities/ability_timing.test.ts (96%) rename {src/test => test}/abilities/analytic.test.ts (98%) rename {src/test => test}/abilities/arena_trap.test.ts (98%) rename {src/test => test}/abilities/aroma_veil.test.ts (97%) rename {src/test => test}/abilities/aura_break.test.ts (97%) rename {src/test => test}/abilities/battery.test.ts (97%) rename {src/test => test}/abilities/battle_bond.test.ts (98%) rename {src/test => test}/abilities/beast_boost.test.ts (98%) rename {src/test => test}/abilities/commander.test.ts (99%) rename {src/test => test}/abilities/competitive.test.ts (97%) rename {src/test => test}/abilities/contrary.test.ts (97%) rename {src/test => test}/abilities/corrosion.test.ts (96%) rename {src/test => test}/abilities/costar.test.ts (97%) rename {src/test => test}/abilities/dancer.test.ts (98%) rename {src/test => test}/abilities/defiant.test.ts (97%) rename {src/test => test}/abilities/desolate-land.test.ts (98%) rename {src/test => test}/abilities/disguise.test.ts (99%) rename {src/test => test}/abilities/dry_skin.test.ts (98%) rename {src/test => test}/abilities/early_bird.test.ts (98%) rename {src/test => test}/abilities/flash_fire.test.ts (99%) rename {src/test => test}/abilities/flower_gift.test.ts (99%) rename {src/test => test}/abilities/forecast.test.ts (99%) rename {src/test => test}/abilities/friend_guard.test.ts (98%) rename {src/test => test}/abilities/galvanize.test.ts (98%) rename {src/test => test}/abilities/good_as_gold.test.ts (99%) rename {src/test => test}/abilities/gorilla_tactics.test.ts (98%) rename {src/test => test}/abilities/gulp_missile.test.ts (99%) rename {src/test => test}/abilities/heatproof.test.ts (97%) rename {src/test => test}/abilities/honey_gather.test.ts (97%) rename {src/test => test}/abilities/hustle.test.ts (98%) rename {src/test => test}/abilities/hyper_cutter.test.ts (96%) rename {src/test => test}/abilities/ice_face.test.ts (99%) rename {src/test => test}/abilities/illuminate.test.ts (96%) rename {src/test => test}/abilities/imposter.test.ts (98%) rename {src/test => test}/abilities/infiltrator.test.ts (98%) rename {src/test => test}/abilities/intimidate.test.ts (97%) rename {src/test => test}/abilities/intrepid_sword.test.ts (95%) rename {src/test => test}/abilities/libero.test.ts (99%) rename {src/test => test}/abilities/magic_bounce.test.ts (99%) rename {src/test => test}/abilities/magic_guard.test.ts (99%) rename {src/test => test}/abilities/mimicry.test.ts (98%) rename {src/test => test}/abilities/mirror_armor.test.ts (99%) rename {src/test => test}/abilities/moody.test.ts (98%) rename {src/test => test}/abilities/moxie.test.ts (97%) rename {src/test => test}/abilities/mummy.test.ts (96%) rename {src/test => test}/abilities/mycelium_might.test.ts (98%) rename {src/test => test}/abilities/no_guard.test.ts (97%) rename {src/test => test}/abilities/parental_bond.test.ts (99%) rename {src/test => test}/abilities/pastel_veil.test.ts (97%) rename {src/test => test}/abilities/perish_body.test.ts (98%) rename {src/test => test}/abilities/power_construct.test.ts (98%) rename {src/test => test}/abilities/power_spot.test.ts (97%) rename {src/test => test}/abilities/protean.test.ts (99%) rename {src/test => test}/abilities/protosynthesis.test.ts (97%) rename {src/test => test}/abilities/quick_draw.test.ts (98%) rename {src/test => test}/abilities/sand_spit.test.ts (97%) rename {src/test => test}/abilities/sand_veil.test.ts (97%) rename {src/test => test}/abilities/sap_sipper.test.ts (98%) rename {src/test => test}/abilities/schooling.test.ts (97%) rename {src/test => test}/abilities/screen_cleaner.test.ts (97%) rename {src/test => test}/abilities/seed_sower.test.ts (97%) rename {src/test => test}/abilities/serene_grace.test.ts (96%) rename {src/test => test}/abilities/sheer_force.test.ts (99%) rename {src/test => test}/abilities/shield_dust.test.ts (97%) rename {src/test => test}/abilities/shields_down.test.ts (99%) rename {src/test => test}/abilities/simple.test.ts (95%) rename {src/test => test}/abilities/speed_boost.test.ts (98%) rename {src/test => test}/abilities/stakeout.test.ts (97%) rename {src/test => test}/abilities/stall.test.ts (98%) rename {src/test => test}/abilities/steely_spirit.test.ts (98%) rename {src/test => test}/abilities/sturdy.test.ts (97%) rename {src/test => test}/abilities/supreme_overlord.test.ts (99%) rename {src/test => test}/abilities/sweet_veil.test.ts (98%) rename {src/test => test}/abilities/synchronize.test.ts (98%) rename {src/test => test}/abilities/tera_shell.test.ts (98%) rename {src/test => test}/abilities/trace.test.ts (96%) rename {src/test => test}/abilities/unburden.test.ts (99%) rename {src/test => test}/abilities/unseen_fist.test.ts (98%) rename {src/test => test}/abilities/volt_absorb.test.ts (98%) rename {src/test => test}/abilities/wandering_spirit.test.ts (97%) rename {src/test => test}/abilities/wimp_out.test.ts (99%) rename {src/test => test}/abilities/wind_power.test.ts (98%) rename {src/test => test}/abilities/wind_rider.test.ts (98%) rename {src/test => test}/abilities/wonder_skin.test.ts (97%) rename {src/test => test}/abilities/zen_mode.test.ts (98%) rename {src/test => test}/abilities/zero_to_hero.test.ts (98%) rename {src/test => test}/account.test.ts (99%) rename {src/test => test}/achievements/achievement.test.ts (99%) rename {src/test => test}/arena/arena_gravity.test.ts (98%) rename {src/test => test}/arena/grassy_terrain.test.ts (97%) rename {src/test => test}/arena/weather_fog.test.ts (96%) rename {src/test => test}/arena/weather_hail.test.ts (97%) rename {src/test => test}/arena/weather_sandstorm.test.ts (98%) rename {src/test => test}/arena/weather_strong_winds.test.ts (98%) rename {src/test => test}/battle-scene.test.ts (93%) rename {src/test => test}/battle/ability_swap.test.ts (97%) rename {src/test => test}/battle/battle-order.test.ts (99%) rename {src/test => test}/battle/battle.test.ts (98%) rename {src/test => test}/battle/damage_calculation.test.ts (98%) rename {src/test => test}/battle/double_battle.test.ts (98%) rename {src/test => test}/battle/inverse_battle.test.ts (99%) rename {src/test => test}/battle/special_battle.test.ts (98%) rename {src/test => test}/battlerTags/octolock.test.ts (96%) rename {src/test => test}/battlerTags/stockpiling.test.ts (99%) rename {src/test => test}/battlerTags/substitute.test.ts (100%) rename {src/test => test}/boss-pokemon.test.ts (99%) rename {src/test => test}/daily_mode.test.ts (98%) rename {src/test => test}/data/splash_messages.test.ts (100%) rename {src/test => test}/data/status_effect.test.ts (99%) rename {src/test => test}/eggs/egg.test.ts (99%) rename {src/test => test}/eggs/manaphy-egg.test.ts (96%) rename {src/test => test}/endless_boss.test.ts (98%) rename {src/test => test}/enemy_command.test.ts (98%) rename {src/test => test}/escape-calculations.test.ts (99%) rename {src/test => test}/evolution.test.ts (99%) rename {src/test => test}/field/pokemon.test.ts (99%) rename {src/test => test}/final_boss.test.ts (99%) rename {src/test => test}/fontFace.setup.ts (100%) rename {src/test => test}/game-mode.test.ts (95%) rename {src/test => test}/imports.test.ts (100%) rename {src/test => test}/inputs/inputs.test.ts (96%) rename {src/test => test}/internals.test.ts (95%) rename {src/test => test}/items/dire_hit.test.ts (98%) rename {src/test => test}/items/double_battle_chance_booster.test.ts (98%) rename {src/test => test}/items/eviolite.test.ts (99%) rename {src/test => test}/items/exp_booster.test.ts (95%) rename {src/test => test}/items/grip_claw.test.ts (98%) rename {src/test => test}/items/leek.test.ts (98%) rename {src/test => test}/items/leftovers.test.ts (97%) rename {src/test => test}/items/light_ball.test.ts (99%) rename {src/test => test}/items/lock_capsule.test.ts (96%) rename {src/test => test}/items/metal_powder.test.ts (99%) rename {src/test => test}/items/multi_lens.test.ts (99%) rename {src/test => test}/items/quick_powder.test.ts (99%) rename {src/test => test}/items/scope_lens.test.ts (95%) rename {src/test => test}/items/temp_stat_stage_booster.test.ts (99%) rename {src/test => test}/items/thick_club.test.ts (99%) rename {src/test => test}/items/toxic_orb.test.ts (96%) rename {src/test => test}/misc.test.ts (95%) rename {src/test => test}/moves/after_you.test.ts (97%) rename {src/test => test}/moves/alluring_voice.test.ts (96%) rename {src/test => test}/moves/aromatherapy.test.ts (98%) rename {src/test => test}/moves/assist.test.ts (98%) rename {src/test => test}/moves/astonish.test.ts (97%) rename {src/test => test}/moves/aurora_veil.test.ts (98%) rename {src/test => test}/moves/autotomize.test.ts (98%) rename {src/test => test}/moves/baddy_bad.test.ts (95%) rename {src/test => test}/moves/baneful_bunker.test.ts (98%) rename {src/test => test}/moves/baton_pass.test.ts (98%) rename {src/test => test}/moves/beak_blast.test.ts (98%) rename {src/test => test}/moves/beat_up.test.ts (97%) rename {src/test => test}/moves/belly_drum.test.ts (98%) rename {src/test => test}/moves/burning_jealousy.test.ts (98%) rename {src/test => test}/moves/camouflage.test.ts (96%) rename {src/test => test}/moves/ceaseless_edge.test.ts (98%) rename {src/test => test}/moves/chilly_reception.test.ts (98%) rename {src/test => test}/moves/chloroblast.test.ts (95%) rename {src/test => test}/moves/clangorous_soul.test.ts (98%) rename {src/test => test}/moves/copycat.test.ts (98%) rename {src/test => test}/moves/crafty_shield.test.ts (98%) rename {src/test => test}/moves/defog.test.ts (97%) rename {src/test => test}/moves/destiny_bond.test.ts (99%) rename {src/test => test}/moves/diamond_storm.test.ts (96%) rename {src/test => test}/moves/dig.test.ts (98%) rename {src/test => test}/moves/disable.test.ts (98%) rename {src/test => test}/moves/dive.test.ts (98%) rename {src/test => test}/moves/doodle.test.ts (97%) rename {src/test => test}/moves/double_team.test.ts (96%) rename {src/test => test}/moves/dragon_cheer.test.ts (98%) rename {src/test => test}/moves/dragon_rage.test.ts (98%) rename {src/test => test}/moves/dragon_tail.test.ts (99%) rename {src/test => test}/moves/dynamax_cannon.test.ts (99%) rename {src/test => test}/moves/effectiveness.test.ts (98%) rename {src/test => test}/moves/electrify.test.ts (97%) rename {src/test => test}/moves/electro_shot.test.ts (98%) rename {src/test => test}/moves/encore.test.ts (98%) rename {src/test => test}/moves/endure.test.ts (97%) rename {src/test => test}/moves/entrainment.test.ts (96%) rename {src/test => test}/moves/fairy_lock.test.ts (99%) rename {src/test => test}/moves/fake_out.test.ts (98%) rename {src/test => test}/moves/fell_stinger.test.ts (99%) rename {src/test => test}/moves/fillet_away.test.ts (98%) rename {src/test => test}/moves/fissure.test.ts (97%) rename {src/test => test}/moves/flame_burst.test.ts (98%) rename {src/test => test}/moves/flower_shield.test.ts (98%) rename {src/test => test}/moves/fly.test.ts (98%) rename {src/test => test}/moves/focus_punch.test.ts (98%) rename {src/test => test}/moves/follow_me.test.ts (98%) rename {src/test => test}/moves/foresight.test.ts (97%) rename {src/test => test}/moves/forests_curse.test.ts (96%) rename {src/test => test}/moves/freeze_dry.test.ts (99%) rename {src/test => test}/moves/freezy_frost.test.ts (98%) rename {src/test => test}/moves/fusion_bolt.test.ts (96%) rename {src/test => test}/moves/fusion_flare.test.ts (96%) rename {src/test => test}/moves/fusion_flare_bolt.test.ts (99%) rename {src/test => test}/moves/future_sight.test.ts (95%) rename {src/test => test}/moves/gastro_acid.test.ts (97%) rename {src/test => test}/moves/geomancy.test.ts (97%) rename {src/test => test}/moves/gigaton_hammer.test.ts (97%) rename {src/test => test}/moves/glaive_rush.test.ts (98%) rename {src/test => test}/moves/growth.test.ts (96%) rename {src/test => test}/moves/grudge.test.ts (98%) rename {src/test => test}/moves/guard_split.test.ts (97%) rename {src/test => test}/moves/guard_swap.test.ts (97%) rename {src/test => test}/moves/hard_press.test.ts (97%) rename {src/test => test}/moves/haze.test.ts (97%) rename {src/test => test}/moves/heal_bell.test.ts (98%) rename {src/test => test}/moves/heal_block.test.ts (98%) rename {src/test => test}/moves/heart_swap.test.ts (96%) rename {src/test => test}/moves/hyper_beam.test.ts (97%) rename {src/test => test}/moves/imprison.test.ts (98%) rename {src/test => test}/moves/instruct.test.ts (99%) rename {src/test => test}/moves/jaw_lock.test.ts (99%) rename {src/test => test}/moves/lash_out.test.ts (96%) rename {src/test => test}/moves/last_respects.test.ts (99%) rename {src/test => test}/moves/light_screen.test.ts (98%) rename {src/test => test}/moves/lucky_chant.test.ts (98%) rename {src/test => test}/moves/lunar_blessing.test.ts (97%) rename {src/test => test}/moves/lunar_dance.test.ts (98%) rename {src/test => test}/moves/magic_coat.test.ts (99%) rename {src/test => test}/moves/magnet_rise.test.ts (97%) rename {src/test => test}/moves/make_it_rain.test.ts (98%) rename {src/test => test}/moves/mat_block.test.ts (98%) rename {src/test => test}/moves/metal_burst.test.ts (98%) rename {src/test => test}/moves/metronome.test.ts (98%) rename {src/test => test}/moves/miracle_eye.test.ts (96%) rename {src/test => test}/moves/mirror_move.test.ts (98%) rename {src/test => test}/moves/mist.test.ts (96%) rename {src/test => test}/moves/moongeist_beam.test.ts (97%) rename {src/test => test}/moves/multi_target.test.ts (98%) rename {src/test => test}/moves/nightmare.test.ts (96%) rename {src/test => test}/moves/obstruct.test.ts (98%) rename {src/test => test}/moves/octolock.test.ts (98%) rename {src/test => test}/moves/order_up.test.ts (98%) rename {src/test => test}/moves/parting_shot.test.ts (99%) rename {src/test => test}/moves/plasma_fists.test.ts (98%) rename {src/test => test}/moves/pledge_moves.test.ts (99%) rename {src/test => test}/moves/powder.test.ts (99%) rename {src/test => test}/moves/power_shift.test.ts (97%) rename {src/test => test}/moves/power_split.test.ts (97%) rename {src/test => test}/moves/power_swap.test.ts (97%) rename {src/test => test}/moves/power_trick.test.ts (98%) rename {src/test => test}/moves/protect.test.ts (98%) rename {src/test => test}/moves/psycho_shift.test.ts (96%) rename {src/test => test}/moves/purify.test.ts (97%) rename {src/test => test}/moves/quash.test.ts (98%) rename {src/test => test}/moves/quick_guard.test.ts (98%) rename {src/test => test}/moves/rage_fist.test.ts (98%) rename {src/test => test}/moves/rage_powder.test.ts (97%) rename {src/test => test}/moves/reflect.test.ts (98%) rename {src/test => test}/moves/reflect_type.test.ts (97%) rename {src/test => test}/moves/relic_song.test.ts (97%) rename {src/test => test}/moves/retaliate.test.ts (96%) rename {src/test => test}/moves/revival_blessing.test.ts (98%) rename {src/test => test}/moves/role_play.test.ts (96%) rename {src/test => test}/moves/rollout.test.ts (98%) rename {src/test => test}/moves/roost.test.ts (99%) rename {src/test => test}/moves/round.test.ts (97%) rename {src/test => test}/moves/safeguard.test.ts (98%) rename {src/test => test}/moves/scale_shot.test.ts (98%) rename {src/test => test}/moves/secret_power.test.ts (98%) rename {src/test => test}/moves/shed_tail.test.ts (97%) rename {src/test => test}/moves/shell_side_arm.test.ts (97%) rename {src/test => test}/moves/shell_trap.test.ts (98%) rename {src/test => test}/moves/simple_beam.test.ts (95%) rename {src/test => test}/moves/sketch.test.ts (98%) rename {src/test => test}/moves/skill_swap.test.ts (96%) rename {src/test => test}/moves/sleep_talk.test.ts (97%) rename {src/test => test}/moves/solar_beam.test.ts (98%) rename {src/test => test}/moves/sparkly_swirl.test.ts (98%) rename {src/test => test}/moves/spectral_thief.test.ts (99%) rename {src/test => test}/moves/speed_swap.test.ts (96%) rename {src/test => test}/moves/spikes.test.ts (97%) rename {src/test => test}/moves/spit_up.test.ts (99%) rename {src/test => test}/moves/spotlight.test.ts (97%) rename {src/test => test}/moves/steamroller.test.ts (97%) rename {src/test => test}/moves/stockpile.test.ts (98%) rename {src/test => test}/moves/substitute.test.ts (99%) rename {src/test => test}/moves/swallow.test.ts (99%) rename {src/test => test}/moves/syrup_bomb.test.ts (98%) rename {src/test => test}/moves/tackle.test.ts (97%) rename {src/test => test}/moves/tail_whip.test.ts (96%) rename {src/test => test}/moves/tailwind.test.ts (98%) rename {src/test => test}/moves/tar_shot.test.ts (98%) rename {src/test => test}/moves/taunt.test.ts (96%) rename {src/test => test}/moves/telekinesis.test.ts (99%) rename {src/test => test}/moves/tera_blast.test.ts (96%) rename {src/test => test}/moves/tera_starstorm.test.ts (98%) rename {src/test => test}/moves/thousand_arrows.test.ts (98%) rename {src/test => test}/moves/throat_chop.test.ts (96%) rename {src/test => test}/moves/thunder_wave.test.ts (98%) rename {src/test => test}/moves/tidy_up.test.ts (98%) rename {src/test => test}/moves/torment.test.ts (97%) rename {src/test => test}/moves/toxic.test.ts (98%) rename {src/test => test}/moves/toxic_spikes.test.ts (98%) rename {src/test => test}/moves/transform.test.ts (98%) rename {src/test => test}/moves/trick_or_treat.test.ts (96%) rename {src/test => test}/moves/triple_arrows.test.ts (97%) rename {src/test => test}/moves/u_turn.test.ts (98%) rename {src/test => test}/moves/upper_hand.test.ts (98%) rename {src/test => test}/moves/whirlwind.test.ts (99%) rename {src/test => test}/moves/wide_guard.test.ts (98%) rename {src/test => test}/moves/will_o_wisp.test.ts (96%) rename {src/test => test}/mystery-encounter/encounter-test-utils.ts (99%) rename {src/test => test}/mystery-encounter/encounters/a-trainers-test-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/absolute-avarice-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/berries-abound-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/clowning-around-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/dancing-lessons-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/delibirdy-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/department-store-sale-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/field-trip-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/fiery-fallout-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fight-or-flight-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fun-and-games-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/global-trade-system-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/lost-at-sea-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/part-timer-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/safari-zone.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/uncommon-breed-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/weird-dream-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter-utils.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter.test.ts (96%) rename {src/test => test}/phases/form-change-phase.test.ts (97%) rename {src/test => test}/phases/frenzy-move-reset.test.ts (97%) rename {src/test => test}/phases/game-over-phase.test.ts (98%) rename {src/test => test}/phases/learn-move-phase.test.ts (99%) rename {src/test => test}/phases/mystery-encounter-phase.test.ts (98%) rename {src/test => test}/phases/phases.test.ts (96%) rename {src/test => test}/phases/select-modifier-phase.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-account-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-admin-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-daily-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-savedata-api.test.ts (96%) rename {src/test => test}/plugins/api/pokerogue-session-savedata-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-system-savedata-api.test.ts (98%) rename {src/test => test}/pre.test.ts (100%) rename {src/test => test}/reload.test.ts (97%) rename {src/test => test}/settingMenu/helpers/inGameManip.ts (100%) rename {src/test => test}/settingMenu/helpers/menuManip.ts (92%) rename {src/test => test}/settingMenu/rebinding_setting.test.ts (100%) rename {src/test => test}/sprites/pokemonSprite.test.ts (99%) rename {src/test => test}/sprites/spritesUtils.ts (100%) rename {src/test => test}/system/game_data.test.ts (96%) rename {src/test/utils => test/testUtils}/TextInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/errorInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/fakeMobile.html (100%) rename {src/test/utils => test/testUtils}/gameManager.ts (95%) rename {src/test/utils => test/testUtils}/gameManagerUtils.ts (100%) rename {src/test/utils => test/testUtils}/gameWrapper.ts (93%) rename {src/test/utils => test/testUtils}/helpers/challengeModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/classicModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/dailyModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/gameManagerHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/modifiersHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/moveHelper.ts (97%) rename {src/test/utils => test/testUtils}/helpers/overridesHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/reloadHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/settingsHelper.ts (100%) rename {src/test/utils => test/testUtils}/inputsHandler.ts (94%) rename {src/test/utils => test/testUtils}/mocks/mockClock.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockConsoleLog.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockFetch.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObjectCreator.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLoader.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLocalStorage.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockTextureManager.ts (80%) rename {src/test/utils => test/testUtils}/mocks/mockTimedEventManager.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockVideoGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockContainer.ts (98%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockGraphics.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockImage.ts (70%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockNineslice.ts (86%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockPolygon.ts (67%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockRectangle.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockSprite.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockText.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockTexture.ts (92%) rename {src/test/utils => test/testUtils}/phaseInterceptor.ts (99%) rename {src/test/utils => test/testUtils}/saves/data_new.prsv (100%) rename {src/test/utils => test/testUtils}/saves/everything.prsv (100%) rename {src/test/utils => test/testUtils}/testUtils.ts (100%) rename {src/test => test}/ui/battle_info.test.ts (96%) rename {src/test => test}/ui/starter-select.test.ts (97%) rename {src/test => test}/ui/transfer-item.test.ts (98%) rename {src/test => test}/ui/type-hints.test.ts (95%) rename {src/test => test}/vitest.setup.ts (97%) diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index 25f7b64ce85..8c6dff55c8c 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -156,7 +156,7 @@ module.exports = { path: '^(src)', pathNot: [ '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', - 'src/test' + './test' ] }, to: { diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index a365999c623..04e1a29cb5f 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -84,19 +84,19 @@ async function runInteractive() { let description; switch (type) { case "move": - dir = path.join(__dirname, "src", "test", "moves"); + dir = path.join(__dirname, "test", "moves"); description = `Moves - ${formattedName}`; break; case "ability": - dir = path.join(__dirname, "src", "test", "abilities"); + dir = path.join(__dirname, "test", "abilities"); description = `Abilities - ${formattedName}`; break; case "item": - dir = path.join(__dirname, "src", "test", "items"); + dir = path.join(__dirname, "test", "items"); description = `Items - ${formattedName}`; break; case "mystery encounter": - dir = path.join(__dirname, "src", "test", "mystery-encounter", "encounters"); + dir = path.join(__dirname, "test", "mystery-encounter", "encounters"); description = `Mystery Encounter - ${formattedName}`; break; default: diff --git a/eslint.config.js b/eslint.config.js index 0da9cc604bf..e79395e1900 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -6,7 +6,7 @@ import importX from 'eslint-plugin-import-x'; export default [ { name: "eslint-config", - files: ["src/**/*.{ts,tsx,js,jsx}"], + files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], languageOptions: { parser: parser @@ -52,7 +52,7 @@ export default [ }, { name: "eslint-tests", - files: ["src/test/**/**.test.ts"], + files: ["test/**/**.test.ts"], languageOptions: { parser: parser, parserOptions: { diff --git a/src/test/abilities/ability_duplication.test.ts b/test/abilities/ability_duplication.test.ts similarity index 96% rename from src/test/abilities/ability_duplication.test.ts rename to test/abilities/ability_duplication.test.ts index f9122b3259c..73092b41ce6 100644 --- a/src/test/abilities/ability_duplication.test.ts +++ b/test/abilities/ability_duplication.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/ability_timing.test.ts b/test/abilities/ability_timing.test.ts similarity index 96% rename from src/test/abilities/ability_timing.test.ts rename to test/abilities/ability_timing.test.ts index e3264c2c1a8..85332b9cd82 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/test/abilities/ability_timing.test.ts @@ -5,7 +5,7 @@ import i18next from "#app/plugins/i18n"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts similarity index 98% rename from src/test/abilities/analytic.test.ts rename to test/abilities/analytic.test.ts index 12777c545f0..45f7bc55006 100644 --- a/src/test/abilities/analytic.test.ts +++ b/test/abilities/analytic.test.ts @@ -3,7 +3,7 @@ import { isBetween, toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/arena_trap.test.ts b/test/abilities/arena_trap.test.ts similarity index 98% rename from src/test/abilities/arena_trap.test.ts rename to test/abilities/arena_trap.test.ts index 12b9673080d..dda6e60e886 100644 --- a/src/test/abilities/arena_trap.test.ts +++ b/test/abilities/arena_trap.test.ts @@ -2,7 +2,7 @@ import { allAbilities } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/aroma_veil.test.ts b/test/abilities/aroma_veil.test.ts similarity index 97% rename from src/test/abilities/aroma_veil.test.ts rename to test/abilities/aroma_veil.test.ts index 4ba4d16504b..111d682aabe 100644 --- a/src/test/abilities/aroma_veil.test.ts +++ b/test/abilities/aroma_veil.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts similarity index 97% rename from src/test/abilities/aura_break.test.ts rename to test/abilities/aura_break.test.ts index 137688d1f22..230835a887e 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battery.test.ts b/test/abilities/battery.test.ts similarity index 97% rename from src/test/abilities/battery.test.ts rename to test/abilities/battery.test.ts index 8abeca287f7..b82ffaeea7b 100644 --- a/src/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts similarity index 98% rename from src/test/abilities/battle_bond.test.ts rename to test/abilities/battle_bond.test.ts index db7ed01e7d9..38d25fa3800 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/beast_boost.test.ts b/test/abilities/beast_boost.test.ts similarity index 98% rename from src/test/abilities/beast_boost.test.ts rename to test/abilities/beast_boost.test.ts index de31b979e32..c9877709467 100644 --- a/src/test/abilities/beast_boost.test.ts +++ b/test/abilities/beast_boost.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/commander.test.ts b/test/abilities/commander.test.ts similarity index 99% rename from src/test/abilities/commander.test.ts rename to test/abilities/commander.test.ts index 70568639b61..1b054bbd5ea 100644 --- a/src/test/abilities/commander.test.ts +++ b/test/abilities/commander.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts similarity index 97% rename from src/test/abilities/competitive.test.ts rename to test/abilities/competitive.test.ts index ecb276a1b8d..e4baf9b9855 100644 --- a/src/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts similarity index 97% rename from src/test/abilities/contrary.test.ts rename to test/abilities/contrary.test.ts index c838a5a098e..eaf8d885a83 100644 --- a/src/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/corrosion.test.ts b/test/abilities/corrosion.test.ts similarity index 96% rename from src/test/abilities/corrosion.test.ts rename to test/abilities/corrosion.test.ts index e607e85defb..2829c3c3b41 100644 --- a/src/test/abilities/corrosion.test.ts +++ b/test/abilities/corrosion.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/costar.test.ts b/test/abilities/costar.test.ts similarity index 97% rename from src/test/abilities/costar.test.ts rename to test/abilities/costar.test.ts index 3be29ea2dcf..09b724a07ec 100644 --- a/src/test/abilities/costar.test.ts +++ b/test/abilities/costar.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts similarity index 98% rename from src/test/abilities/dancer.test.ts rename to test/abilities/dancer.test.ts index 3a480316c96..99d8a6d588d 100644 --- a/src/test/abilities/dancer.test.ts +++ b/test/abilities/dancer.test.ts @@ -3,7 +3,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts similarity index 97% rename from src/test/abilities/defiant.test.ts rename to test/abilities/defiant.test.ts index aa8d250dad7..ce8c7bac8b3 100644 --- a/src/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts similarity index 98% rename from src/test/abilities/desolate-land.test.ts rename to test/abilities/desolate-land.test.ts index 75576d7a8f6..4aa44c97404 100644 --- a/src/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -3,7 +3,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts similarity index 99% rename from src/test/abilities/disguise.test.ts rename to test/abilities/disguise.test.ts index 07a84bd7a5a..cb875e23019 100644 --- a/src/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/dry_skin.test.ts b/test/abilities/dry_skin.test.ts similarity index 98% rename from src/test/abilities/dry_skin.test.ts rename to test/abilities/dry_skin.test.ts index 314564df15c..f3a67f0c1fd 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/test/abilities/dry_skin.test.ts @@ -1,7 +1,7 @@ import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/early_bird.test.ts b/test/abilities/early_bird.test.ts similarity index 98% rename from src/test/abilities/early_bird.test.ts rename to test/abilities/early_bird.test.ts index a69290fa1e4..5889cfe2f89 100644 --- a/src/test/abilities/early_bird.test.ts +++ b/test/abilities/early_bird.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flash_fire.test.ts b/test/abilities/flash_fire.test.ts similarity index 99% rename from src/test/abilities/flash_fire.test.ts rename to test/abilities/flash_fire.test.ts index 0ca55227ea4..1c94c694b29 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/test/abilities/flash_fire.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts similarity index 99% rename from src/test/abilities/flower_gift.test.ts rename to test/abilities/flower_gift.test.ts index 04ada598f22..99f4211eeaa 100644 --- a/src/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -4,7 +4,7 @@ import { Stat } from "#app/enums/stat"; import { WeatherType } from "#app/enums/weather-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts similarity index 99% rename from src/test/abilities/forecast.test.ts rename to test/abilities/forecast.test.ts index 6d1f776da16..31c9942cd98 100644 --- a/src/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -9,7 +9,7 @@ import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts similarity index 98% rename from src/test/abilities/friend_guard.test.ts rename to test/abilities/friend_guard.test.ts index 4ce64468c43..986bd8e7925 100644 --- a/src/test/abilities/friend_guard.test.ts +++ b/test/abilities/friend_guard.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts similarity index 98% rename from src/test/abilities/galvanize.test.ts rename to test/abilities/galvanize.test.ts index 80e767866ea..f0230be3b31 100644 --- a/src/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/good_as_gold.test.ts b/test/abilities/good_as_gold.test.ts similarity index 99% rename from src/test/abilities/good_as_gold.test.ts rename to test/abilities/good_as_gold.test.ts index ecda1a0e031..e3367d5b7f8 100644 --- a/src/test/abilities/good_as_gold.test.ts +++ b/test/abilities/good_as_gold.test.ts @@ -9,7 +9,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/gorilla_tactics.test.ts b/test/abilities/gorilla_tactics.test.ts similarity index 98% rename from src/test/abilities/gorilla_tactics.test.ts rename to test/abilities/gorilla_tactics.test.ts index 8aee365eb8f..e97bca6a725 100644 --- a/src/test/abilities/gorilla_tactics.test.ts +++ b/test/abilities/gorilla_tactics.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/gulp_missile.test.ts b/test/abilities/gulp_missile.test.ts similarity index 99% rename from src/test/abilities/gulp_missile.test.ts rename to test/abilities/gulp_missile.test.ts index bbb103c63e6..d34e86ddc08 100644 --- a/src/test/abilities/gulp_missile.test.ts +++ b/test/abilities/gulp_missile.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts similarity index 97% rename from src/test/abilities/heatproof.test.ts rename to test/abilities/heatproof.test.ts index bf4e99ce467..6c41460535f 100644 --- a/src/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/honey_gather.test.ts b/test/abilities/honey_gather.test.ts similarity index 97% rename from src/test/abilities/honey_gather.test.ts rename to test/abilities/honey_gather.test.ts index fc9d6cdd150..a1cad453843 100644 --- a/src/test/abilities/honey_gather.test.ts +++ b/test/abilities/honey_gather.test.ts @@ -3,7 +3,7 @@ import { Command } from "#app/ui/command-ui-handler"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts similarity index 98% rename from src/test/abilities/hustle.test.ts rename to test/abilities/hustle.test.ts index 08a441315fb..c92bc5cbbd3 100644 --- a/src/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hyper_cutter.test.ts b/test/abilities/hyper_cutter.test.ts similarity index 96% rename from src/test/abilities/hyper_cutter.test.ts rename to test/abilities/hyper_cutter.test.ts index e51fef6bd49..c8c4c21c98f 100644 --- a/src/test/abilities/hyper_cutter.test.ts +++ b/test/abilities/hyper_cutter.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/ice_face.test.ts b/test/abilities/ice_face.test.ts similarity index 99% rename from src/test/abilities/ice_face.test.ts rename to test/abilities/ice_face.test.ts index e31bee1c721..e4339cb8a28 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/test/abilities/ice_face.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts similarity index 96% rename from src/test/abilities/illuminate.test.ts rename to test/abilities/illuminate.test.ts index 4f7d3d83b51..c4fbcd2c7a4 100644 --- a/src/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts similarity index 98% rename from src/test/abilities/imposter.test.ts rename to test/abilities/imposter.test.ts index 98f30c60505..d73b77feda9 100644 --- a/src/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts similarity index 98% rename from src/test/abilities/infiltrator.test.ts rename to test/abilities/infiltrator.test.ts index 8ea72b55b0c..c614bbe4474 100644 --- a/src/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -7,7 +7,7 @@ import { StatusEffect } from "#enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts similarity index 97% rename from src/test/abilities/intimidate.test.ts rename to test/abilities/intimidate.test.ts index d5a37d06593..eab59e7c1a2 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Mode } from "#app/ui/ui"; import { Stat } from "#enums/stat"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/intrepid_sword.test.ts b/test/abilities/intrepid_sword.test.ts similarity index 95% rename from src/test/abilities/intrepid_sword.test.ts rename to test/abilities/intrepid_sword.test.ts index 7bf0654276c..0f4305d38b4 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/test/abilities/intrepid_sword.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/libero.test.ts b/test/abilities/libero.test.ts similarity index 99% rename from src/test/abilities/libero.test.ts rename to test/abilities/libero.test.ts index f6e85979c69..46093019daa 100644 --- a/src/test/abilities/libero.test.ts +++ b/test/abilities/libero.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts similarity index 99% rename from src/test/abilities/magic_bounce.test.ts rename to test/abilities/magic_bounce.test.ts index 2fc460662ca..9bb7b55bc72 100644 --- a/src/test/abilities/magic_bounce.test.ts +++ b/test/abilities/magic_bounce.test.ts @@ -9,7 +9,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Magic Bounce", () => { diff --git a/src/test/abilities/magic_guard.test.ts b/test/abilities/magic_guard.test.ts similarity index 99% rename from src/test/abilities/magic_guard.test.ts rename to test/abilities/magic_guard.test.ts index 7c038354748..a2a88915419 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/test/abilities/magic_guard.test.ts @@ -8,7 +8,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts similarity index 98% rename from src/test/abilities/mimicry.test.ts rename to test/abilities/mimicry.test.ts index 29aa1d649d3..75990c89707 100644 --- a/src/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mirror_armor.test.ts b/test/abilities/mirror_armor.test.ts similarity index 99% rename from src/test/abilities/mirror_armor.test.ts rename to test/abilities/mirror_armor.test.ts index 070428a8ee7..1d103c45be1 100644 --- a/src/test/abilities/mirror_armor.test.ts +++ b/test/abilities/mirror_armor.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/moody.test.ts b/test/abilities/moody.test.ts similarity index 98% rename from src/test/abilities/moody.test.ts rename to test/abilities/moody.test.ts index 166f69b0fe3..64c2c7d8a07 100644 --- a/src/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -2,7 +2,7 @@ import { BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts similarity index 97% rename from src/test/abilities/moxie.test.ts rename to test/abilities/moxie.test.ts index 5f337fedabb..c518c55671f 100644 --- a/src/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts similarity index 96% rename from src/test/abilities/mummy.test.ts rename to test/abilities/mummy.test.ts index bf93cdcf61d..96b5e170c14 100644 --- a/src/test/abilities/mummy.test.ts +++ b/test/abilities/mummy.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts similarity index 98% rename from src/test/abilities/mycelium_might.test.ts rename to test/abilities/mycelium_might.test.ts index 0c8e7b5a703..2c0bd39b32a 100644 --- a/src/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -1,6 +1,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Stat } from "#enums/stat"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/no_guard.test.ts b/test/abilities/no_guard.test.ts similarity index 97% rename from src/test/abilities/no_guard.test.ts rename to test/abilities/no_guard.test.ts index b0b454dd560..1a319eb2611 100644 --- a/src/test/abilities/no_guard.test.ts +++ b/test/abilities/no_guard.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts similarity index 99% rename from src/test/abilities/parental_bond.test.ts rename to test/abilities/parental_bond.test.ts index c2f54fa4cfc..d22c5615df2 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/pastel_veil.test.ts b/test/abilities/pastel_veil.test.ts similarity index 97% rename from src/test/abilities/pastel_veil.test.ts rename to test/abilities/pastel_veil.test.ts index dd8360493a1..cb73a79bae4 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/test/abilities/pastel_veil.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/perish_body.test.ts b/test/abilities/perish_body.test.ts similarity index 98% rename from src/test/abilities/perish_body.test.ts rename to test/abilities/perish_body.test.ts index 70ba6d8d684..7084076713a 100644 --- a/src/test/abilities/perish_body.test.ts +++ b/test/abilities/perish_body.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/power_construct.test.ts b/test/abilities/power_construct.test.ts similarity index 98% rename from src/test/abilities/power_construct.test.ts rename to test/abilities/power_construct.test.ts index aaab5ddb5c4..b6b7be33753 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/test/abilities/power_construct.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts similarity index 97% rename from src/test/abilities/power_spot.test.ts rename to test/abilities/power_spot.test.ts index a566c2277c3..dbc3799d48d 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/protean.test.ts b/test/abilities/protean.test.ts similarity index 99% rename from src/test/abilities/protean.test.ts rename to test/abilities/protean.test.ts index c7d04b9e1c8..a20fa61d75f 100644 --- a/src/test/abilities/protean.test.ts +++ b/test/abilities/protean.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts similarity index 97% rename from src/test/abilities/protosynthesis.test.ts rename to test/abilities/protosynthesis.test.ts index 67786c3ae9e..a122fbad797 100644 --- a/src/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Nature } from "#enums/nature"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/quick_draw.test.ts b/test/abilities/quick_draw.test.ts similarity index 98% rename from src/test/abilities/quick_draw.test.ts rename to test/abilities/quick_draw.test.ts index 4979152f4d6..c451218a56c 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/test/abilities/quick_draw.test.ts @@ -3,7 +3,7 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sand_spit.test.ts b/test/abilities/sand_spit.test.ts similarity index 97% rename from src/test/abilities/sand_spit.test.ts rename to test/abilities/sand_spit.test.ts index 092c3e66105..dafae695d3b 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/test/abilities/sand_spit.test.ts @@ -2,7 +2,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/sand_veil.test.ts b/test/abilities/sand_veil.test.ts similarity index 97% rename from src/test/abilities/sand_veil.test.ts rename to test/abilities/sand_veil.test.ts index ee8ca450df9..0128276075b 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/test/abilities/sand_veil.test.ts @@ -7,7 +7,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts similarity index 98% rename from src/test/abilities/sap_sipper.test.ts rename to test/abilities/sap_sipper.test.ts index dc254a54b54..836219fcbcb 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, RandomMoveAttr } from "#app/data/move"; diff --git a/src/test/abilities/schooling.test.ts b/test/abilities/schooling.test.ts similarity index 97% rename from src/test/abilities/schooling.test.ts rename to test/abilities/schooling.test.ts index e1ec58f517e..a52c6a06f12 100644 --- a/src/test/abilities/schooling.test.ts +++ b/test/abilities/schooling.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/screen_cleaner.test.ts b/test/abilities/screen_cleaner.test.ts similarity index 97% rename from src/test/abilities/screen_cleaner.test.ts rename to test/abilities/screen_cleaner.test.ts index c036aa90a77..9c182398765 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/test/abilities/screen_cleaner.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/seed_sower.test.ts b/test/abilities/seed_sower.test.ts similarity index 97% rename from src/test/abilities/seed_sower.test.ts rename to test/abilities/seed_sower.test.ts index 71b76e24d2e..6e3acdf6093 100644 --- a/src/test/abilities/seed_sower.test.ts +++ b/test/abilities/seed_sower.test.ts @@ -2,7 +2,7 @@ import { TerrainType } from "#app/data/terrain"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts similarity index 96% rename from src/test/abilities/serene_grace.test.ts rename to test/abilities/serene_grace.test.ts index 6f9b2195a9c..cb21121743b 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/test/abilities/serene_grace.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { allMoves } from "#app/data/move"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts similarity index 99% rename from src/test/abilities/sheer_force.test.ts rename to test/abilities/sheer_force.test.ts index a0ddf5bb9c6..a65334cbfa0 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/test/abilities/sheer_force.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, FlinchAttr } from "#app/data/move"; diff --git a/src/test/abilities/shield_dust.test.ts b/test/abilities/shield_dust.test.ts similarity index 97% rename from src/test/abilities/shield_dust.test.ts rename to test/abilities/shield_dust.test.ts index 329f52cc4c6..a63898b0c63 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/test/abilities/shield_dust.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/shields_down.test.ts b/test/abilities/shields_down.test.ts similarity index 99% rename from src/test/abilities/shields_down.test.ts rename to test/abilities/shields_down.test.ts index ca6d945824e..4e47a018471 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/test/abilities/shields_down.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/simple.test.ts b/test/abilities/simple.test.ts similarity index 95% rename from src/test/abilities/simple.test.ts rename to test/abilities/simple.test.ts index e5ca474d7c3..e8d478655ab 100644 --- a/src/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/speed_boost.test.ts b/test/abilities/speed_boost.test.ts similarity index 98% rename from src/test/abilities/speed_boost.test.ts rename to test/abilities/speed_boost.test.ts index 74ee6a8cb92..912bb62bca4 100644 --- a/src/test/abilities/speed_boost.test.ts +++ b/test/abilities/speed_boost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import type { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/abilities/stakeout.test.ts b/test/abilities/stakeout.test.ts similarity index 97% rename from src/test/abilities/stakeout.test.ts rename to test/abilities/stakeout.test.ts index 885169b284e..67442ae1822 100644 --- a/src/test/abilities/stakeout.test.ts +++ b/test/abilities/stakeout.test.ts @@ -3,7 +3,7 @@ import { isBetween } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/stall.test.ts b/test/abilities/stall.test.ts similarity index 98% rename from src/test/abilities/stall.test.ts rename to test/abilities/stall.test.ts index b51c56dbe1f..c0b71221071 100644 --- a/src/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; diff --git a/src/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts similarity index 98% rename from src/test/abilities/steely_spirit.test.ts rename to test/abilities/steely_spirit.test.ts index 61e76989060..e1f6a04c0fa 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sturdy.test.ts b/test/abilities/sturdy.test.ts similarity index 97% rename from src/test/abilities/sturdy.test.ts rename to test/abilities/sturdy.test.ts index 8f134338f12..36b098ab69e 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/test/abilities/sturdy.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts similarity index 99% rename from src/test/abilities/supreme_overlord.test.ts rename to test/abilities/supreme_overlord.test.ts index ecd595cb6bb..6de17bc3c7a 100644 --- a/src/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/abilities/sweet_veil.test.ts b/test/abilities/sweet_veil.test.ts similarity index 98% rename from src/test/abilities/sweet_veil.test.ts rename to test/abilities/sweet_veil.test.ts index ef66cb1c68a..14f4f79c3f0 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/test/abilities/sweet_veil.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts similarity index 98% rename from src/test/abilities/synchronize.test.ts rename to test/abilities/synchronize.test.ts index 2ae80ae9c7a..19b5560f61a 100644 --- a/src/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/tera_shell.test.ts b/test/abilities/tera_shell.test.ts similarity index 98% rename from src/test/abilities/tera_shell.test.ts rename to test/abilities/tera_shell.test.ts index 01382d0fd9a..38be70f511b 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/test/abilities/tera_shell.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/trace.test.ts b/test/abilities/trace.test.ts similarity index 96% rename from src/test/abilities/trace.test.ts rename to test/abilities/trace.test.ts index ffa76f59769..e7059d2b0f1 100644 --- a/src/test/abilities/trace.test.ts +++ b/test/abilities/trace.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts similarity index 99% rename from src/test/abilities/unburden.test.ts rename to test/abilities/unburden.test.ts index 9c5f6c2d185..67cf83870b3 100644 --- a/src/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -9,7 +9,7 @@ import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts similarity index 98% rename from src/test/abilities/unseen_fist.test.ts rename to test/abilities/unseen_fist.test.ts index 584f997aa55..de93aef0988 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/test/abilities/unseen_fist.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#app/enums/battler-tag-type"; diff --git a/src/test/abilities/volt_absorb.test.ts b/test/abilities/volt_absorb.test.ts similarity index 98% rename from src/test/abilities/volt_absorb.test.ts rename to test/abilities/volt_absorb.test.ts index 4fee7653b99..2221619af07 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/test/abilities/volt_absorb.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/wandering_spirit.test.ts b/test/abilities/wandering_spirit.test.ts similarity index 97% rename from src/test/abilities/wandering_spirit.test.ts rename to test/abilities/wandering_spirit.test.ts index 4bc9298353f..48c7afa5751 100644 --- a/src/test/abilities/wandering_spirit.test.ts +++ b/test/abilities/wandering_spirit.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts similarity index 99% rename from src/test/abilities/wimp_out.test.ts rename to test/abilities/wimp_out.test.ts index 90cd3d62af5..5aff05d4c20 100644 --- a/src/test/abilities/wimp_out.test.ts +++ b/test/abilities/wimp_out.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; import { allMoves } from "#app/data/move"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; diff --git a/src/test/abilities/wind_power.test.ts b/test/abilities/wind_power.test.ts similarity index 98% rename from src/test/abilities/wind_power.test.ts rename to test/abilities/wind_power.test.ts index 538b65f898b..f9be5393d15 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/test/abilities/wind_power.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wind_rider.test.ts b/test/abilities/wind_rider.test.ts similarity index 98% rename from src/test/abilities/wind_rider.test.ts rename to test/abilities/wind_rider.test.ts index cd7094fb0a9..7cebd70a11a 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/test/abilities/wind_rider.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts similarity index 97% rename from src/test/abilities/wonder_skin.test.ts rename to test/abilities/wonder_skin.test.ts index 6b25701e36a..4f6e45d8fe0 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/zen_mode.test.ts b/test/abilities/zen_mode.test.ts similarity index 98% rename from src/test/abilities/zen_mode.test.ts rename to test/abilities/zen_mode.test.ts index e0cc457c4d5..cb4c82e00dc 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/test/abilities/zen_mode.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/zero_to_hero.test.ts b/test/abilities/zero_to_hero.test.ts similarity index 98% rename from src/test/abilities/zero_to_hero.test.ts rename to test/abilities/zero_to_hero.test.ts index 5702f73e6c4..338ebd6344f 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/test/abilities/zero_to_hero.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/account.test.ts b/test/account.test.ts similarity index 99% rename from src/test/account.test.ts rename to test/account.test.ts index 0f49014c377..099564ce7a8 100644 --- a/src/test/account.test.ts +++ b/test/account.test.ts @@ -1,7 +1,7 @@ import * as battleScene from "#app/battle-scene"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { describe, expect, it, vi } from "vitest"; -import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; +import { initLoggedInUser, loggedInUser, updateUserInfo } from "#app/account"; describe("account", () => { describe("initLoggedInUser", () => { diff --git a/src/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts similarity index 99% rename from src/test/achievements/achievement.test.ts rename to test/achievements/achievement.test.ts index 2d1cc50603e..3c6dc8aefe8 100644 --- a/src/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -1,10 +1,10 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; import { NumberHolder } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import BattleScene from "../../battle-scene"; +import BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { diff --git a/src/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts similarity index 98% rename from src/test/arena/arena_gravity.test.ts rename to test/arena/arena_gravity.test.ts index 13e9c23a35c..75197a4341c 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -5,7 +5,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts similarity index 97% rename from src/test/arena/grassy_terrain.test.ts rename to test/arena/grassy_terrain.test.ts index ead4467925b..f493242a9d8 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts similarity index 96% rename from src/test/arena/weather_fog.test.ts rename to test/arena/weather_fog.test.ts index 8c1fcb1e3a4..8b4ffff3a64 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_hail.test.ts b/test/arena/weather_hail.test.ts similarity index 97% rename from src/test/arena/weather_hail.test.ts rename to test/arena/weather_hail.test.ts index 0b267550d75..137c7622517 100644 --- a/src/test/arena/weather_hail.test.ts +++ b/test/arena/weather_hail.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_sandstorm.test.ts b/test/arena/weather_sandstorm.test.ts similarity index 98% rename from src/test/arena/weather_sandstorm.test.ts rename to test/arena/weather_sandstorm.test.ts index 17ccfdee94b..6420117d107 100644 --- a/src/test/arena/weather_sandstorm.test.ts +++ b/test/arena/weather_sandstorm.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts similarity index 98% rename from src/test/arena/weather_strong_winds.test.ts rename to test/arena/weather_strong_winds.test.ts index 557de93d644..2685a9149ae 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle-scene.test.ts b/test/battle-scene.test.ts similarity index 93% rename from src/test/battle-scene.test.ts rename to test/battle-scene.test.ts index 4da75cea197..44f1364441b 100644 --- a/src/test/battle-scene.test.ts +++ b/test/battle-scene.test.ts @@ -1,6 +1,6 @@ import { LoadingScene } from "#app/loading-scene"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattleScene", () => { let phaserGame: Phaser.Game; diff --git a/src/test/battle/ability_swap.test.ts b/test/battle/ability_swap.test.ts similarity index 97% rename from src/test/battle/ability_swap.test.ts rename to test/battle/ability_swap.test.ts index 9ce7a36c16e..ff3f7c002bc 100644 --- a/src/test/battle/ability_swap.test.ts +++ b/test/battle/ability_swap.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts similarity index 99% rename from src/test/battle/battle-order.test.ts rename to test/battle/battle-order.test.ts index d4e9950dec9..165a2fc916c 100644 --- a/src/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/battle.test.ts b/test/battle/battle.test.ts similarity index 98% rename from src/test/battle/battle.test.ts rename to test/battle/battle.test.ts index bd84cb2fd3b..edd04cf8ed0 100644 --- a/src/test/battle/battle.test.ts +++ b/test/battle/battle.test.ts @@ -16,8 +16,8 @@ import { SwitchPhase } from "#app/phases/switch-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { generateStarter } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { generateStarter } from "#test/testUtils/gameManagerUtils"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -122,7 +122,7 @@ describe("Test Battle Phase", () => { }, 20000); it("load 100% data file", async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts similarity index 98% rename from src/test/battle/damage_calculation.test.ts rename to test/battle/damage_calculation.test.ts index 22d072f313c..0a954b624c0 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/double_battle.test.ts b/test/battle/double_battle.test.ts similarity index 98% rename from src/test/battle/double_battle.test.ts rename to test/battle/double_battle.test.ts index b48f2a96a5b..de65245698e 100644 --- a/src/test/battle/double_battle.test.ts +++ b/test/battle/double_battle.test.ts @@ -6,7 +6,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts similarity index 99% rename from src/test/battle/inverse_battle.test.ts rename to test/battle/inverse_battle.test.ts index 0bda678bbd3..ce44824e772 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -6,7 +6,7 @@ import { Challenges } from "#enums/challenges"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/special_battle.test.ts b/test/battle/special_battle.test.ts similarity index 98% rename from src/test/battle/special_battle.test.ts rename to test/battle/special_battle.test.ts index af9e3dddbec..df24626766c 100644 --- a/src/test/battle/special_battle.test.ts +++ b/test/battle/special_battle.test.ts @@ -3,7 +3,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battlerTags/octolock.test.ts b/test/battlerTags/octolock.test.ts similarity index 96% rename from src/test/battlerTags/octolock.test.ts rename to test/battlerTags/octolock.test.ts index 4bf0257af8f..f161d90d466 100644 --- a/src/test/battlerTags/octolock.test.ts +++ b/test/battlerTags/octolock.test.ts @@ -3,7 +3,7 @@ import type Pokemon from "#app/field/pokemon"; import { BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattlerTag - OctolockTag", () => { describe("lapse behavior", () => { diff --git a/src/test/battlerTags/stockpiling.test.ts b/test/battlerTags/stockpiling.test.ts similarity index 99% rename from src/test/battlerTags/stockpiling.test.ts rename to test/battlerTags/stockpiling.test.ts index 13a4227853d..5970b5abbc6 100644 --- a/src/test/battlerTags/stockpiling.test.ts +++ b/test/battlerTags/stockpiling.test.ts @@ -4,7 +4,7 @@ import { PokemonSummonData } from "#app/field/pokemon"; import * as messages from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { diff --git a/src/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts similarity index 100% rename from src/test/battlerTags/substitute.test.ts rename to test/battlerTags/substitute.test.ts diff --git a/src/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts similarity index 99% rename from src/test/boss-pokemon.test.ts rename to test/boss-pokemon.test.ts index 389b42a2963..ea5a9000000 100644 --- a/src/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#app/enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/daily_mode.test.ts b/test/daily_mode.test.ts similarity index 98% rename from src/test/daily_mode.test.ts rename to test/daily_mode.test.ts index 3e70cc2d8a7..95c01b51434 100644 --- a/src/test/daily_mode.test.ts +++ b/test/daily_mode.test.ts @@ -6,7 +6,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Species } from "#enums/species"; import { Mode } from "#app/ui/ui"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; //const TIMEOUT = 20 * 1000; diff --git a/src/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts similarity index 100% rename from src/test/data/splash_messages.test.ts rename to test/data/splash_messages.test.ts diff --git a/src/test/data/status_effect.test.ts b/test/data/status_effect.test.ts similarity index 99% rename from src/test/data/status_effect.test.ts rename to test/data/status_effect.test.ts index 071dea989a9..e94cb193f0a 100644 --- a/src/test/data/status_effect.test.ts +++ b/test/data/status_effect.test.ts @@ -11,8 +11,8 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; -import { mockI18next } from "#test/utils/testUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { mockI18next } from "#test/testUtils/testUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/eggs/egg.test.ts b/test/eggs/egg.test.ts similarity index 99% rename from src/test/eggs/egg.test.ts rename to test/eggs/egg.test.ts index d7ed07dd151..e4a7cc31709 100644 --- a/src/test/eggs/egg.test.ts +++ b/test/eggs/egg.test.ts @@ -7,7 +7,7 @@ import { VariantTier } from "#app/enums/variant-tier"; import EggData from "#app/system/egg-data"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +29,7 @@ describe("Egg Generation Tests", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); }); it("should return Kyogre for the 10th of June", () => { diff --git a/src/test/eggs/manaphy-egg.test.ts b/test/eggs/manaphy-egg.test.ts similarity index 96% rename from src/test/eggs/manaphy-egg.test.ts rename to test/eggs/manaphy-egg.test.ts index 5bb5b790201..c63dbae7780 100644 --- a/src/test/eggs/manaphy-egg.test.ts +++ b/test/eggs/manaphy-egg.test.ts @@ -2,7 +2,7 @@ import { Egg } from "#app/data/egg"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Manaphy Eggs", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); /** * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress diff --git a/src/test/endless_boss.test.ts b/test/endless_boss.test.ts similarity index 98% rename from src/test/endless_boss.test.ts rename to test/endless_boss.test.ts index c9f3afc3936..ab7df412c12 100644 --- a/src/test/endless_boss.test.ts +++ b/test/endless_boss.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#app/enums/biome"; import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; const EndlessBossWave = { Minor: 250, diff --git a/src/test/enemy_command.test.ts b/test/enemy_command.test.ts similarity index 98% rename from src/test/enemy_command.test.ts rename to test/enemy_command.test.ts index 647c0be279a..b8e0c38b9e8 100644 --- a/src/test/enemy_command.test.ts +++ b/test/enemy_command.test.ts @@ -6,7 +6,7 @@ import { Species } from "#app/enums/species"; import type { EnemyPokemon } from "#app/field/pokemon"; import { AiType } from "#app/field/pokemon"; import { randSeedInt } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/escape-calculations.test.ts b/test/escape-calculations.test.ts similarity index 99% rename from src/test/escape-calculations.test.ts rename to test/escape-calculations.test.ts index 419a6b4c19a..6c5c8777d01 100644 --- a/src/test/escape-calculations.test.ts +++ b/test/escape-calculations.test.ts @@ -4,7 +4,7 @@ import { Command } from "#app/ui/command-ui-handler"; import * as Utils from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/evolution.test.ts b/test/evolution.test.ts similarity index 99% rename from src/test/evolution.test.ts rename to test/evolution.test.ts index 8dc19a548ca..dbd4ef3a0d7 100644 --- a/src/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/field/pokemon.test.ts b/test/field/pokemon.test.ts similarity index 99% rename from src/test/field/pokemon.test.ts rename to test/field/pokemon.test.ts index 0c282b44f49..b327fe0c137 100644 --- a/src/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -1,6 +1,6 @@ import { Species } from "#app/enums/species"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { PokeballType } from "#enums/pokeball"; import type BattleScene from "#app/battle-scene"; import { Moves } from "#app/enums/moves"; diff --git a/src/test/final_boss.test.ts b/test/final_boss.test.ts similarity index 99% rename from src/test/final_boss.test.ts rename to test/final_boss.test.ts index 5540d9511e4..f7675c17005 100644 --- a/src/test/final_boss.test.ts +++ b/test/final_boss.test.ts @@ -5,7 +5,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const FinalWave = { diff --git a/src/test/fontFace.setup.ts b/test/fontFace.setup.ts similarity index 100% rename from src/test/fontFace.setup.ts rename to test/fontFace.setup.ts diff --git a/src/test/game-mode.test.ts b/test/game-mode.test.ts similarity index 95% rename from src/test/game-mode.test.ts rename to test/game-mode.test.ts index 2c8184a30ef..3f5819f9a38 100644 --- a/src/test/game-mode.test.ts +++ b/test/game-mode.test.ts @@ -1,8 +1,8 @@ import type { GameMode } from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as Utils from "../utils"; -import GameManager from "./utils/gameManager"; +import * as Utils from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; describe("game-mode", () => { let phaserGame: Phaser.Game; diff --git a/src/test/imports.test.ts b/test/imports.test.ts similarity index 100% rename from src/test/imports.test.ts rename to test/imports.test.ts diff --git a/src/test/inputs/inputs.test.ts b/test/inputs/inputs.test.ts similarity index 96% rename from src/test/inputs/inputs.test.ts rename to test/inputs/inputs.test.ts index 6306c1b9da6..2cdab4b3eb2 100644 --- a/src/test/inputs/inputs.test.ts +++ b/test/inputs/inputs.test.ts @@ -1,7 +1,7 @@ import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import GameManager from "#test/utils/gameManager"; -import InputsHandler from "#test/utils/inputsHandler"; +import GameManager from "#test/testUtils/gameManager"; +import InputsHandler from "#test/testUtils/inputsHandler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/internals.test.ts b/test/internals.test.ts similarity index 95% rename from src/test/internals.test.ts rename to test/internals.test.ts index ce2cd55dbc6..2cc827a8906 100644 --- a/src/test/internals.test.ts +++ b/test/internals.test.ts @@ -1,6 +1,6 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/dire_hit.test.ts b/test/items/dire_hit.test.ts similarity index 98% rename from src/test/items/dire_hit.test.ts rename to test/items/dire_hit.test.ts index 3c82ebd3a47..4a94030ab93 100644 --- a/src/test/items/dire_hit.test.ts +++ b/test/items/dire_hit.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; diff --git a/src/test/items/double_battle_chance_booster.test.ts b/test/items/double_battle_chance_booster.test.ts similarity index 98% rename from src/test/items/double_battle_chance_booster.test.ts rename to test/items/double_battle_chance_booster.test.ts index cccd8d4765e..2a86a151685 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/test/items/double_battle_chance_booster.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; diff --git a/src/test/items/eviolite.test.ts b/test/items/eviolite.test.ts similarity index 99% rename from src/test/items/eviolite.test.ts rename to test/items/eviolite.test.ts index a97c287da29..64038cc9b82 100644 --- a/src/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -2,7 +2,7 @@ import { StatBoosterModifier } from "#app/modifier/modifier"; import { NumberHolder, randItem } from "#app/utils"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/exp_booster.test.ts b/test/items/exp_booster.test.ts similarity index 95% rename from src/test/items/exp_booster.test.ts rename to test/items/exp_booster.test.ts index 7441dcaeb73..4519df29b01 100644 --- a/src/test/items/exp_booster.test.ts +++ b/test/items/exp_booster.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#app/enums/abilities"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts similarity index 98% rename from src/test/items/grip_claw.test.ts rename to test/items/grip_claw.test.ts index e0cbeb95b6f..854e0998d3b 100644 --- a/src/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leek.test.ts b/test/items/leek.test.ts similarity index 98% rename from src/test/items/leek.test.ts rename to test/items/leek.test.ts index 901b353b3d3..a3c509d19dd 100644 --- a/src/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leftovers.test.ts b/test/items/leftovers.test.ts similarity index 97% rename from src/test/items/leftovers.test.ts rename to test/items/leftovers.test.ts index 672151d97cb..8d74301968f 100644 --- a/src/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/light_ball.test.ts b/test/items/light_ball.test.ts similarity index 99% rename from src/test/items/light_ball.test.ts rename to test/items/light_ball.test.ts index aae1d806a28..8dff8001ffc 100644 --- a/src/test/items/light_ball.test.ts +++ b/test/items/light_ball.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/lock_capsule.test.ts b/test/items/lock_capsule.test.ts similarity index 96% rename from src/test/items/lock_capsule.test.ts rename to test/items/lock_capsule.test.ts index 2d95cea5847..4cdd3b8a8a0 100644 --- a/src/test/items/lock_capsule.test.ts +++ b/test/items/lock_capsule.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/metal_powder.test.ts b/test/items/metal_powder.test.ts similarity index 99% rename from src/test/items/metal_powder.test.ts rename to test/items/metal_powder.test.ts index 68c3107af08..c1345af35df 100644 --- a/src/test/items/metal_powder.test.ts +++ b/test/items/metal_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts similarity index 99% rename from src/test/items/multi_lens.test.ts rename to test/items/multi_lens.test.ts index bd586878fce..01447a29544 100644 --- a/src/test/items/multi_lens.test.ts +++ b/test/items/multi_lens.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/quick_powder.test.ts b/test/items/quick_powder.test.ts similarity index 99% rename from src/test/items/quick_powder.test.ts rename to test/items/quick_powder.test.ts index ae16daf17ff..80ff0d7ba33 100644 --- a/src/test/items/quick_powder.test.ts +++ b/test/items/quick_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/scope_lens.test.ts b/test/items/scope_lens.test.ts similarity index 95% rename from src/test/items/scope_lens.test.ts rename to test/items/scope_lens.test.ts index e39517ceae9..98e374b6969 100644 --- a/src/test/items/scope_lens.test.ts +++ b/test/items/scope_lens.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/test/items/temp_stat_stage_booster.test.ts similarity index 99% rename from src/test/items/temp_stat_stage_booster.test.ts rename to test/items/temp_stat_stage_booster.test.ts index 3e496d1bbf8..8bbd9f4f29d 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/test/items/temp_stat_stage_booster.test.ts @@ -1,5 +1,5 @@ import { BATTLE_STATS, Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/thick_club.test.ts b/test/items/thick_club.test.ts similarity index 99% rename from src/test/items/thick_club.test.ts rename to test/items/thick_club.test.ts index d32c213e506..f18c0bd073e 100644 --- a/src/test/items/thick_club.test.ts +++ b/test/items/thick_club.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/toxic_orb.test.ts b/test/items/toxic_orb.test.ts similarity index 96% rename from src/test/items/toxic_orb.test.ts rename to test/items/toxic_orb.test.ts index 6918d7f34f0..8201036b927 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/test/items/toxic_orb.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/misc.test.ts b/test/misc.test.ts similarity index 95% rename from src/test/misc.test.ts rename to test/misc.test.ts index ae91a5014d9..f2b89418ef5 100644 --- a/src/test/misc.test.ts +++ b/test/misc.test.ts @@ -1,6 +1,6 @@ // import { apiFetch } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; -import { waitUntil } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { waitUntil } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/after_you.test.ts b/test/moves/after_you.test.ts similarity index 97% rename from src/test/moves/after_you.test.ts rename to test/moves/after_you.test.ts index 99f383194aa..bf030027436 100644 --- a/src/test/moves/after_you.test.ts +++ b/test/moves/after_you.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/alluring_voice.test.ts b/test/moves/alluring_voice.test.ts similarity index 96% rename from src/test/moves/alluring_voice.test.ts rename to test/moves/alluring_voice.test.ts index 2980f102735..bf5a9f90f82 100644 --- a/src/test/moves/alluring_voice.test.ts +++ b/test/moves/alluring_voice.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/aromatherapy.test.ts b/test/moves/aromatherapy.test.ts similarity index 98% rename from src/test/moves/aromatherapy.test.ts rename to test/moves/aromatherapy.test.ts index 874dadc0a1f..e70384355a0 100644 --- a/src/test/moves/aromatherapy.test.ts +++ b/test/moves/aromatherapy.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/assist.test.ts b/test/moves/assist.test.ts similarity index 98% rename from src/test/moves/assist.test.ts rename to test/moves/assist.test.ts index 81633d9a277..4168ec6295a 100644 --- a/src/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/astonish.test.ts b/test/moves/astonish.test.ts similarity index 97% rename from src/test/moves/astonish.test.ts rename to test/moves/astonish.test.ts index d94e50fc9f9..87af0db737b 100644 --- a/src/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -7,7 +7,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts similarity index 98% rename from src/test/moves/aurora_veil.test.ts rename to test/moves/aurora_veil.test.ts index 721f682f778..c8da3e03db5 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -10,7 +10,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts similarity index 98% rename from src/test/moves/autotomize.test.ts rename to test/moves/autotomize.test.ts index e15642b7ce5..29d2edbcf4e 100644 --- a/src/test/moves/autotomize.test.ts +++ b/test/moves/autotomize.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/baddy_bad.test.ts b/test/moves/baddy_bad.test.ts similarity index 95% rename from src/test/moves/baddy_bad.test.ts rename to test/moves/baddy_bad.test.ts index 1be25704393..78e7c63d49f 100644 --- a/src/test/moves/baddy_bad.test.ts +++ b/test/moves/baddy_bad.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/baneful_bunker.test.ts b/test/moves/baneful_bunker.test.ts similarity index 98% rename from src/test/moves/baneful_bunker.test.ts rename to test/moves/baneful_bunker.test.ts index a0fc0f21ee2..55b4b7d985e 100644 --- a/src/test/moves/baneful_bunker.test.ts +++ b/test/moves/baneful_bunker.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/baton_pass.test.ts b/test/moves/baton_pass.test.ts similarity index 98% rename from src/test/moves/baton_pass.test.ts rename to test/moves/baton_pass.test.ts index 52e4c3ec016..6abd2d95f7b 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/test/moves/baton_pass.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/beak_blast.test.ts b/test/moves/beak_blast.test.ts similarity index 98% rename from src/test/moves/beak_blast.test.ts rename to test/moves/beak_blast.test.ts index 0c1e7bbeed9..177610182b0 100644 --- a/src/test/moves/beak_blast.test.ts +++ b/test/moves/beak_blast.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/beat_up.test.ts b/test/moves/beat_up.test.ts similarity index 97% rename from src/test/moves/beat_up.test.ts rename to test/moves/beat_up.test.ts index 41e5b63471f..1ac2ae238b8 100644 --- a/src/test/moves/beat_up.test.ts +++ b/test/moves/beat_up.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { StatusEffect } from "#app/enums/status-effect"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/belly_drum.test.ts b/test/moves/belly_drum.test.ts similarity index 98% rename from src/test/moves/belly_drum.test.ts rename to test/moves/belly_drum.test.ts index 0bed1248e7e..7d8b17262d7 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/test/moves/belly_drum.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts similarity index 98% rename from src/test/moves/burning_jealousy.test.ts rename to test/moves/burning_jealousy.test.ts index abe2c09bb72..bfa9af600a2 100644 --- a/src/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts similarity index 96% rename from src/test/moves/camouflage.test.ts rename to test/moves/camouflage.test.ts index 5773afffcc3..8995e2d00bb 100644 --- a/src/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -4,7 +4,7 @@ import { Species } from "#enums/species"; import { TerrainType } from "#app/data/terrain"; import { Type } from "#enums/type"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts similarity index 98% rename from src/test/moves/ceaseless_edge.test.ts rename to test/moves/ceaseless_edge.test.ts index 3fbbb7b0aaf..22cf310bc80 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/test/moves/ceaseless_edge.test.ts @@ -6,7 +6,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts similarity index 98% rename from src/test/moves/chilly_reception.test.ts rename to test/moves/chilly_reception.test.ts index 664ca242b20..0d99175a9bc 100644 --- a/src/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; //import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/chloroblast.test.ts b/test/moves/chloroblast.test.ts similarity index 95% rename from src/test/moves/chloroblast.test.ts rename to test/moves/chloroblast.test.ts index 5e55bf46958..ee01935291a 100644 --- a/src/test/moves/chloroblast.test.ts +++ b/test/moves/chloroblast.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/clangorous_soul.test.ts b/test/moves/clangorous_soul.test.ts similarity index 98% rename from src/test/moves/clangorous_soul.test.ts rename to test/moves/clangorous_soul.test.ts index 52e980cc4fa..6bb50b9ba59 100644 --- a/src/test/moves/clangorous_soul.test.ts +++ b/test/moves/clangorous_soul.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/copycat.test.ts b/test/moves/copycat.test.ts similarity index 98% rename from src/test/moves/copycat.test.ts rename to test/moves/copycat.test.ts index d9e64289481..9b111c7b342 100644 --- a/src/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/crafty_shield.test.ts b/test/moves/crafty_shield.test.ts similarity index 98% rename from src/test/moves/crafty_shield.test.ts rename to test/moves/crafty_shield.test.ts index 93dd4a02538..054d19debf8 100644 --- a/src/test/moves/crafty_shield.test.ts +++ b/test/moves/crafty_shield.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/defog.test.ts b/test/moves/defog.test.ts similarity index 97% rename from src/test/moves/defog.test.ts rename to test/moves/defog.test.ts index c83cdc192bf..52c51df657a 100644 --- a/src/test/moves/defog.test.ts +++ b/test/moves/defog.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts similarity index 99% rename from src/test/moves/destiny_bond.test.ts rename to test/moves/destiny_bond.test.ts index e668aee2191..9ae37ef5b9b 100644 --- a/src/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/diamond_storm.test.ts b/test/moves/diamond_storm.test.ts similarity index 96% rename from src/test/moves/diamond_storm.test.ts rename to test/moves/diamond_storm.test.ts index 6e5be2a790d..7a30f73a113 100644 --- a/src/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dig.test.ts b/test/moves/dig.test.ts similarity index 98% rename from src/test/moves/dig.test.ts rename to test/moves/dig.test.ts index 4c6b5d3b75d..53104f13b20 100644 --- a/src/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -7,7 +7,7 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { MoveResult } from "#app/field/pokemon"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Dig", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/disable.test.ts b/test/moves/disable.test.ts similarity index 98% rename from src/test/moves/disable.test.ts rename to test/moves/disable.test.ts index bd56201ad33..044cfc762cd 100644 --- a/src/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Disable", () => { diff --git a/src/test/moves/dive.test.ts b/test/moves/dive.test.ts similarity index 98% rename from src/test/moves/dive.test.ts rename to test/moves/dive.test.ts index b60416d7740..e8febaa72f6 100644 --- a/src/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; import { WeatherType } from "#enums/weather-type"; diff --git a/src/test/moves/doodle.test.ts b/test/moves/doodle.test.ts similarity index 97% rename from src/test/moves/doodle.test.ts rename to test/moves/doodle.test.ts index 258abda392a..6272a822094 100644 --- a/src/test/moves/doodle.test.ts +++ b/test/moves/doodle.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/double_team.test.ts b/test/moves/double_team.test.ts similarity index 96% rename from src/test/moves/double_team.test.ts rename to test/moves/double_team.test.ts index 62848553e06..9145265bf93 100644 --- a/src/test/moves/double_team.test.ts +++ b/test/moves/double_team.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts similarity index 98% rename from src/test/moves/dragon_cheer.test.ts rename to test/moves/dragon_cheer.test.ts index 750f09214ca..44bedeaa03a 100644 --- a/src/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts similarity index 98% rename from src/test/moves/dragon_rage.test.ts rename to test/moves/dragon_rage.test.ts index 61630ede326..0a5202825f5 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts similarity index 99% rename from src/test/moves/dragon_tail.test.ts rename to test/moves/dragon_tail.test.ts index 96db67279d3..8415251c24c 100644 --- a/src/test/moves/dragon_tail.test.ts +++ b/test/moves/dragon_tail.test.ts @@ -7,7 +7,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts similarity index 99% rename from src/test/moves/dynamax_cannon.test.ts rename to test/moves/dynamax_cannon.test.ts index 033d8960bad..0deb12b2737 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -4,7 +4,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts similarity index 98% rename from src/test/moves/effectiveness.test.ts rename to test/moves/effectiveness.test.ts index 09c94c740cc..d9974fd1980 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/electrify.test.ts b/test/moves/electrify.test.ts similarity index 97% rename from src/test/moves/electrify.test.ts rename to test/moves/electrify.test.ts index 8015dd0a74d..f7d78a2f4d0 100644 --- a/src/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/electro_shot.test.ts b/test/moves/electro_shot.test.ts similarity index 98% rename from src/test/moves/electro_shot.test.ts rename to test/moves/electro_shot.test.ts index 283154b3408..7cc7e793f4a 100644 --- a/src/test/moves/electro_shot.test.ts +++ b/test/moves/electro_shot.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/encore.test.ts b/test/moves/encore.test.ts similarity index 98% rename from src/test/moves/encore.test.ts rename to test/moves/encore.test.ts index 7d8dc9658bf..4cf466a7f2a 100644 --- a/src/test/moves/encore.test.ts +++ b/test/moves/encore.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/endure.test.ts b/test/moves/endure.test.ts similarity index 97% rename from src/test/moves/endure.test.ts rename to test/moves/endure.test.ts index bde5a26f68e..8514470d59c 100644 --- a/src/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts similarity index 96% rename from src/test/moves/entrainment.test.ts rename to test/moves/entrainment.test.ts index 5d0991c8dfd..608c6ef3676 100644 --- a/src/test/moves/entrainment.test.ts +++ b/test/moves/entrainment.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fairy_lock.test.ts b/test/moves/fairy_lock.test.ts similarity index 99% rename from src/test/moves/fairy_lock.test.ts rename to test/moves/fairy_lock.test.ts index ceb298ed0fe..627eac401cc 100644 --- a/src/test/moves/fairy_lock.test.ts +++ b/test/moves/fairy_lock.test.ts @@ -3,7 +3,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fake_out.test.ts b/test/moves/fake_out.test.ts similarity index 98% rename from src/test/moves/fake_out.test.ts rename to test/moves/fake_out.test.ts index f20b6db3a13..21a129b6410 100644 --- a/src/test/moves/fake_out.test.ts +++ b/test/moves/fake_out.test.ts @@ -1,4 +1,4 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts similarity index 99% rename from src/test/moves/fell_stinger.test.ts rename to test/moves/fell_stinger.test.ts index a901ddced44..fdcba624e22 100644 --- a/src/test/moves/fell_stinger.test.ts +++ b/test/moves/fell_stinger.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/fillet_away.test.ts b/test/moves/fillet_away.test.ts similarity index 98% rename from src/test/moves/fillet_away.test.ts rename to test/moves/fillet_away.test.ts index aa3243270cb..076a3011afa 100644 --- a/src/test/moves/fillet_away.test.ts +++ b/test/moves/fillet_away.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/fissure.test.ts b/test/moves/fissure.test.ts similarity index 97% rename from src/test/moves/fissure.test.ts rename to test/moves/fissure.test.ts index 65719df0205..07f2a3bfacb 100644 --- a/src/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -5,7 +5,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flame_burst.test.ts b/test/moves/flame_burst.test.ts similarity index 98% rename from src/test/moves/flame_burst.test.ts rename to test/moves/flame_burst.test.ts index 9dea930d7e8..7bcf06d92ae 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/test/moves/flame_burst.test.ts @@ -4,7 +4,7 @@ import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts similarity index 98% rename from src/test/moves/flower_shield.test.ts rename to test/moves/flower_shield.test.ts index 4c03df5212b..d6f79c40533 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fly.test.ts b/test/moves/fly.test.ts similarity index 98% rename from src/test/moves/fly.test.ts rename to test/moves/fly.test.ts index 6ae758fe3dc..b0abf96e128 100644 --- a/src/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts similarity index 98% rename from src/test/moves/focus_punch.test.ts rename to test/moves/focus_punch.test.ts index 44d9c92cac1..9bf858dfda5 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -6,7 +6,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/follow_me.test.ts b/test/moves/follow_me.test.ts similarity index 98% rename from src/test/moves/follow_me.test.ts rename to test/moves/follow_me.test.ts index fba7937f812..bef9b9ddb01 100644 --- a/src/test/moves/follow_me.test.ts +++ b/test/moves/follow_me.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/foresight.test.ts b/test/moves/foresight.test.ts similarity index 97% rename from src/test/moves/foresight.test.ts rename to test/moves/foresight.test.ts index 1195cd0b71b..7dccd0fefca 100644 --- a/src/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts similarity index 96% rename from src/test/moves/forests_curse.test.ts rename to test/moves/forests_curse.test.ts index 010b00599a5..c9977190c9d 100644 --- a/src/test/moves/forests_curse.test.ts +++ b/test/moves/forests_curse.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/freeze_dry.test.ts b/test/moves/freeze_dry.test.ts similarity index 99% rename from src/test/moves/freeze_dry.test.ts rename to test/moves/freeze_dry.test.ts index f207e297191..f07105882c2 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/test/moves/freeze_dry.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Type } from "#enums/type"; import { Challenges } from "#enums/challenges"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts similarity index 98% rename from src/test/moves/freezy_frost.test.ts rename to test/moves/freezy_frost.test.ts index 09d7779474f..26c7d06961f 100644 --- a/src/test/moves/freezy_frost.test.ts +++ b/test/moves/freezy_frost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/fusion_bolt.test.ts b/test/moves/fusion_bolt.test.ts similarity index 96% rename from src/test/moves/fusion_bolt.test.ts rename to test/moves/fusion_bolt.test.ts index 4e35b939abf..9bb53ef8fb0 100644 --- a/src/test/moves/fusion_bolt.test.ts +++ b/test/moves/fusion_bolt.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare.test.ts b/test/moves/fusion_flare.test.ts similarity index 96% rename from src/test/moves/fusion_flare.test.ts rename to test/moves/fusion_flare.test.ts index 75641c04d02..02f5b19d97f 100644 --- a/src/test/moves/fusion_flare.test.ts +++ b/test/moves/fusion_flare.test.ts @@ -2,7 +2,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts similarity index 99% rename from src/test/moves/fusion_flare_bolt.test.ts rename to test/moves/fusion_flare_bolt.test.ts index dbd4479dff8..340020c85b7 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -7,7 +7,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/future_sight.test.ts b/test/moves/future_sight.test.ts similarity index 95% rename from src/test/moves/future_sight.test.ts rename to test/moves/future_sight.test.ts index d0110a87202..e0a9a1efd04 100644 --- a/src/test/moves/future_sight.test.ts +++ b/test/moves/future_sight.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/gastro_acid.test.ts b/test/moves/gastro_acid.test.ts similarity index 97% rename from src/test/moves/gastro_acid.test.ts rename to test/moves/gastro_acid.test.ts index ec9246c855c..2e4f7938306 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/test/moves/gastro_acid.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts similarity index 97% rename from src/test/moves/geomancy.test.ts rename to test/moves/geomancy.test.ts index 9ff3a1e7a7d..914e4f7188a 100644 --- a/src/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/gigaton_hammer.test.ts b/test/moves/gigaton_hammer.test.ts similarity index 97% rename from src/test/moves/gigaton_hammer.test.ts rename to test/moves/gigaton_hammer.test.ts index f54700fe660..37735b29a3b 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/test/moves/gigaton_hammer.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts similarity index 98% rename from src/test/moves/glaive_rush.test.ts rename to test/moves/glaive_rush.test.ts index 9cfbfdd8727..557d003e541 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/growth.test.ts b/test/moves/growth.test.ts similarity index 96% rename from src/test/moves/growth.test.ts rename to test/moves/growth.test.ts index a66e4ec6719..dfc41acd757 100644 --- a/src/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/grudge.test.ts b/test/moves/grudge.test.ts similarity index 98% rename from src/test/moves/grudge.test.ts rename to test/moves/grudge.test.ts index 340808929ab..4b9683dd417 100644 --- a/src/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/guard_split.test.ts b/test/moves/guard_split.test.ts similarity index 97% rename from src/test/moves/guard_split.test.ts rename to test/moves/guard_split.test.ts index 519f347b920..af5023608d3 100644 --- a/src/test/moves/guard_split.test.ts +++ b/test/moves/guard_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/guard_swap.test.ts b/test/moves/guard_swap.test.ts similarity index 97% rename from src/test/moves/guard_swap.test.ts rename to test/moves/guard_swap.test.ts index 99769b32899..592307ff168 100644 --- a/src/test/moves/guard_swap.test.ts +++ b/test/moves/guard_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts similarity index 97% rename from src/test/moves/hard_press.test.ts rename to test/moves/hard_press.test.ts index 0fa4181491c..29a386207ad 100644 --- a/src/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -3,7 +3,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/haze.test.ts b/test/moves/haze.test.ts similarity index 97% rename from src/test/moves/haze.test.ts rename to test/moves/haze.test.ts index 30aab8bd98c..11071bdc07d 100644 --- a/src/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/heal_bell.test.ts b/test/moves/heal_bell.test.ts similarity index 98% rename from src/test/moves/heal_bell.test.ts rename to test/moves/heal_bell.test.ts index b180588d3a3..72957ee21e7 100644 --- a/src/test/moves/heal_bell.test.ts +++ b/test/moves/heal_bell.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/heal_block.test.ts b/test/moves/heal_block.test.ts similarity index 98% rename from src/test/moves/heal_block.test.ts rename to test/moves/heal_block.test.ts index 25f2076ff3e..a0e8eaf541c 100644 --- a/src/test/moves/heal_block.test.ts +++ b/test/moves/heal_block.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/heart_swap.test.ts b/test/moves/heart_swap.test.ts similarity index 96% rename from src/test/moves/heart_swap.test.ts rename to test/moves/heart_swap.test.ts index a128549c459..43569a32a69 100644 --- a/src/test/moves/heart_swap.test.ts +++ b/test/moves/heart_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts similarity index 97% rename from src/test/moves/hyper_beam.test.ts rename to test/moves/hyper_beam.test.ts index af8440a0911..5869655948c 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/test/moves/hyper_beam.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/imprison.test.ts b/test/moves/imprison.test.ts similarity index 98% rename from src/test/moves/imprison.test.ts rename to test/moves/imprison.test.ts index f10e20dab63..85d529d7a74 100644 --- a/src/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/instruct.test.ts b/test/moves/instruct.test.ts similarity index 99% rename from src/test/moves/instruct.test.ts rename to test/moves/instruct.test.ts index b26f9c9669f..db9801932cc 100644 --- a/src/test/moves/instruct.test.ts +++ b/test/moves/instruct.test.ts @@ -5,7 +5,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/jaw_lock.test.ts b/test/moves/jaw_lock.test.ts similarity index 99% rename from src/test/moves/jaw_lock.test.ts rename to test/moves/jaw_lock.test.ts index 30dbcac64a8..4f9c6481a9a 100644 --- a/src/test/moves/jaw_lock.test.ts +++ b/test/moves/jaw_lock.test.ts @@ -5,7 +5,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts similarity index 96% rename from src/test/moves/lash_out.test.ts rename to test/moves/lash_out.test.ts index 014c0ae8fe5..3fe5c56dd3e 100644 --- a/src/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts similarity index 99% rename from src/test/moves/last_respects.test.ts rename to test/moves/last_respects.test.ts index 71a76e3fa1a..54e4bc5a0bc 100644 --- a/src/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { allMoves } from "#app/data/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import Phaser from "phaser"; diff --git a/src/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts similarity index 98% rename from src/test/moves/light_screen.test.ts rename to test/moves/light_screen.test.ts index 424f43e155c..8eee58c8e17 100644 --- a/src/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/lucky_chant.test.ts b/test/moves/lucky_chant.test.ts similarity index 98% rename from src/test/moves/lucky_chant.test.ts rename to test/moves/lucky_chant.test.ts index 02e9dd24465..7f943732192 100644 --- a/src/test/moves/lucky_chant.test.ts +++ b/test/moves/lucky_chant.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Lucky Chant", () => { diff --git a/src/test/moves/lunar_blessing.test.ts b/test/moves/lunar_blessing.test.ts similarity index 97% rename from src/test/moves/lunar_blessing.test.ts rename to test/moves/lunar_blessing.test.ts index 52c41a30e11..a81e967a6d9 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/test/moves/lunar_blessing.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/lunar_dance.test.ts b/test/moves/lunar_dance.test.ts similarity index 98% rename from src/test/moves/lunar_dance.test.ts rename to test/moves/lunar_dance.test.ts index 603247298ac..37e96e0dc3e 100644 --- a/src/test/moves/lunar_dance.test.ts +++ b/test/moves/lunar_dance.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts similarity index 99% rename from src/test/moves/magic_coat.test.ts rename to test/moves/magic_coat.test.ts index 7371c89d4ac..6ecbea435b6 100644 --- a/src/test/moves/magic_coat.test.ts +++ b/test/moves/magic_coat.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Magic Coat", () => { diff --git a/src/test/moves/magnet_rise.test.ts b/test/moves/magnet_rise.test.ts similarity index 97% rename from src/test/moves/magnet_rise.test.ts rename to test/moves/magnet_rise.test.ts index b26bbf42ed0..e4ceeaea929 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/test/moves/magnet_rise.test.ts @@ -2,7 +2,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/make_it_rain.test.ts b/test/moves/make_it_rain.test.ts similarity index 98% rename from src/test/moves/make_it_rain.test.ts rename to test/moves/make_it_rain.test.ts index 08021227e9c..8de6777bddf 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/test/moves/make_it_rain.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveEndPhase } from "#app/phases/move-end-phase"; diff --git a/src/test/moves/mat_block.test.ts b/test/moves/mat_block.test.ts similarity index 98% rename from src/test/moves/mat_block.test.ts rename to test/moves/mat_block.test.ts index a4d9177cbdc..b9e66253058 100644 --- a/src/test/moves/mat_block.test.ts +++ b/test/moves/mat_block.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/metal_burst.test.ts b/test/moves/metal_burst.test.ts similarity index 98% rename from src/test/moves/metal_burst.test.ts rename to test/moves/metal_burst.test.ts index 3b32dd322a3..7f7cfa841da 100644 --- a/src/test/moves/metal_burst.test.ts +++ b/test/moves/metal_burst.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/metronome.test.ts b/test/moves/metronome.test.ts similarity index 98% rename from src/test/moves/metronome.test.ts rename to test/moves/metronome.test.ts index 946dc92de0f..85c027b62e3 100644 --- a/src/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -5,7 +5,7 @@ import { Stat } from "#app/enums/stat"; import { CommandPhase } from "#app/phases/command-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/miracle_eye.test.ts b/test/moves/miracle_eye.test.ts similarity index 96% rename from src/test/moves/miracle_eye.test.ts rename to test/moves/miracle_eye.test.ts index 70f487de942..068f4f70493 100644 --- a/src/test/moves/miracle_eye.test.ts +++ b/test/moves/miracle_eye.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mirror_move.test.ts b/test/moves/mirror_move.test.ts similarity index 98% rename from src/test/moves/mirror_move.test.ts rename to test/moves/mirror_move.test.ts index e55c55038ae..a6fe90548be 100644 --- a/src/test/moves/mirror_move.test.ts +++ b/test/moves/mirror_move.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mist.test.ts b/test/moves/mist.test.ts similarity index 96% rename from src/test/moves/mist.test.ts rename to test/moves/mist.test.ts index cd338f79412..a9b69bccc6c 100644 --- a/src/test/moves/mist.test.ts +++ b/test/moves/mist.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts similarity index 97% rename from src/test/moves/moongeist_beam.test.ts rename to test/moves/moongeist_beam.test.ts index 216eee482fb..15a5787be41 100644 --- a/src/test/moves/moongeist_beam.test.ts +++ b/test/moves/moongeist_beam.test.ts @@ -2,7 +2,7 @@ import { allMoves, RandomMoveAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/multi_target.test.ts b/test/moves/multi_target.test.ts similarity index 98% rename from src/test/moves/multi_target.test.ts rename to test/moves/multi_target.test.ts index 965876d3445..a2379524c73 100644 --- a/src/test/moves/multi_target.test.ts +++ b/test/moves/multi_target.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts similarity index 96% rename from src/test/moves/nightmare.test.ts rename to test/moves/nightmare.test.ts index 850b0793b1e..0a2392fe833 100644 --- a/src/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts similarity index 98% rename from src/test/moves/obstruct.test.ts rename to test/moves/obstruct.test.ts index 1649c199e32..e2c469e21f0 100644 --- a/src/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/octolock.test.ts b/test/moves/octolock.test.ts similarity index 98% rename from src/test/moves/octolock.test.ts rename to test/moves/octolock.test.ts index 6ca96eeb464..882a2357e1a 100644 --- a/src/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/order_up.test.ts b/test/moves/order_up.test.ts similarity index 98% rename from src/test/moves/order_up.test.ts rename to test/moves/order_up.test.ts index a9281b121b2..339f3f31584 100644 --- a/src/test/moves/order_up.test.ts +++ b/test/moves/order_up.test.ts @@ -6,7 +6,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/parting_shot.test.ts b/test/moves/parting_shot.test.ts similarity index 99% rename from src/test/moves/parting_shot.test.ts rename to test/moves/parting_shot.test.ts index 30ad3660a32..43a6d833949 100644 --- a/src/test/moves/parting_shot.test.ts +++ b/test/moves/parting_shot.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Stat } from "#enums/stat"; import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; diff --git a/src/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts similarity index 98% rename from src/test/moves/plasma_fists.test.ts rename to test/moves/plasma_fists.test.ts index 4075c1ab988..5a2ec90f60b 100644 --- a/src/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts similarity index 99% rename from src/test/moves/pledge_moves.test.ts rename to test/moves/pledge_moves.test.ts index 64d586e7ba4..24fff05a25d 100644 --- a/src/test/moves/pledge_moves.test.ts +++ b/test/moves/pledge_moves.test.ts @@ -9,7 +9,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/powder.test.ts b/test/moves/powder.test.ts similarity index 99% rename from src/test/moves/powder.test.ts rename to test/moves/powder.test.ts index a1db2bced3a..24162825230 100644 --- a/src/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/power_shift.test.ts b/test/moves/power_shift.test.ts similarity index 97% rename from src/test/moves/power_shift.test.ts rename to test/moves/power_shift.test.ts index e389f77bedf..bb98d8cf3ed 100644 --- a/src/test/moves/power_shift.test.ts +++ b/test/moves/power_shift.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/power_split.test.ts b/test/moves/power_split.test.ts similarity index 97% rename from src/test/moves/power_split.test.ts rename to test/moves/power_split.test.ts index 914fa86e491..69ea92c69ef 100644 --- a/src/test/moves/power_split.test.ts +++ b/test/moves/power_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_swap.test.ts b/test/moves/power_swap.test.ts similarity index 97% rename from src/test/moves/power_swap.test.ts rename to test/moves/power_swap.test.ts index e9a4b569c92..637714f1277 100644 --- a/src/test/moves/power_swap.test.ts +++ b/test/moves/power_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_trick.test.ts b/test/moves/power_trick.test.ts similarity index 98% rename from src/test/moves/power_trick.test.ts rename to test/moves/power_trick.test.ts index a064a43dec4..e60172b5304 100644 --- a/src/test/moves/power_trick.test.ts +++ b/test/moves/power_trick.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Species } from "#enums/species"; diff --git a/src/test/moves/protect.test.ts b/test/moves/protect.test.ts similarity index 98% rename from src/test/moves/protect.test.ts rename to test/moves/protect.test.ts index e639969ddf0..d502e997483 100644 --- a/src/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/psycho_shift.test.ts b/test/moves/psycho_shift.test.ts similarity index 96% rename from src/test/moves/psycho_shift.test.ts rename to test/moves/psycho_shift.test.ts index 448a8c99ef0..d5890a3af0b 100644 --- a/src/test/moves/psycho_shift.test.ts +++ b/test/moves/psycho_shift.test.ts @@ -2,7 +2,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/purify.test.ts b/test/moves/purify.test.ts similarity index 97% rename from src/test/moves/purify.test.ts rename to test/moves/purify.test.ts index d72b4a87d2a..eba8e9d851f 100644 --- a/src/test/moves/purify.test.ts +++ b/test/moves/purify.test.ts @@ -5,7 +5,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/quash.test.ts b/test/moves/quash.test.ts similarity index 98% rename from src/test/moves/quash.test.ts rename to test/moves/quash.test.ts index 3cbe79d7bfe..dd91820a8db 100644 --- a/src/test/moves/quash.test.ts +++ b/test/moves/quash.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { BattlerIndex } from "#app/battle"; import { WeatherType } from "#enums/weather-type"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; diff --git a/src/test/moves/quick_guard.test.ts b/test/moves/quick_guard.test.ts similarity index 98% rename from src/test/moves/quick_guard.test.ts rename to test/moves/quick_guard.test.ts index 7bda71782aa..c326e77d057 100644 --- a/src/test/moves/quick_guard.test.ts +++ b/test/moves/quick_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts similarity index 98% rename from src/test/moves/rage_fist.test.ts rename to test/moves/rage_fist.test.ts index a85be5a88d9..4d17cf990f7 100644 --- a/src/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { allMoves } from "#app/data/move"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/rage_powder.test.ts b/test/moves/rage_powder.test.ts similarity index 97% rename from src/test/moves/rage_powder.test.ts rename to test/moves/rage_powder.test.ts index 1b73a7f0f5f..15a9bfd951c 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/test/moves/rage_powder.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/reflect.test.ts b/test/moves/reflect.test.ts similarity index 98% rename from src/test/moves/reflect.test.ts rename to test/moves/reflect.test.ts index aa9f2095c89..edc3f1ab8aa 100644 --- a/src/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts similarity index 97% rename from src/test/moves/reflect_type.test.ts rename to test/moves/reflect_type.test.ts index 50e0fc2fbe6..575f4b88f86 100644 --- a/src/test/moves/reflect_type.test.ts +++ b/test/moves/reflect_type.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts similarity index 97% rename from src/test/moves/relic_song.test.ts rename to test/moves/relic_song.test.ts index c09514850eb..f28047bb90e 100644 --- a/src/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -3,7 +3,7 @@ import { Challenges } from "#app/enums/challenges"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts similarity index 96% rename from src/test/moves/retaliate.test.ts rename to test/moves/retaliate.test.ts index e00b9da6010..32d5379f05e 100644 --- a/src/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts similarity index 98% rename from src/test/moves/revival_blessing.test.ts rename to test/moves/revival_blessing.test.ts index cdde3941d30..647771fa23b 100644 --- a/src/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -4,7 +4,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/role_play.test.ts b/test/moves/role_play.test.ts similarity index 96% rename from src/test/moves/role_play.test.ts rename to test/moves/role_play.test.ts index a37f4faac9b..edc41de5c68 100644 --- a/src/test/moves/role_play.test.ts +++ b/test/moves/role_play.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/rollout.test.ts b/test/moves/rollout.test.ts similarity index 98% rename from src/test/moves/rollout.test.ts rename to test/moves/rollout.test.ts index 199f4e1dcf2..c58ab3e6a18 100644 --- a/src/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/roost.test.ts b/test/moves/roost.test.ts similarity index 99% rename from src/test/moves/roost.test.ts rename to test/moves/roost.test.ts index 69301dc86cf..b9424747f5e 100644 --- a/src/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/round.test.ts b/test/moves/round.test.ts similarity index 97% rename from src/test/moves/round.test.ts rename to test/moves/round.test.ts index 1d7c91bcbd4..5d26e242aff 100644 --- a/src/test/moves/round.test.ts +++ b/test/moves/round.test.ts @@ -4,7 +4,7 @@ import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts similarity index 98% rename from src/test/moves/safeguard.test.ts rename to test/moves/safeguard.test.ts index 6505162fd04..9768b24f170 100644 --- a/src/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities, PostDefendContactApplyStatusEffectAbAttr } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts similarity index 98% rename from src/test/moves/scale_shot.test.ts rename to test/moves/scale_shot.test.ts index cbaa6611f3e..76954ba2413 100644 --- a/src/test/moves/scale_shot.test.ts +++ b/test/moves/scale_shot.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts similarity index 98% rename from src/test/moves/secret_power.test.ts rename to test/moves/secret_power.test.ts index 09fe5faa50b..f155633d545 100644 --- a/src/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { allMoves } from "#app/data/move"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts similarity index 97% rename from src/test/moves/shed_tail.test.ts rename to test/moves/shed_tail.test.ts index 33a7d81e460..37f046ba2fa 100644 --- a/src/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts similarity index 97% rename from src/test/moves/shell_side_arm.test.ts rename to test/moves/shell_side_arm.test.ts index 41cbefb186b..3a658d53a83 100644 --- a/src/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -3,7 +3,7 @@ import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts similarity index 98% rename from src/test/moves/shell_trap.test.ts rename to test/moves/shell_trap.test.ts index 04d3cf998b1..aa94d0cab1b 100644 --- a/src/test/moves/shell_trap.test.ts +++ b/test/moves/shell_trap.test.ts @@ -6,7 +6,7 @@ import { MoveResult } from "#app/field/pokemon"; import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/simple_beam.test.ts b/test/moves/simple_beam.test.ts similarity index 95% rename from src/test/moves/simple_beam.test.ts rename to test/moves/simple_beam.test.ts index b4566669e8d..1fb8b54e8aa 100644 --- a/src/test/moves/simple_beam.test.ts +++ b/test/moves/simple_beam.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sketch.test.ts b/test/moves/sketch.test.ts similarity index 98% rename from src/test/moves/sketch.test.ts rename to test/moves/sketch.test.ts index f531f44ef0c..e736893b0aa 100644 --- a/src/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult, PokemonMove } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#app/enums/status-effect"; diff --git a/src/test/moves/skill_swap.test.ts b/test/moves/skill_swap.test.ts similarity index 96% rename from src/test/moves/skill_swap.test.ts rename to test/moves/skill_swap.test.ts index 9c0f0b75ade..e39dac8bb01 100644 --- a/src/test/moves/skill_swap.test.ts +++ b/test/moves/skill_swap.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sleep_talk.test.ts b/test/moves/sleep_talk.test.ts similarity index 97% rename from src/test/moves/sleep_talk.test.ts rename to test/moves/sleep_talk.test.ts index 9ad2d23f903..b9c98f4fb65 100644 --- a/src/test/moves/sleep_talk.test.ts +++ b/test/moves/sleep_talk.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts similarity index 98% rename from src/test/moves/solar_beam.test.ts rename to test/moves/solar_beam.test.ts index ebec338932a..7f18cebff6d 100644 --- a/src/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts similarity index 98% rename from src/test/moves/sparkly_swirl.test.ts rename to test/moves/sparkly_swirl.test.ts index a83f1c3a437..53851cb77d3 100644 --- a/src/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -4,7 +4,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts similarity index 99% rename from src/test/moves/spectral_thief.test.ts rename to test/moves/spectral_thief.test.ts index 8913b7f3683..883f280da08 100644 --- a/src/test/moves/spectral_thief.test.ts +++ b/test/moves/spectral_thief.test.ts @@ -5,7 +5,7 @@ import { allMoves } from "#app/data/move"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/speed_swap.test.ts b/test/moves/speed_swap.test.ts similarity index 96% rename from src/test/moves/speed_swap.test.ts rename to test/moves/speed_swap.test.ts index 179f1212394..5cdea223296 100644 --- a/src/test/moves/speed_swap.test.ts +++ b/test/moves/speed_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/spikes.test.ts b/test/moves/spikes.test.ts similarity index 97% rename from src/test/moves/spikes.test.ts rename to test/moves/spikes.test.ts index 35e89c8caf7..11ef295a62f 100644 --- a/src/test/moves/spikes.test.ts +++ b/test/moves/spikes.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts similarity index 99% rename from src/test/moves/spit_up.test.ts rename to test/moves/spit_up.test.ts index 7f9dfaad38b..125b17891ed 100644 --- a/src/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -4,7 +4,7 @@ import { allMoves } from "#app/data/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import type { TurnMove } from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/spotlight.test.ts b/test/moves/spotlight.test.ts similarity index 97% rename from src/test/moves/spotlight.test.ts rename to test/moves/spotlight.test.ts index 095f7d80bfe..2a883d403a7 100644 --- a/src/test/moves/spotlight.test.ts +++ b/test/moves/spotlight.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts similarity index 97% rename from src/test/moves/steamroller.test.ts rename to test/moves/steamroller.test.ts index f641c58c2d1..2aed941fd92 100644 --- a/src/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -5,7 +5,7 @@ import type { DamageCalculationResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts similarity index 98% rename from src/test/moves/stockpile.test.ts rename to test/moves/stockpile.test.ts index f83459cd09d..0d0a1de4840 100644 --- a/src/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -7,7 +7,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/substitute.test.ts b/test/moves/substitute.test.ts similarity index 99% rename from src/test/moves/substitute.test.ts rename to test/moves/substitute.test.ts index 18b0c6ea536..5acbb6c0a44 100644 --- a/src/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -4,7 +4,7 @@ import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; import { MoveResult } from "#app/field/pokemon"; import type { CommandPhase } from "#app/phases/command-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/moves/swallow.test.ts b/test/moves/swallow.test.ts similarity index 99% rename from src/test/moves/swallow.test.ts rename to test/moves/swallow.test.ts index b2435ba77b3..1ede5808d82 100644 --- a/src/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -8,7 +8,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/syrup_bomb.test.ts b/test/moves/syrup_bomb.test.ts similarity index 98% rename from src/test/moves/syrup_bomb.test.ts rename to test/moves/syrup_bomb.test.ts index ea2f8b6bab3..a284e6fa669 100644 --- a/src/test/moves/syrup_bomb.test.ts +++ b/test/moves/syrup_bomb.test.ts @@ -3,7 +3,7 @@ import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tackle.test.ts b/test/moves/tackle.test.ts similarity index 97% rename from src/test/moves/tackle.test.ts rename to test/moves/tackle.test.ts index ff50f027f87..2ee811d3137 100644 --- a/src/test/moves/tackle.test.ts +++ b/test/moves/tackle.test.ts @@ -3,7 +3,7 @@ import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tail_whip.test.ts b/test/moves/tail_whip.test.ts similarity index 96% rename from src/test/moves/tail_whip.test.ts rename to test/moves/tail_whip.test.ts index 5c83feb8a4e..fea334e4708 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/test/moves/tail_whip.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts similarity index 98% rename from src/test/moves/tailwind.test.ts rename to test/moves/tailwind.test.ts index a26dde82824..56cf85749cd 100644 --- a/src/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -4,7 +4,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts similarity index 98% rename from src/test/moves/tar_shot.test.ts rename to test/moves/tar_shot.test.ts index 66f540e4f9f..1a259206e48 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/taunt.test.ts b/test/moves/taunt.test.ts similarity index 96% rename from src/test/moves/taunt.test.ts rename to test/moves/taunt.test.ts index a425a048a2c..c5cdd512704 100644 --- a/src/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts similarity index 99% rename from src/test/moves/telekinesis.test.ts rename to test/moves/telekinesis.test.ts index ba2bc40a189..441c70fff34 100644 --- a/src/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts similarity index 96% rename from src/test/moves/tera_blast.test.ts rename to test/moves/tera_blast.test.ts index 08e401ef9d1..22231ec6e46 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts similarity index 98% rename from src/test/moves/tera_starstorm.test.ts rename to test/moves/tera_starstorm.test.ts index 1e934b88c86..219a64b4ecc 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/thousand_arrows.test.ts b/test/moves/thousand_arrows.test.ts similarity index 98% rename from src/test/moves/thousand_arrows.test.ts rename to test/moves/thousand_arrows.test.ts index 976b4352ee4..563f99c030d 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/test/moves/thousand_arrows.test.ts @@ -4,7 +4,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/throat_chop.test.ts b/test/moves/throat_chop.test.ts similarity index 96% rename from src/test/moves/throat_chop.test.ts rename to test/moves/throat_chop.test.ts index 24293f8d086..d69205aadf3 100644 --- a/src/test/moves/throat_chop.test.ts +++ b/test/moves/throat_chop.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/thunder_wave.test.ts b/test/moves/thunder_wave.test.ts similarity index 98% rename from src/test/moves/thunder_wave.test.ts rename to test/moves/thunder_wave.test.ts index 21e215a51f2..34ab64e081a 100644 --- a/src/test/moves/thunder_wave.test.ts +++ b/test/moves/thunder_wave.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tidy_up.test.ts b/test/moves/tidy_up.test.ts similarity index 98% rename from src/test/moves/tidy_up.test.ts rename to test/moves/tidy_up.test.ts index 255967b40ac..5b5b67847ce 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/test/moves/tidy_up.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SubstituteTag } from "#app/data/battler-tags"; diff --git a/src/test/moves/torment.test.ts b/test/moves/torment.test.ts similarity index 97% rename from src/test/moves/torment.test.ts rename to test/moves/torment.test.ts index b4c9a059db1..8cc835aad48 100644 --- a/src/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/toxic.test.ts b/test/moves/toxic.test.ts similarity index 98% rename from src/test/moves/toxic.test.ts rename to test/moves/toxic.test.ts index b146134ae51..8e66fefe6ff 100644 --- a/src/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -1,6 +1,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/toxic_spikes.test.ts b/test/moves/toxic_spikes.test.ts similarity index 98% rename from src/test/moves/toxic_spikes.test.ts rename to test/moves/toxic_spikes.test.ts index 8969289c2f2..2bddbc2eccb 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/test/moves/toxic_spikes.test.ts @@ -7,7 +7,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/transform.test.ts b/test/moves/transform.test.ts similarity index 98% rename from src/test/moves/transform.test.ts rename to test/moves/transform.test.ts index ffe935aa61b..781e83b7e89 100644 --- a/src/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts similarity index 96% rename from src/test/moves/trick_or_treat.test.ts rename to test/moves/trick_or_treat.test.ts index 5c85cac05e2..2efd1b76d1a 100644 --- a/src/test/moves/trick_or_treat.test.ts +++ b/test/moves/trick_or_treat.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts similarity index 97% rename from src/test/moves/triple_arrows.test.ts rename to test/moves/triple_arrows.test.ts index 98ad29997df..9aa08d7b670 100644 --- a/src/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -2,7 +2,7 @@ import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/u_turn.test.ts b/test/moves/u_turn.test.ts similarity index 98% rename from src/test/moves/u_turn.test.ts rename to test/moves/u_turn.test.ts index c6e255e01b2..f57dec2e39f 100644 --- a/src/test/moves/u_turn.test.ts +++ b/test/moves/u_turn.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/upper_hand.test.ts b/test/moves/upper_hand.test.ts similarity index 98% rename from src/test/moves/upper_hand.test.ts rename to test/moves/upper_hand.test.ts index f94197d3fbd..c7556c1fa91 100644 --- a/src/test/moves/upper_hand.test.ts +++ b/test/moves/upper_hand.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts similarity index 99% rename from src/test/moves/whirlwind.test.ts rename to test/moves/whirlwind.test.ts index 69232bee43a..8637b6ec02c 100644 --- a/src/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { Status } from "#app/data/status-effect"; diff --git a/src/test/moves/wide_guard.test.ts b/test/moves/wide_guard.test.ts similarity index 98% rename from src/test/moves/wide_guard.test.ts rename to test/moves/wide_guard.test.ts index c25a700c981..1f0579e24ee 100644 --- a/src/test/moves/wide_guard.test.ts +++ b/test/moves/wide_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/will_o_wisp.test.ts b/test/moves/will_o_wisp.test.ts similarity index 96% rename from src/test/moves/will_o_wisp.test.ts rename to test/moves/will_o_wisp.test.ts index 39729d331ad..473f0d4d0a8 100644 --- a/src/test/moves/will_o_wisp.test.ts +++ b/test/moves/will_o_wisp.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts similarity index 99% rename from src/test/mystery-encounter/encounter-test-utils.ts rename to test/mystery-encounter/encounter-test-utils.ts index 69fa9b5465f..97f292ef6b1 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import { isNullOrUndefined } from "#app/utils"; import { Button } from "#enums/buttons"; import { StatusEffect } from "#enums/status-effect"; -import type GameManager from "#test/utils/gameManager"; +import type GameManager from "#test/testUtils/gameManager"; import { expect, vi } from "vitest"; /** diff --git a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts rename to test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 5a01b8a7379..d7f0ed6e20e 100644 --- a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { EggTier } from "#enums/egg-type"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts rename to test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 797c062dafe..0503a60cf1b 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts rename to test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index 9a6dae53901..b88e02be6ab 100644 --- a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -3,7 +3,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { ShinyRateBoosterModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts rename to test/mystery-encounter/encounters/berries-abound-encounter.test.ts index f980b0cb20a..d623d1ce7a8 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; @@ -11,7 +11,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts rename to test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 1ff523909da..6827ea5a463 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -11,7 +11,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts rename to test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f95450bbf44..799e26ea271 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; import { TrainerType } from "#enums/trainer-type"; diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts rename to test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index ceb457666d7..46217cca5e2 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts rename to test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 8121916a4d7..baea430fdaf 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts rename to test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index e30aaadbf85..224a4403942 100644 --- a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts b/test/mystery-encounter/encounters/field-trip-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/field-trip-encounter.test.ts rename to test/mystery-encounter/encounters/field-trip-encounter.test.ts index bc9be246e10..b831a52f116 100644 --- a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts +++ b/test/mystery-encounter/encounters/field-trip-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts rename to test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 2f668dd7f50..96fac78d872 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { Gender } from "#app/data/gender"; @@ -18,7 +18,7 @@ import { Status } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts rename to test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index 8c869812f39..116c45c1faf 100644 --- a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts rename to test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index 44ddbb8f7ba..de351e48c76 100644 --- a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { Nature } from "#enums/nature"; diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts rename to test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index 60780984014..f898b1f574f 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts rename to test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 17e324f29f0..09ecbc6c31a 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -5,12 +5,12 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounter-test-utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts rename to test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 7729fa40599..e42cd321cde 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/part-timer-encounter.test.ts rename to test/mystery-encounter/encounters/part-timer-encounter.test.ts index e8f2af0de5f..0cd7bc9bc76 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/safari-zone.test.ts rename to test/mystery-encounter/encounters/safari-zone.test.ts index a807805b81c..068e28547f4 100644 --- a/src/test/mystery-encounter/encounters/safari-zone.test.ts +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -2,13 +2,13 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { getSafariSpeciesSpawn, SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; diff --git a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts rename to test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index a00cca5083c..c7fcc1e967f 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -8,13 +8,13 @@ import { Species } from "#enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts rename to test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index e6f8127b776..7b10adc9680 100644 --- a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -3,13 +3,13 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts rename to test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 4fd96f8d5bc..3a3d94dbc44 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { getSalesmanSpeciesOffer, ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts rename to test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 3c0e75a2195..1a075ffaff2 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -20,7 +20,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; diff --git a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts rename to test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index e087bc5c180..85dbb4e23ff 100644 --- a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts rename to test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 395e33e818a..90a13c75dc3 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { HitHealModifier, HealShopCostModifier, TurnHealModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts rename to test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 06bd382879f..ab50666ab3d 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -10,7 +10,7 @@ import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts rename to test/mystery-encounter/encounters/weird-dream-encounter.test.ts index 669a99b92cd..073893f340d 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; @@ -11,7 +11,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts similarity index 98% rename from src/test/mystery-encounter/mystery-encounter-utils.test.ts rename to test/mystery-encounter/mystery-encounter-utils.test.ts index 7c924b86e0d..dacfb5cc96e 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -6,10 +6,10 @@ import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPla import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#enums/type"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts similarity index 96% rename from src/test/mystery-encounter/mystery-encounter.test.ts rename to test/mystery-encounter/mystery-encounter.test.ts index 7958fc1cd46..c70193a5d56 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts similarity index 97% rename from src/test/phases/form-change-phase.test.ts rename to test/phases/form-change-phase.test.ts index 07e59cafe1c..10287cd2046 100644 --- a/src/test/phases/form-change-phase.test.ts +++ b/test/phases/form-change-phase.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { Type } from "#enums/type"; diff --git a/src/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts similarity index 97% rename from src/test/phases/frenzy-move-reset.test.ts rename to test/phases/frenzy-move-reset.test.ts index db9ec2bfe66..0bea8e87f47 100644 --- a/src/test/phases/frenzy-move-reset.test.ts +++ b/test/phases/frenzy-move-reset.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { StatusEffect } from "#enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/phases/game-over-phase.test.ts b/test/phases/game-over-phase.test.ts similarity index 98% rename from src/test/phases/game-over-phase.test.ts rename to test/phases/game-over-phase.test.ts index 2e19d5fe954..4f5e215959a 100644 --- a/src/test/phases/game-over-phase.test.ts +++ b/test/phases/game-over-phase.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#enums/biome"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { achvs } from "#app/system/achv"; diff --git a/src/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts similarity index 99% rename from src/test/phases/learn-move-phase.test.ts rename to test/phases/learn-move-phase.test.ts index 3a3d111f551..6eb86620877 100644 --- a/src/test/phases/learn-move-phase.test.ts +++ b/test/phases/learn-move-phase.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts similarity index 98% rename from src/test/phases/mystery-encounter-phase.test.ts rename to test/phases/mystery-encounter-phase.test.ts index 507862534af..aa4e1683aae 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/phases.test.ts b/test/phases/phases.test.ts similarity index 96% rename from src/test/phases/phases.test.ts rename to test/phases/phases.test.ts index 36a405b8d15..4aabeb55b9e 100644 --- a/src/test/phases/phases.test.ts +++ b/test/phases/phases.test.ts @@ -3,7 +3,7 @@ import { LoginPhase } from "#app/phases/login-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { UnavailablePhase } from "#app/phases/unavailable-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts similarity index 98% rename from src/test/phases/select-modifier-phase.test.ts rename to test/phases/select-modifier-phase.test.ts index 23fab729838..0949eeec955 100644 --- a/src/test/phases/select-modifier-phase.test.ts +++ b/test/phases/select-modifier-phase.test.ts @@ -12,8 +12,8 @@ import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-account-api.test.ts rename to test/plugins/api/pokerogue-account-api.test.ts index 90a7d3639ad..e9033c859de 100644 --- a/src/test/plugins/api/pokerogue-account-api.test.ts +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -1,7 +1,7 @@ import type { AccountInfoResponse } from "#app/@types/PokerogueAccountApi"; import { SESSION_ID_COOKIE_NAME } from "#app/constants"; import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import * as Utils from "#app/utils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-admin-api.test.ts rename to test/plugins/api/pokerogue-admin-api.test.ts index 5ae46abfcc8..5af55967ae2 100644 --- a/src/test/plugins/api/pokerogue-admin-api.test.ts +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -7,7 +7,7 @@ import type { UnlinkAccountFromGoogledIdRequest, } from "#app/@types/PokerogueAdminApi"; import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-api.test.ts b/test/plugins/api/pokerogue-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-api.test.ts rename to test/plugins/api/pokerogue-api.test.ts index a62174c226d..241453866a5 100644 --- a/src/test/plugins/api/pokerogue-api.test.ts +++ b/test/plugins/api/pokerogue-api.test.ts @@ -1,6 +1,6 @@ import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-daily-api.test.ts b/test/plugins/api/pokerogue-daily-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-daily-api.test.ts rename to test/plugins/api/pokerogue-daily-api.test.ts index 569e7cbb15d..95d938e6625 100644 --- a/src/test/plugins/api/pokerogue-daily-api.test.ts +++ b/test/plugins/api/pokerogue-daily-api.test.ts @@ -1,6 +1,6 @@ import type { GetDailyRankingsPageCountRequest, GetDailyRankingsRequest } from "#app/@types/PokerogueDailyApi"; import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { ScoreboardCategory, type RankingEntry } from "#app/ui/daily-run-scoreboard"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-savedata-api.test.ts b/test/plugins/api/pokerogue-savedata-api.test.ts similarity index 96% rename from src/test/plugins/api/pokerogue-savedata-api.test.ts rename to test/plugins/api/pokerogue-savedata-api.test.ts index 6dd402206e5..47eafa0a933 100644 --- a/src/test/plugins/api/pokerogue-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-savedata-api.test.ts @@ -1,6 +1,6 @@ import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi"; import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-session-savedata-api.test.ts rename to test/plugins/api/pokerogue-session-savedata-api.test.ts index f453c5edd88..d8103428d59 100644 --- a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -8,7 +8,7 @@ import type { } from "#app/@types/PokerogueSessionSavedataApi"; import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session-savedata-api"; import type { SessionSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-system-savedata-api.test.ts rename to test/plugins/api/pokerogue-system-savedata-api.test.ts index af377762b77..f108e22ee2c 100644 --- a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -6,7 +6,7 @@ import type { } from "#app/@types/PokerogueSystemSavedataApi"; import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; import type { SystemSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/pre.test.ts b/test/pre.test.ts similarity index 100% rename from src/test/pre.test.ts rename to test/pre.test.ts diff --git a/src/test/reload.test.ts b/test/reload.test.ts similarity index 97% rename from src/test/reload.test.ts rename to test/reload.test.ts index b5f66630606..019da0a4c2a 100644 --- a/src/test/reload.test.ts +++ b/test/reload.test.ts @@ -6,8 +6,8 @@ import { Biome } from "#enums/biome"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import type { MockClock } from "#test/utils/mocks/mockClock"; +import GameManager from "#test/testUtils/gameManager"; +import type { MockClock } from "#test/testUtils/mocks/mockClock"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Reload", () => { diff --git a/src/test/settingMenu/helpers/inGameManip.ts b/test/settingMenu/helpers/inGameManip.ts similarity index 100% rename from src/test/settingMenu/helpers/inGameManip.ts rename to test/settingMenu/helpers/inGameManip.ts diff --git a/src/test/settingMenu/helpers/menuManip.ts b/test/settingMenu/helpers/menuManip.ts similarity index 92% rename from src/test/settingMenu/helpers/menuManip.ts rename to test/settingMenu/helpers/menuManip.ts index 0b1f48525f1..1d53b845047 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/test/settingMenu/helpers/menuManip.ts @@ -1,4 +1,15 @@ -import { assign, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting, deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { + assign, + canIAssignThisKey, + canIDeleteThisKey, + canIOverrideThisSetting, + deleteBind, + getIconWithKeycode, + getIconWithSettingName, + getKeyWithKeycode, + getKeyWithSettingName, + getSettingNameWithKeycode, +} from "#app/configs/inputs/configHandler"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { expect } from "vitest"; diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/test/settingMenu/rebinding_setting.test.ts similarity index 100% rename from src/test/settingMenu/rebinding_setting.test.ts rename to test/settingMenu/rebinding_setting.test.ts diff --git a/src/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts similarity index 99% rename from src/test/sprites/pokemonSprite.test.ts rename to test/sprites/pokemonSprite.test.ts index 2bfdbe9ce39..43749015e1c 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,7 +2,7 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; type PokemonVariantMasterlist = typeof _masterlist; diff --git a/src/test/sprites/spritesUtils.ts b/test/sprites/spritesUtils.ts similarity index 100% rename from src/test/sprites/spritesUtils.ts rename to test/sprites/spritesUtils.ts diff --git a/src/test/system/game_data.test.ts b/test/system/game_data.test.ts similarity index 96% rename from src/test/system/game_data.test.ts rename to test/system/game_data.test.ts index ad24c40f445..f7940567746 100644 --- a/src/test/system/game_data.test.ts +++ b/test/system/game_data.test.ts @@ -3,10 +3,10 @@ import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import type { SessionSaveData } from "#app/system/game-data"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as account from "../../account"; +import * as account from "#app/account"; describe("System - Game Data", () => { let phaserGame: Phaser.Game; diff --git a/src/test/utils/TextInterceptor.ts b/test/testUtils/TextInterceptor.ts similarity index 100% rename from src/test/utils/TextInterceptor.ts rename to test/testUtils/TextInterceptor.ts diff --git a/src/test/utils/errorInterceptor.ts b/test/testUtils/errorInterceptor.ts similarity index 100% rename from src/test/utils/errorInterceptor.ts rename to test/testUtils/errorInterceptor.ts diff --git a/src/test/utils/fakeMobile.html b/test/testUtils/fakeMobile.html similarity index 100% rename from src/test/utils/fakeMobile.html rename to test/testUtils/fakeMobile.html diff --git a/src/test/utils/gameManager.ts b/test/testUtils/gameManager.ts similarity index 95% rename from src/test/utils/gameManager.ts rename to test/testUtils/gameManager.ts index b2015700c9b..436c97a6967 100644 --- a/src/test/utils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -22,8 +22,8 @@ import { TitlePhase } from "#app/phases/title-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import type InputsHandler from "#app/test/utils/inputsHandler"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; +import type InputsHandler from "#test/testUtils/inputsHandler"; import type BallUiHandler from "#app/ui/ball-ui-handler"; import type BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import type CommandUiHandler from "#app/ui/command-ui-handler"; @@ -40,18 +40,18 @@ import type { Moves } from "#enums/moves"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PlayerGender } from "#enums/player-gender"; import type { Species } from "#enums/species"; -import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; -import GameWrapper from "#test/utils/gameWrapper"; -import { ChallengeModeHelper } from "#test/utils/helpers/challengeModeHelper"; -import { ClassicModeHelper } from "#test/utils/helpers/classicModeHelper"; -import { DailyModeHelper } from "#test/utils/helpers/dailyModeHelper"; -import { ModifierHelper } from "#test/utils/helpers/modifiersHelper"; -import { MoveHelper } from "#test/utils/helpers/moveHelper"; -import { OverridesHelper } from "#test/utils/helpers/overridesHelper"; -import { ReloadHelper } from "#test/utils/helpers/reloadHelper"; -import { SettingsHelper } from "#test/utils/helpers/settingsHelper"; -import PhaseInterceptor from "#test/utils/phaseInterceptor"; -import TextInterceptor from "#test/utils/TextInterceptor"; +import { generateStarter, waitUntil } from "#test/testUtils/gameManagerUtils"; +import GameWrapper from "#test/testUtils/gameWrapper"; +import { ChallengeModeHelper } from "#test/testUtils/helpers/challengeModeHelper"; +import { ClassicModeHelper } from "#test/testUtils/helpers/classicModeHelper"; +import { DailyModeHelper } from "#test/testUtils/helpers/dailyModeHelper"; +import { ModifierHelper } from "#test/testUtils/helpers/modifiersHelper"; +import { MoveHelper } from "#test/testUtils/helpers/moveHelper"; +import { OverridesHelper } from "#test/testUtils/helpers/overridesHelper"; +import { ReloadHelper } from "#test/testUtils/helpers/reloadHelper"; +import { SettingsHelper } from "#test/testUtils/helpers/settingsHelper"; +import PhaseInterceptor from "#test/testUtils/phaseInterceptor"; +import TextInterceptor from "#test/testUtils/TextInterceptor"; import { AES, enc } from "crypto-js"; import fs from "fs"; import { expect, vi } from "vitest"; diff --git a/src/test/utils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts similarity index 100% rename from src/test/utils/gameManagerUtils.ts rename to test/testUtils/gameManagerUtils.ts diff --git a/src/test/utils/gameWrapper.ts b/test/testUtils/gameWrapper.ts similarity index 93% rename from src/test/utils/gameWrapper.ts rename to test/testUtils/gameWrapper.ts index e8addcfc1d9..c2614b2b61d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -4,14 +4,14 @@ import BattleScene, * as battleScene from "#app/battle-scene"; import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { blobToString } from "#test/utils/gameManagerUtils"; -import { MockClock } from "#test/utils/mocks/mockClock"; -import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; -import { MockFetch } from "#test/utils/mocks/mockFetch"; -import MockLoader from "#test/utils/mocks/mockLoader"; -import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import { blobToString } from "#test/testUtils/gameManagerUtils"; +import { MockClock } from "#test/testUtils/mocks/mockClock"; +import mockConsoleLog from "#test/testUtils/mocks/mockConsoleLog"; +import { MockFetch } from "#test/testUtils/mocks/mockFetch"; +import MockLoader from "#test/testUtils/mocks/mockLoader"; +import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; @@ -24,7 +24,7 @@ import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import { version } from "../../../package.json"; +import { version } from "../../package.json"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; Object.defineProperty(window, "localStorage", { diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/test/testUtils/helpers/challengeModeHelper.ts similarity index 100% rename from src/test/utils/helpers/challengeModeHelper.ts rename to test/testUtils/helpers/challengeModeHelper.ts diff --git a/src/test/utils/helpers/classicModeHelper.ts b/test/testUtils/helpers/classicModeHelper.ts similarity index 100% rename from src/test/utils/helpers/classicModeHelper.ts rename to test/testUtils/helpers/classicModeHelper.ts diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/test/testUtils/helpers/dailyModeHelper.ts similarity index 100% rename from src/test/utils/helpers/dailyModeHelper.ts rename to test/testUtils/helpers/dailyModeHelper.ts diff --git a/src/test/utils/helpers/gameManagerHelper.ts b/test/testUtils/helpers/gameManagerHelper.ts similarity index 100% rename from src/test/utils/helpers/gameManagerHelper.ts rename to test/testUtils/helpers/gameManagerHelper.ts diff --git a/src/test/utils/helpers/modifiersHelper.ts b/test/testUtils/helpers/modifiersHelper.ts similarity index 100% rename from src/test/utils/helpers/modifiersHelper.ts rename to test/testUtils/helpers/modifiersHelper.ts diff --git a/src/test/utils/helpers/moveHelper.ts b/test/testUtils/helpers/moveHelper.ts similarity index 97% rename from src/test/utils/helpers/moveHelper.ts rename to test/testUtils/helpers/moveHelper.ts index ee026c06a8d..535537b34a2 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/test/testUtils/helpers/moveHelper.ts @@ -9,8 +9,8 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import { GameManagerHelper } from "#test/utils/helpers/gameManagerHelper"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; +import { GameManagerHelper } from "#test/testUtils/helpers/gameManagerHelper"; import { vi } from "vitest"; /** diff --git a/src/test/utils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts similarity index 100% rename from src/test/utils/helpers/overridesHelper.ts rename to test/testUtils/helpers/overridesHelper.ts diff --git a/src/test/utils/helpers/reloadHelper.ts b/test/testUtils/helpers/reloadHelper.ts similarity index 100% rename from src/test/utils/helpers/reloadHelper.ts rename to test/testUtils/helpers/reloadHelper.ts diff --git a/src/test/utils/helpers/settingsHelper.ts b/test/testUtils/helpers/settingsHelper.ts similarity index 100% rename from src/test/utils/helpers/settingsHelper.ts rename to test/testUtils/helpers/settingsHelper.ts diff --git a/src/test/utils/inputsHandler.ts b/test/testUtils/inputsHandler.ts similarity index 94% rename from src/test/utils/inputsHandler.ts rename to test/testUtils/inputsHandler.ts index e2591def447..c526300a75a 100644 --- a/src/test/utils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -2,7 +2,7 @@ import type BattleScene from "#app/battle-scene"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import type { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; -import { holdOn } from "#test/utils/gameManagerUtils"; +import { holdOn } from "#test/testUtils/gameManagerUtils"; import fs from "fs"; import { JSDOM } from "jsdom"; import Phaser from "phaser"; @@ -90,7 +90,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { class FakeMobile { constructor() { - const fakeMobilePage = fs.readFileSync("./src/test/utils/fakeMobile.html", { encoding: "utf8", flag: "r" }); + const fakeMobilePage = fs.readFileSync("././test/testUtils/fakeMobile.html", { encoding: "utf8", flag: "r" }); const dom = new JSDOM(fakeMobilePage); Object.defineProperty(window, "document", { value: dom.window.document, diff --git a/src/test/utils/mocks/mockClock.ts b/test/testUtils/mocks/mockClock.ts similarity index 100% rename from src/test/utils/mocks/mockClock.ts rename to test/testUtils/mocks/mockClock.ts diff --git a/src/test/utils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts similarity index 100% rename from src/test/utils/mocks/mockConsoleLog.ts rename to test/testUtils/mocks/mockConsoleLog.ts diff --git a/src/test/utils/mocks/mockFetch.ts b/test/testUtils/mocks/mockFetch.ts similarity index 100% rename from src/test/utils/mocks/mockFetch.ts rename to test/testUtils/mocks/mockFetch.ts diff --git a/src/test/utils/mocks/mockGameObject.ts b/test/testUtils/mocks/mockGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockGameObject.ts rename to test/testUtils/mocks/mockGameObject.ts diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/test/testUtils/mocks/mockGameObjectCreator.ts similarity index 100% rename from src/test/utils/mocks/mockGameObjectCreator.ts rename to test/testUtils/mocks/mockGameObjectCreator.ts diff --git a/src/test/utils/mocks/mockLoader.ts b/test/testUtils/mocks/mockLoader.ts similarity index 100% rename from src/test/utils/mocks/mockLoader.ts rename to test/testUtils/mocks/mockLoader.ts diff --git a/src/test/utils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts similarity index 100% rename from src/test/utils/mocks/mockLocalStorage.ts rename to test/testUtils/mocks/mockLocalStorage.ts diff --git a/src/test/utils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts similarity index 80% rename from src/test/utils/mocks/mockTextureManager.ts rename to test/testUtils/mocks/mockTextureManager.ts index 39066561f25..44d33cf8910 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -1,11 +1,11 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; -import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; -import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; -import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite"; -import MockText from "#test/utils/mocks/mocksContainer/mockText"; -import MockTexture from "#test/utils/mocks/mocksContainer/mockTexture"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockNineslice from "#test/testUtils/mocks/mocksContainer/mockNineslice"; +import MockPolygon from "#test/testUtils/mocks/mocksContainer/mockPolygon"; +import MockRectangle from "#test/testUtils/mocks/mocksContainer/mockRectangle"; +import MockSprite from "#test/testUtils/mocks/mocksContainer/mockSprite"; +import MockText from "#test/testUtils/mocks/mocksContainer/mockText"; +import MockTexture from "#test/testUtils/mocks/mocksContainer/mockTexture"; import type { MockGameObject } from "./mockGameObject"; import { MockVideoGameObject } from "./mockVideoGameObject"; diff --git a/src/test/utils/mocks/mockTimedEventManager.ts b/test/testUtils/mocks/mockTimedEventManager.ts similarity index 100% rename from src/test/utils/mocks/mockTimedEventManager.ts rename to test/testUtils/mocks/mockTimedEventManager.ts diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/test/testUtils/mocks/mockVideoGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockVideoGameObject.ts rename to test/testUtils/mocks/mockVideoGameObject.ts diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts similarity index 98% rename from src/test/utils/mocks/mocksContainer/mockContainer.ts rename to test/testUtils/mocks/mocksContainer/mockContainer.ts index f0198535e7b..6c03ff7460d 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; export default class MockContainer implements MockGameObject { diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/test/testUtils/mocks/mocksContainer/mockGraphics.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockGraphics.ts rename to test/testUtils/mocks/mocksContainer/mockGraphics.ts diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts similarity index 70% rename from src/test/utils/mocks/mocksContainer/mockImage.ts rename to test/testUtils/mocks/mocksContainer/mockImage.ts index be183a0dd89..3badde4f8ab 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/test/testUtils/mocks/mocksContainer/mockNineslice.ts similarity index 86% rename from src/test/utils/mocks/mocksContainer/mockNineslice.ts rename to test/testUtils/mocks/mocksContainer/mockNineslice.ts index a8e10036a72..4f6b8a5d21d 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/test/testUtils/mocks/mocksContainer/mockNineslice.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/test/testUtils/mocks/mocksContainer/mockPolygon.ts similarity index 67% rename from src/test/utils/mocks/mocksContainer/mockPolygon.ts rename to test/testUtils/mocks/mocksContainer/mockPolygon.ts index 12b60904a96..43e9c5460d0 100644 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ b/test/testUtils/mocks/mocksContainer/mockPolygon.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockPolygon extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockRectangle.ts rename to test/testUtils/mocks/mocksContainer/mockRectangle.ts diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockSprite.ts rename to test/testUtils/mocks/mocksContainer/mockSprite.ts diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/test/testUtils/mocks/mocksContainer/mockText.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockText.ts rename to test/testUtils/mocks/mocksContainer/mockText.ts diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/test/testUtils/mocks/mocksContainer/mockTexture.ts similarity index 92% rename from src/test/utils/mocks/mocksContainer/mockTexture.ts rename to test/testUtils/mocks/mocksContainer/mockTexture.ts index 57c87df23be..a9186783d46 100644 --- a/src/test/utils/mocks/mocksContainer/mockTexture.ts +++ b/test/testUtils/mocks/mocksContainer/mockTexture.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; diff --git a/src/test/utils/phaseInterceptor.ts b/test/testUtils/phaseInterceptor.ts similarity index 99% rename from src/test/utils/phaseInterceptor.ts rename to test/testUtils/phaseInterceptor.ts index 91f98e89ec3..fe0fbf82e29 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/test/testUtils/phaseInterceptor.ts @@ -1,5 +1,5 @@ import { Phase } from "#app/phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { BerryPhase } from "#app/phases/berry-phase"; diff --git a/src/test/utils/saves/data_new.prsv b/test/testUtils/saves/data_new.prsv similarity index 100% rename from src/test/utils/saves/data_new.prsv rename to test/testUtils/saves/data_new.prsv diff --git a/src/test/utils/saves/everything.prsv b/test/testUtils/saves/everything.prsv similarity index 100% rename from src/test/utils/saves/everything.prsv rename to test/testUtils/saves/everything.prsv diff --git a/src/test/utils/testUtils.ts b/test/testUtils/testUtils.ts similarity index 100% rename from src/test/utils/testUtils.ts rename to test/testUtils/testUtils.ts diff --git a/src/test/ui/battle_info.test.ts b/test/ui/battle_info.test.ts similarity index 96% rename from src/test/ui/battle_info.test.ts rename to test/ui/battle_info.test.ts index 3100372f091..6209312c451 100644 --- a/src/test/ui/battle_info.test.ts +++ b/test/ui/battle_info.test.ts @@ -3,7 +3,7 @@ import { Species } from "#app/enums/species"; import { ExpPhase } from "#app/phases/exp-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts similarity index 97% rename from src/test/ui/starter-select.test.ts rename to test/ui/starter-select.test.ts index 15b5f643539..685debf098d 100644 --- a/src/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -13,7 +13,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,7 +38,7 @@ describe("UI - Starter select", () => { }); it("Bulbasaur - shiny - variant 2 male", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -98,7 +98,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female hardy overgrow", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -160,7 +160,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -225,7 +225,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -286,7 +286,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - not shiny", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -346,7 +346,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 1", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -408,7 +408,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 0", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -469,7 +469,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -533,7 +533,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/ui/transfer-item.test.ts b/test/ui/transfer-item.test.ts similarity index 98% rename from src/test/ui/transfer-item.test.ts rename to test/ui/transfer-item.test.ts index b08b056f60e..83c2eb2ef79 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/test/ui/transfer-item.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/ui/type-hints.test.ts b/test/ui/type-hints.test.ts similarity index 95% rename from src/test/ui/type-hints.test.ts rename to test/ui/type-hints.test.ts index 9046d82c1df..0838ab01f51 100644 --- a/src/test/ui/type-hints.test.ts +++ b/test/ui/type-hints.test.ts @@ -4,10 +4,10 @@ import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import FightUiHandler from "#app/ui/fight-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import type MockText from "#test/utils/mocks/mocksContainer/mockText"; +import type MockText from "#test/testUtils/mocks/mocksContainer/mockText"; import i18next from "i18next"; describe("UI - Type Hints", () => { diff --git a/src/test/vitest.setup.ts b/test/vitest.setup.ts similarity index 97% rename from src/test/vitest.setup.ts rename to test/vitest.setup.ts index eb2c1e4b9cf..bc7db8ea591 100644 --- a/src/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -45,7 +45,7 @@ vi.mock("i18next", async (importOriginal) => { const filename = req.params[0]; try { - const json = await import(`../../public/locales/en/${req.params[0]}`); + const json = await import(`../public/locales/en/${req.params[0]}`); console.log("Loaded locale", filename); return HttpResponse.json(json); } catch (err) { diff --git a/tsconfig.json b/tsconfig.json index 0ec945df4ee..6bb0ae51c1b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,12 +8,12 @@ "strictNullChecks": true, "sourceMap": false, "strict": false, - "rootDir": "./src", + "rootDir": ".", "baseUrl": "./src", "paths": { "#enums/*": ["./enums/*.ts"], "#app/*": ["*.ts"], - "#test/*": ["./test/*.ts"] + "#test/*": ["../test/*.ts"] }, "outDir": "./build", "noEmit": true @@ -31,4 +31,4 @@ "vitest.config.ts", "vitest.workspace.ts", ] -} \ No newline at end of file +} diff --git a/vitest.config.ts b/vitest.config.ts index 9f9245687a1..b52c16ec00c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineProject(({ mode }) => ({ ...defaultConfig, test: { testTimeout: 20000, - setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"], + setupFiles: ["./test/fontFace.setup.ts", "./test/vitest.setup.ts"], server: { deps: { inline: ["vitest-canvas-mock"], @@ -33,8 +33,8 @@ export default defineProject(({ mode }) => ({ reporters: ["text-summary", "html"], }, name: "main", - include: ["./src/test/**/*.{test,spec}.ts"], - exclude: ["./src/test/pre.test.ts"], + include: ["./test/**/*.{test,spec}.ts"], + exclude: ["./test/pre.test.ts"], }, esbuild: { pure: mode === "production" ? ["console.log"] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 38121942004..2f5d1f1e2c8 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -6,7 +6,7 @@ export default defineWorkspace([ ...defaultConfig, test: { name: "pre", - include: ["src/test/pre.test.ts"], + include: ["./test/pre.test.ts"], environment: "jsdom", }, }, From eeeb4171b18b55f9ba252f58b4632a82f32e684c Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 22 Feb 2025 23:35:49 -0600 Subject: [PATCH 15/24] [Move] Add flavor text for Splash and Celebrate (#5392) * Add flavor text for Splash and Celebrate * Remove unnecessary constructors * Use Splash move text from move triggers --- src/data/move.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 30c5ef75491..332a3302fdd 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -61,6 +61,7 @@ import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; import { MoveAnimPhase } from "#app/phases/move-anim-phase"; +import { loggedInUser } from "#app/account"; export enum MoveCategory { PHYSICAL, @@ -1584,6 +1585,20 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { } } +export class SplashAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:splash")); + return true; + } +} + +export class CelebrateAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username })); + return true; + } +} + export class RecoilAttr extends MoveEffectAttr { private useHp: boolean; private damageRatio: number; @@ -8852,6 +8867,7 @@ export function initMoves() { new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) + .attr(SplashAttr) .condition(failOnGravityCondition), new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), @@ -10294,7 +10310,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new AttackMove(Moves.DAZZLING_GLEAM, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6), + new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6) + .attr(CelebrateAttr), new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), From cefd92bee8fbbba5db5d0f8b299a0ac1590335a7 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:06:27 -0800 Subject: [PATCH 16/24] [Misc] Update Encounter Phase logging nature display and passive check (#5397) --- src/phases/encounter-phase.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index ce85460a481..b868c3f8952 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -38,7 +38,7 @@ import { Species } from "#enums/species"; import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; -import { Nature } from "#enums/nature"; +import { getNatureName } from "#app/data/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -173,12 +173,12 @@ export class EncounterPhase extends BattlePhase { console.log( `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `| Species ID: ${enemyPokemon.species.speciesId}`, - `| Nature: ${Nature[enemyPokemon.getNature()]}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, ); console.log(`Stats (IVs): ${stats}`); console.log( `Ability: ${enemyPokemon.getAbility().name}`, - `| Passive Ability${enemyPokemon.isBoss() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` ); console.log("Moveset:", moveset); From 095634fe6d1661bfcaef0d4b51ecd523dba19e7a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:21:24 -0500 Subject: [PATCH 17/24] [Bug] Fix Gym Leaders fought on wave 20 not evolving mons when fought later in the run (#5370) * Fix repeat Plains GLs not evolving first mons * Add null check --- src/data/pokemon-species.ts | 6 +++++- src/data/trainer-config.ts | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ff9fbdf0bc8..06704666153 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -830,7 +830,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) { + if ( // If evolutions shouldn't happen, add more cases here :) + !allowEvolving + || !pokemonEvolutions.hasOwnProperty(this.speciesId) + || globalScene.currentBattle?.waveIndex === 20 && globalScene.gameMode.isClassic && globalScene.currentBattle.trainer + ) { return this.speciesId; } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index d9aab528e72..1b646fc6478 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1247,9 +1247,6 @@ function getGymLeaderPartyTemplate() { export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { return (level: number, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); - if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 20) { - ignoreEvolution = true; - } if (!ignoreEvolution) { species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex); } From 3ab75b297b0e221df68d7270d47d4910a741ae9b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:27:40 -0800 Subject: [PATCH 18/24] [Misc] Copy Encounter Phase logging to MEs (#5405) --- .../utils/encounter-phase-utils.ts | 28 ++++++++++++++++++- src/phases/encounter-phase.ts | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index d745da5ecb3..1f740763148 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -47,6 +47,8 @@ import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#app/enums/type"; +import { getNatureName } from "#app/data/nature"; +import { getPokemonNameWithAffix } from "#app/messages"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -357,7 +359,31 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${enemyPokemon.name}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach((move) => { + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + ); + console.log("Moveset:", moveset); }); globalScene.pushPhase(new MysteryEncounterBattlePhase(partyConfig.disableSwitch)); diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index b868c3f8952..9485e77e5aa 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -167,7 +167,7 @@ export class EncounterPhase extends BattlePhase { ]; const moveset: string[] = []; enemyPokemon.getMoveset().forEach((move) => { - moveset.push(move!.getName()); + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR }); console.log( From 9d03004dd34e629d94cea0b86b50f08ab50834cd Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:17:37 -0800 Subject: [PATCH 19/24] [Test] Fix import in `create-test` script (#5403) --- create-test-boilerplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 04e1a29cb5f..1ea61e0dc48 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -108,7 +108,7 @@ async function runInteractive() { const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; From 1c192d434b4547543dd75b2066c2401be353d10d Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:44:41 +0100 Subject: [PATCH 20/24] [Sprite] 666-Vivillion back exp change and scuff fix (#5382) * [Sprite] Vivillion back exp change and scuff fix scuff is the incorrect labeling in the exp-sprite.json. fully updated meadow pattern. all incorrect labeled back sprites are no more a thing. * fix the last issues with Shiny exp backs * Last adjustment for the future variant Pr added 1 color --- public/exp-sprites.json | 58 +- public/images/pokemon/666-continental.png | Bin 948 -> 982 bytes public/images/pokemon/666-fancy.png | Bin 1069 -> 1111 bytes public/images/pokemon/666-river.png | Bin 952 -> 1005 bytes public/images/pokemon/back/666-fancy.png | Bin 994 -> 1035 bytes public/images/pokemon/back/666-river.png | Bin 906 -> 953 bytes public/images/pokemon/exp/666-fancy.png | Bin 6381 -> 7162 bytes public/images/pokemon/exp/666-meadow.json | 863 +++++++++++------- public/images/pokemon/exp/666-meadow.png | Bin 5195 -> 5634 bytes public/images/pokemon/exp/666-poke-ball.png | Bin 6270 -> 7178 bytes public/images/pokemon/exp/666-river.png | Bin 6155 -> 7043 bytes .../pokemon/exp/back/666-archipelago.json | 221 ++--- .../pokemon/exp/back/666-archipelago.png | Bin 2861 -> 2776 bytes .../pokemon/exp/back/666-continental.json | 221 ++--- .../pokemon/exp/back/666-continental.png | Bin 3067 -> 2795 bytes .../images/pokemon/exp/back/666-elegant.json | 221 ++--- .../images/pokemon/exp/back/666-elegant.png | Bin 2775 -> 2799 bytes public/images/pokemon/exp/back/666-fancy.json | 221 ++--- public/images/pokemon/exp/back/666-fancy.png | Bin 3284 -> 2977 bytes .../images/pokemon/exp/back/666-garden.json | 221 ++--- public/images/pokemon/exp/back/666-garden.png | Bin 2534 -> 2753 bytes .../pokemon/exp/back/666-high-plains.json | 221 ++--- .../pokemon/exp/back/666-high-plains.png | Bin 3287 -> 2810 bytes .../images/pokemon/exp/back/666-icy-snow.json | 221 ++--- .../images/pokemon/exp/back/666-icy-snow.png | Bin 2613 -> 2769 bytes .../images/pokemon/exp/back/666-jungle.json | 221 ++--- public/images/pokemon/exp/back/666-jungle.png | Bin 2873 -> 2764 bytes .../images/pokemon/exp/back/666-marine.json | 221 ++--- public/images/pokemon/exp/back/666-marine.png | Bin 2654 -> 7088 bytes .../images/pokemon/exp/back/666-meadow.json | 640 +++---------- public/images/pokemon/exp/back/666-meadow.png | Bin 4909 -> 2869 bytes .../images/pokemon/exp/back/666-modern.json | 221 ++--- public/images/pokemon/exp/back/666-modern.png | Bin 3013 -> 2755 bytes .../images/pokemon/exp/back/666-monsoon.json | 221 ++--- .../images/pokemon/exp/back/666-monsoon.png | Bin 3169 -> 2768 bytes public/images/pokemon/exp/back/666-ocean.json | 221 ++--- public/images/pokemon/exp/back/666-ocean.png | Bin 2784 -> 2894 bytes .../pokemon/exp/back/666-poke-ball.json | 221 ++--- .../images/pokemon/exp/back/666-poke-ball.png | Bin 3532 -> 2983 bytes public/images/pokemon/exp/back/666-polar.json | 221 ++--- public/images/pokemon/exp/back/666-polar.png | Bin 2584 -> 2766 bytes public/images/pokemon/exp/back/666-river.json | 221 ++--- public/images/pokemon/exp/back/666-river.png | Bin 2696 -> 2805 bytes .../pokemon/exp/back/666-sandstorm.json | 221 ++--- .../images/pokemon/exp/back/666-sandstorm.png | Bin 2866 -> 2821 bytes .../images/pokemon/exp/back/666-savanna.json | 221 ++--- .../images/pokemon/exp/back/666-savanna.png | Bin 3302 -> 2850 bytes public/images/pokemon/exp/back/666-sun.json | 221 ++--- public/images/pokemon/exp/back/666-sun.png | Bin 3541 -> 2859 bytes .../images/pokemon/exp/back/666-tundra.json | 221 ++--- public/images/pokemon/exp/back/666-tundra.png | Bin 2813 -> 2777 bytes .../exp/back/shiny/666-archipelago.json | 221 ++--- .../exp/back/shiny/666-archipelago.png | Bin 3018 -> 2776 bytes .../exp/back/shiny/666-continental.json | 221 ++--- .../exp/back/shiny/666-continental.png | Bin 3174 -> 2795 bytes .../pokemon/exp/back/shiny/666-elegant.json | 221 ++--- .../pokemon/exp/back/shiny/666-elegant.png | Bin 2960 -> 2799 bytes .../pokemon/exp/back/shiny/666-fancy.json | 221 ++--- .../pokemon/exp/back/shiny/666-fancy.png | Bin 3067 -> 2967 bytes .../pokemon/exp/back/shiny/666-garden.json | 221 ++--- .../pokemon/exp/back/shiny/666-garden.png | Bin 2688 -> 2753 bytes .../exp/back/shiny/666-high-plains.json | 221 ++--- .../exp/back/shiny/666-high-plains.png | Bin 3203 -> 2803 bytes .../pokemon/exp/back/shiny/666-icy-snow.json | 221 ++--- .../pokemon/exp/back/shiny/666-icy-snow.png | Bin 2803 -> 2769 bytes .../pokemon/exp/back/shiny/666-jungle.json | 221 ++--- .../pokemon/exp/back/shiny/666-jungle.png | Bin 2856 -> 2764 bytes .../pokemon/exp/back/shiny/666-marine.json | 221 ++--- .../pokemon/exp/back/shiny/666-marine.png | Bin 2808 -> 2810 bytes .../pokemon/exp/back/shiny/666-meadow.json | 641 +++---------- .../pokemon/exp/back/shiny/666-meadow.png | Bin 4941 -> 2869 bytes .../pokemon/exp/back/shiny/666-modern.json | 221 ++--- .../pokemon/exp/back/shiny/666-modern.png | Bin 2794 -> 2755 bytes .../pokemon/exp/back/shiny/666-monsoon.json | 221 ++--- .../pokemon/exp/back/shiny/666-monsoon.png | Bin 3127 -> 2768 bytes .../pokemon/exp/back/shiny/666-ocean.json | 221 ++--- .../pokemon/exp/back/shiny/666-ocean.png | Bin 2749 -> 2894 bytes .../pokemon/exp/back/shiny/666-poke-ball.json | 221 ++--- .../pokemon/exp/back/shiny/666-poke-ball.png | Bin 3495 -> 2983 bytes .../pokemon/exp/back/shiny/666-polar.json | 221 ++--- .../pokemon/exp/back/shiny/666-polar.png | Bin 2794 -> 2766 bytes .../pokemon/exp/back/shiny/666-savanna.json | 221 ++--- .../pokemon/exp/back/shiny/666-savanna.png | Bin 3165 -> 2850 bytes .../pokemon/exp/back/shiny/666-sun.json | 221 ++--- .../images/pokemon/exp/back/shiny/666-sun.png | Bin 3365 -> 2859 bytes .../pokemon/exp/back/shiny/666-tundra.json | 221 ++--- .../pokemon/exp/back/shiny/666-tundra.png | Bin 2984 -> 2777 bytes 87 files changed, 5062 insertions(+), 5096 deletions(-) diff --git a/public/exp-sprites.json b/public/exp-sprites.json index a340d02a65a..c3b79d0cb38 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -261,10 +261,10 @@ "666-fancy", "666-garden", "666-garden", - "666-high", - "666-high", - "666-icy", - "666-icy", + "666-high-plains", + "666-high-plains", + "666-icy-snow", + "666-icy-snow", "666-jungle", "666-jungle", "666-marine", @@ -277,8 +277,8 @@ "666-monsoon", "666-ocean", "666-ocean", - "666-poke", - "666-poke", + "666-poke-ball", + "666-poke-ball", "666-polar", "666-polar", "666-river", @@ -1379,10 +1379,10 @@ "666b-fancy", "666b-garden", "666b-garden", - "666b-high", - "666b-high", - "666b-icy", - "666b-icy", + "666b-high-plains", + "666b-high-plains", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle", "666b-jungle", "666b-marine", @@ -1395,8 +1395,8 @@ "666b-monsoon", "666b-ocean", "666b-ocean", - "666b-poke", - "666b-poke", + "666b-poke-ball", + "666b-poke-ball", "666b-polar", "666b-polar", "666b-river", @@ -2499,10 +2499,10 @@ "666sb-fancy", "666sb-garden", "666sb-garden", - "666sb-high", - "666sb-high", - "666sb-icy", - "666sb-icy", + "666sb-high-plains", + "666sb-high-plains", + "666sb-icy-snow", + "666sb-icy-snow", "666sb-jungle", "666sb-jungle", "666sb-marine", @@ -2515,8 +2515,8 @@ "666sb-monsoon", "666sb-ocean", "666sb-ocean", - "666sb-poke", - "666sb-poke", + "666sb-poke-ball", + "666sb-poke-ball", "666sb-polar", "666sb-polar", "666sb-river", @@ -3624,10 +3624,10 @@ "666s-fancy", "666s-garden", "666s-garden", - "666s-high", - "666s-high", - "666s-icy", - "666s-icy", + "666s-high-plains", + "666s-high-plains", + "666s-icy-snow", + "666s-icy-snow", "666s-jungle", "666s-jungle", "666s-marine", @@ -3640,8 +3640,8 @@ "666s-monsoon", "666s-ocean", "666s-ocean", - "666s-poke", - "666s-poke", + "666s-poke-ball", + "666s-poke-ball", "666s-polar", "666s-polar", "666s-river", @@ -4551,7 +4551,7 @@ "666-fancy_3", "666-garden", "666-high", - "666-icy", + "666-icy-snow", "666-jungle", "666-marine", "666-meadow_2", @@ -4841,10 +4841,10 @@ "666b-high", "666b-high", "666b-high", - "666b-icy", - "666b-icy", - "666b-icy", - "666b-icy", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle_2", "666b-jungle_2", "666b-jungle_3", diff --git a/public/images/pokemon/666-continental.png b/public/images/pokemon/666-continental.png index 1bd15dbb70db5166998f29f3c36a737414ef5959..b45f5c4e76d1dc94eaba1a58d446005feafe4c23 100644 GIT binary patch delta 927 zcmV;Q17Q5L2i6CWBq0HFQb$4nuFf3k0000pP)t-s0000G5D+jhFi=WLRZ~-uH6(vL zj7rY{000qmQchC<|NsC0|NsC0|NsC0|NsC05EVe70009tNkl39nnTDZrddE=0p3_wM14#rmg#OW{8^;Yq z8eP|MAaXj5!kM6HVACuJaa}mhiLNZ_5DkLbDoPN-;fZj5oY**_$U_{VLS7$f6eS{p z_nrtpAR0zAuGaWKmLlOj8$A*Y?-}u-LUis`VnPfQ$Pb1PjL@Y*ppwKO1fPFTZpu?v zkQ_!DBO6d(gBBtPk*sawi4sRbU_wNs3M3ko22~;xb3+NuWi%M(dJGwvg`snL9j4(k zGBJeE1rB-hF_I0h+2lZ=CtL_b$O_YSG!8L*9Y}Aukcv#2VZ@cGkZkmX7SlL5L=M(v zqY9%ZBGMbF(rF;@HH>H=6>5J<*Vc%EPzBe`!U)p87{XN5+yh}<>9ZhOgrhDSm14** zu0e2JR{pTk6O=taPlK`1`Q)l$)>0NUfQeBlu+{|)pfM7n_oD(!jscg1G(a)rIjRDQ z3P?{OcK%VOwFT5b+h7H#t7ajEs8Og>>5`EGG@y>W zVFUvEf@&}@B}y1pAh_4XBDyfF8KGqM_xsI)n-O&wCc+9Ev@tB=8i*0$=SkL;GLbhY zXAt8nNI_`-#dLN-RE;}55yMMNR2WIkXn5T9(nJu?jM>W$a4=_V3(3s0u+ZE4K$I)pkC=9LRqMeunk$6Ga|Aw47^?| z#O3Y`3(?gr#_L7M>ywO<&`pDh&qs|!q)-wuF;X(r7C!VI1_V`xC_K*8NP*CU=45H< zL6R4`8o6YL&r(SS*YnC!Pd@eKrLYj(dEB#oGE|>79~*My)`oK`Gb06(4Ee*MM{apG zw&pCJ1tOD@jC5S)Rn5qB!;qm1%&XJ<(-4K9M4k~r&c-;4@Rg{LttAxM?hrN7Z*C~U zcR~@g3`M>kVx?(RtZz8(2~}IO=KeP&f7ABy_yamdXkl&=KK%dy002ovPDHLkV1gic BnBM>Z delta 893 zcmV-@1A_e42eb!}BoQ!BOjJbx000mW5HK(>P)bUXMI?Xl&4RiB0004WQchCx65*%HCX~IIdFOx5QR- zozrv?<_LeP2>sLsfPDgyO4qgTh}@k<;hvyrU{mcB;=1sj6CGL9TQmr2tti2H?tusw z?um^FMZU#;R>=D!m7+w%8A2c;+z<^T8dqz4AWM-5fsG!CMhJ|AvqCiYDls7j3KVXJ z5RA~FLZFhwAOxMn!Ko`q4kO(o8&DrlEy&G+^xA(m97-GsfdLVbDv)SUH|Ps8F*cOY zzT6Fl`2?OB8HJ%ay>`qukP20$V{61f0Fkea!Z@XUF@&iu za|?fjb*0aOXb}z(H!8)DKU{<0x~%+Rr6;KOJfCjH#`Cng&05NW1~4!x1=hNt0W?NJ z^n6rc$uZ!PkOnA*%%duhsDQK-!t+;2YYV7>w!sQeQ|*NmqV7W7m98^Vz$2zGI1rE5 zH8SE{?gP01(Jz_}7W~M_VHkmcUr-GO{BwU8Rv_r>Vi8>!Rz?uL|M~f0!HtMI3=?66 z4TpG*!)Tt)J;L)z#?^b&=Yc`oUqK3j=wf%gAgacdo(Qns&q-k)~qqD5-?u zj{!hD()dOL{CdmCaU9za*|y^-^9(#6))o6~urWZmGugNR(0kxrfZ}j>1L4u2R%w4D zLK&!zunifRBO)>~47}ef#NqA?3(?Un#`{gk`;&~)p-F>@&qocYW?oGUjMN#b3!l#i zfS}3{h3_*oQXn+ZoD40%OJ3-pnPZz49F0q?fIPC)l6QT1DXbStemIQ`y`B~y8?xp0 zYkq8`K$0O34&8Fg+}O5$_pt(zq$FV@ZI^jeGcsH-Wat3%=rlhXqVP!Mj0kcx#!-Z? zM1^cEp~yBv)JVU$p$Pc&n+=l!F9Z3yi8VVbD=@e+_kWI9*WN9s|F`g$y06zS|HNQR TIqGlt00000NkvXXu0mjf;wP6Z diff --git a/public/images/pokemon/666-fancy.png b/public/images/pokemon/666-fancy.png index ec5e8a5f6e871f80d59fe6dbdc5ac71564367e99..9e40deb3568d4da2579ce7060b37cdf3a041d5dc 100644 GIT binary patch delta 1041 zcmV+s1n&E-2-gUZBn|;{Qb$4nuFf3k0000pktH;L>eA!!R5K6&000qmQchC<|NsC0 z|NsC0|NsC0|NsC05EVe7000BENklFG|NqxsUc3}r?~d7V zb|iiVi0JO)@lOrl&Z+N&bH^(tr+yKqE8u+UC-Hv<_z5A1zl(tPes)W6)Nv1CVutWo zZW<7Of)LaBxQ7ry$km*Z5q=|LY*%x-ZQ-{89JOuRbQ!6WdVe7tr48U%+H_*Ofk;qF z+lCl;G<`6QB%mPM!N4KR3y~7?q>OXIGa4A-TMP(llu1+>LO4$NfN&brkoyPZ`IaD) zxVZQ}PDdU3BGEL$CPwmu@rEiXL5S0-8!D}T7=mnlrRm(O#PumF;&fsB(GY^VlXSL0 zb`lp?=9qow(0%Wbnugt@RV(yICURzi5I*b&gUY-btw^9Fa%Lh6v8VljsNr`>&}|ev zH-zv)q-4Zs?ADyb!kowwD9cBoab~27To|0MPulhvTO!pE-M2(wN?0C|+rfz1$7ip9 z4C?T0K4wOYyBZa#MkR9AWs%u98GJ@2#Cwfaqf0}_D2Oh=%&>(i;ZTh(4MBWwATw5A5Ns8y3Ig0Qaivmo|_B2)r&2`^4FBJEA+D#6#_x~%-e zN>5~+glG#q7%66&muleJ+JYTHQ7+Se#b+b(3GTN*So?+pK<#LhMA)bbEHwvQ3gYT5 z)Zmp-qApCm6%lf!5Rrey+~p`n&>F+J!O=jM>L{cU)eF2m91KHrqq6CsyO%ULkvPn1 zF|@?2mf4`KtRZwJE;<`5#DfvU@Ld`O2@Qd`pc;!jl;KU^VL(tb_`A}TVxAi% z5#Ie1uPPOie9%D=crvi&aj`B|$@GOtfWGYHqtJw;7k^2k4925OD>XKFWXnyB2>du) z8)Y!)6_FQ*Zn;&E2QJ_xVTtJG`cb27mr~vZ`I3evVg$9}kA@EUN?0N?@z=(8qN@=? z#xS@`49Ib(Yr=Oz5u6!{eBH!as427maNHBR*lExG|CIbq?BnqV65UylEUane00000 LNkvXXu0mjfp4smO delta 999 zcmV2of3}$BHF%Q|J4AVeDs-c4!(c%jkufv?pKHse=~sG zES?d9#{|*rlHj-l9uqS}#`4er@0FO&$1{WpM%=yO;hC}D&FQ}T?*@NJ)V}Z2W#mro z{f0=CHGp$z1Hk?O(V!Uj9ns5ZU>u1@MfQ_{Ll`L$Bg&+Vb0Rb91(8b(2wGH@fJg}^ z37-&2gBwc!fV?*i%90e9T*uj{eP1M&hTqkQG#DFH$p}WAP2Esw#ZYALE6wKKB&knb z5oZfSXG00@j@sD<*-3v=TuEY%Lqd+Vy#=@LP8mP<1pGFt zN;p)bOG6Rr4dlk5e9Q(ZQ4-+}=^N6JDIr5bz}(E>7OZMgMG)4N{}#laFoa705oK|j z5n@Dim5_6AT~_%Mr6-b2LdXj|7%?R0s2aGowqQqaluLZ_)d=!|^yffW`-TI+?QE1p z#Hb1^H3wV@;_81T%#f8aqApCm6cc);5<&jO)a9s#w;IE_A<=*VZ4}y=>IK;zPDVy- zqsr3}5K9`8NEl|d7*=Armc=0Q4FSZk*ldUpPKH;5x-<&n8vWPvF zwL~!V?L;IKMx!Dv7pa+_pC1w2WgtY==$>d-gq0+QL!5t(<3d~!sVBP^1L~WTyBI87 zUO^gy=<;xaBKa1wRt%WEpRBT)gE2$S#{134dn<;drq9Ah1|vdjn;FpUEcz(S#EoGHMHdrn+Xlc;GvvL} zm13S7B@rTWQC1b;r7v_)1epx1dEBf^u4Ign0ejf#OJNqGo%|t!1nv?K>M51!mtVKW<{f&MFGr^gR2WBgf8n%g4Vh{3iDG`UmG` VS%OXE0($@e002ovPDHLkV1h^5%{%}A diff --git a/public/images/pokemon/666-river.png b/public/images/pokemon/666-river.png index eeabeecb0699cc4a67635e4e7bbf513f12a919c7..ca93fd612b7645b262d7890d24a6c33bf173d4bf 100644 GIT binary patch delta 935 zcmV;Y16cgH2ki%tBn|;{Qb$4nuFf3k0000vktH;LV@)8^sA5V%ED8R!DF6Tf6LeBe zQvm<}|NsC0|NsC0|NsC0|NsC0K0n+o0009+Nkl&)U?GAqF&S3`2~pt4uo=RW5eEnB*M9gW@86a zIUIL}!f;R}CXBo$L`)MQVO=xC$taaz4N?purjQ}vxfPLh&5-%SgH!_S3@4GTj-lr$KXn4p#$PCv5k{+JKQDoJ5L<$g`qtnF00_ zZ?l)ggAozPi2X_=#2R@bSED4VhD93Es2jU~FfK$yY6c_FK-7&hkr`&$LwvW1~rh&HTGhDn1T2Sdp4%m}e{N{K+3M#{q&4g-hcr#9+3=92`QWEr_Yh(t7-Scia zV{kV>#V`siHrx%6j0}ki3@HaUMC1a9!TZP>q5xmX#74hzS+77!qcq+t?i##QX2F4! z_v`z?D3CWUGT_}~8kERJOMheNUM`J)6k-7cL%Z?$)9GxCh^kL|G%kl2Rrp)ixqcjxz%$7vA897z*!TL*xI63sCDUVnkO6AI zwzx!$eT?oF>AF4{c(aW@aK~#kGUEmTr-mT-)NDX+0nEb}1RAc2SYyPi;)}@fLXCME zbpsQRMnC#djd@;xCxS|!88w8Bh~RDK8Ik!T24&%YXZU`^Gn5#Sz*cXG8zW8z$HE8C zVSvyKW5irer$4V_HKx8fj! zU%7o2H0sXKL^_uUHF89CR z!Xo9v4X5x-2;ypnAdfGxbEqn{zi_k(W^A>m{VyfI8T)$u1M4?lTa*b7QSkr(002ov JPDHLkV1hRhv~mCd delta 881 zcmV-%1CIRd2e=22BmppyGBkgj%Vd850004WQchC#bB_g_4 ztgbL1f2Z4AHSuCZ1PXuRdJ+lAjWUp@Q4>ugM+U-Z8<%@A9z;Z1h9EFNw2eEE+9-P2 z3aJdOq{SAIWI)^{Aqlo*E5nu$FIbn1EDYHW8KK<^BgEP*1p;*#DUQrQD%6$Ut=a|? zG!SawHVcDyL&}C22U<~sN`xgbj3Degy%xShJtg6Ah#08chWvk1&M@xF&M#JKf;YOA z!l06`dED=^UIZ4SzTX zbg7O)3Q^7-{>7*ePm>HMVhn==IeF?khOOn=IH=}aG#f0OV!Va%K)i=@K{XgSzlZV2 z2sfU2L2~nq`DcF^O@x%6pC1-n+2ps)Kf|~YUn*?4Quq2n*&qz@TMCoclgulPM4p^n zZg?f0k06NNnh~81=M+R$+v(AO*7G?j@~MkBuPYJG;i+$FBm19}MW$&^1|ppNw(n@!D2xsQXoezy=LviYP#k}*BFI4aW~_8oJcv*xYAwTP z8-N&%d3CE9-tQm-A!RO%79vJO=(gSy;x9Eg3img|&8xpIH6lT^E+;xh91QgZc^W3j z!@8zin9?<}K-|o;3h^(BO0+6MV$L#*kC5Pl@vDQ$eoMA zy?TZPGGS#R%qS6!qC;39IAumWE(_u%3=QO-;NnZeC=oMaNW+-E5*ad;gd)=jkt6ly zhFidI-`OxK@M$2ghgfm4vI3o!vEMnYZ~L?y{%zqeeLtUHhRa=SIYQ5c00000NkvXX Hu0mjf_TPg0 diff --git a/public/images/pokemon/back/666-fancy.png b/public/images/pokemon/back/666-fancy.png index 35ed4317d8e9b2fae2fdeec76277277598cdf15f..b56daf08a527082a6ac159b88c0e6d9f9f7193a5 100644 GIT binary patch delta 968 zcmV;(12_EQ2a5=hBn|;{Qb$4nuFf3k0000mktH#I>eAyVwV00V7FL_t(og{9XG)0-d+0N{qghDGrI|J&t*KoGR{#@*bt z!qWr-`o3Ph0lfaVf%iWm(~lzYBQpOe8^0j1=*~!Zj;sv&GK9wngiGQn0@(8+l@MZl zgrG5h=OS~8#3MwAbs*`P0dZ{*k`f{*eMNwJEyBQ-w0%L4h;uKXOrmos<@^Pk#lqY?W~gZG_~QcF!ogC#H- z{-K_X8auT_7oSQgtzJh2E40Ph0vU)s^VJtZN-@KA?&`#gq5ICHf<$H{Fmhp(l02uq zhqJK>K}b+zLV&;Zdu`QdVQiZaIn$?$K%fzMVQkb|918?`7(tU>7=1nh_PjEvxBS+B zwlsDzcJAAeYBYk39S6*YOp_87X@OJ&zoaFkCLk20tB2 z83K{}pkXi)sv$RI{Fd=QFGeXN@>g0Xid5v*a5b=PGBssHjG?7Rhf!jtlyLH2{swBpip{wkZ~Lr zZ;n8jQl%P0pE0ys2Mn+31i{f*r#O;J&`S6rf1?063WKn$G3~QnV zBG+6Mel?UwoV-x#Zn!b1kYh)(9Jpx6N9+);Q>iCW)U7K@J#Q%*A%eR}MFVLB6~3O8 zVjOaW-h|PRiIAHIZ4*JR2~#5%1~1!f7!xvfgrk+$9ij6o?fi$dIp9u^~DdekLOpF>-Q&m=SeNP>x!!ZM2^}h%pP{ zjZPc~4?Ye?YAZDx4W56XWaNiNGG-jyG9NJ4T6?|D2&C9!?SV|hQRIk~ky_nwm`bA= zcHOyDh$wC zPJuuRgZ|p8%mz0#DL8YU+$Q z!%B}4455_$YV3O@rY;c|1{u_ghpY|m=^1oJ|C&4SkX;Qyq9VIrVFB@5Gvp#FhN7Q z(UG_?bR-#WRg_4c7zQh~t`w+q*+>-Luo-E}fsZx`Em_ z44qPZBJ_r4M%xTrSwhQ&LK?*K@gCYW*Ew5#F4;6hFVDZ1g3p&zM3yicX=M9D5)RoZ^b(I^qa zLn;kncLxhGtW+!(TKk6~Ppxg*qGUg7x#DGUX!?@n(B z+san&mS947@zyEIVxNL0ynBOQ?{x59_}bpKe31{TEj?4_YcpR4zIF`g! z1XARGVk(!BWQ=o>nqEbO_){W0lXXomA!JNy3aK5(H3X(nKr`9Bzl7wmpxNwPi#@d| z0=_elLwr*ZCXkF>N`etgZwL(nF%sfaa7A=QDuOWzBE2Cz|20I6Ob`MMk=nlF!T&`? zq&GZ!1B;4kbSPbvw)MyRd`$V9mvFB*C1~n#PnJDJR4{qsZiV}lP2-Jyx z^JBv|s6VEb{)E_6Rm%rI(m*a~2qhwe8-v=g%)T|6RpoA@F)|eaI{eIYDiO?>3 zvEtzuJPQQRjCYA}Tq?*fm6R{OrbLr}$az}jrJ)BLvtf*36FK+&oCL!xQA=2ae=g5H z)c4ap2ZDZzB<8dRoh;nf1Lfh%&N$B$(i8H7mJK}&LdgR`=OWJ;1)WKly`zAhCHMQb znW-SAWkEr=1HyTm__)P{QV%(iu5Z)MnifBdB z<06I<$r#F6j3$vSRDui)+Xo|+(=~~NkV}${Ehs_84CxITbSnfIDX~H<4TFRr(;?#N zACDhEnn<{Agiva-ZRw4SmQrdF%2eJIgb;5F3-VeAQqJ%$jhcur1R?xtNT*V}dlF4s}`AX;{Rq4CmfeqeEOr zFybx{wXW3q4=s0%$Vb_PP{V&FiZVH;K!s~x(DRdSWq;Kc_U-l`$;euX1)_nH00000 LNkvXXu0mjfgSd|} delta 838 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 M5SH+d=UpEDAD$SgS^xk5 diff --git a/public/images/pokemon/exp/666-meadow.json b/public/images/pokemon/exp/666-meadow.json index ee4f6d31bc0..77158992e59 100644 --- a/public/images/pokemon/exp/666-meadow.json +++ b/public/images/pokemon/exp/666-meadow.json @@ -1,314 +1,551 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 243, - "h": 243 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 84, - "h": 88 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 41, - "h": 85 - }, - "frame": { - "x": 202, - "y": 0, - "w": 41, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 2, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 278, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 71, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 155, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 140, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 206, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 209, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 257, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 278, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 308, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 2, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 209, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 53, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 278, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 104, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 398, "h": 347 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/666-meadow.png b/public/images/pokemon/exp/666-meadow.png index 3f9f758ad1f4bc4cb5084167f39a2be12a475e4a..6912a8d81740b6ecbb74f1fe451fc11ae3235807 100644 GIT binary patch literal 5634 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 FV1l9R6bt|W diff --git a/public/images/pokemon/exp/666-poke-ball.png b/public/images/pokemon/exp/666-poke-ball.png index e33fe6e8c5a091dad51a0d57d62cbb9bfd7c0dfe..58cae8e2aaac62b691b79d25432136ce2bbd9667 100644 GIT binary patch literal 7178 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

(Ou8 zj|&q(fsabXZ!OluM#C}UayEIofEGqiG`l9~u;w+f&xq;wBjPU}Jq0FexFuUqToLCQ zxK1T`bmoQzph`lpnGt9EFud06Ph{3gQNz)LKl!wW{zddhUu z!}QN_gpP6Jy{WJnZ^?)p0c%lAkonI~?yu^Zx`qTAnr7@dO&d-i7m=e>Sjv=?3i-Lt zj)o4t*^L>=%}-4N=yM8?RX6B8-gID~9L_ z=?d0)2P^dtW@g^yLe2vfdK#SN^SkDL7u9z;Q+xwDiVoB<4vCIuXE6r&V{8RLGh`Jc zhyGP$W14A36IuG7Rf9&*k}!o_(BkXPLIcF}cTf#=9ob^?QxlFE)7?lPmGtS^IYMs< z4cQrwGVQxwE=-IaqPq?%=nMN-=CyvPmydsu^#jJ@+?({r?L`w-sJ1`h8@9;MyKE*v zxq(p_D3mv7!~xX7BG8DfNM_^L98204PtLXLC4s4@#7l`H0NU)IDQVgHosCXMeejnt z&b17!|B4AW0%YBc8?De?IhUTOye*V^g6ELo6-r9+6d0diTF{Xlw*t_%f)VbdLLYK_ z`+vS$kr?oIK~|Q+!|<~74HSXw>Bf?%$?()_W*1;&`|C?Yd{U&4WUH{mmRS@O@fx5T zf|X%`xzIhmIJPcTS<2nyM8~T9USZ_%X^NvxLWDeWW)??--{5lxAGNM{ftzBN?km!E z83;5mn6ZBQp{m}F-AuZO-D#4c2qHsgUT8n%U`H#(ek+otG@)_)60alpk*F_5{OV65 zv$S`! z)93Z~PQ;sn`)^pUeV`HI>q_C^C3M>ZMqg+?rMpRs4i!bca4bzYIAabAedFv1Fb4)4l+5z(AdO#W)*YsLIvL$&yp45i8o zF0Iw#qH(PuCd*QLmk)d-o=f~+hSx@~JL?B^0?RJ=#=2j4cxnMB%Ayk;BY8W*;6yTt zczLNCdrRWE9$VLJ5&}*v{OoeHV`!TDwHwRi4zD2@fRE1V`u~2EziNh!I8L9P&A1MX zg#+=NUj%vK?u-32VKk9?9V*Y$#TWhiF2jD9R0rvcYUD*Es@;g+fuOr(&TNpOBybBQly`mmm?M~0nPn!AczT?T7(hJj7TCSc`a{$}A$+wp!Vg3I_g-jS#X-W_p*|hg8W{MDQK^n@)n~v{L59K$ zhw}q7l;bf&tbZb~mWSa`M2`c;4Z@QVMrVu?f`2;W(=_2+i=#y?ZtOD%oJr%wi$9&I zJc$-hiQYTt-nRbB z&ib!0I_hHob&Z7w+~~io?VPefW3=@N%RUNXN-l_ykbIlDm$aYbY2VQA= zWt8Lo^G)e`8>;L$gLz1Usq$3)c4@r7TY*1MNA9&Xr&YEb%f*F**>p(T+hm$>_KK}F zlYE;Bzu(wgrl{WP|Enq07cRs>=O~>y(~0G%*qSoQt=PKS%ggL?C^GKN(tKHf%mjJJ zPwv)}YV8fJ5kj_np*PHK?57`goL-$Fh(Nh7_*P(Yi&MSe@*L!@`Xlc}bnYXUIFV_W z3*tQO^^ZJMYd^3x8>3ky!fn~O8xou~uOeHVLwHjzF>lp8n<&SGoQ{$NS@SJN5<) z7#D$To(=7v=Io_5epNceO%@PG92mOtN@4{=ieSeQ;m!d0DnUSoB5xkDQlVMhnSZVq zG-7F$;M5%jkZKbXN`)1GzOH=Z_JafsVzZGQA(4~c0@1cK}m z6Ut|w)!Bm3fAwj*fV5+VuHhrhL-;#v7QR!}7`tW%={E&JGKo~RD_yEd>_dVf;^&)= zffitAQaE9dp}dH5hkoS$X3=Hx+e%OE^jOKqB0P?W-*q`<;&| zts!b}#So?F|KrG&8L7aMxQ?{Vydf^ykU=Bpn4&CrD+aH6X^4MWlT z6+cbBBG}YDNi*e3(=f1wJ-6u~F2PSZPOdmZ5;QK0}i#{7T)%N^^{}tzpmU#o+3(s8Zpr?s})RKVU w49K{Ts`mp;+2#?v4SzAfold|2OJ5|%gWZ~{KYJ+Pg&as1W}y91)8WPc0G*f!z5oCK literal 6270 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 literal 2861 zcmb7`dpr~BAICS5HP_i(vK?$@TjVx#zs(Gr6OUzJb21N^ffc z-TqR3xT2DR3Pe#uS-JOs7s1fL-oVJ-!X(qim+%0eiQZyWRb^&iP^G_(3z@8;g+RlUFF2C+M(!co;jfzDMU}pOK|W`N zjm^4x2g7`a1bZ+@m9~y<^_@!QcBV!KCiIwye*OV=u>WW}Gd7m(7rB?sKy`O_lna`m z>Z;~e=Gg|IpT#7=c$x>{c1S*1^MJze!9(;7iISvrg@TG&jDqW_V?~%9Lj%G~RiAru zKkqHV)Fq#0HIJ^H*$R>Bcr^KjAG_MNUGrkVg4g6Hlda>}^=kfB$Od4_x4mz1z5keH z%R?2^k=z>_mP;GcZO=A)x3*PCB(3VI5Dkr}_{%Rs<%_>{YDg2edM>!&W1sp`f2){% zk~w1iwF%#DkC06!woVA@a?PFbv>x;z0dP;WBg^a@p38=J*-3@-Y-*jRA~tGGLSUg0 z*)f!Uh{L0#wb}Z_Tr7Ta_F_|U(iZ#heuMEafm@$U$~$TQML^2%o|$3-KCGeGW$N23 z@Rt-K^fLFNH>LLZR^#*;o=qymKR>vvW_2kgC(5U`f;MUgh*X_ntdZ(pInOU(YpcOote1Q06kbFj;%i!^kpbjl|Ss5xx-qxzjC=brFusVK0~xF)0b zwGQd6qKHs;ybuM?ph|K*^sD4QY7S-#sd(%(4VpVn)2m}ⅇcT;gSQdtM=6TKfje=~8Xj?4z^A#el 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 literal 3067 zcmb7Gc{mhWA0A^HDa$aH;WCEo`;xI{8T&Stj3q{z#&A<)r>;Skp@|_3Etn+R&3+q8 zp(abno<<={WGjjrllXY*e#@WVbDnd4@ALl7?>+DP-yxzLtxg<+9s>XXCv2>dE{8Sk zXoFY}Pj0NM-(gum*}GXB*0nkhs3_R|tnXR0M}f0Je}enyRhQK{cRn!h+MNGZi`&j7 zdaoUIG0+oftm)+B;CjZ@!wW3{5y5(&QB;6lK97zJ^N@f*N?lLaV~lB`PV_4dG7@64 zQbH5nCPMstN@^O1OIuBq`2}|xp{1mvSn8@bYHRc^NlsW866ohO`oiw(nEh#0^;gzb z3)2A(mWcDX3sy)ZE&#*GbFV1BZ>^>M@peGa88oc`-KMAK>3b&3&rU;CuB#Ly0TT}m z4P4H_etYOsTi>LsubW@`;6tRXx~f*78@#Eho~CaEFSSA(=41(XadZWkEWW`30LNa~ zAWhw(eb);ovfm-V7VNQ@>A0Eco;Z@v_k)85T^1A;(wed6@X2tUM0CF4&-}O{i+X`t zs5;PpdXP?L($E8o;|KIM##R2V%YVHcnB^X*qU@~yUE3m0q>MW>##CjeF)rN`4!(P{ zEZElxmur#o=P77K7VbM!Ji=q6Ey%~<(uEwxLQ7Nisb_htD__O^9HDixkG#jRdZBXe zP0yzqO|A)PhbHJ5Rr_@RIoaDE+JYN@zJmDFfa=z`&Cc&ypsW;aKkK|%JICU)r1!CZ zS%|kvC=_>wgO&U;6#|EPv6+^Jc-)@gu??SEuD+_SYF~K`kZ3oy90prrn^!Yv;M%Y6x0Rgg{iJJBTJ14es1omnvgKJ8a&6X zGyeN-k?31mOzI>uY4Lnh$^%^vi=-CX26b9tebGleX&#@>%i9-9=3W>D9whdfe}0&_ zxohQEx|DnlL{=ca=g7ZCN#Iu0kUV_i#d`!3h-q?@QWZq?K8yo1EW_K!30-_tLqzMV<@@5$sj~$;7NJ5#^3uiTj9qoJf+bv zgGX154SfMr^6(8jceVmSioEq{j&pkIb!#H%joWssH%ef2 z70|GJq0v|HWLY4KIeZyg&Y#)UPJ2;wE1JdrrqX7-(3kO`s8F%zv}*p^iXb&FNZ?}q&r>h8P*kHw`rY-p?OJZ<94hE1=|jcy$7$D#ku1UD&Bz38jp=>cnBTLk ziVHq=6_~|0Ocz1wxa_rF(*cH5QCdEjoyWPc2d@p~ma%EH!zJ1_S`WUJon(zQt$#b~ zq#)qzhk|H9*?cqcM#p_60e&};&k#HolxD1Kds|BPDh3#1;zB}##P&bH0jcM*D~mZZ zS5AbOVQb#sXzcOIfQ5=LogEuzP{E!c+2fgRtUH?^QuRxV4v1|s!CRqzy91t`W}a4k zb;LLL;>jy(KuAPH;_fO2GiapWTEMZA)H4;!O8+XWXk@KE+_)0RB&?99X6TPd#b}>tbLdiyK93KJ+@!4E)j{|&Z=xxPA zD27|GkvNg)m=j#Jb{400A33LU`tmj=aOMs1V$G2S*oNNh%8muxKJJes+!tu9<_03) zs7F);S-5oqKb_Y_)r%??#JRe4O0Bnje$TH-N>4Vqj?0ldw!wjv&YJ^BDctC+qC_fJb%`czdFuEUGV_>%uxE`E4IlG< zrbC*&!ij&OU%{Cx*;=1Su(~tLX84l3gt5R&T-;@tvtVn!73};G&nfVy=z%uDT%MWP z8XxXXdYT1W*LbwZqS*ltGhrIUk6U*ucm3@nG5=kOaw9isX!)A}(<<%JOdw0hlyJT9 zdL3u6At19$q0x!u5xWQq_5dwgqgm=$p4gpYj}Zbtv)UV3PSwaAjh4wr#qK%3 zvz6x~fZ8)L-%r3vYjQ!qy^56C0I}GXzuc3he`_CLv&W({L!>f;poL1mh2Nc_M`5-) zf$1Dyucuy%iBZV%kaLTm&wZDi*%W8$XY_U9XxA-25UNT5iB@nrm|7PDY;5f28wLtm zo3nlk-rvvkw9YM`dD14%=o5}s?i?SY7(R>Nm8u2nC?@U=d<2lyNrmZq7hYe4p0frO z^!07xM=L5>)Mja`3BC(79qxUWNKfLvaEx(t+juZg^A&Ft9-%()q0v-0Q^7AI+Hs zzk-O>lx7xIQl5Z`fvU(g9UGZj@biT9%Mnq_7waovPXY8iFqPW=8bZAHW^qDrp8`$;hwg5;Smt&y7&VUAh9d)PbF z>e-1s|D0{+LS}PKoJPFPK|=d6ZFL9%tYO?1q6v80F-cH_;f?X3aGw18WHv|uD{1Q0 zt83hY%a^6a(0tAmEAN)4_H6H_9L<-C#Egl28G9hNJ0u4vLV@9TJS(NjQBm`+s4SJ+ z_H{w1Tkg&JQESmN{9W3 zL~;rZb0TwK{-B7dHQvZwG5^go_sY}D1M%3cPDczl;~`SVtmHFAJXqErY}g^ARQiRz z%rZ*^=^&l=<6J{5t}vQt%7ZFV4pUDu!Iy5Ncx=;vh5RRaN7RS``p$|&gBN&6=AHLf zLc&M&CMhVGQ9%8Sd~ThQL5hl1d6MDBt~Tvru$H+hS7a29{Z1Ixwa|I3eB-gt+7-& zjD0T;Gr3#e?agd*mPa`kAaB) z_Wa|h`^z((H;z%U|I70cS^1CWqaZ84Vjcx~$o%)nuk8P$Gl*$g+miIP)8n}5l=k58 PcMGtwa6~>b^Go~}g$u5n diff --git a/public/images/pokemon/exp/back/666-elegant.json b/public/images/pokemon/exp/back/666-elegant.json index c44ea10f7dd..35c20315153 100644 --- a/public/images/pokemon/exp/back/666-elegant.json +++ b/public/images/pokemon/exp/back/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-elegant.png b/public/images/pokemon/exp/back/666-elegant.png index 3187d681140b974b8a75638c399d68acda24d089..2a75c09b505d982b3547030a4252820f3557f556 100644 GIT binary patch literal 2799 zcmai0dpy(YAD@{qHik-PbN9^=ON>TYE}P3%5-JwabcT_M(vXPFWpk+63e&|cw?xxT z91cT@xl>0jU7QFVen~^_HeMgTT zjfkMXw6|Y*Y1dPE!pr4)+VKay35%_*tyAMGgiXuuqyZ{Xo^FRg>;KaxGjEiFK#E7m zjt+-ouFW0mKk@f1<&5d6p&GyS^>^B`Y6{3)^i<4*C5%`Pj*ADmEo&5>9uL>t-~gZ0?xuu~p>8huEZ& zQC}saOdqX>c|szOk}Av6GOXD>cW+jdzx}umk=MM)qdtM*R^0Ga;bh~SB@mDZ-vO>u z|K1+uHGa~YS^JgD5}XC|yg-HT&$($D#zI?pAnXvVG#z0R<+p>Gr~E7+@A-ohQ(J+9 zKsh-2+I^=Mf3Ne`ONmQ={Oim)zX!O_D;{$c-oh_#>?+Lxb+uN$mOROWYAQ@!@ zaGUM~Tj}H)eE#7kiOZ~#ou1bE+9G!K%wW)MK@2!1&jk3K`?Z};Q){Zd{Zc+{ClvI1 z+T?uf+|p?L)h(NH+M5nxtb1sJ3O-T>f83k&d9~@=_B(eBVfCVf(Vg1)D$O$8KJ{rM zue`>qle|?v>|`?g+~~7_Bj^rk(1Eb>-B$oSdJWUG)k%~u#Q`HW&;7I1>vAvYd=1f9 z_g~ewByp%siA|MCf)+~ifixIf<#fWd`#&F4QuT-zC zAb-{6>Ii7+(?9?Q!Ot|u2vt5yJZr_0zXLpT7?dI=jtwP;6Lnx^w*)bY2a%(C%87}U zRQ5PyEPE(azO1otlG0P)pmwyHhwtH8D+2a-9guEBcWp^GH;!IpI`aDducis9z`a7j z+ej8o3FoMTMc+u4Fg`3BUSQXFAAUouhpb?lN-XGnq$H4EoE4M)SY6k)T4ooU&A5w@ zB>P%aDB%hoF2$(_7m)eG?s^XBZ0;Kiv}Rw6F;3Juzw5*6%<1v!F8eG9gU;t6$SF<* z*To$i9PMctu=eTtp4DKD0O+#7I$cv62mQl>QV_j!nEE-CSH?cJxKak(gG>DQt^^KcvO>fmR(|AS05*{wjlS3KrQq@I8SU>v_?J$L|v(| zcL;VZhrn^1PgF~_gC1r)gyF=)yXc_fzwD{W;-W2juj1LGWU!opXnmj7SfuZG>aka( zaaxJ5#iN{L561>Q^iw$%1GK`^HuZQPNaptF?|1g8akEVC>r2NrV%&o(DzEbB#z zMJBU-(66ugW8rU>?nal0u*2L_{N`7>yY19Y5eY~a>eQFb+{Wny->Y>Gzi%2|OKJPQ zVywACZBc{7+;S#8*@$8?H~d7FG3@iz;(JxH-Nn)6b1&dQn$+K*SZ=&&vIMv|35Sg| zEBtfP5^>@7wj1kt?}Lzxh^}YM@T^Bo_=F4yn0Q~DkcY(IuYoQg`WXivh#S}Q)4g>- zCxNx;C#3S?=kT5|Iwx)};$Bg$LPzQ|E1$DkzCZv}M^9YI`tSx&+128Uxcen9)Hiau zAJyw|wb>fzPrK4OYE|K?W#^sCxl`d{kyGi(@~*kW_5`G)(i ztKYh7=EfkYdR(`UnSnNMz>RYTba@srJ%9wtBvl(FYgZIEeA=S7Psfd_sb4#^lslqi&)RlS@$`k>Wxo>>yQOq_s#dl~ zp_KW@9aN#2YG>+pb|A!^N65`}F81uE{!%~_ib{jofh~?^KBe&NEPF_+<1gkLabm2~ z-L6%t5RWQV$X0c5{jeV#-hv7!vPqG!VUtO5E^n1ZQ-82iY^ zvr~c=V?!)mRWXNToVLSm&Jb)UrLKo#4Jd|G301hq2vWldu?)rCK73l_ilUh}s$+nKYV{Rk`&+iDWQQa@Z2;e7 z5G^Q%xQA7>tiTg-@5I<0$hl5A(u)+f^jM6G$E>w5#5s3}(TOf1_y|v45|uO*)~s^nye*|v>1HUq>e9y2VMc+9 z`lM|+bi>Vv(7Cln6S;tuM5#E6~OaUYE)tTJFb2 zLw;iHc!;I(S??cI8^ZkIuKm}|_}A?#a@8PJ&5E(Oc7plFxxJrJg=ujE2I!ZF?3xa2 zH&v*pkf+-i3Xu#KuPly=v7a9Yi86AXWohS4qzdy9V=pO*u}n{G<56#!>*SwemS+5; zG?ad3(3SGDM5Oc-D>=!r4b)XuVD-)Z@}UD_Y|elbT}l=1-#{M}WjIRpi(4-hy$8wm)STmNvWEq1o41=*p)`=J`wh~D(Sq51KWy!v#jmVTj z2{X2gM3lyUm{XLP(vjX?I_F&1`SN~vKRnO54$qoLj* zQc@DrL=xM`^c@Qm8XW5G?W+Nmb23j|U}~IWZ*(5j8{WjXXj1^t>I#9EB^$o}zeu9$WJ83W|uJe3_w8Tw%%? zjD(%oz_ZQ{E&%M(g8>aJWk;Cj8y+#=*ptqD{RB50$oiQ{uq9 ziiZNl$hh>9#pdy5C&dKhrHr@?{y{f3KKgdXj6=BlnU?pzC+9oOILvdaHsJ-%0@+c; zg{4o@0>cg}^mCg(1#kdgbx3eo>6AQrhdrMfax07JGr-cIM~-9eFq6)=JhfUc2>RK5 z;j`+O8{5D41#rMXSXk$|Dznnd*QbD~ZbFu)uPid+j~c>+lec{?Y*!V-_oS5%D^$Eby=;2=p&0n0fa|wNeP}t5y8^^rACM6Vr9r+6qW=6M zfM58IX;fVsJr2&~bQ&FN+~l-$F(AV4{KCYr&|-6CfLCL8cr`BCP7`O{Zk6{Ny9-1{ z)TgC(5i6UXQdwJ-Q3gUYAzCDe*QjW+qH;5NAhwO}d|UI3Uv+de+o;`e-KRdO91iO(38yr{8 z%@c3Bks_2koN#=H;Kzvl-0U;nwf+p2`dk#R8#7JC2Om=9TfqS&wdCN}QCT%#phr~6 z2vD|>wmF?AIo!Xo`q>tJ;Z)bcm({9lp<{<39e|aoFHvxJs~p}1Cz>X5Ja9y*Ncr2u z*{9`OQC4w= zlQW7!^HOYd3ggE8U_s{(flXZ||9BwobVm;W6jb$Ew8%(k-8vOOR#(Fjm8O=%u^-RH zmB*#SJDF!7AtBG+&KvR#FVA1~hC*EM6leD;EAf4ZW%ik1O!3n;uCnfJ#kNYN(5K}b zK9x2s-Gser)7i%AA8RRf*Z9*^lBz1fJ>WP#V_>(LBs6*mThKTEcuwvcIH_d+*g&(% zpgb!!Hm}T47Ezb$9h90}VNI7oiM@%v+Dje?%BFv|9B) z*F=T{HG6JlecY~HSd4wGB-YRE@KKJe0S>97k%?7S2(fkEA1>_ly9|Oqj&G*1*z5D4 z4LVG%%f!aaUbOp;mxjHezJKwOP}s;;rtQ+uUAp%dSF-#_F=#0U<(qs?V^8L?sJaC=bcRk?Jw7u}qRd`O??# z7!d@C?F-305zOYv^Nve%f=Qq_^*-R@r(}%XH&M&xC77_l!PvN4a)cWQ{?47@2&T zz9z_T(%#1sRJ~zqfXx4-B_1OISqXJ+FhHxB{9dJEL4Kg`_8#1U3(q6T(|(|Si8FF$ znXN*%(AHS(B5h$==;Q(Mb>+48N7!UOKeqz}*T~Ot@d0HG)_n#v`x^1e5Tex|;S<06 zf0BSz=6}t>7n-1`0%e1MTTa&4q3g~m5_#QS?rh&$w{&7knoV~rx%YVQ1b9mEdL>P$ z`>m^XnWXtapI}v<QisX@7J!?|x@qb#-`K&JrAJ;p!h)uYfjKrcRwkyD zi2xx>@r1XqqH1+WuPc$-I3v%RV-6D$P{cey%I-Cm6)^DLiN2SniDll#%$USveElJ_ zP^Y3Nqaq8}HNO`mGpomReVX8GCMN5&8ADvGNJ(RrU;HlPyN60sIFOG>m4`&h<5C6^ znW%kE0%K+Ni|FxGW!6LbjHlB45nBVOYOc}*iN4b%SX-^wP;5Na_|fd?&nn&zlT2uN zz1_HklQ$Jc3+s>C@R6n#IX!N#AQB=%)+c>UG^!Jm{dp1%8kms;5IlNF78Bep$(WX*6h7SyAAzdTY>*k@TMXTTI_udm8nixjUu~N zRSdr+EF=mBh7WaAI%t@_4X7Yj+lm{KOq`*4bMewzBs;{!c-blXm2~;F<7OptvZ#F4 z+S<^)XgR`@gT0C@;TdyT?~@}FfdHm4kVEAOlYf};7~D#v@k>j;=&IoDAe9T;K?mMQ zLFulU`P)|WK~vseW_4=k3Qi>cO`5`1^Q%XHk3f;TU8Z+*)ozzf`)iijXR{-&KG<>o zf5G_m3Z-U;0S}IULn--3JlLg@iTVYwOI3e=m-%lh%J$#Pzk;N;ub?jduOJKm4)X1v o?7z&2H~-q>v$I?at@=|y)*9=6?}?k;&Q}dUuyVlNv+$?>7eeC=00000 diff --git a/public/images/pokemon/exp/back/666-fancy.json b/public/images/pokemon/exp/back/666-fancy.json index 657c29e99ee..54113df4b51 100644 --- a/public/images/pokemon/exp/back/666-fancy.json +++ b/public/images/pokemon/exp/back/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-fancy.png b/public/images/pokemon/exp/back/666-fancy.png index 9f9f9c42e801687f62565a72d132688034ca5b50..f7da62d06377646563c2d28e88e861ab309d3ea7 100644 GIT binary patch literal 2977 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 literal 3284 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 B0zm)( diff --git a/public/images/pokemon/exp/back/666-garden.json b/public/images/pokemon/exp/back/666-garden.json index 763dd125a5c..4fcc5ab0ad1 100644 --- a/public/images/pokemon/exp/back/666-garden.json +++ b/public/images/pokemon/exp/back/666-garden.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-garden.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-garden.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-garden.png b/public/images/pokemon/exp/back/666-garden.png index 47a9a27e7903dacde7c59d3f3080cdd4940d6633..35e0dd02087d8b543e6a8e48a8d65ec1fde65104 100644 GIT binary patch literal 2753 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 wRdocfqh?iYOCT%uR&d{oFs{f~ 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 diff --git a/public/images/pokemon/exp/back/666-icy-snow.json b/public/images/pokemon/exp/back/666-icy-snow.json index 17e6e3be8ef..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/666-icy-snow.json +++ b/public/images/pokemon/exp/back/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-icy-snow.png b/public/images/pokemon/exp/back/666-icy-snow.png index b34659ded515f99013e75a6a45216bfcbabf06f6..332e96a6d6158d0b6ab422f14312387610ec0514 100644 GIT binary patch literal 2769 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 X1i1sT_?<2NU;>B^ZuSptsm%WXhK~*W literal 2613 zcmb7`X*3jU8^>oR%OLy6J~3%Xh8g>oEF&{^#ya+$>LH>mm8D{kWyV%CVj{9Ub|OnL zk3_Zy`+prx5QJvB>T`l7C9kXw)om64)S zX9mXy-cB!yii+SIao@i0sGw9XM@9*Yh!vETYw2n|@9WXm){~Z%8>7-rtDw#Yop-@I zBbC+OycrJ+@^W`}adP*3*4Hl~E|i*b`W}K7}BQ$0RS#5EZWE++H<{dDPk4FcW$oz-pz=}4xLwD zx(|jBV+$mqlR5ZH^r;)472R4RuN^hC%IC2;a1)FBU9=(ggw*)E=oL`kBj@D=)``E+ zM$JclTQ->&ZLL~_&ZKWT5GOd@V>&1f04F-qRj%45!Z*x+57?FoBV%hX`i%&m;R{5y z=j5G#p`!9TeWpgiX-qRA1CsrPX>I5 z3tH~D$@HmBj4Q&=#A??VQ8TrILL{o8;!bfDT0?;{NpJ=##Bv1CxrGr(ymY6eZ3l3Q+Ne*+I2oTpAWbBz-_8Z zA;Py{y0 zUX!!r=LXTfmL{YJgUCByL=3L`lFeKxX1we%BUy_<_zc)H51HnUlDvR!tL!D0GmVABuuoO%{efOnaY9GHK zPSG9$#RD2Q)V*mR#dYlDpg}vJCjQK5phK&d5Ir=drdK{@UFvw|$iU0eEhx9syNQuw zb^|XLPD4UwHBpmznJx3AtlZ^-TkT1?3M9_Ig12V}5;-oVjGS@!N7hxsu$0i(3B2_^ zzYWxw3LP(tbe4|eaB+Li31Q>>L^C3{wg%3%9#8w$8WqfsFb~G0KUT5?lLU@HR7ec{ zDPP1Jjw)#!K7O)*HdN>Ji;(_4ES`y z#A@?Y(&}BZ`y1B2Gg$BYZg`-@qOv^i5sJohtn3;>FT?PCCWMVK=M@u4&O^$nJVNJl zmDJv(&L8zKcR;l?;|Mxx%sB zF$(F;|C-bzaikLSQ3_D1wT(QD3|Bno^jNiid@{_<*a$_x8VOCRjT95%@iut@82C;WI$KufmPuSgyxJN;@ z_p_}7Dr8TgFW$zG(B%rZzb=f@3Zl}y6lK-V*SuSOaRxRM-Ucu&`}JzF8sZ{>WrUOG zLZ8mTFO)i)0!Q83%WMVr5j#rRc97uIMlLr4EB*xG29N>>H)3$)s4b@BIc-^cR>qz! zLnA-w;6sQ&co@UqxuL?0(o&)OF|7$=`if+hjjA1yXOe4vqA-Lh#4A}`7|VAUDMSzlsxbP_Uc*_>n=XV{#2lVPHq zlfJ?nnxBmaMW;mb=xlBkl2LVBcwq*o zAr#N^Jb~`|JAa^K!ti7mskdjo+sR9n32?ZY@++J0LYKZWakU>ncb%0D5|4XWo{5M$ z__Vv_^{wvN;OMg5*?DpF2|JiD!O#z^7b^fr?)qM!%_P9Z_q8@IZ07#uWTYBNC*HgT zbmdtm(wu)%HNoRoO(%8FqjMnf@3;Ck9-A+gNAL256F4G1J+df4nVCSA+B#?Df~gF0 zozmr{p7gN=YdW#s3H@ng0%Wc?Rxg)Q%9)Ic2NH(G=LM{~6DJetcHvGbC);ZVLNB#{ zgKJl1-A*U0O)x(U>*-q{J66&eL_KQA$;Y7Dr&uYi@x7!-6AHWa%0n)9>5zTFrLEx@ zAqR@ttBvnX7o*v?`;J!b$k82>q0^FYFuGYUteD3Op*@yLcAx7zqmC?TK(`3;SNS_k zCdE>XLg(j8IO-V}RKbhaq%@Qi)ZgF0#Ofc47)U`?&je;a!z{Rf*o%g6u# diff --git a/public/images/pokemon/exp/back/666-jungle.json b/public/images/pokemon/exp/back/666-jungle.json index b2ffdb768e6..51876d649da 100644 --- a/public/images/pokemon/exp/back/666-jungle.json +++ b/public/images/pokemon/exp/back/666-jungle.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-jungle.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-jungle.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-jungle.png b/public/images/pokemon/exp/back/666-jungle.png index 8e72fdd3af620769005e926961c628184cccdd81..291c6bce18cd69f25877fdbe7b4da7ab14c50165 100644 GIT binary patch literal 2764 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 Ao&W#< literal 2873 zcmaKudpy(a8^?z{p=9PzHqV?kCWpnySz2sHIgA{$a+vceq>)pxSjl0S$0I3+DaR-! z=OQdqNit;>8fi(+I>^s>`u(22et&$w_v^l{>wSH$&;9-5dsFOeu%aSh5dZ)ninBDw zZ>|*HBP6i-Mti23#n(Qhc!31>g=(#J?3!S z!RZ7+O=JHFXBTf@Vq(-8sJtv|opdB40VX5p|4AT@yI@W#z~Fo*L^L zeVzYtNFN22lClo!QbTG*MxC*H`344sxcd2Kf1SH^vlJ`?^7T8}*x1li;5^Kl3^?T$ z=oe^is(nx&ql458a8&FmJ1H#=G{xF!X{xvrLr$L#@M&pNR*;@$EeUQ8%@>8YaR8W2 zv3vmlk%Kt%!;U1v@N2)EG5tM%y#FIP!f9G(&>*b&>qa7r4>p`zEmP||&4Rm~4+ zh5~YZ$Chg`k6E9J?c-_7&?K34BsZCeSA3jlN^cTF9ilMZkg=xJ0|f@d%nFNw5q6gs zuCPB?F+1a+HY1K+H1hLB&0aLLxp&62VQdhi+2)In%J0Wpz4K@eD2|VxArKGwCIr

9Xu ztX4zsp6$XM@jN>J3i$xnM$$51i@!ZCKt%as?y!M7=JMEL{hzAOJxH~=^@CIAT)QJP z_Hdku_HFe9PrVqwV(&omqLsZbDZ)>%Bwn8OqNe72{Mu6gvzBokKEgD8_~@%BTI`xk zhccm;I5lrmI+3|jx%=X3al$&W9U>W7z`e1gJ>6Y_47xlL?loC7us0p%46?3w=GZ{q zcK98d!-QNInc~nmjfPdPQ13Nbk5HJSC2~8#P45`WH+%cr=_PtP0&fb55tSxz3Dp?FxqX6kjtkovakH& zPo?9J%+*UZiIzhqts{bT{$_(@DR;B9$oVK7LnRBdAEyjann`P_C*>AmD{n>I^EW6u z!gus!s!xdniD!ADhE8U>q}J;W37^zijUZJ*nh}Tk79s(Qrlr~c*dHB zdud51Wfgk)hD4)^gma>m?}~(`J`xXoIm}N9?#aC$Rxel|8ZR1wL>=Cr?`~&;;=9UWKimPH3fZk3o+q&?k$c$54L+1|1eFn(E6iVWiH6n>}<_ z_rIP@FF~GtT?IQU8U{+)r;WuC;c1;+okl;UhN$h6`X%L5#H9osI(z|RVYkp%ZO?ejn*kIeiE$UwKD$BQ7#sk1sIo< z-YJI_QpJHhO82~J*X09?A+Y-Lh0m>FcqjMj#mx9XtYXTV;*PtR7b5n_z%n>vZW{G{ zr|_AGoKphnU)un7U+LV5eFK+aEwkgd*_>|)9f>-?N;d}~enlF;wJ6+FDNcnWpAGuK zs<1+f-h~CsG%c)Wd?Hf$;VvzembNp$Vuyi8v_J|%B^MjsO(U>4Q>tt+_s@i511yAZCZ5c&&B{)6+Wb*vrDm^9~W*S*V#EF`KG$04?V_J z^+)76q6%CBNf-v|W%3*;)@plnfHLYggj~J#U^2h9M4%Kob^qWI+oaLDJ+< z^Zk?&yE5pLZmO9uZgwpOfLF}q$p+v0k`-bb!y|xXL4!0M5868p8~0>BlSgcj+1%iML%V z>7>x_D+A{L$PiG6D(*V%5U%d(sTm^Z`=}BG7ViHD{ZxoQ4#v9))u`lutkNj9=*cLh zXOrR5EN6w0w_Kh6;n8EPkcw$jw{b`X&bDMOh3+FLmyEs*b6RZP8SJf(u;Yhe z*LwQvy|}aYZj|=Ud*xOlmGQs_MImT5USHcidl&>}I0Wtl5UBye zE2OdjT}#3<*yp3vAx2WMy<(^3Q>Ha2UJen^+_48Z-&+xeD}iT~*{Wz5bSTGYXP(1= z_}w6|6}U4Zl0F_WV=ig?7KALl()QNMSX(r&nUUf*Y4qC+-uh)2V-7 zwRVCpXaDsF@R{T~;)@tJf}^6Ul(gQha2-3z?(!WDy4IdCAd`>Ezbd%9!o3@{Xr}j( z5Q8t-d1qe>q)ksYG$dR*+UMxnt3R^JxN6 z=N#xQ0U8o;8c4101b_0Y346^I#5_IMTV%7nqygyO20;^FC!MErh&Vvvr3R)vjPFhX)j$)RUYAeH9REeTIp^0W zof2_ix=8MdkM6nm>l&XqeqDyLx$SbJ-g{w3KjvNWjLu6uE55$b^h<%Xku`YIB)T}u zp2X}wPEaWQ`d5C-&m)*|t-6?R^PG7gXa7Hn+hA4e7Kq&jZ7A42g#PAF zl$4Tw!J82J|F?`Ph0+0aA4%E82UyR7ys%^T1E;dL>ZnxeVG?=_K_Ps~EPlc>} uzFkk^)$`OY$BtaknF1Y&>U*zU>5`eR?F|S3Ry6_*0Y(H-R diff --git a/public/images/pokemon/exp/back/666-marine.json b/public/images/pokemon/exp/back/666-marine.json index 6f4be700dfc..18edbc78ec0 100644 --- a/public/images/pokemon/exp/back/666-marine.json +++ b/public/images/pokemon/exp/back/666-marine.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-marine.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-marine.png", + "format": "RGBA8888", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-marine.png b/public/images/pokemon/exp/back/666-marine.png index 91c5b1be983735aa5b94badbf059664d8f02412b..9e644f0cdaa5f2de94c0965eac2e1cffe27f4820 100644 GIT binary patch literal 7088 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 aY(m;j5&W_bq<|whkcO&`N|mxz$o~LS0J8!B literal 2654 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 A1ONa4 diff --git a/public/images/pokemon/exp/back/666-meadow.json b/public/images/pokemon/exp/back/666-meadow.json index 737ccd7c848..0f24040bd0d 100644 --- a/public/images/pokemon/exp/back/666-meadow.json +++ b/public/images/pokemon/exp/back/666-meadow.json @@ -1,524 +1,118 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-meadow.png b/public/images/pokemon/exp/back/666-meadow.png index d7d63b3098f745a00c2133cdd2a082078fc146e8..fabeb9730db35220698c0e8e8028a9491d9da21e 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/666-modern.json b/public/images/pokemon/exp/back/666-modern.json index a57b695d10b..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/666-modern.json +++ b/public/images/pokemon/exp/back/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-modern.png b/public/images/pokemon/exp/back/666-modern.png index 689876c3d6d7ded05a01b8a56a741fbe5a25e725..01a3981dd9740fe7cf20654e8e49a1db20e4ee25 100644 GIT binary patch literal 2755 zcmY*bdpy(YA73srY%Y__HpI-WR%S+#Bomv4C9=wKR*YQcQo1R{M1?V-Tz{=a1*}`MjUc<$1k6@6Ypku2DT)VM<6P5C{Y# zlbpRkpbcQDo(7SX?sscG%SpwClU}Y)po$LNX{oW5O7Y$+m1=5gI2kMCavx$Ub@xvzAy-!S}LcIE&xuCGfuhx<<~FEi4Q1K@49(> zd&#|-gSoFpRS6{JwIp%B2pNr;|FY~O8JdY_lwx1z=vRqK^?!rVw?pOa6>L_cCJ=4iF&lTE5 zhkgxGOwW1jo@^|UE4(5FK2gIcy&8keFaDE>ykTz_xGyUE@Wa@d zL`~le=02@AX&8Pp3_f8(WaUBSbS9Z+b!g{yts3u0*KojSm^F5i+Z3xf20SG);l*$$ zeA6dY+53a@f)<|<@M2jE=<@T#!d3iV0PXUl{`p)q7% zlQg#kTSM+}frks^Howwsut|KcIhcGUZWQ+=Wjvf3{h$?bm5Z^#VR&eG*^6ZMV}LL= zQ{am~RhJ(6cd&uycz79CCnei3f(rt6k0#&VXk3wYJ&XyiC+ES;?Zct5!3Ix{I+UaJ zB@v3@#SGsGD&{uq554;dM=o4+vYFakB|EII@TXiwUabR8pX_pU5J>P%+evLrj(e@W zmV0o$CUJ&GYHx0qu_ z@Pc=L`^ADs$TITiu6Ly>p}LX8ipr}Ik6v6yd@|m%QN6MbHY%^YV6%gMD}8YdZNN0u z`(43^Y-T^215xZMEV&kTrIEy5|Mm?$OqqZ-8$Q1oa~v`-<{v^V`a`^VTy_tqf3OMK zY+!EJ2J#jdP8TVzIHp*ndijrxUw2Z-Tq0otU7x(GjAX;Q^q8;<7B1)HEvWpMM{-7) z;z^%3T?({y%1CPD*p}2Wh)Q%?2IelG$f5cs5rtcTl5M@(fO?=Z#{zJ~o2Tz@@dlNjZtg`+MKoUbis8sVP!(6ZZ(y&VXZb=SgjU5vey$ z@2^bodNs#AXRAV>%k?zpKxO;EQnfw49c&lPIc*_;SHr(Ksg%!U?_+6KqZcN^t4c?J#n2@&T zkZN(#2c-{pYDe~uEwYTucNcu=@T5bz!=xUq%BeRS0;}G64KHS2)aq>Hr%Ru(LXr;F zFR>U_cQ%3%?r>CXXo#2B zBDoE(4W2l_!-!65t~iUYn$xk}bw`c}s=sLsNQ9|F5=&ic?urFR7rS5#_e?lE-Qbb+ z_-N&9r&f+b`uonbeU6m^#0|C~OugnVmo+<$Mc-GIz za(!Xh5)OfOgV&f&g041XqpI`g;Bwg8g>~<|IM4*?Lw82za(Zk~R3LHhaOjoX>+4s$ zhUTl-%@qM`jCjllGgm&p9K}uQXmo{Dty=Z#6GZhM;IR1~v=fs4Q7+p|%RF7zp5xBtz5+3ufXtlH#GW)_yWEbI7ZFOkuX^LWeXNGb_$@{o9icRFbld)9O0oLgPyr0p$jTmxJ;5o10rF^C^K81q zbIwrfIp_lPg&VS0eFtJaFWhH{w7C3)ay7}C-cb? zRn6{1ghF`0>`kx~yXd>kvEW343NN9yy&i%6d#DJ)yPJ4l*&Ep&9Bz=vh~l+A1Mp-X zB$&A2<8u@P$*zNi3)1}C%?ZNu0KPk!{V+jB9#x$&NZ&N`gpLR!9ubHMO{cap#~d9K z9Ri46A*psKB#V&;J13xMki_6MMnVeg1b}}KLO5YFwR%=S2}82;VCOUF{C)!R5K4Tb zd^ZByljC9(NwmcP-_e|m0nScC?H@dNEBqt)lIE^U=pPLggJ&`(CKDNlrOaS1Ul34E zBH6#G-iD0>cy|LbYG4Y|P3N0%%2X*kv9|zxdkEo}%{&>+0`Rj^)nR^C&?+ygD(xn% zHk`$YeyFX>U0Y~xU65>!dK`-pai<$%n@M^7%s~JDG|c%)!|%07i%Pr@PigP{e*O$G8p1yEVmW>Upw0KZ!H z<@1nKG)XbOi|pv~VQKn47NZ0O;A6eC+=g1>EBo3+d1t5Qraq57NLIWlE=GlPYh;y?Et;%A$h&;=Cv6K(U+jKM5l5^>D6m HqO<-7t*ZF* literal 3013 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 diff --git a/public/images/pokemon/exp/back/666-monsoon.json b/public/images/pokemon/exp/back/666-monsoon.json index 3afda85f798..117fad03b83 100644 --- a/public/images/pokemon/exp/back/666-monsoon.json +++ b/public/images/pokemon/exp/back/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-monsoon.png b/public/images/pokemon/exp/back/666-monsoon.png index e3cb4d2dca70ee4a40833a7cfb76116441d9417e..32cf2331411f50af3e4925a3f44a94820f3571ba 100644 GIT binary patch literal 2768 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 literal 3169 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 diff --git a/public/images/pokemon/exp/back/666-ocean.json b/public/images/pokemon/exp/back/666-ocean.json index f0785703906..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/666-ocean.json +++ b/public/images/pokemon/exp/back/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-ocean.png b/public/images/pokemon/exp/back/666-ocean.png index f60844a9b87d3834c5f16440f36338fa1065d7de..65665ea56c359a73ee8e5a910f0205d1d3299fd5 100644 GIT binary patch literal 2894 zcmZWrdpwiv8y{l~W2PK7IkixhIrA1d&1~gNMTre#PQ^>iA=##(Qfo9;5)tB+C7lpv zilQ8Q9a1?}cuR<~xsmiUEsAjEAEg=CPznM`)e>>GUbOtL zzHb>5<+2y^=J!SFeBZoTFBvV5Cz-2>zaIMA-ap{z_8bv~_&T-AH&=H*0c~6+)Txks z8Z);a+b<3E4S>JCH~hg%>Gy`+@aOmk_uP_T%_oy3mQ$*+Pw(pQJ0J~htSu0tVQUL@ zen-+D1b^CwZjZ7fkrCJX8Y^UfI3ZN_b$G*pt6{D`t)^%mgX46zowZAhWV_WnwRn+L07(O#eKJSj>GBz%*|21_6O$Rk1 zoF$0OZ%;WRERawNmX9U&*B81O zv8D*PRCI&Hw6=YynHw@Qwr`ea*6660RCs7SlFA8^p=15T2K&}S-ce9eOJ8*xC#5{( z@Y$0xvB3=#QM6Lr!x-b|d1tVbR>RhBV#ntZb0UYvJ+G)rj_}f4All#aUL<0? z-uc>xbAnH@osJxN_=tMZRn2i#-NCt9O4IzpQx(MYea#MkuG4 z9`dE-o^w%3G{{dg?B1>BJP6w58_bOPr`)wZN%-t5sk7w1nv;EtF5*27HT5pU1pCF2 zv3yOCyZ8M5)4g#s?noWg9w!Hmp_nC4a*?|WB)>#cW!b+^oeP$mZ#ugP>3t~OiO3mf zkoeA4l~laUN`1#o4Ii?hj!?Ce;aw%it(1v>YRp9`M0!6?kozRGOz<^I5J0RiV3f}q1Yc;*sPIdRD)>Gxr@Z-{TXNYdk2%>ah^QsmSL(%JpVA$dln!gU zh#j%C*c0xGL;P_NH6}+MatgR?IO0I7KkrPMxzv35Wh`{AArMFg-DV6rxNy(z@%2RC zV0*hpIp>Up(KeM=do06TjnDBs*`TuaImj)#Y;L_<#eHpyG8n1~?HfzdLRfg(P-FQ zajw=M`}tDmzMyHBYjIZhsd~$%9bDFt3xP<4q!={I{J6wv8?r7OJ^&lxL`A1(jGwX; z85o#x90}1B2_SW}?H`;=c@pn+Sc$Q09M*?pSRb)0pXgcr3=7dD;u9@WRun92vDH^y z5%s7m!czCC&*<4_%*P*X=3i!9J14fAt(m@akQVgDTH#xZw_am>=CH2XwS@!I0vR+{ z%SfXjfnYrl(Y(IBUO{IXz2SERyK(Gx(kmQVdx*`;7=45CR`|Rhk-XSe3w5ntscP>> z7ibBS5`w{2 zlRA<8(N@9>d}CqR5RoC1=7^f>OB>}Ajw+NnKSmwIR<9?orsrE|Q?ZEF zN>novx?^1#>N5>h9wEPAv6l7TRpgnSY!du&0bCWm<2ZVDs*SLGB3CFMPOe^XXO?dy zejawozm)g ztbnCggG{Yf_77*>@4dk_c9)5aVV)D{UQb!lmJINGba_y&eU5u>6xJ> zd)~-!>1>Sf?(_o^Z%|%+uP3B~Pzd^-X%qnPGG$WE2l4(97`0LJ7O~mgAVYyaVrr*; z4t>u7Wr$tpt0fXIutsLBs|TWcu%|ahY-=Zkkt_82(uoy2oW(CixN zDlf$h|3-C;!aWM#X~#CEcdH5V1WJEp?j4DjwwFmk7N&A~sW~UgB|2KaoV!HgQSIe1 zeWKzHyR+~gSYdn_0+aj{j>*Pg7?fj$q=FoLaRhj6^XEh@0lfBBV3bV5s>R7lRo1Za z#h+VJkQgwT7pU(m&4mh!B)Or?c5xuk8&(|ONwQ}O%ANPo0=S`YFHj!HtQuGqNu}Z1 zWk-L$Qw_O`K^ZQj+RLt{!InrWHAPtO=Yn%2o|$A&cSuCJcn2D_k3ngGwUK!G>}#-P zGX2IIt|`&byHvU)%>Jaqg01N<6PzO2m%MMwJP8)ZCmVQ|ns2@2vksGz*hgKAh{_$E zO56N-639GIZBzBXysdW~(Z5xGQ$BvF4yjJ2U@kS$AdYfRTNBEm2xOQ^Y71|`|G z5Gs3amXz%#O%bUile$!{(S6^~ecwOM`F@_~oM$<|=bv-I!_8S#SV0&70EnVdNY7nf z;4Z;^ySx6@>h>-!dK^CDxJwC;xT%GyUy3h2_c$?&;7#&2wKjGMb(NI``}+Gppi0`h zTKWe1P?>|@76LmHdgZkPDP#fA4*1rYNXBiKc~WLo z{lPz~b4*T$jo5;R7np}U1gq}ldA7}7sxu0L4n^0EDS=dwA#ovd+i>t$M19ukxvZtK z1%<|%cE0gV=F+rv`jbuQAn6|-{a8X z)?1|$79fK}KdN1WN&gAD`DwXcdnYJ>HV~#_F;y{iRns5I8PugxK&T5)s2seVH>R)$ zy4n3hYX5_`GCvrYSAS{hwY}@n?eTlw(cm{>2?aYl=}rHJfQ{+~PSoe2^mm%Uc0BfLe~1TFf1e6`8ED zfsxOv5!l9SETO)7Ot9~n4+!3wfVbt!?s1xYmz}a9_Y4PVld0p36wrJ+?AsNsG=(pS z!;~*$v4bMG=>olbw($c;Wo{IarJpD8To6N-Bbpg1IbjLc`ux0$f7H5mIMX|d%Y4~g z`0{Vi>f=bZKf$Eh9VXEm5b!a3K~vgL;xofk$xuE5Gwxho1jvNI3>31>_(hlqfClJU zEQ%9i5h2`)lnTwOTAoa;@#D*Lm|~`xE0H4dK&9+}`tOWoF(KR&<(ookPO5V|n2G?` zqbnxq{_o|l0EgmbN6bWy23n@~V~tQG@wA&4X)g+FJ>kIc&xeE*+N|-G&NQOe7hZJh zhl{PP;#aB#EzH!Zlu)lCCNii~%nOXP&q!jEN<+25;7ThLbOqt);evUR#DKn!r=A6> z&F4G@2}4K6#}t1Bp`RmY1%_Tuzt+4GmtY`9ML*itfdAlUU87-6Dni5Chl}Sy7jQ^m z?!>u$pV`*vlhI}9J3{c+&u_Hm&-JY(w!KK698pFbd1`W=7^U z;;B61oG;WadKo`fjB7AtdAIF|0u_>9hO^-zMQ;*X)ER%a$2-8uzqQW55@~r}*U zC+L*g9Xu|LZCj8}8dP!)fBuR|jI7u09X-J!rE|dZ>a*{af{oCYhiwh|FJ3AP#5T~+ z^=wqH&{Lky8L}jhXs8`!p?yI=Vj7J8f*RsC=?Y;#{bc#OYDbSs?$B)8}S)OGn{US$4p5&nnlQXME zn}ITgGr}mXGWlp+4;4mG63Y+PrSd_JT=(s)8!6v@qX;cQFfa8kd1^Vp0Tr=3;kmso z57(!T-(oFdR&V%s&K*|F_#n8BDLurzq}Es)_5If?=D7eR|I`P^l~6jR@6Hx#F6!{! zPB$(|Nj*RI#X7s`^XROWS;otfF_1g#Y$Sj6yVY3O~Mc9l7~V2u<|`Uo2rLjcUS*0;CVF+THzW#icbl$9~+ z>k^}~t&7AZ+fBt+8XwT4?aJslv)n4?fZDV)r*vXnRb=bZ|sIkjtwr3wt3w)+GwartZDGts-g_RwC5Q$Nh}JlSL#PE&$^2D7DtdWGroJbador zedN3;aY#NGyLnwg0DlC!Erfno#R{VZU{7&RbOLkW zgU`TvYMt46dni@yvQgL4M%jz@q<-&vUcZwQm}g$PlOIF$RF*cjLoy+jdQX*Ah&wjV zejj&C8bn#jT?QLs@)Bs-%3Smj&gV=V$G>7{aM46ospMRmy8V?4A06Bv+-k{KD~SuR zwhFO8ZX>HtRGu}^+21G51;N1HX~m!c8~1M*{Im?3_MHE*{>Le4VDFTdnLx{wG^8L$ zB9S@taa96dm5`PLk=#&_R3&mUFHL32sZ=`mb~^P6%3Hyfj4NK!$G5bI9Qy9b$@4i1 zN8-SS6x43;EeEG=JM7@Hq(Q^~<@Mdo>p;Li2$j B{9^zB diff --git a/public/images/pokemon/exp/back/666-poke-ball.json b/public/images/pokemon/exp/back/666-poke-ball.json index ed04a06e7ab..45564e59a32 100644 --- a/public/images/pokemon/exp/back/666-poke-ball.json +++ b/public/images/pokemon/exp/back/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-poke-ball.png b/public/images/pokemon/exp/back/666-poke-ball.png index eb3053e94340735bcd1e9ecbfb775b7a9658a52b..895a2bf680f23119a89ac0460bdb939c4798ca33 100644 GIT binary patch literal 2983 zcmZuzc{r47A0FEfO&Gh0EF;@kvP@zy*2XSNhGThCqY*l`%IQpD#?p{5GLk(KCqmhe zFpRB1L>+5{ltiWyvVE`9_s@4--}}e&ywCN!fA{@7?|r}T^-`T3Ps8}7`5_Pp%m!!a z0)cQq!TZ~MT;N#Vu)z&Z91$+3%^^<)k1l}=4QG2dD{vMP64KVzzUU(7Y-{W3=@}YI z%#x95K%u7W?3Qlc9DM9wUY_6C*}1v7SuXLN6KoKSba8Zr?Ela8J|({t0ug}OSem&- z<*s-Oo-BQvVgF|xb+1%E#{)?y~f(>d)J-H`K}ox74P%sk)5Sk`pib&GS;RADIq zQaQs6cyd(?PW121jkwfSp5HX#jw__fe-KM*E6&gGiZAKwBaO&M26?ovVVT0*?0vSTT#>?@Lw?tAgY4*GRll~skWVqIZfQ*rE+l?IHt0*qAdz?fectopn4~wQI#i+d ztl}j(;hnA1narj_lu0Xu+d3$yFr;g|Yx8Hy<|;L)5h+ZL;M{LE^Cu2Ljf$TkeYN;v zBb+sXnJ(x?HJ1IswYk@$A@rr*DRo^khT7RF17BbVennzMO*ohykh%PeTtNkOiJzQh zAkACfyONP~xz>~~Gz_h#1lj*iWb@lh69Bxt4V!yjW-6a99_H2RczY^Nod!sr#9>Yf zAY);Xn@h#Hu~6}o53~k9In5+C3bPx<+K$`s4q43AxZ%wC1se9l3oZt)#U?qbjTd6> zhjLrdI&P3Mn2*#ln7fvt*EsTTWT9t6s5c-OhtkjMd>D97c;dpaIeZ+L-Q#H=x#C%k z%2o;xv^9Qy=TLA|GtX2~LmD?aG6N$G(#Q9hBl7F1{)l?hX#Xo4duql!A8SRjKDdcc ztEY}PHPddHHz`T(bF2i9>7Y09l>;Wm=P5VU20rYJ>nKXv&y71H<&%VtjTIJn0a@tH zPpc-cdV1N9&T&WQ#f6m7m}tD-9#@>DcQQ;Rf;ksuQ!=eXmO@ftwnJEST68og;;xID znCWn$*|8)0G4p(vW0hM)ZHQb0{N_0#j%9il!Ibg^*`tYubuULg8YJbUM){^2$l_Cx zpP`tnRLPHFV@+{#H4IEfe*r@St2*Mc?_5sN>Pcd`Ygn6$a`<}Inybu9E=&S<@U_Ro zK3fA}LnQ;1#C1R){s4e>|E3275j&*Zx}nK$;!HI3B4~AW=FkP_mcD`8fFbqIHaGHV zy>pog`=YB_cIY${N}v}tr8oYl?T-iX!u?8Y6-g)JLe7{7kS`EpVD%Hi9{Lh!#;&M*e~a#!W0ZHFuFamI{4^v z97VT++f|jeQ$p-QLUB)UQ?()vnxe{&!+25$yvf`o{+R@duL={&_00$Onk#H7iZw5x z`th(>4a$O3K0e14+7H$FEG&+FaOaV#RggfX9e>yK8T?&jDe(PJ_v`iQW2Yxn1k=l& zZp=b1S*=X}m2ut&ZuhPecCV0Bv6eFq@ozqrjQ(1CZJS=%_*yFrWW5tJyJ*JIQq#S$ zO8c=~P3Q{q3<%rcPK~x87{k}t_v`(FDO-N^Fi#_K)2J`dneWy0j|Z0BW!t5ZgSe-{ z!!sY{Cqg*|CSFKO9ZSi|-nB?dHS?z`bm$ zbQhEDTlLq4E3k7$pv=p}TQNz*N`9oNBs{vD| zDZa38#E{xUPRq$fL@9tgcMkDAi+!*?g2CjkG1D6-4C` zIdyBhpm$B8s(AeT7RxP@X|#l9Su-4GG^J$MwgUFm`tlI;wxFF)e)?2$RcC9r&cu$m z-|(L1g!sqXM~37n(&YfA+YyFO9};@njc3`=cU*KBKBbJgaXk5)>IxP*Jq2Y%|f zL`MkxLZJLP#9d0x%b5Kna&s*s3mvZrVDuFO+Z?_|k!aj-==Y%*L7yCvmP3O1V_!R6 zclP{z$Ne(5@$yB*#}ql<8|xZ3Vgmg7jIQ1y5!xY_Q}`(Pq*6SXf5V}0uNR5Fm zOD65SAA1}EVWk-;@5aA>JxeC7WDM7HXNj`XAPC`pl?31NXQWkib9(F1c0*)ZK2O!v ztE6Ks; z{ld$NjO`Y?p~OzWU*C0b>|VSAevx;ffBx;Yh@SgW<=5%*&2WU6AZpJ~Uvey#a(PB3 zG=uBW3Ltw=@4mdgI)2ewdLZq-7%D)F%Ejj#xT?b)q8hO?BcBRxxv@yG8Z*pLZN<($?$j(iuEc!d=^lE6W23KXPMGYBny$yG5G zq8i30h!wC*K+0D}>AlsUZ7_~P=pf!h;!7dnE~kb72{ndJJeF3eitqLx0kU;^p*0sq zh}{!%K4~_O!c1BasQK!^YI`1JnYZ)+{s4{svq%x&Juzz%?Mtyd!2xSvwB1MIp|1jn z0`xHP>py%b%ogtNfe11nH8}=8-mxE!WWpsm&rIDwy?O63O$wnAVMr#F$k2dn!&~0H z4~Gxe70IIJ&Gp_2($i7t2Kdq=a|UD7Sd|Yv1o63ocUyEYKh{y_CggXeNgd z=^aRp8H+!_lQAE^p*I;ig9se1V%^d(N%GsezS?4?d#&@Ze-i1s=g$krTkMwEj7 z$0key3!};u0%%e9B%oz8q6C8-__lQmw%zl~;H}vkGQ>QC%`dAmo#X>x!nn3FzVu{D zKpCt+@ZT&fTD(bk$I$U9Oh@-0I*?pvJTvp2ZCgic<4cWF0`9?F$%LO^=T_nKpZIF~ zXz78|B);JG=@!h$`V1)OR4g^$2?hxfs7JYdPXraAo)VBI62AS=j399e{V&JAf%^Zs zJCMLR2>goW$bVy5dvMBXHD1;|$>i9By@k0SrvEYPn7X&T3rJ<4Tw!$8m{~)x)16G{ zKl667MFw@=qyowUUB}js)g2^Lfd0o6AHArcSGIZdEswL^uXv9XSnHMq@UW(Ezv6wl z1bmA;40C2Pjcggz~|r_~}iVAo@6nwgu40W8uwG8CvMrA U78e~1{xd^ttQ;+$m;>bh0Q*UK>Hq)$ literal 3532 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 R9sZutA@#4oU%{Mk{{e7VnnC~o diff --git a/public/images/pokemon/exp/back/666-polar.json b/public/images/pokemon/exp/back/666-polar.json index 4618d891d3f..abb6d0286f4 100644 --- a/public/images/pokemon/exp/back/666-polar.json +++ b/public/images/pokemon/exp/back/666-polar.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-polar.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-polar.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-polar.png b/public/images/pokemon/exp/back/666-polar.png index 5d09b57833ca1bc49ef895cb4e91b68644b17ff6..c7ec3ec550a55bd5253347d342460f573b2f58f4 100644 GIT binary patch literal 2766 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 diff --git a/public/images/pokemon/exp/back/666-river.json b/public/images/pokemon/exp/back/666-river.json index c4e5274ab6d..28912532d76 100644 --- a/public/images/pokemon/exp/back/666-river.json +++ b/public/images/pokemon/exp/back/666-river.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-river.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-river.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-river.png b/public/images/pokemon/exp/back/666-river.png index 2910340b676644fd2c12823a123a41b4c30531ec..4e0493b8de555ff66a6fd3ee2b9be54d72051233 100644 GIT binary patch literal 2805 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 literal 2696 zcmb7`X*d*W8^;HO$ɯ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 Cw%|+v diff --git a/public/images/pokemon/exp/back/666-sandstorm.json b/public/images/pokemon/exp/back/666-sandstorm.json index cc96c2a2805..99df25242ff 100644 --- a/public/images/pokemon/exp/back/666-sandstorm.json +++ b/public/images/pokemon/exp/back/666-sandstorm.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sandstorm.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sandstorm.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sandstorm.png b/public/images/pokemon/exp/back/666-sandstorm.png index 96d7084eb3014feb7b7d6e7b15fb57c77232602a..d95ab4413a553f4e0f9e3eb9b77db5548e8d8b9d 100644 GIT binary patch literal 2821 zcmai0eLNG|8{ceZY4cuU%r>i(VRsl^y=;s&ri3!r)X227`K_xWl`wg!XdzV6yhP<~ zUh{S}c_}TTsU{R7UFzqhkXv5vy7&Hb|M~sSALlvedA{eI=RD8%JfD-~v1d12-B29> z0KjQfiYEX7geb?Cp&(^{@4;8FQUJp|cRK>gx{W536AKTzx3f}eX=&l{_#>Vu4_8-T zU*AB6)2}RdKA&^*Dzzb*(_I|cUwdNqRZeSb>nR@LnsR~W3C}%VfYpDs_sKbh0D$^2 z8ini~k^NuhrBkDKb@ZOen>Tr`tcK~|fEaSLT*&-z*@tJ?V_y67BA}<6YIqOl{m!nL zwZcpUYh8Jqz!(qlL2J9i=!nwg+@Hg0iiL@rAl>F#tCU-5zg#Hjq(!{|&T)K>7$3UO z)^sAf)gHe5`M6E-rTn0A9c=ta9I4fw*b};6zhUFU>I{_j6)% zt6~rWUZPhcyowuMT7C-sLTgH6tF$Cb7Wz>V3T|4d=q>^|Xlq9r@g`lGY8$&YABQ=k zBpY`6KkhBGbS*uAUIW|M#CoR}yne?WuIE>sPJ@Lw%9Bf2Dk(x88;c)X1kj%kiw$o# z$SvDmm#_Mfb+6;f2uT~YG*2r%R@()I@5SI$XVHxSz|)|gVrmJBy^RHZetPBSb*Jrw zzjve;Q5Dd((U0m$Q>&T0&+|pD7$av%k-jJf>NY6LBm4jM?!Zv%s_@k}cQ>8hbed7j zqPmSSR-^p9H|>-ABW=dnNMQ7(JDtlDe|W1cEx61teJic|tk68}s({X^tc1n1^+dy? zoU5=?2ksg4#E0`ef{1Z9owa;|FV>R*`VV#3RrO}&rFF<4EYPY<2++JULd%B7kBk&~ zomG7VU~`>%Ivh`KT-0D8?&NG8tSH9jkeJy1yyh9KcEWs2+4(Dd_SU0MiSqutgGl4= zD95#nsxO~Y^Fo;@bm)3&pa%Z4=q^j-%+~#B-!6@wXNHGz5+$Ydd^m|pcSZVOx||{gy@tl9iP9{$=8F9?Sm5_wonD$iGi91)!FuMXlp=}jHhq+Kbi z-6j)EVB^q^ekFomn4R(7hdgJ!8~OzGSZyFV9}YcX7LM#}Gd*Vqr8rQhLwOd?j})az z7+^?W?X^Oupn{gw=lI%YewP|u)}gG8^w6MqR-->Ygmx9#s?F??cs~}E!i@{?nChvx9Dp28PQF8?^I^^&h5w&@*}<| z*^s+J^yr9xgCe={Mj!NN4m-DpSWzDF0nGgN2knvAlV~K^HRT~9R?yg7t>z}wLU_Y6 zcSj*~+?gCj^$;mb{i`l%y76sJc%wsW)fOgeVqi#FmeNUv_=v9%l=V8? z%$;fSg1`jBi$-bKnX#vbC+xgmnQA`~LEp%uJx&?s5ij}`5TsAb$g|75_3LmpVW+&x zed({eeWeVa`c)*2cb`j)l!Z7810={kC$ax(pNy`e$t)r{pEU+998ecvUDp#9Q z+~6z5XWOTHzv=%Dlt=H@K3cPDQ_T6(P05r9NZa%r{)Wo=cIXZjQ!ny(?6F;XfCDYiPFTHLV#=aZQ7XTU-G ztn+=6;^IZWYp9f)o@}Gn=ruddzP%5V9C#dkH~%cQ%;S69VFR7XAkLU5d9s{>=sN^A zX2i#J--Qi`rp9ENj}P*cbF4khF2hH#cIvQ+%YbgSC(a4elgM#K&(V$F*I$9|`&JG5 zC`@d+7EvRu>T=bu`BAtmtSdg`tvshjIj%lfaj-RK1ef~$Y|bcjNDiiUsb@^=%{TC@ zie+0C^uq4>wh;7RaN_$)Sl6d)ZlIOm{|9^f56n)v+shY6nU(aj{=1KfFK^~cpzSdV zGsI4%VZUi8xAHQoUO%~o&}?dn*rb^eKsu-%z%}d=-iJt`nYhu%)wYa|aBx2RGs{3@ zjFn~9TB!6VL`=`X$&k1-m)4*b0xl7{GC~sg+pD(_Ho#1o&)m<5={Im`5a|rciv0j- znH(&JpB2NVQY_!U7qG6|8*W;gu_ZcIPt9;zW&JmiC!$A{D>KB6R-6{o4aNivxy_9; zT-J-Dv6{CbQZN^Z^8#+u%XA4#Tbr91a3;}z5zFWpApNnIyyqv-&{3xxEM~EjkHqQX zu#zyLwH2sKjFuWqLNjt@-$(WxK|L@(B69G5QY1*Mt?!HfMSS_DhOd}z9OOUzf-_Z( zo+rlt>j+AjiE6^tcnPPglVHe(Hp*mLgZ*_b>elw%cE_wU_ zqC-u3qNo@4C8j1I;>YF%@UU2R1Ig)}89m_~=kJw>La=o12dJfU$Pg#H?P4uYxG7+N zlW{s0@#c(iN5d|Z={Q)*bj>#yi~9~n-T2-rU^mGAC$auASO3F1i@$m2zBXe*1z!BC z_;OOkh7CBGs-aIi>w4EM{MQ_oK^o2ruFP)R=^rElOS8hy2-wdqy<`~>lRNs3{!l6- zs2|Iw7lpJCR6X33nj7o>^0pvYRm!CPoA&;q7~3t3an~OxJzUsEC2QT)GwRb_tP3_N t(aM{6Dg)v2--F{PDiu=lMLJ+xL0iKi;c0R;GgdQv3h_K#*XDx7(j-zYdst z|32tz@3lWlY%Cm%_h(y%@85$32HI+PebpEBp(+@aLx;psGKVcqw5_cz?H%ns9rV4O zP5lGTlDvrYEF(siDFiCqRd!KH1;gs3u1u7=xH*f8OG=19f&*PcLj#W@B~0;nrQ^q> zU{DzZ9CJcJUFC$9j#eM@tdqOv-3;$QFSqH|PYMFF&LKX|KK_2Lo{kNT zExu;c%nU-<(7{CEN$=Md$&bbXQr?-Wcfs3BS9t_IV0 zy&mn|hapb&lp=C=?x)WmTs1%R(Powl;Wn+Ka+9U5vL~uwK^t`q?!UGZ`3&85w8<4} zg_6xdHGS23<_`r^7vBo5`qF3O_2|7=&0IG%V#e;fJK1BCp~jD0zY#+=r!9_!yN#Bg z)vXoYS!m5g@8thzFt2JMPY5R|5nc)J1ZcO8bZxo6{=s0Sthba6qb`_d6i=Y)y{=s3 zneX+s6eqCza%KcC04F|9U)pRq0`|DC&daZQ|FBbo{>w3EKoLF>ZiTu48T%{3MO3|> z5tM=MnWn5(n?kk<5eHV5L(;`wyblafJf`4<3cRj1BP^uBm!EF3+V_)HB0ORaHTV1Q zCVy>RZKSdAY!EaHopdG~Z(|%y^DNF~GF*erRl~f>qqq#8o{EiC@T2?PlXABEVgj}d zle!)0Xi1fO9#9Y}7*LOT-bMTzV`|LH|ExEk8-OCDpqO>FH*n|EW%o1}s%mScv{wYo z#%xq_&H*AZ)S$@E=dsV5g6TSSjYZ1%B9U~27`Ap@-22A|J+7%qmz-V7_$G-p*k!He zCeU1aQ97m?YqqH*a$#F;mR%WLnDtv2sk#>8VGw_(2B?8xI78C?RI^%?Xs+JU--g66OwpvS;}%r(@{}-7Q^5$2O4v*tJNuM z9ZQ1P+vvoDaFGk>N-e|+ca%MJhnGFuP>(*R^i9A(6L;Xyc}SvWEnKWkR~mfm?!miL zytpn{M$XNS?g(N0&d3n__V3 znneaBLrT8+otAQ@xU6FvRh**IJGT*bd2Fjhd2lOWteYp8(476fM@D+fyK+4INpwRv zP()T%mTP#0Wc=ypr`{c`u+$v3#+BTBR&^%*`#1rTusf2WAtS^FB#oVjeqCCE`-&iz zy9x|E9OXIXp?L}+UdGcS4ibvWZ~B6kpp@oGG7-&5aKU~#;s`nqe~9vfm-{$$P7&7} zSwok;)rfE>nZ5t^#JmD4<2t8t*pYUmLcNODNU41Nr=E_z-BhQb0G~sudCPcMVPNXa zNyu!|gC5J;Q|fO}#c4-(q*Im!>Hz*FU%WnVotzp4J-1c-R>S=^Z>G>_p@NO3&g}rP zLa~Ox51rLlQ$}y#s2>97l*$x0kW*^|*x5=qNyy|(p&a;*_;9H1$E7PxAte4G?~rg~ z3!G#G?{I_wm!|paAsKF$^w}#pOQa5uM(v)?M$d;57dm7T;P-EGed>Lw zT$|pjzFV3kJSWA}eW*?CinWfhe|b_Fb8F}Q)+no;M+BM8gJB)B_UMNEm^~nMkb1BZ z^uC#P{&u72l$XfUo$_p-@XC|@N7yG232UMi!HA4*q)lDE8(Uw#Vlb^eX6Pe*#Pzkl zg$N7&>hLF(rVRV$cPH&qZZ4QK&ZkrQ_p}1JqNfYH`$JscWMu&1aP2`JxPaHo)}Q0S z-DNEmuRHdH?)lt328LHa=*G5xNIdHN(_f}*KJG*UvE`0fijg&83)xj0ym&1^&a(pE z49_1{TxBbR23C{<79M;~|6^BTsEA6;3I$d`)B8G%NguL718QsKS04?*ByBwDASty^ zcoD7=7e^(~%TkxLp2+b&!_%l?Nr~fyTEY=uou2X1!H4agtA&n+k@G3+xT+${k?5_^ zncZ-061m;XPE>-dv1+P|^m5eP{quAQE;|MVSYnF)&5u8>jPvqM-mb&qcBc<^m&qD> zT0SFxV~+rtyy1MB$gXZx6teP#j($m_!)tSruiyQ=aD7t(6lf-Zy6o`$X^_@CrxBrG z*?>P9+VL9aZzX^#kG{xO*lV(hoB7aoh`(pmZd-_nukR0QUg}2vGyu9@lEQzPBu8va zw~53rHrU18mUT_Mlo4alZd*#+21_TFNj0-{MCWd%r!fkaE=LOTBDsbQ3usg!EyEjJq0!)1(MoV1Roc!#p1_+DUvT)xI{ezOqjIGqFtI&Q}H9p z<+soj_|s*W*%hwTwd65e-Zop{TnE|rYnVFU^62I4#8WfPxo2`A4uy%CBi{=P*dRvO zxFMv`&}nY?3f|&N<3Xi5<5s0m%fwrCk#abfNqncf z|IBi12vakO%Gmzl6x2MZHdW8^^i|jKwthG ztj}_PcI~nbzaHc3i@jt?k4g1Ms~3~}eYF#}=NXJA6-5Sd4rjUw#{;xB*4&Ouumm(W z_OfG^6wZ{WnLK=K^*u9((U5!EXAZsSJ0iKkuREn?a)kreb6^Dy%=ZhP`43y^U$)F+ ztBWu>VQ+=D%$(GQT%W#vqgMm+K6A*$x$Bq}NJQ9k$!M_dJ-ujYW>0*jJ5#$;onzvKv?`Y9_0%IhJQQmd81kd6*T^U#bWHsD7u~ zb13_kq7h+3zw%CT^4_SLcye0r7rXFJDo6i2^}l5#A}$X~?p!GOrxxXgGED9fr>#Aw zEl0PVdc&fReH-SNN#->8;;oR239{(xcjj;;INd0}Hag3Z5;?H=zl;8k{O!nr_Z|1y fd)~J`eKhdAp2JG*DeK+;TmlHjR`@zYuf+cYFIYhR diff --git a/public/images/pokemon/exp/back/666-savanna.json b/public/images/pokemon/exp/back/666-savanna.json index 8f85dfdeb13..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/666-savanna.json +++ b/public/images/pokemon/exp/back/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-savanna.png b/public/images/pokemon/exp/back/666-savanna.png index 7254d0f1f61843b357b47402cc9fbea74c812d0f..4169b1325a6a3cc410d3cb6a2d3abc119e66b793 100644 GIT binary patch literal 2850 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

RgGf7y($HbNjM7 zY5ya|X|_2wPcBmEp?sJL)oI?6Po6Ir()p2X-p6UZ8k0(BnoGkWC;WFN534@TC3LS4TZVXi_u>F;HH99rHUd z?v}WnY>Pw^AiKEjK1E?mx5N5;FwYygrYiTc!J`9U#(%`c7z9Jz_6=C<=)ccH4Oj#*BlQL+--Mm2e(G|f0%f5mzK71))QnW zAo{VdwchT?f$)?|YK~?^`Q3&d2n?@JDnIeR~AP5W_L`{H|05&xdc z%(^;s7tJFryO-~D-vMK~t5M@#b?6;s$9-VBUM_Utwt$yAw8=IY7)kD>3Y-xPMUNnJ>Mx^=zl8z zP-NL1Qpo;Gp?rv+o^yyV@dsbWj^_YBto$&Hh5rxZ-%Mml<;VA<`L{wIT+O^(P;)dj z%8v-qjK(D&q#LCS7S-RUbk(TQgVE9?>kp5qtCucIPCoZ1zjOVSAN??<(Hb?eRfjV! z`x{#=`*Fy{T;%3qMk@CXCCl>=8K?5+Eb)U-@#Mo9yWIohV|dh`)`^1_nU;3xtmk1P fuWg?tW!G>%Hs}~72jsc`M-RZ8SYhvDys7^OfL-%^ diff --git a/public/images/pokemon/exp/back/666-sun.json b/public/images/pokemon/exp/back/666-sun.json index df795f0ef0c..d41f22f541c 100644 --- a/public/images/pokemon/exp/back/666-sun.json +++ b/public/images/pokemon/exp/back/666-sun.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sun.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sun.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sun.png b/public/images/pokemon/exp/back/666-sun.png index 84b9d76ef88708c273f2b1c838dc2e8487b4abbe..5cc814e82d7e6bfe3f5dfcf57e7fa6ae21d8ad62 100644 GIT binary patch literal 2859 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 O1(2M`j`jA`LvKtL5HI?jy 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 literal 2813 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 diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.json b/public/images/pokemon/exp/back/shiny/666-archipelago.json index 5207ba45af5..817696f70a1 100644 --- a/public/images/pokemon/exp/back/shiny/666-archipelago.json +++ b/public/images/pokemon/exp/back/shiny/666-archipelago.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-archipelago.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d3b3934e858033f670ae2a24ec4d347a:f014942f9212da6fadbc8a0c94f2dc11:80cdb6dd219378a41ccf5c2acc7e7786$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-archipelago.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.png b/public/images/pokemon/exp/back/shiny/666-archipelago.png index cfc3f0012b64540f3020984dd70e449303bde79e..ada5bd02bdbb22fb49ffa566c98ce2df3a2be43d 100644 GIT binary patch literal 2776 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 literal 3018 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 diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.json b/public/images/pokemon/exp/back/shiny/666-elegant.json index e4372fe6e79..35c20315153 100644 --- a/public/images/pokemon/exp/back/shiny/666-elegant.json +++ b/public/images/pokemon/exp/back/shiny/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2f5780697c633c5f2db2d90012b0bfaa:3df5d06e71f1f48664b1d3f70b589ce5:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.png b/public/images/pokemon/exp/back/shiny/666-elegant.png index a63ccd8a4fd657ac946588a31fdd1100311ff7a4..f14933548315719f7b6af7750b3b6678803130b7 100644 GIT binary patch literal 2799 zcmai0dpy(YAD@{qHin|Jx%=iQON>TYE}P3%5-OHk(-}r4N<(tnTsDWAtuWn0hD6iN z<#3p!n7isMmo83JI{cCpUHDC%e|~@cob~HACm(vaZRM8ae8RCFa?@MAc!wL7I~-NHDUlA@ zWYkyb7&AcsZi$e{qhu?x^v&wG&)%95U*2>mfXHiK;87pIa7$kJ+8FZYqD2sp4&MT9 z(*E8R?>BM8pV{!0%o3ac^ZY!cntYEH)bt1AoG<>Mpa*9D2-#1aeOQ}Nd>I!&vs;rcV>oUKsM z?>SR*NwbS%Dd%<86?L`k!`S!J1l4?`0{)Oc>C`$HCw2F@*OM0en7gSBx(mVm zr39_{*sRX^SdI=ANn}PFq_81wgWGY_Wr9U1QIFTLn zoHRkJ2()P|%JgwR& zZRMN76HgZhp~N0&5^%E9xAnI4W)o6y0~`&AnOPM%YgZ};8qmhlMlgY%48 z)#Mo)s>Sf{D>qR^ojz8IcpB7M=Rbrg!BY^|JaS;+&z%Et<}3dE(aJwOj598@Q>>ES z1Xa<;+TwZ-Za1@Z9H_a|)?p2Y(coRl8@61pYxm1dc6j+(dAcgbDd526_6(cfR_ zn6 zU)rp9NejpGEH8hsgu-?A}G`4jFB5r;ui3*JS zJcJtXIp1y%4CS1=H)dDusqf@p%(+pO(k{RC1nec(LBY&e$?9L)&TrW;II+XwTKgsM zUzfl2)z6MYvW>Z3AM(Q-UV>X^P3g)kVs0o2luxQN&ornmZ~3TWyvxvws;6Z>z?yAo zNep0kn+nb*+K+H|vcDLbE~CG+Ek3XQgB8{_Gc50$N9g-!>ZrmMThzH`3(7PBmA`9Z zJ?6M^zI(--YT;Y2a-TKu|AX!M2|FogyLQft*o{3EbQB_muyWR6Of!bf(c9&8C7O1Q z2ceX?``uKbm1a-&CUzLan@1=vb}#qsqyAD#6N*IVJCD=$?Pfg4|1-DJGt8WPo6p`otBvXnRRZ11^Fo)E0B5k8^*Y_V2d!lI8t=bsv z`Y^GlqO19)eD}Vra;lKmI;e@!jy7k71sM6B9j4nd>{SXC!tVu2utOaiH3}m$9=3q5 zGKe-5Gu++U23FYNQ@nNTF!{4N9wyFZhKM~AQ28Yq)d;S3t_0hMF%sYG<^FCO8*KUj|MON6C5xQ+kRU-A{4>SH$<4>{iH9te7LA%O*j+qD@n@SBZBNydzNKpE* z(W77qb|TVt^9lbSRBOWg;cocX&G^?HDE8DP)y_z;xGsYA+PVE7Q-wLn!=~tGh{F1A zY#&vqs#0Rq8U>Nc%9j?#B-l^)!^L^U?uxWi7IK9JNU&$rBv_`e!R9f4g^T2$VwPw8 zqcqfhX3(4Uvqa?d6gwqp&>HGIE3EG7P}QS75^T}194(>>cdw!Miu2s%g_MG)Oxxv8 dH^fw>Da^@6JuJLb7UX|V5ZTSkwT?h#{TE;m2Sfk> literal 2960 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 diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.json b/public/images/pokemon/exp/back/shiny/666-fancy.json index da0238946be..54113df4b51 100644 --- a/public/images/pokemon/exp/back/shiny/666-fancy.json +++ b/public/images/pokemon/exp/back/shiny/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 133, - "h": 133 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 65, - "y": 0, - "w": 41, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 41, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 41, - "y": 67, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6d28d4fec94007c70d1812b69e8c9a4:cff02079419826e1cb2148e331588d89:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.png b/public/images/pokemon/exp/back/shiny/666-fancy.png index c84443bbe4ec54e7ff0f04b6c7b2b7892f183835..6a50c5817a842a41fba63eb330cdfaf1b1d2503b 100644 GIT binary patch literal 2967 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 bbZ@<&FSpxO(`+8*KQe&RGu16VizogM;Tv+= literal 3067 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 htsg8_&O{yo_L-ns&mUxo{`eCEFlha2~l}mCx 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 literal 2688 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 literal 3203 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 diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.json b/public/images/pokemon/exp/back/shiny/666-icy-snow.json index 4922c7c1fb6..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/shiny/666-icy-snow.json +++ b/public/images/pokemon/exp/back/shiny/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a19b20c8ff121729b5b9dfb470e1e166:abf786c03cda88b39336d9172fd788ec:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.png b/public/images/pokemon/exp/back/shiny/666-icy-snow.png index 2ba96cc9ac348994622c1f86249d267298de482c..1fe8305f068cda4f7edc4c8eb461dad5571be44e 100644 GIT binary patch literal 2769 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 X7!GY;F7Xt8FhK-sXR9X`Wcq&q9DWR^ literal 2803 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 Vy^7RH`{k ziAg$;GikJ&6%X!oM-JU`c&5AO^?IIvp6ie6`dy#v^Sxf*>$=|G*Xx(!M70IW!es#f z0N9Rf?E(NuNQuAGKwHFpdHpg_JV=~zv9$s`>{6c=Pj)#`Tn~yz2n1qeWaRIHq|@nL z_kH#p=HM?rHcWr*{&udivZTAad17K>et!PpQ2p;>xBOWb>S4gfe>b;7Bgz1Pte>4V z(e=WO+2g6_?(Txrc(nIk|Gv>28E%Yogi+)oLsxEm_}oQ1;#9MLPf7kneYCz8U;~vM zA_WnVSSM<#GYLwh$?fH9g%Q6dUHZG%QzEEAs@b}F-yBK{BcDVJ&C$sN_CJgu0wH9*~fsCBli%l-{-v z+zY9ZdopqX`Y%5&;CFrA#X3-oswdQ5OK8Koe$5<|`f%{ipc=ygqDBGzPB%{t%@d+4f$^mT$;3i-Jpr6*lkER7 zLVa4fbq;a*b(PIqn(iJTa>xulb71XYg&O*tFYSN@jJ*_^Zcr2LXljkTg=p@z$S@Z8 zT|$!qqOc_Et_`Mq_*!}P*b@2c9H51-wS3A^c5uh4f{7qd8pnj9*;h)Zk;JE~E;@4t zprp&vr>+_ZAQ-_PK;6eOM| z8L@75mpAJakZ65iLE@F7pW;I@CvX&r3Q;9XBFYq^HP{P&XUO@;zevN$mEVo+Ok*{m ztu82;->ftTyuM7_04wW)Onu`B`F>Idv-?b=ZLG@QpaU(5Mu6prBC!AGEjP}l2u_@8 zw-`my-N`NpswrUqMJ1Jb9goncVQwYyUg~*_(8?-!N{>DZQ zl@JEq*6bX6DL(y??BT?HcNR5~>mI|57A-x4t|8bqZ97)MYyk_x4WYdYb1uHFz+)zfNZXdG7J4dHE z84z`6#j*rCyT#TRmQn(d@Z4Wxp+}WWWeq#{ZcQbOk;mZ9v?hks;mqx_-39gJ&^W@z zKo%Xbb7e<)(vxgKa^32-#GL)I_H6&WGfrD{Li9(FCh5>8bd$ilrd!lD99gm zhg%)*%X@iw_1Ua>Q?bLo^#M}fGMy00!bTAMe%4CzZvW@1DfR`Nve5SAhKs@XI~np& zTkkn5FGPGb5#@`RZ)$*TBsA9S3@eVhIu4nujSd2%=tb2&)juwo7C+04lbs1>>jWj; z%vEulKeXc+v21o~TWt}nlUUVP-8!z~&PjOh*7>6lJgqf_6;0mLelaMFxRs&h&PgF7 zEBgw^N4`7^&ru1_nb?D-iLwNE+VRYSert@A`HU8@1DgS`7b5AprvIruy z28O+=7m`>J2i%>Tyqc+D$cI-_NRs@?u`#RIglbd+1&OWgF}J?c9Hmw;L?}xyH;+vr z`)Fd^+0lgLVMyS~a6;I(S-~##*YcBmEVJxg*MSK$nUs>RK-H$}{+4Y)9y`ssV1jek zo2V-z-!e$fe}ytL0?9~Sh%5%<^2Dh}`0ClmmK75RErV_xGbYv-4o%)3Ki6}Nc06{s zO1)!FRLt`)gM(Y2n8%useYA}~jYRH@-8yTmQontXZVoj(JAgrFYcY&KTbJ;;FSIM( ztxHJCqYlyPefxH5Z6c(Cj<`l5@0i-cWh@M`oY=iyX(o{wya1 zkZ6Xes{&hlKxW^~eEoBA+a!{nt`I8+@;t_J(mbAA1C4p`ePG7mxL!0_(vsL`0re#j z#%z&G^RU23=a~As!@-Nn+cDJ9v_~z@+VmK~fB+gexgY$^)4_Zl@7CQiQov1}J+9qr8GbPhs2*2O zJm3J5a;I;JA)PfN1@|m(kmf|vEzp$ka!BcFQrnMHE*I9cRLV!L^J5#DWZcclOSKBA zD{&A(*|UQJ_o$OsTX5)_A}A})^v%nCFYD@LC?wI%yNHgVF-hUl>i{#3{iQ&13taJr zvuZ?f$i$g?(1V2u;3O(`Vdt=5qB<#0%6PBcrKEi7XV`$3&Aie|^WsLiGaq{81k{&%U)&7M_tZ)qd*=- z>eF2eW;1M%0c-JtRh6u`<+a|_R}ve1ikN*2t~$sY@2vZegNvq@9H8lDB$`mv5&|V; zl0oaQV>M2rz^;{iBlezsvwZC7s!s1xbbJ~6M(+CvA4oIUX3rvj{f%Y30S?#^-)m&Y zqey%z{vCNv?GhhbOn~;?K|W)N~TPYF^lx5$8vfOqh*!}8)BcK98CRowek0BL|ocl2Pg9OIZAOx8f6Bq(QJ zAMToMFer{W5M*HQ#Y?Lnk790-FhOLmX88w$ILtI~6d&6mdbjvSN`YfO<&4N?z(Ps3 zytG=BeEzg#<$HE>w({^-YaS&O4!#Y(XNAxJFpW$Oa1maj0@pzWP)=iD~p4W~yhhqB04-oYH+plG`{|jwC)&ogJ zh+f6}i|HU#Sg^7bE(1HxmWo3%bpr~(W?nyOxvr3K&S>M4Z2q)k(f9(YW;}(#UB|&S zG;OwajFOAIu|5=D=K~yES8vK`bcHAVbB9g-{)6Sse@I*T1>kuxfMB`&X=;&ox%ba> zFvgglluj^UD!%;fnEtJz`#!wRDok6V_*Px3D8{rB0B2Y7Bk=>yc>LJ7EWX*)K?auv zPmhd#lD|nTgF9ivOS_gEJ2|V*cJKSYs2f0h!QukQ5y!=Gm|r%lrGUXbwplGZX_H4c r>q91gTzs literal 2808 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 diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.json b/public/images/pokemon/exp/back/shiny/666-meadow.json index 54e872aee05..2c4a73b80cf 100644 --- a/public/images/pokemon/exp/back/shiny/666-meadow.json +++ b/public/images/pokemon/exp/back/shiny/666-meadow.json @@ -1,524 +1,119 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:217e1d90eca71c8b95407de1c156a5e6:e2b23be3d14960d78059a46f5b83304a:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.png b/public/images/pokemon/exp/back/shiny/666-meadow.png index 2e8a64be5d458e872f3b0ee23596ae7bf4d31b2b..1148fa5a620b3cac609015bea44c2c5a0a5f2a34 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/shiny/666-modern.json b/public/images/pokemon/exp/back/shiny/666-modern.json index c60078bd8ce..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/shiny/666-modern.json +++ b/public/images/pokemon/exp/back/shiny/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 132, - "h": 132 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:854759536c0175b34e9ed7b2513e55dd:9fbbae33832e3b62152c5bae85714a7a:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-modern.png b/public/images/pokemon/exp/back/shiny/666-modern.png index f9654fbeb0237647d00251316ff580a71490c749..d9f109c8ef942541584424629da41a6ce5cd8659 100644 GIT binary patch literal 2755 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 IPBiBK0G0>*K>z>% literal 2794 zcmb7GX*3iJ7gj>{8QEe?GxlXL6UB_Oj-AOEVzQKd7*S0mypnY=GBIRVW69QJj3vFi zvXnJa5@k!akg`*j&v$yy`QAU@`Of#_-sjwVp8MQ;&$&Ntf(^!$pGSg+jg5`p+zf4d zh%x`RTZ~xfe-~6V1WVH45%*>2FvC+fZOUt_gXOF9`tsb|salGU(Yl2zF zShut_k6W6_3X52HGfl6R>jnQgJ?`_O?bU?~){9dYm!{mSs%y7b8~^}-pS?pc$x##t zSR1qgi-`PO_3kq>B{^RZD+Mjv`|`b zIQ(=(jkAMeUxoWQZ5?l)%XmEA#}?w`b#-IHS49FO3zlq&D;hl9^TmQ3PG-LLpNCiepl7H9&KKpexBazeHfeN(u50cyz zi6f&5sK?SD-6UsefxvN584w|U|Kg{{wz`^?Vq;F|fF)Ue6R!0hCztoGg`lRjsb z{Hw$jE>1ia%3_wY?LX?^ZW1?^X}xF|Yja1Sr}F4MS|{LAihx(`S58S--IsR1S`^X- zW51H{pqAv1;CTe34D%b*`@oNh6i}lm;>W(RBlWKnv|On05l?s8aB7?0w+jOL55f`L zul;!F1nz8WH>YVx$005hq;J>z>pZ|0eJnOb4n>U> z#8QM1$62#%UQ5xk>vS}C!x%@Y;goJGz$=6r`TU*^@Ka}U9=P^wnj+z>#{49cFB!z!$Yu}sg~IW!zPh(Kd1v;`v(U;6&C58Ob&@} z#Lb%Ta)2p?lyW_r*03uHB{I?zLHLV|{y4WBR%OH@F1_3ff3Vk4FvieXQjkT-YkVN{ z**VMUCVt*ZZF80VDDE-&%wGvCCTg0dy{gR>e`BYi(Cn%PbbtpB?vJG4E}rh4Q>#lh zJFYqn?N>j4b9csE3iF&2$b+A~(Z4)KLyN^OR`zPnXPTA$h@}ET(Gf;f_k=4TX-WWwyL6+~O#IuQl;9&GmZ0=Aal#}DLZBc>& zywR&V%BT)zALYBa>hv8V>>l@oi{^Y-X=JHWhrsv?*G3;gi-Q{Q_McXBQpMW zIl;7~b*mxB>BRl7sG&S;T-49Fx(LhaDjakIEkx$^Q`)W$-Iy?Ihh^IgN zSu|ZfWnVI#7V!?W9DzhrfJJ~b6<4o9MAwO+50MPk<%kHgCLK`)pI>;s^Ih?CG0ZGr zlU_cE6{8vVD3l4f%d&=&dd9@=SMi@1r4zr;#vc0>d@#ee_WY%o3@9)}F9^*=TGPl~{1*_P@yO)Y>x=4=N zo`={)srmypD6B`Gu5;rCcFK2eXK9ht;K>*|L&|d4f-rjBO9+bmB!uWoCCGS0YahSh z)>4LUq!FHvw+gC2Q3VnE^Kvm$;;qr-!M^(ha>GyGK83rnx!3?tq1OgOMvT|>w-iM5 z_I7u^%*4uR2b>Il;zZ9<04jxMvEwjDPtcwcXDR+XU2PbV-p^$R6ZrQR|UsGP$u969>$N_S$bsX!`k3}3@H}zn@y7@#AUEb8B^}{{0eJsuF zcD~=iX_A&oSTLmNX+B>@7&Q4>_H4e$dbJ}t4pquw8UDb-USlz9=}EwBN$Jc$Zp*68 ziSr!@jLa)+e;J{wjoQ5v3+4;WBkA%t;ufUEnX9}ez>_}H40y8f-Uj=8MQK@~fcvJR z@K4T)r-6+`-i^Q55~9Eb-i&CeJGMp4n4;Y4NqN4`*OXb3m{c^oR01`k>mVIe~G2_{dcax_&1M~^t;iV=xF+dAC>=y z-aqAs@Bt_Po-d2R64qFNnf*T_|Cjydn#)~Fbt&f)VU3=W?;HgjVPnqhb)>R)7Z BGIsy~ diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.json b/public/images/pokemon/exp/back/shiny/666-monsoon.json index 78130a47159..117fad03b83 100644 --- a/public/images/pokemon/exp/back/shiny/666-monsoon.json +++ b/public/images/pokemon/exp/back/shiny/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dcde8c849851ea64b2ceed92a82153e1:5a97106b9193dc2cda01b0448d9f2637:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.png b/public/images/pokemon/exp/back/shiny/666-monsoon.png index 5d87fc101a8f6e5fec9961c8a871145322ad1a1f..cc5279545d553ffd260e24db46860e2076fb06f7 100644 GIT binary patch literal 2768 zcmY+Gdpr~BAIE2A85^6FW^&yRNo>QY5Odp3&Pd9T+L5`F%ZfF zJZ^&AH&R$wc=s;<*|Ue-&!4BKrzMg#7K5@W4N#8pARh&6{@<9+y3Pjx6!0WRd(Zfi z`4gFOm90vSnncTD* z4x4lTJ#;5m=-w%NK_y&mPb{ev-8d>RK;Mky#16 zftD$k#|Ov)ShNKM=7_;s!-vp8a_}6Q2sp*$r+}8e`sRVo>Xm5#NRqv9&IPrVrT3G2 zOSsz12h6?r6S`RQ5pa8jH@8|%av=(?fO?eYWOTiHyESg#V12)KF>vyo5@(td60c(T z4YG`QYlC=2z28#jncf5XOG51Ug#e1m3)nN`!KGwh)qb!EX*=&3=y1$tRc0{uk&~4k ziBC^KpS?%m`XIl+XJm5i2HC#4{a|6F+k4oD@(|2pf$8v-t z@=wR?#9yFu=ohiy*=T-E-qm%`W59>4!*;K*^d>|mvWW=n-OZg=fDDnB01TyVs8+Id z%{)B9gm~|f1-I`KnL7=Hob#pObCS|vLAF;9!$;n#KpMyO_oE;!f23NluQ5M@SsNR> zNf>;WxEoqYQb8G^nU4?y@2`n2{ng=P`F(`CBAoE|O;v6U>fab37h!z*wVH(EaGI? zM~}e7ZGH>gRl4?imS_qh0@g$v4J?B3m00DiX^Vo^6`w>)sFn4(HXE!KDKv$-xN({J z)oeyxk$`eN`1L-!sU_+4zx_mq>Zzm3{#;oX3nZsP5CkCyXLTP{;=Pm%-bzl~M&HMO zcL5!#S#C8e3P)!XHW{Gb_ci@yK};W(53d2(0+a8jIiMw~YN0*#WoxOm1cBI)~l*JuoQC8u_y(7;ZMAplo5c<;q` z=+e2TPSY>+u^-l$?Q&z0`L^`|DLA`ix6~`2!X{Hk=QPh~J9THrcF+NDwSJ|P!{Xf?(-W=c`UYs4I((uKzreXhx~d>rsmoj z5l4(P0u7`&J`d_R$ok(?gQcdnB5lZRIFt4y(tUjl0y3cA<{Tx)Mw9h3+>CeCR91jJ$S4L$w>ByacvK)4FwDtBxs`-eV?4Z^WrqneB2d_Z&Ov znHq-={%|MKp;FUkNLZlT(YSyQ!ffLx*ybq8A79MGqup90tF-I+ai0H_uIWI&!?+*y zbWr7}4B->8F!T45n|oUV(EgsH5w!z1%3yuIkRNZ`0eXNch|SnSdX@iXm4(QPkro0EU?%Gxf7Ds-e1 zFcCVr;1q8(Um(1=p~YD|mVJP8@Y^nkA-^EzIdjq`4u%xMUkZGSi_NOZZ|zmy`cdHC z7l+-w+-#r7+u}#)n%u7RD1`2zBk#LkX$<9bLDOJQo&FlW=N41{D^;CaSSCE_?o}H% zRzx=B>p*N(QN3*k9;@95EBlP>Hb=kBGF+(c*(iJ*t%W#0I|S)-08SqhoGJ)1y#osk zdpA>)UIz7C5@8rv%h43tazGKL z;=YXTo|e_Ao9W@yM9Jo~mV#P8i#8Zss7v7k6+ASE!)b9wiUS4DQfTtN;ND?-)vibU z=R|ST^K`cq8n7A43t_;!Z#`$X4=C`;KBZ+-k&QYUZ~E=4DU8YpVvh%!0~m$AN~0E0 zb#}jLj)q_JVx&e83o3bL!wBQ;E$7sYhk)Izv|GkEv1omvCJAQYX|QmCt3U_0sOpHX)J{OT=PL5( z_|I~^#vcefjfcQ8%ICW-g$gdWl$la`#O~nU7-m;ECfS&g*=U0_9+FeJFB-Q0JHe2` zS44-Vv|$sytksN%ik?_4W*}xBEQx6RE@gvy)m!z!JSnioW3_7X?#@1 zemmMLi;9dMIn>NFx&i7fOnFL0; zZvE$NW}KyUvJ`l2xj!jyw_{ltQfA0o)un2lR83*gBBg)~-=r4#ZUyO6oOPuwXe#r* fkSf01mRU8G{Q9BGQwh-^{agY_PGrY=0+sb2SU3Fd literal 3127 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 JC{?!&|2G>*wGIFP diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.json b/public/images/pokemon/exp/back/shiny/666-ocean.json index 1bf44996eef..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/shiny/666-ocean.json +++ b/public/images/pokemon/exp/back/shiny/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc3f54a39a4afa0ea28913252050d7c1:d856dfe44678a2ee4dc3d367a6658ad3:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.png b/public/images/pokemon/exp/back/shiny/666-ocean.png index 8c6aeca189acebd2799a77c99f1156f6a400bd8d..caabd9302eabf0f9321dcb29593762d0e08185e0 100644 GIT binary patch literal 2894 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 literal 2749 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 diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.json b/public/images/pokemon/exp/back/shiny/666-poke-ball.json index 5c8715a8a1e..45564e59a32 100644 --- a/public/images/pokemon/exp/back/shiny/666-poke-ball.json +++ b/public/images/pokemon/exp/back/shiny/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9df25dba5036e3cd48218e8de3a98074:4357b8b161f5f87776f4d39fcb3723f5:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.png b/public/images/pokemon/exp/back/shiny/666-poke-ball.png index 24907a5ef9fcecae2c775eb27e1f6dae1f64cb36..30e2cbf861543ff605d9111186643356896ae34f 100644 GIT binary patch literal 2983 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 literal 3495 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 TupB4<8Wd<jB-JDV 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 literal 2794 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 LTk}fO(>MMHK&B~< diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.json b/public/images/pokemon/exp/back/shiny/666-savanna.json index 24638119724..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/shiny/666-savanna.json +++ b/public/images/pokemon/exp/back/shiny/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c7fd4a8c1137a2566fabe2f53dac4c4:295a7bdde494b6106f9c73b649be6098:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.png b/public/images/pokemon/exp/back/shiny/666-savanna.png index 5fcf8bc6d281809a2e161892750b32a3dba1ad06..a69c0c18ae1540a6b426b99ccf7b9b2da68c8e69 100644 GIT binary patch literal 2850 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 O6+m|KaBQ%rGX4qKEgwe! literal 3365 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 diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.json b/public/images/pokemon/exp/back/shiny/666-tundra.json index 8361b7ca139..afa574f9e07 100644 --- a/public/images/pokemon/exp/back/shiny/666-tundra.json +++ b/public/images/pokemon/exp/back/shiny/666-tundra.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-tundra.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 46, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b87511ba7b272729aecbf5eb18fe65cc:383836b7b2902a470e150b17bdd9bcfc:9779ed3adebc298af537dd64dc25fe00$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-tundra.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.png b/public/images/pokemon/exp/back/shiny/666-tundra.png index c33fbf1fc6550a37aa9fcbd48e3b0b8a4ee180dc..78316df8a8fc721faceabe9e7f86dc6544ccead1 100644 GIT binary patch literal 2777 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 Yb?f>0jXI;cz(W&6bS1geI#F2v1A3tVssI20 literal 2984 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 Vo3bKqt^dFZ5$#F1hjza4{{pdUc6a~) From 8f15788b39930906d1c451a51c5731cec10d5f2f Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:43:38 +0100 Subject: [PATCH 21/24] [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. (#5330) * [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. * [Misc] Changed Daily Run Seed Override to string | null Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: damocleas --- src/overrides.ts | 1 + src/phases/title-phase.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/overrides.ts b/src/overrides.ts index e53d3b766c4..d15370259fc 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -47,6 +47,7 @@ class DefaultOverrides { // ----------------- /** a specific seed (default: a random string of 24 characters) */ readonly SEED_OVERRIDE: string = ""; + readonly DAILY_RUN_SEED_OVERRIDE: string | null = null; readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; /** * If `null`, ignore this override. diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 0d486da1998..a560897037e 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -21,6 +21,7 @@ import { SelectChallengePhase } from "./select-challenge-phase"; import { SelectStarterPhase } from "./select-starter-phase"; import { SummonPhase } from "./summon-phase"; import { globalScene } from "#app/global-scene"; +import Overrides from "#app/overrides"; export class TitlePhase extends Phase { @@ -256,7 +257,11 @@ export class TitlePhase extends Phase { console.error("Failed to load daily run:\n", err); }); } else { - generateDaily(btoa(new Date().toISOString().substring(0, 10))); + let seed: string = btoa(new Date().toISOString().substring(0, 10)); + if (!Utils.isNullOrUndefined(Overrides.DAILY_RUN_SEED_OVERRIDE)) { + seed = Overrides.DAILY_RUN_SEED_OVERRIDE; + } + generateDaily(seed); } }); } From 9fb654ce736d5f670466fad858f90a9911619d6a Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 03:44:22 +1100 Subject: [PATCH 22/24] [Balance] Make dual STABs way more likely #5401 --- src/field/pokemon.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 214c667f1c1..ed27dd41f6a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2395,14 +2395,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { if (this.hasTrainer()) { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. - // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights double if STAB. + // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map((m) => { let ret: number; if (this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type)) { ret = Math.ceil(Math.sqrt(m[1])); } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { - ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)); + ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 20 : 1)); } else { ret = m[1]; } From 5996f8c6ebbe6063c87065f35df52db3796be702 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:46:54 -0800 Subject: [PATCH 23/24] [Move] Add Taunt Removal Message #5407 --- src/data/battler-tags.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8d5f21c0a42..7b16c718f07 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2752,6 +2752,12 @@ export class TauntTag extends MoveRestrictionBattlerTag { globalScene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); } + public override onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + globalScene.queueMessage(i18next.t("battlerTags:tauntOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } + /** * Checks if a move is a status move and determines its restriction status on that basis * @param {Moves} move the move under investigation From 0cb3a28dfa757b6d2e5b758923728ce006ef4335 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 04:33:39 +1100 Subject: [PATCH 24/24] Fix tera type access (#5364) --- src/field/pokemon.ts | 4 ++-- src/phases/tera-phase.ts | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ed27dd41f6a..61815ec649c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2848,7 +2848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value += 0.5; } - if (source.isTerastallized && source.teraType === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (source.isTerastallized && source.getTeraType() === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { if (matchesSourceType) { stabMultiplier.value += 0.5; } else { @@ -4632,7 +4632,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; - newPokemon.fusionTeraType = this.teraType; + newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; globalScene.getPlayerParty().push(newPokemon); diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index f4b72d39192..462a4e1882e 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -20,9 +20,7 @@ export class TeraPhase extends BattlePhase { start() { super.start(); - console.log(this.pokemon.name, "terastallized to", Type[this.pokemon.teraType].toString()); - - globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.teraType]}`) })); + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.getTeraType()]}`) })); new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { this.end(); }); @@ -41,7 +39,7 @@ export class TeraPhase extends BattlePhase { if (this.pokemon.isPlayer()) { globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.pokemon.teraType === Type.STELLAR) { + if (this.pokemon.getTeraType() === Type.STELLAR) { globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); } }