From 3eee9d9b4e7b53373e2c5f56b541458c5e70fb54 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 22 Aug 2025 21:43:17 -0700 Subject: [PATCH 001/134] Update version to 1.10.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74e98e37f89..9648361341a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.1", + "version": "1.10.2", "type": "module", "scripts": { "start": "vite", From c027b5562b7fdd227bdfceb736968fd816d8794c Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 23 Aug 2025 00:37:50 -0700 Subject: [PATCH 002/134] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 58fa5f9b6e9..a73ea68fdda 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 58fa5f9b6e94469017bfbe69bef992ed48ef5343 +Subproject commit a73ea68fdda09bb5018f524cbe6b7e73a3ddf4e0 From 961d30f75ec15f39eddb89b5162665991b6a3e6d Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 23 Aug 2025 07:42:41 -0700 Subject: [PATCH 003/134] [Bug] Wild Pokemon can now generate as female again (#6352) --- 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 064ad57cfb3..fd8551f2289 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -795,7 +795,7 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable { return Gender.GENDERLESS; } - if (randSeedFloat() <= this.malePercent) { + if (randSeedFloat() * 100 <= this.malePercent) { return Gender.MALE; } return Gender.FEMALE; From e752e7a93d9b1b1f5a319d0790b1445d2562df08 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 23 Aug 2025 16:43:33 +0200 Subject: [PATCH 004/134] [Bug][Item] Items can be transfered from 6th item slot again. (#6357) * Added check for transferMode --- src/ui/party-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index d3c67f66ec9..9ad56476441 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -563,7 +563,7 @@ export class PartyUiHandler extends MessageUiHandler { const ui = this.getUi(); const option = this.options[this.optionsCursor]; - if (option === PartyOption.TRANSFER) { + if (this.transferMode && option === PartyOption.TRANSFER) { return this.processTransferOption(); } From 8b371395bcf2adbb08f031d3899e8f7b4f9ec22a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 23 Aug 2025 07:43:56 -0700 Subject: [PATCH 005/134] [Bug] Fix typo in i18n key for second Berries Abound ME option (#6354) --- .../mystery-encounters/encounters/berries-abound-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 196ca873f4e..358bba92a09 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -237,7 +237,7 @@ export const BerriesAboundEncounter: MysteryEncounter = MysteryEncounterBuilder. const config = globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - queueEncounterMessage(`${namespace}:option.2.boss_enraged`); + queueEncounterMessage(`${namespace}:option.2.bossEnraged`); globalScene.phaseManager.unshiftNew( "StatStageChangePhase", pokemon.getBattlerIndex(), From e63effa311ef229e0edf4dad10b5bac01aa0128b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 23 Aug 2025 16:45:11 +0200 Subject: [PATCH 006/134] [Challenge][Bug] Fix fresh starters for real (#6355) * Including side evolutions of starters --- src/constants.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 589a091153c..6bb7138e354 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,4 @@ +import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { SpeciesId } from "#enums/species-id"; /** The maximum size of the player's party */ @@ -53,11 +54,14 @@ export const defaultStarterSpecies: SpeciesId[] = [ SpeciesId.QUAXLY, ]; -export const defaultStarterSpeciesAndEvolutions: SpeciesId[] = defaultStarterSpecies.flatMap(id => [ - id, - (id + 1) as SpeciesId, - (id + 2) as SpeciesId, -]); +/** + * The default species and all their evolutions + */ +export const defaultStarterSpeciesAndEvolutions: SpeciesId[] = defaultStarterSpecies.flatMap(id => { + const stage2ids = pokemonEvolutions[id]?.map(e => e.speciesId) ?? []; + const stage3ids = stage2ids.flatMap(s2id => pokemonEvolutions[s2id]?.map(e => e.speciesId) ?? []); + return [id, ...stage2ids, ...stage3ids]; +}); export const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary From 3dd1948634111155904245dfea5308e050c79c39 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 10:00:00 -0500 Subject: [PATCH 007/134] [Misc] Fix circular dep (#6361) --- src/constants.ts | 10 ---------- src/data/balance/pokemon-evolutions.ts | 10 ++++++++++ src/data/challenge.ts | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 6bb7138e354..17cf08aa7e2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,3 @@ -import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { SpeciesId } from "#enums/species-id"; /** The maximum size of the player's party */ @@ -54,15 +53,6 @@ export const defaultStarterSpecies: SpeciesId[] = [ SpeciesId.QUAXLY, ]; -/** - * The default species and all their evolutions - */ -export const defaultStarterSpeciesAndEvolutions: SpeciesId[] = defaultStarterSpecies.flatMap(id => { - const stage2ids = pokemonEvolutions[id]?.map(e => e.speciesId) ?? []; - const stage3ids = stage2ids.flatMap(s2id => pokemonEvolutions[s2id]?.map(e => e.speciesId) ?? []); - return [id, ...stage2ids, ...stage3ids]; -}); - export const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary /** diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index d42bce041c2..bf90ebb7edc 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1,3 +1,4 @@ +import { defaultStarterSpecies } from "#app/constants"; import { globalScene } from "#app/global-scene"; import { speciesStarterCosts } from "#balance/starters"; import { allMoves } from "#data/data-lists"; @@ -1883,6 +1884,15 @@ export function initPokemonPrevolutions(): void { // TODO: This may cause funny business for double starters such as Pichu/Pikachu export const pokemonStarters: PokemonPrevolutions = {}; +/** + * The default species and all their evolutions + */ +export const defaultStarterSpeciesAndEvolutions: SpeciesId[] = defaultStarterSpecies.flatMap(id => { + const stage2ids = pokemonEvolutions[id]?.map(e => e.speciesId) ?? []; + const stage3ids = stage2ids.flatMap(s2id => pokemonEvolutions[s2id]?.map(e => e.speciesId) ?? []); + return [id, ...stage2ids, ...stage3ids]; +}); + export function initPokemonStarters(): void { const starterKeys = Object.keys(pokemonPrevolutions); starterKeys.forEach(pk => { diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 3c282e7640e..01e6fa78ffc 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,6 +1,6 @@ import type { FixedBattleConfig } from "#app/battle"; import { getRandomTrainerFunc } from "#app/battle"; -import { defaultStarterSpeciesAndEvolutions } from "#app/constants"; +import { defaultStarterSpeciesAndEvolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; import type { PokemonSpecies } from "#data/pokemon-species"; import { AbilityAttr } from "#enums/ability-attr"; From 16adb02ad26a49b48ca960df10c76e50c4fe63ac Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:00:27 +0200 Subject: [PATCH 008/134] [Item][Bug] No more free sacred ash (#6356) --- src/phases/select-modifier-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 05c890136ee..06a02af38b0 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -177,7 +177,7 @@ export class SelectModifierPhase extends BattlePhase { this.openModifierMenu(modifierType, cost, modifierSelectCallback); } } else { - this.applyModifier(modifierType.newModifier()!); + this.applyModifier(modifierType.newModifier()!, cost); } return cost === -1; } From 3b290ee9a2b9afed8b01e6977d233c3c628879a0 Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:05:48 +0200 Subject: [PATCH 009/134] [UI/UX][Bug] Prevent switch to discard mode while transferring item (#6358) --- src/ui/party-ui-handler.ts | 3 +- test/ui/item-manage-button.test.ts | 47 +++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 9ad56476441..de10571f44c 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1021,7 +1021,8 @@ export class PartyUiHandler extends MessageUiHandler { } // Toggle item transfer mode to discard items or vice versa - if (this.cursor === 7) { + // Prevent changing mode, when currently transfering an item + if (this.cursor === 7 && !this.transferMode) { switch (this.partyUiMode) { case PartyUiMode.DISCARD: this.partyUiMode = PartyUiMode.MODIFIER_TRANSFER; diff --git a/test/ui/item-manage-button.test.ts b/test/ui/item-manage-button.test.ts index a7ea76918a5..f31c5e8e7e5 100644 --- a/test/ui/item-manage-button.test.ts +++ b/test/ui/item-manage-button.test.ts @@ -6,7 +6,7 @@ import { UiMode } from "#enums/ui-mode"; import type { Pokemon } from "#field/pokemon"; import { GameManager } from "#test/test-utils/game-manager"; import type { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; -import type { PartyUiHandler } from "#ui/party-ui-handler"; +import { type PartyUiHandler, PartyUiMode } from "#ui/party-ui-handler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -169,4 +169,49 @@ describe("UI - Transfer Items", () => { expect(pokemon.getHeldItems().map(h => h.stackCount)).toEqual([2, 2]); } }); + + it("should not allow changing to discard mode when transfering items", async () => { + let handler: PartyUiHandler | undefined; + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { + await new Promise(r => setTimeout(r, 100)); + const modifierHandler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + + modifierHandler.processInput(Button.DOWN); + modifierHandler.setCursor(1); + modifierHandler.processInput(Button.ACTION); + }); + + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + handler = game.scene.ui.getHandler() as PartyUiHandler; + + handler.setCursor(0); + handler.processInput(Button.ACTION); + + await new Promise(r => setTimeout(r, 100)); + handler.processInput(Button.ACTION); + + resolve(); + }); + }); + + expect(handler).toBeDefined(); + if (handler) { + const partyMode = handler["partyUiMode"]; + expect(partyMode).toBe(PartyUiMode.MODIFIER_TRANSFER); + + handler.setCursor(7); + handler.processInput(Button.ACTION); + // Should not change mode to discard + expect(handler["partyUiMode"]).toBe(PartyUiMode.MODIFIER_TRANSFER); + + handler.processInput(Button.CANCEL); + handler.setCursor(7); + handler.processInput(Button.ACTION); + // Should change mode to discard + expect(handler["partyUiMode"]).toBe(PartyUiMode.DISCARD); + } + }); }); From 908886d78b57a25a55d66605042d15dcdb190e18 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:23:15 -0500 Subject: [PATCH 010/134] Fix unpauseEvolutions key in party select --- src/ui/party-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index de10571f44c..927d6ce5154 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1610,7 +1610,7 @@ export class PartyUiHandler extends MessageUiHandler { const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; optionName = `${modifier.active ? i18next.t("partyUiHandler:deactivate") : i18next.t("partyUiHandler:activate")} ${modifier.type.name}`; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { - optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:unpausedEvolution") : i18next.t("partyUiHandler:pauseEvolution")}`; + optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:unpausedEvolutions") : i18next.t("partyUiHandler:pauseEvolution")}`; } else { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${toCamelCase(PartyOption[option])}`); From 053976daecbf417007aa3a2775b050cb18e1261c Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:41:30 -0500 Subject: [PATCH 011/134] [Bug] Fix ssui passives (#6362) Fix passives not being persisted in starter select --- src/ui/starter-select-ui-handler.ts | 36 ++++++++++++----------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 25d5277b4c2..9f6a3647972 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2095,27 +2095,21 @@ export class StarterSelectUiHandler extends MessageUiHandler { const passiveAttr = starterData.passiveAttr; if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive - if (!(passiveAttr & PassiveAttr.ENABLED)) { - options.push({ - label: i18next.t("starterSelectUiHandler:enablePassive"), - handler: () => { - starterData.passiveAttr |= PassiveAttr.ENABLED; - ui.setMode(UiMode.STARTER_SELECT); - this.setSpeciesDetails(this.lastSpecies); - return true; - }, - }); - } else { - options.push({ - label: i18next.t("starterSelectUiHandler:disablePassive"), - handler: () => { - starterData.passiveAttr ^= PassiveAttr.ENABLED; - ui.setMode(UiMode.STARTER_SELECT); - this.setSpeciesDetails(this.lastSpecies); - return true; - }, - }); - } + const label = i18next.t( + passiveAttr & PassiveAttr.ENABLED + ? "starterSelectUiHandler:disablePassive" + : "starterSelectUiHandler:enablePassive", + ); + options.push({ + label, + handler: () => { + starterData.passiveAttr ^= PassiveAttr.ENABLED; + persistentStarterData.passiveAttr ^= PassiveAttr.ENABLED; + ui.setMode(UiMode.STARTER_SELECT); + this.setSpeciesDetails(this.lastSpecies); + return true; + }, + }); } // if container.favorite is false, show the favorite option const isFavorite = starterAttributes?.favorite ?? false; From 873e12f9ad45720ce529ca5c152230aeb0093439 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:42:02 -0500 Subject: [PATCH 012/134] [Balance] Clamperl Egg Moves / Passive Tweaks (#6365) Clamperl changes --- src/data/balance/egg-moves.ts | 2 +- src/data/balance/passives.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 2d2e981219d..5dd7bcbd9e2 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -187,7 +187,7 @@ export const speciesEggMoves = { [SpeciesId.WYNAUT]: [ MoveId.RECOVER, MoveId.SHED_TAIL, MoveId.TAUNT, MoveId.COMEUPPANCE ], [SpeciesId.SNORUNT]: [ MoveId.SPARKLY_SWIRL, MoveId.NASTY_PLOT, MoveId.EARTH_POWER, MoveId.BLOOD_MOON ], [SpeciesId.SPHEAL]: [ MoveId.FLIP_TURN, MoveId.FREEZE_DRY, MoveId.SLACK_OFF, MoveId.STEAM_ERUPTION ], - [SpeciesId.CLAMPERL]: [ MoveId.SHELL_SIDE_ARM, MoveId.BOUNCY_BUBBLE, MoveId.FREEZE_DRY, MoveId.STEAM_ERUPTION ], + [SpeciesId.CLAMPERL]: [ MoveId.SHELL_SIDE_ARM, MoveId.SNIPE_SHOT, MoveId.GIGA_DRAIN, MoveId.BOUNCY_BUBBLE ], [SpeciesId.RELICANTH]: [ MoveId.DRAGON_DANCE, MoveId.SHORE_UP, MoveId.WAVE_CRASH, MoveId.DIAMOND_STORM ], [SpeciesId.LUVDISC]: [ MoveId.BATON_PASS, MoveId.HEART_SWAP, MoveId.GLITZY_GLOW, MoveId.REVIVAL_BLESSING ], [SpeciesId.BAGON]: [ MoveId.HEADLONG_RUSH, MoveId.FIRE_LASH, MoveId.DRAGON_DANCE, MoveId.DRAGON_DARTS ], diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 0e34917fd80..1297ad71c36 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -402,7 +402,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.SPHEAL]: { 0: AbilityId.UNAWARE }, [SpeciesId.SEALEO]: { 0: AbilityId.UNAWARE }, [SpeciesId.WALREIN]: { 0: AbilityId.UNAWARE }, - [SpeciesId.CLAMPERL]: { 0: AbilityId.DAUNTLESS_SHIELD }, + [SpeciesId.CLAMPERL]: { 0: AbilityId.OVERCOAT }, [SpeciesId.GOREBYSS]: { 0: AbilityId.ARENA_TRAP }, [SpeciesId.HUNTAIL]: { 0: AbilityId.ARENA_TRAP }, [SpeciesId.RELICANTH]: { 0: AbilityId.PRIMORDIAL_SEA }, From 99bf639ea7dc39b0b9989e7eeadf34369d2df956 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:42:10 -0500 Subject: [PATCH 013/134] [Bug] [Move] Fix pollen puff (#6363) * Ensure pollen puff does not heal enemy after damage * Add test to ensure pollen puff does not heal enemy --- src/data/moves/move.ts | 7 +++++++ test/moves/pollen-puff.test.ts | 12 ++++++++++++ test/test-utils/phase-interceptor.ts | 2 ++ 3 files changed, 21 insertions(+) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index dc9f2306101..a8ea61f7187 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -2325,6 +2325,13 @@ export class HealOnAllyAttr extends HealAttr { // Don't trigger if not targeting an ally return target === user.getAlly() && super.canApply(user, target, _move, _args); } + + override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { + if (user.isOpponent(target)) { + return false; + } + return super.apply(user, target, _move, _args); + } } /** diff --git a/test/moves/pollen-puff.test.ts b/test/moves/pollen-puff.test.ts index 76732a39c43..02772055f1f 100644 --- a/test/moves/pollen-puff.test.ts +++ b/test/moves/pollen-puff.test.ts @@ -61,4 +61,16 @@ describe("Moves - Pollen Puff", () => { expect(target.battleData.hitCount).toBe(2); }); + + // Regression test for pollen puff healing an enemy after dealing damage + it("should not heal an enemy after dealing damage", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + const target = game.field.getEnemyPokemon(); + game.move.use(MoveId.POLLEN_PUFF); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(target.hp).not.toBe(target.getMaxHp()); + expect(game.phaseInterceptor.log).not.toContain("PokemonHealPhase"); + }); }); diff --git a/test/test-utils/phase-interceptor.ts b/test/test-utils/phase-interceptor.ts index 0d357a75557..996f00806c6 100644 --- a/test/test-utils/phase-interceptor.ts +++ b/test/test-utils/phase-interceptor.ts @@ -37,6 +37,7 @@ import { NewBiomeEncounterPhase } from "#phases/new-biome-encounter-phase"; import { NextEncounterPhase } from "#phases/next-encounter-phase"; import { PartyExpPhase } from "#phases/party-exp-phase"; import { PartyHealPhase } from "#phases/party-heal-phase"; +import { PokemonHealPhase } from "#phases/pokemon-heal-phase"; import { PokemonTransformPhase } from "#phases/pokemon-transform-phase"; import { PositionalTagPhase } from "#phases/positional-tag-phase"; import { PostGameOverPhase } from "#phases/post-game-over-phase"; @@ -181,6 +182,7 @@ export class PhaseInterceptor { UnlockPhase, PostGameOverPhase, RevivalBlessingPhase, + PokemonHealPhase, ]; private endBySetMode = [ From cd137062eaeec57a9052e9324e49e144e23288fa Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 23 Aug 2025 13:28:09 -0400 Subject: [PATCH 014/134] Fix Option 1 Leftovers text in Trash to Treasure encounter --- .../encounters/trash-to-treasure-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index af576ffd8be..ed588ea2884 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -249,7 +249,7 @@ async function tryApplyDigRewardItems() { await showEncounterText( i18next.t("battle:rewardGainCount", { modifierName: leftovers.name, - count: 2, + count: 1, }), null, undefined, From af963c79027bbb39425a48f868d10582cb019f4b Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:00:00 -0400 Subject: [PATCH 015/134] [Bug] Fixed delayed attacks pushing to move history twice on charging turn (#6371) --- src/data/moves/move.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index a8ea61f7187..4a744d6e9c3 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -3277,7 +3277,6 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { ) ) - user.pushMoveHistory({move: move.id, targets: [target.getBattlerIndex()], result: MoveResult.OTHER, useMode, turn: globalScene.currentBattle.turn}) user.pushMoveHistory({move: move.id, targets: [target.getBattlerIndex()], result: MoveResult.OTHER, useMode, turn: globalScene.currentBattle.turn}) // Queue up an attack on the given slot. globalScene.arena.positionalTagManager.addTag({ From d2eb3dba53592b897ebadcc3bb4af0e0f8ef0491 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sat, 23 Aug 2025 14:02:36 -0700 Subject: [PATCH 016/134] [Test] Fix leftovers test not running heal phase (#6370) Fix leftovers test --- test/items/leftovers.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/items/leftovers.test.ts b/test/items/leftovers.test.ts index 6ae4094799b..484843b81ff 100644 --- a/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -2,7 +2,6 @@ import { AbilityId } from "#enums/ability-id"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; import { DamageAnimPhase } from "#phases/damage-anim-phase"; -import { TurnEndPhase } from "#phases/turn-end-phase"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -54,7 +53,7 @@ describe("Items - Leftovers", () => { const leadHpAfterDamage = leadPokemon.hp; // Check if leftovers heal us - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("PokemonHealPhase"); expect(leadPokemon.hp).toBeGreaterThan(leadHpAfterDamage); }); }); From a8b54eba6df008995d8c79aa02e7ae9654e1f7f3 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 16:56:58 -0500 Subject: [PATCH 017/134] [Test] Mark failing test/ui/manage-item-button.test.ts as TODO (#6375) * Ensure hotfix runs tests * Unnest promise * ensure workflows run when pushed to hotfix * Mark test todo --- .github/workflows/github-pages.yml | 2 ++ .github/workflows/linting.yml | 2 ++ .github/workflows/tests.yml | 2 ++ test/ui/item-manage-button.test.ts | 44 ++++++++++++++++-------------- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 84d5964064f..55ff05d7726 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -6,11 +6,13 @@ on: - main - beta - release + - 'hotfix*' pull_request: branches: - main - beta - release + - 'hotfix*' merge_group: types: [checks_requested] diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a5e8f96961e..ae23a515c4f 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -6,11 +6,13 @@ on: - main - beta - release + - 'hotfix*' pull_request: branches: - main - beta - release + - 'hotfix*' merge_group: types: [checks_requested] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2b9f6dc9c0d..748072c536f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,11 +6,13 @@ on: - main - beta - release + - 'hotfix*' pull_request: branches: - main - beta - release + - 'hotfix*' merge_group: types: [checks_requested] workflow_dispatch: diff --git a/test/ui/item-manage-button.test.ts b/test/ui/item-manage-button.test.ts index f31c5e8e7e5..c28cd9e802e 100644 --- a/test/ui/item-manage-button.test.ts +++ b/test/ui/item-manage-button.test.ts @@ -170,33 +170,35 @@ describe("UI - Transfer Items", () => { } }); - it("should not allow changing to discard mode when transfering items", async () => { + // TODO: This test breaks when running all tests on github. Fix this once hotfix period is over. + it.todo("should not allow changing to discard mode when transfering items", async () => { let handler: PartyUiHandler | undefined; - await new Promise(resolve => { - game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { - await new Promise(r => setTimeout(r, 100)); - const modifierHandler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + const { resolve, promise } = Promise.withResolvers(); - modifierHandler.processInput(Button.DOWN); - modifierHandler.setCursor(1); - modifierHandler.processInput(Button.ACTION); - }); + game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { + await new Promise(r => setTimeout(r, 100)); + const modifierHandler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { - await new Promise(r => setTimeout(r, 100)); - handler = game.scene.ui.getHandler() as PartyUiHandler; - - handler.setCursor(0); - handler.processInput(Button.ACTION); - - await new Promise(r => setTimeout(r, 100)); - handler.processInput(Button.ACTION); - - resolve(); - }); + modifierHandler.processInput(Button.DOWN); + modifierHandler.setCursor(1); + modifierHandler.processInput(Button.ACTION); }); + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + handler = game.scene.ui.getHandler() as PartyUiHandler; + + handler.setCursor(0); + handler.processInput(Button.ACTION); + + await new Promise(r => setTimeout(r, 100)); + handler.processInput(Button.ACTION); + + resolve(); + }); + + await promise; expect(handler).toBeDefined(); if (handler) { const partyMode = handler["partyUiMode"]; From 1b2c69408449ce66e90ed1441a28cb2858df2128 Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:26:12 +0200 Subject: [PATCH 018/134] [bug/i18n] Fix stealth rock message (#6377) replace pokemonName with pokemonNameWithAffix --- src/data/arena-tag.ts | 2 +- test/moves/entry-hazards.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index b03cc5b951a..cd02455af0f 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -937,7 +937,7 @@ class StealthRockTag extends DamagingTrapTag { protected override getTriggerMessage(pokemon: Pokemon): string { return i18next.t("arenaTag:stealthRockActivateTrap", { - pokemonName: getPokemonNameWithAffix(pokemon), + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }); } diff --git a/test/moves/entry-hazards.test.ts b/test/moves/entry-hazards.test.ts index c4dead1bb67..af8145183a3 100644 --- a/test/moves/entry-hazards.test.ts +++ b/test/moves/entry-hazards.test.ts @@ -200,7 +200,7 @@ describe("Moves - Entry Hazards", () => { expect(enemy).toHaveTakenDamage(enemy.getMaxHp() * 0.125 * multi); expect(game.textInterceptor.logs).toContain( i18next.t("arenaTag:stealthRockActivateTrap", { - pokemonName: getPokemonNameWithAffix(enemy), + pokemonNameWithAffix: getPokemonNameWithAffix(enemy), }), ); }); From 1192825d515aaef4dd1a0ef4fbae4de2415f8f7d Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:59:01 +0200 Subject: [PATCH 019/134] [Bug/i18n] Fix unpause evolution option in party ui (#6379) --- src/ui/party-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 927d6ce5154..446fa37ec4a 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1610,7 +1610,7 @@ export class PartyUiHandler extends MessageUiHandler { const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; optionName = `${modifier.active ? i18next.t("partyUiHandler:deactivate") : i18next.t("partyUiHandler:activate")} ${modifier.type.name}`; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { - optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:unpausedEvolutions") : i18next.t("partyUiHandler:pauseEvolution")}`; + optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:unpauseEvolution") : i18next.t("partyUiHandler:pauseEvolution")}`; } else { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${toCamelCase(PartyOption[option])}`); From 842f0e88b0ab95255fb14025b2da48a01d63c4f5 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:45:15 -0500 Subject: [PATCH 020/134] [Bug] Fix saveslot deletion (#6380) Fix saveslot deletion --- src/ui/save-slot-select-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index e9f9c5a0038..97cd3016479 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -181,7 +181,7 @@ export class SaveSlotSelectUiHandler extends MessageUiHandler { ui.setOverlayMode( UiMode.CONFIRM, () => { - globalScene.gameData.tryClearSession(cursor).then(response => { + globalScene.gameData.deleteSession(cursor).then(response => { if (response[0] === false) { globalScene.reset(true); } else { From 70b47945e89547937cdde6ece0aa2f89d0965495 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:47:39 -0500 Subject: [PATCH 021/134] [Bug] Fix nicknames not showing up in battle (#6378) --- src/field/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index e73d1cdf273..4904964ac1b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -454,7 +454,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { getNameToRender(useIllusion = true) { const illusion = this.summonData.illusion; const name = useIllusion ? (illusion?.name ?? this.name) : this.name; - const nickname: string | undefined = useIllusion ? illusion?.nickname : this.nickname; + const nickname: string | undefined = useIllusion ? (illusion?.nickname ?? this.nickname) : this.nickname; try { if (nickname) { return decodeURIComponent(escape(atob(nickname))); // TODO: Remove `atob` and `escape`... eventually... From c44e5893039a2148ec128aecd8a7335d2e9dbc80 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 24 Aug 2025 01:50:44 +0200 Subject: [PATCH 022/134] [UI/UX][Bug] Saving preferences when leaving ssui (#6376) Save starter preferences when leaving ssui --- src/ui/starter-select-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 9f6a3647972..a29a65aca80 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -4612,6 +4612,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { clear(): void { super.clear(); + saveStarterPreferences(this.originalStarterPreferences); + this.clearStarterPreferences(); this.cursor = -1; this.hideInstructions(); From 746ea6947559e76577e5a67ea4d78f4dbbd277b9 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:58:29 -0500 Subject: [PATCH 023/134] [Bug] Fix missing fusion icon (#6381) Fix nullish coalescing in `pokemon#isFusion` --- src/field/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 4904964ac1b..f02c9a1f30c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1781,7 +1781,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns Whether this Pokemon is currently fused with another species. */ isFusion(useIllusion = false): boolean { - return useIllusion ? !!this.summonData.illusion?.fusionSpecies : !!this.fusionSpecies; + return !!(useIllusion ? (this.summonData.illusion?.fusionSpecies ?? this.fusionSpecies) : this.fusionSpecies); } /** From c446eaf9703ea8ede731e5007b3e07b1b8e94d09 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:59:47 -0500 Subject: [PATCH 024/134] [Sprite] Revert ribbon icons (#6382) --- public/images/ui/champion_ribbon.png | Bin 207 -> 151 bytes public/images/ui/champion_ribbon_emerald.png | Bin 207 -> 151 bytes public/images/ui/legacy/champion_ribbon.png | Bin 207 -> 151 bytes .../ui/legacy/champion_ribbon_emerald.png | Bin 207 -> 151 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/ui/champion_ribbon.png b/public/images/ui/champion_ribbon.png index b188f4c92d284f8bc8a04c4f2918299191c31588..a19bb01279b2928c9aa32fbbd40db6103bdffe3f 100644 GIT binary patch delta 134 zcmX@lIGu5VL_G^L0|Nt3nf3%AB@y5g;tHhw7#Qjq7~0|(w$^Z6TjKHK!Gz!EYds>C zd3_tCM4*y3TZ7o$He1xu8oPur>lvF h$BU_nNuWuPgR$-iOG%~hl0!g^44$rjF6*2UngBp{C#C=Z delta 191 zcmV;w06_nj0nY)D7=H)`0002~ST>^o0004VQb$4nuFf3k0001oNklKPb%b`IB@$=&0 h(c|*s5@_P&VC-DO8pS<%aWzmQgQu&X%Q~loCIIR;C5Qk3 delta 191 zcmV;w06_nj0nY)D7=H)`0002~ST>^o0004VQb$4nuFf3k0001oNklC zd3_tCM4*y3TZ7o$He1xu8oPur>lvF h$BU_nNuWuPgR$-iOG%~hl0!g^44$rjF6*2UngBp{C#C=Z delta 191 zcmV;w06_nj0nY)D7=H)`0002~ST>^o0004VQb$4nuFf3k0001oNklKPb%b`IB@$=&0 h(c|*s5@_P&VC-DO8pS<%aWzmQgQu&X%Q~loCIIR;C5Qk3 delta 191 zcmV;w06_nj0nY)D7=H)`0002~ST>^o0004VQb$4nuFf3k0001oNkl Date: Sat, 23 Aug 2025 20:28:42 -0700 Subject: [PATCH 025/134] [GitHub] Update pages workflow to only deploy on main and beta (#6386) --- .github/workflows/github-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 55ff05d7726..8d1c5a84962 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -69,7 +69,7 @@ jobs: pnpm exec typedoc --out /tmp/docs --githubPages false --entryPoints ./src/ - name: Commit & Push docs - if: github.event_name == 'push' + if: github.event_name == 'push' && (github.ref_name == 'beta' || github.ref_name == 'main') run: | cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" From ae58f9de4f522d374af6d77d86b34052da5d2d2f Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:58:27 +0200 Subject: [PATCH 026/134] [Hotfix] Leech Seed does not get cleared when user faints (#6388) Lapsing leech seed tag even when source has left field --- src/data/battler-tags.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 104eca0e407..3dbbf747c5c 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1058,8 +1058,7 @@ export class SeedTag extends SerializableBattlerTag { // Check which opponent to restore HP to const source = pokemon.getOpponents().find(o => o.getBattlerIndex() === this.sourceIndex); if (!source) { - console.warn(`Failed to get source Pokemon for SeedTag lapse; id: ${this.sourceId}`); - return false; + return true; } const cancelled = new BooleanHolder(false); From 049932c00184b52d5a64febb13a4a6d82a40e855 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 12:51:16 -0500 Subject: [PATCH 027/134] [Bug] Fix status effects overwriting each other (#6392) * Ensure status effects from same source interaction cannot override each other * Update test/status-effects/general-status-effect.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/data/pokemon/pokemon-data.ts | 9 +++ src/field/pokemon.ts | 14 ++++- .../general-status-effect.test.ts | 60 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 test/status-effects/general-status-effect.test.ts diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index 0bd6af0bb04..87ffbbab4cd 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -11,6 +11,7 @@ import type { MoveId } from "#enums/move-id"; import type { Nature } from "#enums/nature"; import type { PokemonType } from "#enums/pokemon-type"; import type { SpeciesId } from "#enums/species-id"; +import { StatusEffect } from "#enums/status-effect"; import type { AttackMoveResult } from "#types/attack-move-result"; import type { IllusionData } from "#types/illusion-data"; import type { TurnMove } from "#types/turn-move"; @@ -326,6 +327,14 @@ export class PokemonTurnData { public switchedInThisTurn = false; public failedRunAway = false; public joinedRound = false; + /** Tracker for a pending status effect + * + * @remarks + * Set whenever {@linkcode Pokemon#trySetStatus} succeeds in order to prevent subsequent status effects + * from being applied. Necessary because the status is not actually set until the {@linkcode ObtainStatusEffectPhase} runs, + * which may not happen before another status effect is attempted to be applied. + */ + public pendingStatus: StatusEffect = StatusEffect.NONE; /** * The amount of times this Pokemon has acted again and used a move in the current turn. * Used to make sure multi-hits occur properly when the user is diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f02c9a1f30c..c6ec5f25622 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4803,7 +4803,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { if (effect !== StatusEffect.FAINT) { // Status-overriding moves (i.e. Rest) fail if their respective status already exists; // all other moves fail if the target already has _any_ status - if (overrideStatus ? this.status?.effect === effect : this.status) { + if (overrideStatus ? this.status?.effect === effect : this.status || this.turnData.pendingStatus) { this.queueStatusImmuneMessage(quiet, overrideStatus ? "overlap" : "other"); // having different status displays generic fail message return false; } @@ -4955,6 +4955,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { if (overrideStatus) { this.resetStatus(false); + } else { + this.turnData.pendingStatus = effect; } globalScene.phaseManager.unshiftNew( @@ -4974,6 +4976,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Set this Pokemon's {@linkcode status | non-volatile status condition} to the specified effect. * @param effect - The {@linkcode StatusEffect} to set * @remarks + * Clears this pokemon's `pendingStatus` in its {@linkcode Pokemon.turnData | turnData}. + * * ⚠️ This method does **not** check for feasibility; that is the responsibility of the caller. */ doSetStatus(effect: Exclude): void; @@ -4982,6 +4986,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @param effect - {@linkcode StatusEffect.SLEEP} * @param sleepTurnsRemaining - The number of turns to inflict sleep for; defaults to a random number between 2 and 4 * @remarks + * Clears this pokemon's `pendingStatus` in its {@linkcode Pokemon#turnData}. + * * ⚠️ This method does **not** check for feasibility; that is the responsibility of the caller. */ doSetStatus(effect: StatusEffect.SLEEP, sleepTurnsRemaining?: number): void; @@ -4991,6 +4997,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @param sleepTurnsRemaining - The number of turns to inflict sleep for; defaults to a random number between 2 and 4 * and is unused for all non-sleep Statuses * @remarks + * Clears this pokemon's `pendingStatus` in its {@linkcode Pokemon#turnData}. + * * ⚠️ This method does **not** check for feasibility; that is the responsibility of the caller. */ doSetStatus(effect: StatusEffect, sleepTurnsRemaining?: number): void; @@ -5000,6 +5008,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @param sleepTurnsRemaining - The number of turns to inflict sleep for; defaults to a random number between 2 and 4 * and is unused for all non-sleep Statuses * @remarks + * Clears this pokemon's `pendingStatus` in its {@linkcode Pokemon#turnData}. + * * ⚠️ This method does **not** check for feasibility; that is the responsibility of the caller. * @todo Make this and all related fields private and change tests to use a field-based helper or similar */ @@ -5007,6 +5017,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { effect: StatusEffect, sleepTurnsRemaining = effect !== StatusEffect.SLEEP ? 0 : this.randBattleSeedIntRange(2, 4), ): void { + // Reset any pending status + this.turnData.pendingStatus = StatusEffect.NONE; switch (effect) { case StatusEffect.POISON: case StatusEffect.TOXIC: diff --git a/test/status-effects/general-status-effect.test.ts b/test/status-effects/general-status-effect.test.ts new file mode 100644 index 00000000000..db73265181b --- /dev/null +++ b/test/status-effects/general-status-effect.test.ts @@ -0,0 +1,60 @@ +import { allAbilities } from "#data/data-lists"; +import { AbilityId } from "#enums/ability-id"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { StatusEffect } from "#enums/status-effect"; +import { ObtainStatusEffectPhase } from "#phases/obtain-status-effect-phase"; +import { GameManager } from "#test/test-utils/game-manager"; +import type { PostAttackContactApplyStatusEffectAbAttr } from "#types/ability-types"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +describe("Status Effects - General", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleStyle("single") + .enemyLevel(5) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .ability(AbilityId.BALL_FETCH); + }); + + test("multiple status effects from the same interaction should not overwrite each other", async () => { + game.override.ability(AbilityId.POISON_TOUCH).moveset([MoveId.NUZZLE]); + await game.classicMode.startBattle([SpeciesId.PIKACHU]); + + // Force poison touch to always apply + vi.spyOn( + allAbilities[AbilityId.POISON_TOUCH].getAttrs( + "PostAttackContactApplyStatusEffectAbAttr", + // expose chance, which is private, for testing purpose, but keep type safety otherwise + )[0] as unknown as Omit & { chance: number }, + "chance", + "get", + ).mockReturnValue(100); + const statusEffectPhaseSpy = vi.spyOn(ObtainStatusEffectPhase.prototype, "start"); + + game.move.select(MoveId.NUZZLE); + await game.toEndOfTurn(); + + expect(statusEffectPhaseSpy).toHaveBeenCalledOnce(); + const enemy = game.field.getEnemyPokemon(); + // This test does not care which status effect is applied, as long as one is. + expect(enemy.status?.effect).toBeOneOf([StatusEffect.POISON, StatusEffect.PARALYSIS]); + }); +}); From 0f8b1f63b5e461ba40323622aa96851fbe75fec1 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:09:16 -0400 Subject: [PATCH 028/134] [Bug/Ability] Fixed bugs with Intimidate triggers after reload/initial switch (#6212) * Added TODO test case + documentation for failing intim test * Fixed comment * Fixed intimidate bugs fr fr * Update src/data/phase-priority-queue.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/phase-priority-queue.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Cleanup remove phase logic * Do not add unnecessary activateAbilityPhases for pokemon that do not have their passive enabled * Remove leftover log messages * Add TODO comment Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/data/phase-priority-queue.ts | 28 +++++++++ src/field/pokemon.ts | 12 +++- src/phase-manager.ts | 58 +++++++++++-------- src/phases/switch-phase.ts | 6 +- test/abilities/intimidate.test.ts | 30 ++++++++++ .../test-utils/helpers/classic-mode-helper.ts | 30 ++++++++++ 6 files changed, 137 insertions(+), 27 deletions(-) diff --git a/src/data/phase-priority-queue.ts b/src/data/phase-priority-queue.ts index 88361b0f4fa..012344d59f6 100644 --- a/src/data/phase-priority-queue.ts +++ b/src/data/phase-priority-queue.ts @@ -44,6 +44,34 @@ export abstract class PhasePriorityQueue { public clear(): void { this.queue.splice(0, this.queue.length); } + + /** + * Attempt to remove one or more Phases from the current queue. + * @param phaseFilter - The function to select phases for removal + * @param removeCount - The maximum number of phases to remove, or `all` to remove all matching phases; + * default `1` + * @returns The number of successfully removed phases + * @todo Remove this eventually once the patchwork bug this is used for is fixed + */ + public tryRemovePhase(phaseFilter: (phase: Phase) => boolean, removeCount: number | "all" = 1): number { + if (removeCount === "all") { + removeCount = this.queue.length; + } else if (removeCount < 1) { + return 0; + } + let numRemoved = 0; + + do { + const phaseIndex = this.queue.findIndex(phaseFilter); + if (phaseIndex === -1) { + break; + } + this.queue.splice(phaseIndex, 1); + numRemoved++; + } while (numRemoved < removeCount && this.queue.length > 0); + + return numRemoved; + } } /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index c6ec5f25622..cc7e27caae4 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2234,8 +2234,16 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { return this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().hasAttr(attrType); } - public getAbilityPriorities(): [number, number] { - return [this.getAbility().postSummonPriority, this.getPassiveAbility().postSummonPriority]; + /** + * Return the ability priorities of the pokemon's ability and, if enabled, its passive ability + * @returns A tuple containing the ability priorities of the pokemon + */ + public getAbilityPriorities(): [number] | [activePriority: number, passivePriority: number] { + const abilityPriority = this.getAbility().postSummonPriority; + if (this.hasPassive()) { + return [abilityPriority, this.getPassiveAbility().postSummonPriority]; + } + return [abilityPriority]; } /** diff --git a/src/phase-manager.ts b/src/phase-manager.ts index aa01a0ffc10..8a31689f7b2 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -355,14 +355,23 @@ export class PhaseManager { if (this.phaseQueuePrependSpliceIndex > -1) { this.clearPhaseQueueSplice(); } - if (this.phaseQueuePrepend.length) { - while (this.phaseQueuePrepend.length) { - const poppedPhase = this.phaseQueuePrepend.pop(); - if (poppedPhase) { - this.phaseQueue.unshift(poppedPhase); - } + this.phaseQueue.unshift(...this.phaseQueuePrepend); + this.phaseQueuePrepend.splice(0); + + const unactivatedConditionalPhases: [() => boolean, Phase][] = []; + // Check if there are any conditional phases queued + for (const [condition, phase] of this.conditionalQueue) { + // Evaluate the condition associated with the phase + if (condition()) { + // If the condition is met, add the phase to the phase queue + this.pushPhase(phase); + } else { + // If the condition is not met, re-add the phase back to the end of the conditional queue + unactivatedConditionalPhases.push([condition, phase]); } } + this.conditionalQueue = unactivatedConditionalPhases; + if (!this.phaseQueue.length) { this.populatePhaseQueue(); // Clear the conditionalQueue if there are no phases left in the phaseQueue @@ -371,24 +380,6 @@ export class PhaseManager { this.currentPhase = this.phaseQueue.shift() ?? null; - const unactivatedConditionalPhases: [() => boolean, Phase][] = []; - // Check if there are any conditional phases queued - while (this.conditionalQueue?.length) { - // Retrieve the first conditional phase from the queue - const conditionalPhase = this.conditionalQueue.shift(); - // Evaluate the condition associated with the phase - if (conditionalPhase?.[0]()) { - // If the condition is met, add the phase to the phase queue - this.pushPhase(conditionalPhase[1]); - } else if (conditionalPhase) { - // If the condition is not met, re-add the phase back to the front of the conditional queue - unactivatedConditionalPhases.push(conditionalPhase); - } else { - console.warn("condition phase is undefined/null!", conditionalPhase); - } - } - this.conditionalQueue.push(...unactivatedConditionalPhases); - if (this.currentPhase) { console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;"); this.currentPhase.start(); @@ -520,6 +511,25 @@ export class PhaseManager { this.dynamicPhaseQueues[type].push(phase); } + /** + * Attempt to remove one or more Phases from the given DynamicPhaseQueue, removing the equivalent amount of {@linkcode ActivatePriorityQueuePhase}s from the queue. + * @param type - The {@linkcode DynamicPhaseType} to check + * @param phaseFilter - The function to select phases for removal + * @param removeCount - The maximum number of phases to remove, or `all` to remove all matching phases; + * default `1` + * @todo Remove this eventually once the patchwork bug this is used for is fixed + */ + public tryRemoveDynamicPhase( + type: DynamicPhaseType, + phaseFilter: (phase: Phase) => boolean, + removeCount: number | "all" = 1, + ): void { + const numRemoved = this.dynamicPhaseQueues[type].tryRemovePhase(phaseFilter, removeCount); + for (let x = 0; x < numRemoved; x++) { + this.tryRemovePhase(p => p.is("ActivatePriorityQueuePhase")); + } + } + /** * Unshifts the top phase from the corresponding dynamic queue onto {@linkcode phaseQueue} * @param type {@linkcode DynamicPhaseType} The type of dynamic phase to start diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index a431d973a02..eaa8a723745 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -1,4 +1,5 @@ import { globalScene } from "#app/global-scene"; +import { DynamicPhaseType } from "#enums/dynamic-phase-type"; import { SwitchType } from "#enums/switch-type"; import { UiMode } from "#enums/ui-mode"; import { BattlePhase } from "#phases/battle-phase"; @@ -75,8 +76,11 @@ export class SwitchPhase extends BattlePhase { if (slotIndex >= globalScene.currentBattle.getBattlerCount() && slotIndex < 6) { // Remove any pre-existing PostSummonPhase under the same field index. // Pre-existing PostSummonPhases may occur when this phase is invoked during a prompt to switch at the start of a wave. - globalScene.phaseManager.tryRemovePhase( + // TODO: Separate the animations from `SwitchSummonPhase` and co. into another phase and use that on initial switch - this is a band-aid fix + globalScene.phaseManager.tryRemoveDynamicPhase( + DynamicPhaseType.POST_SUMMON, p => p.is("PostSummonPhase") && p.player && p.fieldIndex === this.fieldIndex, + "all", ); const switchType = option === PartyOption.PASS_BATON ? SwitchType.BATON_PASS : this.switchType; globalScene.phaseManager.unshiftNew("SwitchSummonPhase", switchType, fieldIndex, slotIndex, this.doReturn); diff --git a/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts index 3c283e0392b..8064f1e62aa 100644 --- a/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -35,13 +35,43 @@ describe("Abilities - Intimidate", () => { it("should lower all opponents' ATK by 1 stage on entry and switch", async () => { await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]); + const [mightyena, poochyena] = game.scene.getPlayerParty(); + const enemy = game.field.getEnemyPokemon(); expect(enemy.getStatStage(Stat.ATK)).toBe(-1); + expect(mightyena).toHaveAbilityApplied(AbilityId.INTIMIDATE); game.doSwitchPokemon(1); await game.toNextTurn(); + expect(poochyena.isActive()).toBe(true); expect(enemy.getStatStage(Stat.ATK)).toBe(-2); + expect(poochyena).toHaveAbilityApplied(AbilityId.INTIMIDATE); + }); + + it("should trigger once on initial switch prompt without cancelling opposing abilities", async () => { + await game.classicMode.runToSummon([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]); + await game.classicMode.startBattleWithSwitch(1); + + const [poochyena, mightyena] = game.scene.getPlayerParty(); + expect(poochyena.species.speciesId).toBe(SpeciesId.POOCHYENA); + + const enemy = game.field.getEnemyPokemon(); + expect(enemy).toHaveStatStage(Stat.ATK, -1); + expect(poochyena).toHaveStatStage(Stat.ATK, -1); + + expect(poochyena).toHaveAbilityApplied(AbilityId.INTIMIDATE); + expect(mightyena).not.toHaveAbilityApplied(AbilityId.INTIMIDATE); + }); + + it("should activate on reload with single party", async () => { + await game.classicMode.startBattle([SpeciesId.MIGHTYENA]); + + expect(game.field.getEnemyPokemon()).toHaveStatStage(Stat.ATK, -1); + + await game.reload.reloadSession(); + + expect(game.field.getEnemyPokemon()).toHaveStatStage(Stat.ATK, -1); }); it("should lower ATK of all opponents in a double battle", async () => { diff --git a/test/test-utils/helpers/classic-mode-helper.ts b/test/test-utils/helpers/classic-mode-helper.ts index 008648fcd0d..c625ebc911c 100644 --- a/test/test-utils/helpers/classic-mode-helper.ts +++ b/test/test-utils/helpers/classic-mode-helper.ts @@ -1,6 +1,7 @@ import { getGameMode } from "#app/game-mode"; import overrides from "#app/overrides"; import { BattleStyle } from "#enums/battle-style"; +import { Button } from "#enums/buttons"; import { GameModes } from "#enums/game-modes"; import { Nature } from "#enums/nature"; import type { SpeciesId } from "#enums/species-id"; @@ -100,4 +101,33 @@ export class ClassicModeHelper extends GameManagerHelper { await this.game.phaseInterceptor.to(CommandPhase); console.log("==================[New Turn]=================="); } + + /** + * Queue inputs to switch at the start of the next battle, and then start it. + * @param pokemonIndex - The 0-indexed position of the party pokemon to switch to. + * Should never be called with 0 as that will select the currently active pokemon and freeze + * @returns A Promise that resolves once the battle has been started and the switch prompt resolved + * @todo Make this work for double battles + * @example + * ```ts + * await game.classicMode.runToSummon([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]) + * await game.startBattleWithSwitch(1); + * ``` + */ + public async startBattleWithSwitch(pokemonIndex: number): Promise { + this.game.scene.battleStyle = BattleStyle.SWITCH; + this.game.onNextPrompt( + "CheckSwitchPhase", + UiMode.CONFIRM, + () => { + this.game.scene.ui.getHandler().setCursor(0); + this.game.scene.ui.getHandler().processInput(Button.ACTION); + }, + () => this.game.isCurrentPhase("CommandPhase") || this.game.isCurrentPhase("TurnInitPhase"), + ); + this.game.doSelectPartyPokemon(pokemonIndex); + + await this.game.phaseInterceptor.to("CommandPhase"); + console.log("==================[New Battle (Initial Switch)]=================="); + } } From efaf7760e48df87e9a445b78154b4dfc3e5ca343 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 14:34:21 -0500 Subject: [PATCH 029/134] [Bug] Fix speedup/slowdown buttons not working properly (#6393) Fix speedup button resetting to minimum speed --- src/ui-inputs.ts | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 71c5ac1049e..72ae59faaec 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -13,7 +13,7 @@ import { SettingsGamepadUiHandler } from "#ui/settings-gamepad-ui-handler"; import { SettingsKeyboardUiHandler } from "#ui/settings-keyboard-ui-handler"; import { SettingsUiHandler } from "#ui/settings-ui-handler"; import { StarterSelectUiHandler } from "#ui/starter-select-ui-handler"; -import type Phaser from "phaser"; +import Phaser from "phaser"; type ActionKeys = Record void>; @@ -224,25 +224,26 @@ export class UiInputs { buttonSpeedChange(up = true): void { const settingGameSpeed = settingIndex(SettingKeys.Game_Speed); + const settingOptions = Setting[settingGameSpeed].options; + let currentSetting = settingOptions.findIndex(item => item.value === globalScene.gameSpeed.toString()); + // if current setting is -1, then the current game speed is not a valid option, so default to index 5 (3x) + if (currentSetting === -1) { + currentSetting = 5; + } + let direction: number; if (up && globalScene.gameSpeed < 5) { - globalScene.gameData.saveSetting( - SettingKeys.Game_Speed, - Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) + 1, - ); - if (globalScene.ui?.getMode() === UiMode.SETTINGS) { - (globalScene.ui.getHandler() as SettingsUiHandler).show([]); - } + direction = 1; } else if (!up && globalScene.gameSpeed > 1) { - globalScene.gameData.saveSetting( - SettingKeys.Game_Speed, - Math.max( - Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) - 1, - 0, - ), - ); - if (globalScene.ui?.getMode() === UiMode.SETTINGS) { - (globalScene.ui.getHandler() as SettingsUiHandler).show([]); - } + direction = -1; + } else { + return; + } + globalScene.gameData.saveSetting( + SettingKeys.Game_Speed, + Phaser.Math.Clamp(currentSetting + direction, 0, settingOptions.length - 1), + ); + if (globalScene.ui?.getMode() === UiMode.SETTINGS) { + (globalScene.ui.getHandler() as SettingsUiHandler).show([]); } } } From 30b7a6298851494dded15ec4e4520046ba9ee30c Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:03:28 -0500 Subject: [PATCH 030/134] [Bug] [Sprite] Fix third type icon missing texture (#6395) Fix third type icon --- src/ui/battle-info/enemy-battle-info.ts | 2 +- src/ui/battle-info/player-battle-info.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index d426a49df5c..4b37adc74aa 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -36,7 +36,7 @@ export class EnemyBattleInfo extends BattleInfo { override constructTypeIcons(): void { this.type1Icon = globalScene.add.sprite(-15, -15.5, "pbinfo_enemy_type1").setName("icon_type_1").setOrigin(0); this.type2Icon = globalScene.add.sprite(-15, -2.5, "pbinfo_enemy_type2").setName("icon_type_2").setOrigin(0); - this.type3Icon = globalScene.add.sprite(0, 15.5, "pbinfo_enemy_type3").setName("icon_type_3").setOrigin(0); + this.type3Icon = globalScene.add.sprite(0, -15.5, "pbinfo_enemy_type").setName("icon_type_3").setOrigin(0); this.add([this.type1Icon, this.type2Icon, this.type3Icon]); } diff --git a/src/ui/battle-info/player-battle-info.ts b/src/ui/battle-info/player-battle-info.ts index 998f7cbb41f..f0b50748154 100644 --- a/src/ui/battle-info/player-battle-info.ts +++ b/src/ui/battle-info/player-battle-info.ts @@ -21,7 +21,7 @@ export class PlayerBattleInfo extends BattleInfo { override constructTypeIcons(): void { this.type1Icon = globalScene.add.sprite(-139, -17, "pbinfo_player_type1").setName("icon_type_1").setOrigin(0); this.type2Icon = globalScene.add.sprite(-139, -1, "pbinfo_player_type2").setName("icon_type_2").setOrigin(0); - this.type3Icon = globalScene.add.sprite(-154, -17, "pbinfo_player_type3").setName("icon_type_3").setOrigin(0); + this.type3Icon = globalScene.add.sprite(-154, -17, "pbinfo_player_type").setName("icon_type_3").setOrigin(0); this.add([this.type1Icon, this.type2Icon, this.type3Icon]); } From cd610ff2c59996ef78436fe7652b7063290fffdb Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:24:12 -0500 Subject: [PATCH 031/134] [Bug] [Ability] Fix trace's RNG (#6398) * Fix rng in trace * Fix undefined var --- src/data/abilities/ability.ts | 39 +++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index afac857395c..a2e006e07c8 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -3014,41 +3014,44 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { } } -/** Attempts to copy a pokemon's ability */ +/** + * Attempts to copy a pokemon's ability + * + * @remarks + * Hardcodes idiosyncrasies specific to trace, so should not be used for other abilities + * that might copy abilities in the future + * @sealed + */ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { private target: Pokemon; private targetAbilityName: string; - override canApply({ pokemon }: AbAttrBaseParams): boolean { - const targets = pokemon.getOpponents(); + override canApply({ pokemon, simulated }: AbAttrBaseParams): boolean { + const targets = pokemon + .getOpponents() + .filter(t => t.getAbility().isCopiable || t.getAbility().id === AbilityId.WONDER_GUARD); if (!targets.length) { return false; } let target: Pokemon; - if (targets.length > 1) { - globalScene.executeWithSeedOffset(() => (target = randSeedItem(targets)), globalScene.currentBattle.waveIndex); + // simulated call always chooses first target so as to not advance RNG + if (targets.length > 1 && !simulated) { + target = targets[randSeedInt(targets.length)]; } else { target = targets[0]; } - if ( - !target!.getAbility().isCopiable && - // Wonder Guard is normally uncopiable so has the attribute, but Trace specifically can copy it - !(pokemon.hasAbility(AbilityId.TRACE) && target!.getAbility().id === AbilityId.WONDER_GUARD) - ) { - return false; - } - - this.target = target!; - this.targetAbilityName = allAbilities[target!.getAbility().id].name; + this.target = target; + this.targetAbilityName = allAbilities[target.getAbility().id].name; return true; } override apply({ pokemon, simulated }: AbAttrBaseParams): void { - if (!simulated) { - pokemon.setTempAbility(this.target!.getAbility()); - setAbilityRevealed(this.target!); + // Protect against this somehow being called before canApply by ensuring target is defined + if (!simulated && this.target) { + pokemon.setTempAbility(this.target.getAbility()); + setAbilityRevealed(this.target); pokemon.updateInfo(); } } From a85d8cd5de924b432da9db5994f1dbac4331a943 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:32:12 -0500 Subject: [PATCH 032/134] [Bug] [Sprite] Fix fusion shiny party icon (#6397) * Fix shiny icon with fusion shiny in party * Fix hover tooltip not working when first splicing a mon * Fix fusion shiny icon on summary screen --- src/ui/battle-info/battle-info.ts | 11 ++++------- src/ui/party-ui-handler.ts | 3 ++- src/ui/summary-ui-handler.ts | 13 +++++++------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/ui/battle-info/battle-info.ts b/src/ui/battle-info/battle-info.ts index 810d0c7c328..1641585a603 100644 --- a/src/ui/battle-info/battle-info.ts +++ b/src/ui/battle-info/battle-info.ts @@ -287,9 +287,6 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { 2.5, ); this.splicedIcon.setVisible(pokemon.isFusion(true)); - if (!this.splicedIcon.visible) { - return; - } this.splicedIcon .on("pointerover", () => globalScene.ui.showTooltip( @@ -323,6 +320,10 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { .setVisible(pokemon.isShiny()) .setTint(getVariantTint(baseVariant)); + this.shinyIcon + .on("pointerover", () => globalScene.ui.showTooltip("", i18next.t("common:shinyOnHover") + shinyDescriptor)) + .on("pointerout", () => globalScene.ui.hideTooltip()); + if (!this.shinyIcon.visible) { return; } @@ -335,10 +336,6 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { } shinyDescriptor += ")"; } - - this.shinyIcon - .on("pointerover", () => globalScene.ui.showTooltip("", i18next.t("common:shinyOnHover") + shinyDescriptor)) - .on("pointerout", () => globalScene.ui.hideTooltip()); } initInfo(pokemon: Pokemon) { diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 446fa37ec4a..73fc1bfc010 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -2041,12 +2041,13 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.pokemon.isShiny()) { const doubleShiny = this.pokemon.isDoubleShiny(false); + const largeIconTint = doubleShiny ? this.pokemon.getBaseVariant() : this.pokemon.getVariant(); const shinyStar = globalScene.add .image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`) .setOrigin(0) .setPositionRelative(this.slotName, shinyIconToNameOffset.x, shinyIconToNameOffset.y) - .setTint(getVariantTint(this.pokemon.getBaseVariant())); + .setTint(getVariantTint(largeIconTint)); slotInfoContainer.add(shinyStar); if (doubleShiny) { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b6447f03587..dfa70d1dc76 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -430,20 +430,21 @@ export class SummaryUiHandler extends UiHandler { this.friendshipShadow.setCrop(0, 0, 16, 16 - 16 * ((this.pokemon?.friendship || 0) / 255)); const doubleShiny = this.pokemon.isDoubleShiny(false); - const baseVariant = this.pokemon.getBaseVariant(doubleShiny); + const bigIconVariant = doubleShiny ? this.pokemon.getBaseVariant(doubleShiny) : this.pokemon.getVariant(); this.shinyIcon.setPositionRelative( this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3, ); - this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); - this.shinyIcon.setVisible(this.pokemon.isShiny(false)); - this.shinyIcon.setTint(getVariantTint(baseVariant)); + this.shinyIcon + .setTexture(`shiny_star${doubleShiny ? "_1" : ""}`) + .setVisible(this.pokemon.isShiny(false)) + .setTint(getVariantTint(bigIconVariant)); if (this.shinyIcon.visible) { let shinyDescriptor = ""; - if (doubleShiny || baseVariant) { - shinyDescriptor = " (" + getShinyDescriptor(baseVariant); + if (doubleShiny || bigIconVariant) { + shinyDescriptor = " (" + getShinyDescriptor(bigIconVariant); if (doubleShiny) { shinyDescriptor += "/" + getShinyDescriptor(this.pokemon.fusionVariant); } From 6fac1a5052a18504d5dff2c8858fea48a31431e6 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 17:49:28 -0500 Subject: [PATCH 033/134] [Bug] [Ability] Fix cute charm (#6399) Fix cute charm not working --- src/data/abilities/ability.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index a2e006e07c8..94e0a4cda31 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -1263,17 +1263,17 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { this.turnCount = turnCount; } - override canApply({ move, pokemon, opponent: attacker }: PostMoveInteractionAbAttrParams): boolean { + override canApply({ move, pokemon, opponent }: PostMoveInteractionAbAttrParams): boolean { return ( - move.doesFlagEffectApply({ flag: MoveFlags.MAKES_CONTACT, user: attacker, target: pokemon }) && + move.doesFlagEffectApply({ flag: MoveFlags.MAKES_CONTACT, user: opponent, target: pokemon }) && pokemon.randBattleSeedInt(100) < this.chance && - attacker.canAddTag(this.tagType) + opponent.canAddTag(this.tagType) ); } - override apply({ simulated, opponent: attacker, move }: PostMoveInteractionAbAttrParams): void { + override apply({ pokemon, simulated, opponent, move }: PostMoveInteractionAbAttrParams): void { if (!simulated) { - attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); + opponent.addTag(this.tagType, this.turnCount, move.id, pokemon.id); } } } From 4b8c0643351a5c76bdb4237b6b60615db0a13578 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:47:52 -0500 Subject: [PATCH 034/134] [Bug] [Ability] Fix berserk multi proc (#6402) * Fix berserk activating multiple times with multi strike * Apply kev's suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update doc comments --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/abilities/ability.ts | 14 +++++------ src/phases/move-effect-phase.ts | 44 +++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 94e0a4cda31..66d00d950d2 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -970,6 +970,8 @@ export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr { export interface PostMoveInteractionAbAttrParams extends AugmentMoveInteractionAbAttrParams { /** Stores the hit result of the move used in the interaction */ readonly hitResult: HitResult; + /** The amount of damage dealt in the interaction */ + readonly damage: number; } export class PostDefendAbAttr extends AbAttr { @@ -1079,20 +1081,16 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr { this.selfTarget = selfTarget; } - override canApply({ pokemon, opponent: attacker, move }: PostMoveInteractionAbAttrParams): boolean { + override canApply({ pokemon, opponent: attacker, move, damage }: PostMoveInteractionAbAttrParams): boolean { const hpGateFlat: number = Math.ceil(pokemon.getMaxHp() * this.hpGate); - const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]; - const damageReceived = lastAttackReceived?.damage || 0; - return ( - this.condition(pokemon, attacker, move) && pokemon.hp <= hpGateFlat && pokemon.hp + damageReceived > hpGateFlat - ); + return this.condition(pokemon, attacker, move) && pokemon.hp <= hpGateFlat && pokemon.hp + damage > hpGateFlat; } - override apply({ simulated, pokemon, opponent: attacker }: PostMoveInteractionAbAttrParams): void { + override apply({ simulated, pokemon, opponent }: PostMoveInteractionAbAttrParams): void { if (!simulated) { globalScene.phaseManager.unshiftNew( "StatStageChangePhase", - (this.selfTarget ? pokemon : attacker).getBattlerIndex(), + (this.selfTarget ? pokemon : opponent).getBattlerIndex(), true, this.stats, this.stages, diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 767d7a79968..c8dcbae907c 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -400,10 +400,17 @@ export class MoveEffectPhase extends PokemonPhase { * @param user - The {@linkcode Pokemon} using this phase's invoked move * @param target - {@linkcode Pokemon} the current target of this phase's invoked move * @param hitResult - The {@linkcode HitResult} of the attempted move + * @param damage - The amount of damage dealt to the target in the interaction * @param wasCritical - `true` if the move was a critical hit */ - protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult, wasCritical = false): void { - const params = { pokemon: target, opponent: user, move: this.move, hitResult }; + protected applyOnGetHitAbEffects( + user: Pokemon, + target: Pokemon, + hitResult: HitResult, + damage: number, + wasCritical = false, + ): void { + const params = { pokemon: target, opponent: user, move: this.move, hitResult, damage }; applyAbAttrs("PostDefendAbAttr", params); if (wasCritical) { @@ -763,12 +770,12 @@ export class MoveEffectPhase extends PokemonPhase { this.triggerMoveEffects(MoveEffectTrigger.PRE_APPLY, user, target); - const [hitResult, wasCritical] = this.applyMove(user, target, effectiveness); + const [hitResult, wasCritical, dmg] = this.applyMove(user, target, effectiveness); // Apply effects to the user (always) and the target (if not blocked by substitute). this.triggerMoveEffects(MoveEffectTrigger.POST_APPLY, user, target, firstTarget, true); if (!this.move.hitsSubstitute(user, target)) { - this.applyOnTargetEffects(user, target, hitResult, firstTarget, wasCritical); + this.applyOnTargetEffects(user, target, hitResult, firstTarget, dmg, wasCritical); } if (this.lastHit) { globalScene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); @@ -788,9 +795,13 @@ export class MoveEffectPhase extends PokemonPhase { * @param user - The {@linkcode Pokemon} using this phase's invoked move * @param target - The {@linkcode Pokemon} targeted by the move * @param effectiveness - The effectiveness of the move against the target - * @returns The {@linkcode HitResult} of the move against the target and a boolean indicating whether the target was crit + * @returns The {@linkcode HitResult} of the move against the target, a boolean indicating whether the target was crit, and the amount of damage dealt */ - protected applyMoveDamage(user: Pokemon, target: Pokemon, effectiveness: TypeDamageMultiplier): [HitResult, boolean] { + protected applyMoveDamage( + user: Pokemon, + target: Pokemon, + effectiveness: TypeDamageMultiplier, + ): [result: HitResult, critical: boolean, damage: number] { const isCritical = target.getCriticalHitResult(user, this.move); /* @@ -821,7 +832,7 @@ export class MoveEffectPhase extends PokemonPhase { const isOneHitKo = result === HitResult.ONE_HIT_KO; if (!dmg) { - return [result, false]; + return [result, false, 0]; } target.lapseTags(BattlerTagLapseType.HIT); @@ -850,7 +861,7 @@ export class MoveEffectPhase extends PokemonPhase { } if (damage <= 0) { - return [result, isCritical]; + return [result, isCritical, damage]; } if (user.isPlayer()) { @@ -879,7 +890,7 @@ export class MoveEffectPhase extends PokemonPhase { globalScene.applyModifiers(DamageMoneyRewardModifier, true, user, new NumberHolder(damage)); } - return [result, isCritical]; + return [result, isCritical, damage]; } /** @@ -932,12 +943,17 @@ export class MoveEffectPhase extends PokemonPhase { * @param user - The {@linkcode Pokemon} using this phase's invoked move * @param target - The {@linkcode Pokemon} struck by the move * @param effectiveness - The effectiveness of the move against the target + * @returns The {@linkcode HitResult} of the move against the target, a boolean indicating whether the target was crit, and the amount of damage dealt */ - protected applyMove(user: Pokemon, target: Pokemon, effectiveness: TypeDamageMultiplier): [HitResult, boolean] { + protected applyMove( + user: Pokemon, + target: Pokemon, + effectiveness: TypeDamageMultiplier, + ): [HitResult, critical: boolean, damage: number] { const moveCategory = user.getMoveCategory(target, this.move); if (moveCategory === MoveCategory.STATUS) { - return [HitResult.STATUS, false]; + return [HitResult.STATUS, false, 0]; } const result = this.applyMoveDamage(user, target, effectiveness); @@ -960,6 +976,7 @@ export class MoveEffectPhase extends PokemonPhase { * @param target - The {@linkcode Pokemon} targeted by the move * @param hitResult - The {@linkcode HitResult} obtained from applying the move * @param firstTarget - `true` if the target is the first Pokemon hit by the attack + * @param damage - The amount of damage dealt to the target in the interaction * @param wasCritical - `true` if the move was a critical hit */ protected applyOnTargetEffects( @@ -967,6 +984,7 @@ export class MoveEffectPhase extends PokemonPhase { target: Pokemon, hitResult: HitResult, firstTarget: boolean, + damage: number, wasCritical = false, ): void { /** Does {@linkcode hitResult} indicate that damage was dealt to the target? */ @@ -979,8 +997,8 @@ export class MoveEffectPhase extends PokemonPhase { this.triggerMoveEffects(MoveEffectTrigger.POST_APPLY, user, target, firstTarget, false); this.applyHeldItemFlinchCheck(user, target, dealsDamage); - this.applyOnGetHitAbEffects(user, target, hitResult, wasCritical); - applyAbAttrs("PostAttackAbAttr", { pokemon: user, opponent: target, move: this.move, hitResult }); + this.applyOnGetHitAbEffects(user, target, hitResult, damage, wasCritical); + applyAbAttrs("PostAttackAbAttr", { pokemon: user, opponent: target, move: this.move, hitResult, damage: damage }); // We assume only enemy Pokemon are able to have the EnemyAttackStatusEffectChanceModifier from tokens if (!user.isPlayer() && this.move.is("AttackMove")) { From e139f714dee61047de9770448c0cac41bbc55023 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:52:44 -0500 Subject: [PATCH 035/134] Bump locales --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index a73ea68fdda..102cbdcd924 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit a73ea68fdda09bb5018f524cbe6b7e73a3ddf4e0 +Subproject commit 102cbdcd924e2a7cdc7eab64d1ce79f6ec7604ff From d8fe5ad7536a46a1b7becc9fa0fb51a4d5ed1857 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:51:16 -0500 Subject: [PATCH 036/134] Bump to version 1.10.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9648361341a..a63a1ef2e5b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.2", + "version": "1.10.3", "type": "module", "scripts": { "start": "vite", From 1f4efa0e27709f2789aebbd92738da81513969af Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:45:00 -0700 Subject: [PATCH 037/134] Update version to 1.10.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a63a1ef2e5b..db07b9be8db 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.3", + "version": "1.10.4", "type": "module", "scripts": { "start": "vite", From 56752d6f4a951da4524c41c0459d772b7a65807d Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:08:05 -0500 Subject: [PATCH 038/134] Ensure users that install pokerogue as a PWA do not remain on the old version --- public/service-worker.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/service-worker.js b/public/service-worker.js index b45d2484709..2d5b304db6b 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,3 +1,9 @@ +/// self.addEventListener('install', function () { console.log('Service worker installing...'); }); + +self.addEventListener('activate', (event) => { + // @ts-expect-error: See https://github.com/microsoft/TypeScript/issues/14877 + event.waitUntil(self.clients.claim()); +}) \ No newline at end of file From e95450aa49ddcf4b50eadbcb2e579c5cfdcd4a7c Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 26 Aug 2025 07:17:16 +1000 Subject: [PATCH 039/134] Imported systemdata always increments playtime (#6394) Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/system/game-data.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 3a4dafb2de2..47d3c2df2f5 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1515,6 +1515,7 @@ export class GameData { switch (dataType) { case GameDataType.SYSTEM: { dataStr = this.convertSystemDataStr(dataStr); + dataStr = dataStr.replace(/"playTime":\d+/, `"playTime":${this.gameStats.playTime + 60}`); const systemData = this.parseSystemData(dataStr); valid = !!systemData.dexData && !!systemData.timestamp; break; From 1b6a52e520395020acf63df88ca403d9b9801f58 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:55:31 -0700 Subject: [PATCH 040/134] [Balance] Moved Future Sight after Weather, before berries (#6412) --- src/phases/turn-start-phase.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 8fc7a763c8f..59211a9eb03 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -179,12 +179,11 @@ export class TurnStartPhase extends FieldPhase { // https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179 phaseManager.pushNew("WeatherEffectPhase"); + phaseManager.pushNew("PositionalTagPhase"); phaseManager.pushNew("BerryPhase"); - /** Add a new phase to check who should be taking status damage */ phaseManager.pushNew("CheckStatusEffectPhase", moveOrder); - phaseManager.pushNew("PositionalTagPhase"); phaseManager.pushNew("TurnEndPhase"); /* From 622ee5ce80de422fe593020531718dd4eb895974 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 25 Aug 2025 18:25:53 -0500 Subject: [PATCH 041/134] [Bug] Fix typecheck bug (#6415) Add `public/service-worker.js` to `ts`'s exclude --- tsconfig.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index dcbf7456df8..8becb4c00ec 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -59,5 +59,12 @@ "outDir": "./build", "noEmit": true }, - "exclude": ["node_modules", "dist", "vite.config.ts", "vitest.config.ts", "vitest.workspace.ts"] + "exclude": [ + "node_modules", + "dist", + "vite.config.ts", + "vitest.config.ts", + "vitest.workspace.ts", + "public/service-worker.js" + ] } From f0c24cd16e02be946a8abb141394c7f5e1eea19a Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 25 Aug 2025 18:45:41 -0500 Subject: [PATCH 042/134] Remove unnecessary tsdoc comments from `service-worker.js` (#6417) Remove typescript comments form `service-worker.js` --- public/service-worker.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/service-worker.js b/public/service-worker.js index 2d5b304db6b..ff380adca73 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,9 +1,7 @@ -/// self.addEventListener('install', function () { console.log('Service worker installing...'); }); self.addEventListener('activate', (event) => { - // @ts-expect-error: See https://github.com/microsoft/TypeScript/issues/14877 event.waitUntil(self.clients.claim()); }) \ No newline at end of file From c8a66b2e59461a57226cdb9440031278ffaef944 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 26 Aug 2025 01:48:55 -0500 Subject: [PATCH 043/134] [Bug] Prevent an empty starterpreferences object from being saved (#6410) * Prevent an empty starterpreferences object from being saved * Fix ssui nullish coalescing * Update src/utils/data.ts Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> --------- Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> --- src/ui/starter-select-ui-handler.ts | 7 ++++--- src/utils/data.ts | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a29a65aca80..7396608bfc4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1828,9 +1828,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { // The persistent starter data to apply e.g. candy upgrades const persistentStarterData = globalScene.gameData.starterData[this.lastSpecies.speciesId]; // The sanitized starter preferences - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] ?? {}; // The original starter preferences - const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId]; + const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId] ?? {}; // this gets the correct pokemon cursor depending on whether you're in the starter screen or the party icons if (!this.starterIconsCursorObj.visible) { @@ -3408,8 +3408,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (species) { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + // Bang is correct due to the `?` before variant const variant = this.starterPreferences[species.speciesId]?.variant - ? (this.starterPreferences[species.speciesId].variant as Variant) + ? (this.starterPreferences[species.speciesId]!.variant as Variant) : defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)).setTint(tint); diff --git a/src/utils/data.ts b/src/utils/data.ts index 6580ecf2ee9..337aac1110b 100644 --- a/src/utils/data.ts +++ b/src/utils/data.ts @@ -64,7 +64,7 @@ const StarterPrefers_DEFAULT: string = "{}"; let StarterPrefers_private_latest: string = StarterPrefers_DEFAULT; export interface StarterPreferences { - [key: number]: StarterAttributes; + [key: number]: StarterAttributes | undefined; } // called on starter selection show once @@ -74,10 +74,27 @@ export function loadStarterPreferences(): StarterPreferences { localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT), ); } -// called on starter selection clear, always + +/** + * Check if an object has no properties of its own (its shape is `{}`) + * @param obj - Object to check + * @returns - Whether the object is bare + */ +export function isBareObject(obj: object): boolean { + for (const _ in obj) { + return false; + } + return true; +} export function saveStarterPreferences(prefs: StarterPreferences): void { - const pStr: string = JSON.stringify(prefs); + // Fastest way to check if an object has any properties (does no allocation) + if (isBareObject(prefs)) { + console.warn("Refusing to save empty starter preferences"); + return; + } + // no reason to store `{}` (for starters not customized) + const pStr: string = JSON.stringify(prefs, (_, value) => (isBareObject(value) ? undefined : value)); if (pStr !== StarterPrefers_private_latest) { // something changed, store the update localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); From 4aac5472a97f09388949a12def706e03ac0cd123 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 26 Aug 2025 02:51:35 -0400 Subject: [PATCH 044/134] [Bug] Fix oversight where mons aren't guaranteed damaging moves if none are STAB (#6406) --- src/field/pokemon.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index cc7e27caae4..dab96e4090a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3243,6 +3243,18 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { rand -= stabMovePool[index++][1]; } this.moveset.push(new PokemonMove(stabMovePool[index][0])); + } else { + // If there are no damaging STAB moves, just force a random damaging move + const attackMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS); + if (attackMovePool.length) { + const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0); + let rand = randSeedInt(totalWeight); + let index = 0; + while (rand > attackMovePool[index][1]) { + rand -= attackMovePool[index++][1]; + } + this.moveset.push(new PokemonMove(attackMovePool[index][0], 0, 0)); + } } while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { From 88e42ba4c439a2dcaf9baca206a62e461683127d Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 26 Aug 2025 01:54:26 -0500 Subject: [PATCH 045/134] [Balance][ME]Tweak weird dream do a party heal in option 1, random tera, and no longer revive pokemon in hardcore (#6409) * Tweak weird dream option 1 Transfer HP ratio and status onto transformed pokemon * Make weird dream randomize tera type --- .../encounters/weird-dream-encounter.ts | 24 +++++++++++++++++-- src/enums/pokemon-type.ts | 3 +++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 790bdf0dbef..240a0df9e95 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -2,6 +2,7 @@ import { globalScene } from "#app/global-scene"; import { allSpecies, modifierTypes } from "#data/data-lists"; import { getLevelTotalExp } from "#data/exp"; import type { PokemonSpecies } from "#data/pokemon-species"; +import { AbilityId } from "#enums/ability-id"; import { Challenges } from "#enums/challenges"; import { ModifierTier } from "#enums/modifier-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -10,8 +11,9 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Nature } from "#enums/nature"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { PlayerGender } from "#enums/player-gender"; -import { PokemonType } from "#enums/pokemon-type"; +import { MAX_POKEMON_TYPE, PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; +import { StatusEffect } from "#enums/status-effect"; import { TrainerType } from "#enums/trainer-type"; import type { PlayerPokemon, Pokemon } from "#field/pokemon"; import type { PokemonHeldItemModifier } from "#modifiers/modifier"; @@ -219,6 +221,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit await showEncounterText(`${namespace}:option.1.dreamComplete`); await doNewTeamPostProcess(transformations); + globalScene.phaseManager.unshiftNew("PartyHealPhase", true); setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, @@ -230,7 +233,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit ], fillRemaining: false, }); - leaveEncounterWithoutBattle(true); + leaveEncounterWithoutBattle(false); }) .build(), ) @@ -431,6 +434,8 @@ function getTeamTransformations(): PokemonTransformation[] { newAbilityIndex, undefined, ); + + transformation.newPokemon.teraType = randSeedInt(MAX_POKEMON_TYPE); } return pokemonTransformations; @@ -440,6 +445,8 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { let atLeastOneNewStarter = false; for (const transformation of transformations) { const previousPokemon = transformation.previousPokemon; + const oldHpRatio = previousPokemon.getHpRatio(true); + const oldStatus = previousPokemon.status; const newPokemon = transformation.newPokemon; const speciesRootForm = newPokemon.species.getRootSpeciesId(); @@ -462,6 +469,19 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { } newPokemon.calculateStats(); + if (oldHpRatio > 0) { + newPokemon.hp = Math.ceil(oldHpRatio * newPokemon.getMaxHp()); + // Assume that the `status` instance can always safely be transferred to the new pokemon + // This is the case (as of version 1.10.4) + // Safeguard against COMATOSE here + if (!newPokemon.hasAbility(AbilityId.COMATOSE, false, true)) { + newPokemon.status = oldStatus; + } + } else { + newPokemon.hp = 0; + newPokemon.doSetStatus(StatusEffect.FAINT); + } + await newPokemon.updateInfo(); } diff --git a/src/enums/pokemon-type.ts b/src/enums/pokemon-type.ts index eca02bae275..210e3c3dcbe 100644 --- a/src/enums/pokemon-type.ts +++ b/src/enums/pokemon-type.ts @@ -20,3 +20,6 @@ export enum PokemonType { FAIRY, STELLAR } + +/** The largest legal value for a {@linkcode PokemonType} (includes Stellar) */ +export const MAX_POKEMON_TYPE = PokemonType.STELLAR; \ No newline at end of file From 63c1c34746d22a3678397ab30d04e4a5f087cbc3 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 26 Aug 2025 08:57:11 +0200 Subject: [PATCH 046/134] [Hotfix] Fix tyrogue evo (#6414) * Fixed tyrogue evo condition * Added test for tyrogue evolution * Update src/data/balance/pokemon-evolutions.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update src/data/balance/pokemon-evolutions.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update src/data/balance/pokemon-evolutions.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Added missing typeof in suggestion --------- Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/data/balance/pokemon-evolutions.ts | 5 +++-- test/evolution.test.ts | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index bf90ebb7edc..bf588784f24 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -77,7 +77,8 @@ export enum EvolutionItem { LEADERS_CREST } -type TyrogueMove = MoveId.LOW_SWEEP | MoveId.MACH_PUNCH | MoveId.RAPID_SPIN; +const tyrogueMoves = [MoveId.LOW_SWEEP, MoveId.MACH_PUNCH, MoveId.RAPID_SPIN] as const; +type TyrogueMove = typeof tyrogueMoves[number]; /** * Pokemon Evolution tuple type consisting of: @@ -192,7 +193,7 @@ export class SpeciesEvolutionCondition { case EvoCondKey.WEATHER: return cond.weather.includes(globalScene.arena.getWeatherType()); case EvoCondKey.TYROGUE: - return pokemon.getMoveset(true).find(m => m.moveId as TyrogueMove)?.moveId === cond.move; + return pokemon.getMoveset(true).find(m => (tyrogueMoves as readonly MoveId[]) .includes(m.moveId))?.moveId === cond.move; case EvoCondKey.NATURE: return cond.nature.includes(pokemon.getNature()); case EvoCondKey.RANDOM_FORM: { diff --git a/test/evolution.test.ts b/test/evolution.test.ts index 3fb763e9190..7079404bdec 100644 --- a/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -175,4 +175,27 @@ describe("Evolution", () => { expect(fourForm.evoFormKey).toBe("four"); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is "four" } }); + + it("tyrogue should evolve if move is not in first slot", async () => { + game.override + .moveset([MoveId.TACKLE, MoveId.RAPID_SPIN, MoveId.LOW_KICK]) + .enemySpecies(SpeciesId.GOLEM) + .enemyMoveset(MoveId.SPLASH) + .startingWave(41) + .startingLevel(19) + .enemyLevel(30); + + await game.classicMode.startBattle([SpeciesId.TYROGUE]); + + const tyrogue = game.field.getPlayerPokemon(); + + const golem = game.field.getEnemyPokemon(); + golem.hp = 1; + expect(golem.hp).toBe(1); + + game.move.select(MoveId.TACKLE); + await game.phaseInterceptor.to("EndEvolutionPhase"); + + expect(tyrogue.species.speciesId).toBe(SpeciesId.HITMONTOP); + }); }); From 701eecf9477caef824551ffa34116bb370a065b7 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 26 Aug 2025 01:15:00 -0700 Subject: [PATCH 047/134] Revert #6410 starter preferences hotfix (#6422) Revert "[Bug] Prevent an empty starterpreferences object from being saved (#6410)" This reverts commit c8a66b2e59461a57226cdb9440031278ffaef944. --- src/ui/starter-select-ui-handler.ts | 7 +++---- src/utils/data.ts | 23 +++-------------------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 7396608bfc4..a29a65aca80 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1828,9 +1828,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { // The persistent starter data to apply e.g. candy upgrades const persistentStarterData = globalScene.gameData.starterData[this.lastSpecies.speciesId]; // The sanitized starter preferences - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] ?? {}; + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; // The original starter preferences - const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId] ?? {}; + const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId]; // this gets the correct pokemon cursor depending on whether you're in the starter screen or the party icons if (!this.starterIconsCursorObj.visible) { @@ -3408,9 +3408,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (species) { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - // Bang is correct due to the `?` before variant const variant = this.starterPreferences[species.speciesId]?.variant - ? (this.starterPreferences[species.speciesId]!.variant as Variant) + ? (this.starterPreferences[species.speciesId].variant as Variant) : defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)).setTint(tint); diff --git a/src/utils/data.ts b/src/utils/data.ts index 337aac1110b..6580ecf2ee9 100644 --- a/src/utils/data.ts +++ b/src/utils/data.ts @@ -64,7 +64,7 @@ const StarterPrefers_DEFAULT: string = "{}"; let StarterPrefers_private_latest: string = StarterPrefers_DEFAULT; export interface StarterPreferences { - [key: number]: StarterAttributes | undefined; + [key: number]: StarterAttributes; } // called on starter selection show once @@ -74,27 +74,10 @@ export function loadStarterPreferences(): StarterPreferences { localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT), ); } - -/** - * Check if an object has no properties of its own (its shape is `{}`) - * @param obj - Object to check - * @returns - Whether the object is bare - */ -export function isBareObject(obj: object): boolean { - for (const _ in obj) { - return false; - } - return true; -} +// called on starter selection clear, always export function saveStarterPreferences(prefs: StarterPreferences): void { - // Fastest way to check if an object has any properties (does no allocation) - if (isBareObject(prefs)) { - console.warn("Refusing to save empty starter preferences"); - return; - } - // no reason to store `{}` (for starters not customized) - const pStr: string = JSON.stringify(prefs, (_, value) => (isBareObject(value) ? undefined : value)); + const pStr: string = JSON.stringify(prefs); if (pStr !== StarterPrefers_private_latest) { // something changed, store the update localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); From 6745ce783931897df8f4d3549e427ecf800968f6 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 26 Aug 2025 12:11:16 -0500 Subject: [PATCH 048/134] Fix starterpref reset (#6430) * Prevent an empty starterpreferences object from being saved * Fix ssui nullish coalescing * Update src/utils/data.ts Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> * Fix starter preferences clearing, add tests --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> --- src/ui/starter-select-ui-handler.ts | 120 +++++++++++++++++----------- src/utils/data.ts | 29 ++++++- test/utils/data.test.ts | 39 +++++++++ 3 files changed, 136 insertions(+), 52 deletions(-) create mode 100644 test/utils/data.test.ts diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a29a65aca80..c3214fa5420 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -72,7 +72,7 @@ import { rgbHexToRgba, } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; -import { loadStarterPreferences, saveStarterPreferences } from "#utils/data"; +import { deepCopy, loadStarterPreferences, saveStarterPreferences } from "#utils/data"; import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils"; import { toCamelCase, toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; @@ -1148,7 +1148,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(true); this.starterPreferences = loadStarterPreferences(); - this.originalStarterPreferences = loadStarterPreferences(); + // Deep copy the JSON (avoid re-loading from disk) + this.originalStarterPreferences = deepCopy(this.starterPreferences); this.allSpecies.forEach((species, s) => { const icon = this.starterContainers[s].icon; @@ -1212,6 +1213,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { preferences: StarterPreferences, ignoreChallenge = false, ): StarterAttributes { + // if preferences for the species is undefined, set it to an empty object + preferences[species.speciesId] ??= {}; const starterAttributes = preferences[species.speciesId]; const { dexEntry, starterDataEntry: starterData } = this.getSpeciesData(species.speciesId, !ignoreChallenge); @@ -1828,9 +1831,15 @@ export class StarterSelectUiHandler extends MessageUiHandler { // The persistent starter data to apply e.g. candy upgrades const persistentStarterData = globalScene.gameData.starterData[this.lastSpecies.speciesId]; // The sanitized starter preferences - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; - // The original starter preferences - const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId]; + if (this.starterPreferences[this.lastSpecies.speciesId] === undefined) { + this.starterPreferences[this.lastSpecies.speciesId] = {}; + } + if (this.originalStarterPreferences[this.lastSpecies.speciesId] === undefined) { + this.originalStarterPreferences[this.lastSpecies.speciesId] = {}; + } + // Bangs are safe here due to the above check + const starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]!; + const originalStarterAttributes = this.originalStarterPreferences[this.lastSpecies.speciesId]!; // this gets the correct pokemon cursor depending on whether you're in the starter screen or the party icons if (!this.starterIconsCursorObj.visible) { @@ -2050,10 +2059,6 @@ export class StarterSelectUiHandler extends MessageUiHandler { const option: OptionSelectItem = { label: getNatureName(n, true, true, true, globalScene.uiTheme), handler: () => { - // update default nature in starter save data - if (!starterAttributes) { - starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; - } starterAttributes.nature = n; originalStarterAttributes.nature = starterAttributes.nature; this.clearText(); @@ -3408,8 +3413,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (species) { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + // Bang is correct due to the `?` before variant const variant = this.starterPreferences[species.speciesId]?.variant - ? (this.starterPreferences[species.speciesId].variant as Variant) + ? (this.starterPreferences[species.speciesId]!.variant as Variant) : defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)).setTint(tint); @@ -3634,15 +3640,19 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (starterIndex > -1) { props = globalScene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); - this.setSpeciesDetails(species, { - shiny: props.shiny, - formIndex: props.formIndex, - female: props.female, - variant: props.variant, - abilityIndex: this.starterAbilityIndexes[starterIndex], - natureIndex: this.starterNatures[starterIndex], - teraType: this.starterTeras[starterIndex], - }); + this.setSpeciesDetails( + species, + { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: this.starterAbilityIndexes[starterIndex], + natureIndex: this.starterNatures[starterIndex], + teraType: this.starterTeras[starterIndex], + }, + false, + ); } else { const defaultAbilityIndex = starterAttributes?.ability ?? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -3659,15 +3669,19 @@ export class StarterSelectUiHandler extends MessageUiHandler { props.formIndex = starterAttributes?.form ?? props.formIndex; props.female = starterAttributes?.female ?? props.female; - this.setSpeciesDetails(species, { - shiny: props.shiny, - formIndex: props.formIndex, - female: props.female, - variant: props.variant, - abilityIndex: defaultAbilityIndex, - natureIndex: defaultNature, - teraType: starterAttributes?.tera, - }); + this.setSpeciesDetails( + species, + { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: defaultAbilityIndex, + natureIndex: defaultNature, + teraType: starterAttributes?.tera, + }, + false, + ); } if (!isNullOrUndefined(props.formIndex)) { @@ -3704,15 +3718,19 @@ export class StarterSelectUiHandler extends MessageUiHandler { const defaultNature = globalScene.gameData.getSpeciesDefaultNature(species); const props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - this.setSpeciesDetails(species, { - shiny: props.shiny, - formIndex: props.formIndex, - female: props.female, - variant: props.variant, - abilityIndex: defaultAbilityIndex, - natureIndex: defaultNature, - forSeen: true, - }); + this.setSpeciesDetails( + species, + { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: defaultAbilityIndex, + natureIndex: defaultNature, + forSeen: true, + }, + false, + ); this.pokemonSprite.setTint(0x808080); } } else { @@ -3734,15 +3752,19 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonFormText.setVisible(false); this.teraIcon.setVisible(false); - this.setSpeciesDetails(species!, { - // TODO: is this bang correct? - shiny: false, - formIndex: 0, - female: false, - variant: 0, - abilityIndex: 0, - natureIndex: 0, - }); + this.setSpeciesDetails( + species!, + { + // TODO: is this bang correct? + shiny: false, + formIndex: 0, + female: false, + variant: 0, + abilityIndex: 0, + natureIndex: 0, + }, + false, + ); this.pokemonSprite.clearTint(); } } @@ -3764,7 +3786,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { return { dexEntry: { ...copiedDexEntry }, starterDataEntry: { ...copiedStarterDataEntry } }; } - setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}, save = true): void { let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; @@ -4176,7 +4198,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.updateInstructions(); - saveStarterPreferences(this.originalStarterPreferences); + if (save) { + saveStarterPreferences(this.originalStarterPreferences); + } } setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { diff --git a/src/utils/data.ts b/src/utils/data.ts index 6580ecf2ee9..75047c38d25 100644 --- a/src/utils/data.ts +++ b/src/utils/data.ts @@ -8,7 +8,7 @@ import { AES, enc } from "crypto-js"; * @param values - The object to be deep copied. * @returns A new object that is a deep copy of the input. */ -export function deepCopy(values: object): object { +export function deepCopy(values: T): T { // Convert the object to a JSON string and parse it back to an object to perform a deep copy return JSON.parse(JSON.stringify(values)); } @@ -58,13 +58,28 @@ export function decrypt(data: string, bypassLogin: boolean): string { return AES.decrypt(data, saveKey).toString(enc.Utf8); } +/** + * Check if an object has no properties of its own (its shape is `{}`). An empty array is considered a bare object. + * @param obj - Object to check + * @returns - Whether the object is bare + */ +export function isBareObject(obj: any): boolean { + if (typeof obj !== "object") { + return false; + } + for (const _ in obj) { + return false; + } + return true; +} + // the latest data saved/loaded for the Starter Preferences. Required to reduce read/writes. Initialize as "{}", since this is the default value and no data needs to be stored if present. // if they ever add private static variables, move this into StarterPrefs const StarterPrefers_DEFAULT: string = "{}"; let StarterPrefers_private_latest: string = StarterPrefers_DEFAULT; export interface StarterPreferences { - [key: number]: StarterAttributes; + [key: number]: StarterAttributes | undefined; } // called on starter selection show once @@ -74,11 +89,17 @@ export function loadStarterPreferences(): StarterPreferences { localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT), ); } -// called on starter selection clear, always export function saveStarterPreferences(prefs: StarterPreferences): void { - const pStr: string = JSON.stringify(prefs); + // Fastest way to check if an object has any properties (does no allocation) + if (isBareObject(prefs)) { + console.warn("Refusing to save empty starter preferences"); + return; + } + // no reason to store `{}` (for starters not customized) + const pStr: string = JSON.stringify(prefs, (_, value) => (isBareObject(value) ? undefined : value)); if (pStr !== StarterPrefers_private_latest) { + console.log("%cSaving starter preferences", "color: blue"); // something changed, store the update localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); // update the latest prefs diff --git a/test/utils/data.test.ts b/test/utils/data.test.ts new file mode 100644 index 00000000000..c0b853e2643 --- /dev/null +++ b/test/utils/data.test.ts @@ -0,0 +1,39 @@ +import { deepCopy, isBareObject } from "#utils/data"; +import { describe, expect, it } from "vitest"; + +describe("Utils - Data", () => { + describe("deepCopy", () => { + it("should create a deep copy of an object", () => { + const original = { a: 1, b: { c: 2 } }; + const copy = deepCopy(original); + // ensure the references are different + expect(copy === original, "copied object should not compare equal").not; + expect(copy).toEqual(original); + // update copy's `a` to a different value and ensure original is unaffected + copy.a = 42; + expect(original.a, "adjusting property of copy should not affect original").toBe(1); + // update copy's nested `b.c` to a different value and ensure original is unaffected + copy.b.c = 99; + expect(original.b.c, "adjusting nested property of copy should not affect original").toBe(2); + }); + }); + + describe("isBareObject", () => { + it("should properly identify bare objects", () => { + expect(isBareObject({}), "{} should be considered bare"); + expect(isBareObject(new Object()), "new Object() should be considered bare"); + expect(isBareObject(Object.create(null))); + expect(isBareObject([]), "an empty array should be considered bare"); + }); + + it("should properly reject non-objects", () => { + expect(isBareObject(new Date())).not; + expect(isBareObject(null)).not; + expect(isBareObject(42)).not; + expect(isBareObject("")).not; + expect(isBareObject(undefined)).not; + expect(isBareObject(() => {})).not; + expect(isBareObject(new (class A {})())).not; + }); + }); +}); From e06980519ddfd8e72429dd64c07d8de7be29c14d Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:19:15 -0500 Subject: [PATCH 049/134] [Misc] Bump version to 1.10.5 on main (#6436) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index db07b9be8db..6f63459baed 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.4", + "version": "1.10.5", "type": "module", "scripts": { "start": "vite", From 7447602146d5698193e77b7acea54e364e5bef1a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:42:18 -0700 Subject: [PATCH 050/134] Update version to 1.10.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f63459baed..574beb80466 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.5", + "version": "1.10.6", "type": "module", "scripts": { "start": "vite", From 4b18ad74b3390ffe3fcf3c81ac2539aea89c157b Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Wed, 27 Aug 2025 09:47:51 +1000 Subject: [PATCH 051/134] [Balance] Adjust moveset generation weighting (#6387) --- src/field/pokemon.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 707a8fb93ee..8e2f26af158 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3070,14 +3070,17 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { if (this.level < levelMove[0]) { break; } - let weight = levelMove[0]; + let weight = levelMove[0] + 20; // Evolution Moves - if (weight === EVOLVE_MOVE) { - weight = 50; + if (levelMove[0] === EVOLVE_MOVE) { + weight = 70; } // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight. Trainers use actual relearn moves. - if ((weight === 1 && allMoves[levelMove[1]].power >= 80) || (weight === RELEARN_MOVE && this.hasTrainer())) { - weight = 40; + if ( + (levelMove[0] === 1 && allMoves[levelMove[1]].power >= 80) || + (levelMove[0] === RELEARN_MOVE && this.hasTrainer()) + ) { + weight = 60; } if (!movePool.some(m => m[0] === levelMove[1]) && !allMoves[levelMove[1]].name.endsWith(" (N)")) { movePool.push([levelMove[1], weight]); @@ -3107,11 +3110,11 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } if (compatible && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { if (tmPoolTiers[moveId] === ModifierTier.COMMON && this.level >= 15) { - movePool.push([moveId, 4]); + movePool.push([moveId, 24]); } else if (tmPoolTiers[moveId] === ModifierTier.GREAT && this.level >= 30) { - movePool.push([moveId, 8]); + movePool.push([moveId, 28]); } else if (tmPoolTiers[moveId] === ModifierTier.ULTRA && this.level >= 50) { - movePool.push([moveId, 14]); + movePool.push([moveId, 34]); } } } @@ -3121,7 +3124,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([moveId, 40]); + movePool.push([moveId, 60]); } } const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; @@ -3132,13 +3135,13 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss() ) { - movePool.push([moveId, 30]); + movePool.push([moveId, 50]); } if (this.fusionSpecies) { for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([moveId, 40]); + movePool.push([moveId, 60]); } } const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; @@ -3149,7 +3152,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss() ) { - movePool.push([moveId, 30]); + movePool.push([moveId, 50]); } } } From 1f2788a4384a2b7620ba4bc9c050ecaf231234b0 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:47:12 -0700 Subject: [PATCH 052/134] [Bug] Fix Soak message key not being in camel (#6439) --- src/data/moves/move.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 4a744d6e9c3..b40842b5d01 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -6856,12 +6856,15 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { } } +/** + * Attribute to override the target's current types to the given type. + * Used by {@linkcode MoveId.SOAK} and {@linkcode MoveId.MAGIC_POWDER}. + */ export class ChangeTypeAttr extends MoveEffectAttr { private type: PokemonType; constructor(type: PokemonType) { super(false); - this.type = type; } @@ -6869,7 +6872,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [ this.type ]; target.updateInfo(); - globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) })); + globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${toCamelCase(PokemonType[this.type])}`) })); return true; } From 2afd4f57cba4ab006428c7f12f0b0432100e2f4e Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 26 Aug 2025 23:39:26 -0700 Subject: [PATCH 053/134] [GitHub] Workflows will now time out after 10 minutes (#6441) --- .github/workflows/create-release.yml | 9 +++++++++ .github/workflows/deploy-beta.yml | 1 + .github/workflows/deploy.yml | 1 + .github/workflows/github-pages.yml | 1 + .github/workflows/linting.yml | 1 + .github/workflows/post-release-deleted.yml | 1 + .github/workflows/test-shard-template.yml | 1 + .github/workflows/tests.yml | 1 + 8 files changed, 16 insertions(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index b1543b2cb44..f2e17898334 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -20,6 +20,7 @@ permissions: jobs: create-release: if: github.repository == 'pagefaultgames/pokerogue' && (vars.BETA_DEPLOY_BRANCH == '' || ! startsWith(vars.BETA_DEPLOY_BRANCH, 'release')) + timeout-minutes: 10 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed for github cli commands runs-on: ubuntu-latest @@ -36,11 +37,13 @@ jobs: exit 1 fi shell: bash + - uses: actions/create-github-app-token@v2 id: app-token with: app-id: ${{ secrets.PAGEFAULT_APP_ID }} private-key: ${{ secrets.PAGEFAULT_APP_PRIVATE_KEY }} + - name: Check out code uses: actions/checkout@v4 with: @@ -48,8 +51,10 @@ jobs: # Always base off of beta branch, regardless of the branch the workflow was triggered from. ref: beta token: ${{ steps.app-token.outputs.token }} + - name: Create release branch run: git checkout -b release + # In order to be able to open a PR into beta, we need the branch to have at least one change. - name: Overwrite RELEASE file run: | @@ -58,11 +63,14 @@ jobs: echo "Release v${{ github.event.inputs.versionName }}" > RELEASE git add RELEASE git commit -m "Stage release v${{ github.event.inputs.versionName }}" + - name: Push new branch run: git push origin release + # The repository variable is used by the deploy-beta workflow to determine whether to deploy from beta or release. - name: Set repository variable run: GITHUB_TOKEN="${{ steps.app-token.outputs.token }}" gh variable set BETA_DEPLOY_BRANCH --body "release" + - name: Create pull request to main run: | gh pr create --base main \ @@ -70,6 +78,7 @@ jobs: --title "Release v${{ github.event.inputs.versionName }} to main" \ --body "This PR is for the release of v${{ github.event.inputs.versionName }}, and was created automatically by the GitHub Actions workflow invoked by ${{ github.actor }}" \ --draft + - name: Create pull request to beta run: | gh pr create --base beta \ diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index 0894032c8ad..341999dcd45 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -12,6 +12,7 @@ on: jobs: deploy: if: github.repository == 'pagefaultgames/pokerogue' && github.ref_name == (vars.BETA_DEPLOY_BRANCH || 'beta') + timeout-minutes: 10 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0e7102a41dd..528906196e5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,6 +11,7 @@ on: jobs: deploy: if: github.repository == 'pagefaultgames/pokerogue' + timeout-minutes: 10 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 8d1c5a84962..46957c02e56 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -20,6 +20,7 @@ jobs: pages: name: Github Pages if: github.repository == 'pagefaultgames/pokerogue' + timeout-minutes: 10 runs-on: ubuntu-latest env: api-dir: ./ diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index ae23a515c4f..08327ee3653 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -19,6 +19,7 @@ on: jobs: run-linters: name: Run linters + timeout-minutes: 10 runs-on: ubuntu-latest steps: diff --git a/.github/workflows/post-release-deleted.yml b/.github/workflows/post-release-deleted.yml index 65447e7826b..fe542365da4 100644 --- a/.github/workflows/post-release-deleted.yml +++ b/.github/workflows/post-release-deleted.yml @@ -6,6 +6,7 @@ jobs: # Set the BETA_DEPLOY_BRANCH variable to beta when a release branch is deleted update-release-var: if: github.repository == 'pagefaultgames/pokerogue' && github.event.ref_type == 'branch' && github.event.ref == 'release' + timeout-minutes: 5 runs-on: ubuntu-latest steps: - name: Set BETA_DEPLOY_BRANCH to beta diff --git a/.github/workflows/test-shard-template.yml b/.github/workflows/test-shard-template.yml index 124004f380f..79aea56bbd0 100644 --- a/.github/workflows/test-shard-template.yml +++ b/.github/workflows/test-shard-template.yml @@ -21,6 +21,7 @@ jobs: test: # We can't use dynmically named jobs until https://github.com/orgs/community/discussions/13261 is implemented name: Shard + timeout-minutes: 10 runs-on: ubuntu-latest if: ${{ !inputs.skip }} steps: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 748072c536f..70567632849 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,6 +19,7 @@ on: jobs: check-path-change-filter: + timeout-minutes: 5 runs-on: ubuntu-latest permissions: pull-requests: read From 58ba29a1bedc0b894563b745cba4e2ea5bd84d39 Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Wed, 27 Aug 2025 10:23:37 +0200 Subject: [PATCH 054/134] [Bug] Fix soak message i18n key (#6443) --- src/data/moves/move.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index b40842b5d01..5a22b352e73 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -6872,7 +6872,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [ this.type ]; target.updateInfo(); - globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${toCamelCase(PokemonType[this.type])}`) })); + globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.type])}`) })); return true; } From 98e65b9b8b6e6e025afb98c58bb79baa5cc1fafc Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Wed, 27 Aug 2025 02:10:48 -0700 Subject: [PATCH 055/134] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 102cbdcd924..e0657485ae7 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 102cbdcd924e2a7cdc7eab64d1ce79f6ec7604ff +Subproject commit e0657485ae75ff0361a6e3f0fb4c7ed649a1fb39 From dcb2f3212956f00ced955b1eccfa701098714fac Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Wed, 27 Aug 2025 22:43:04 -0400 Subject: [PATCH 056/134] [Test] Made test workflow not stop when a shard fails (#6403) --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 70567632849..39506096298 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,6 +38,8 @@ jobs: name: Run Tests needs: check-path-change-filter strategy: + # don't stop upon 1 shard failing + fail-fast: false matrix: shard: [1, 2, 3, 4, 5] uses: ./.github/workflows/test-shard-template.yml From dadc7b95988bc845529719adc783c3f77db11cb4 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 28 Aug 2025 22:36:43 -0700 Subject: [PATCH 057/134] [Bug] Breaking a boss bar will no longer crash at max stat stages (#6440) Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/field/pokemon.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index dab96e4090a..db973ef2d78 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -6916,7 +6916,7 @@ export class EnemyPokemon extends Pokemon { const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6); const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false)); - let boostedStat: EffectiveStat; + let boostedStat: EffectiveStat | undefined; const statThresholds: number[] = []; let totalWeight = 0; @@ -6934,6 +6934,11 @@ export class EnemyPokemon extends Pokemon { } } + if (boostedStat === undefined) { + this.bossSegmentIndex--; + return; + } + let stages = 1; // increase the boost if the boss has at least 3 segments and we passed last shield @@ -6949,7 +6954,7 @@ export class EnemyPokemon extends Pokemon { "StatStageChangePhase", this.getBattlerIndex(), true, - [boostedStat!], + [boostedStat], stages, true, true, From 4dc067daa29a647a279c9bfb97f7ae789b34ca7e Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sat, 30 Aug 2025 01:52:39 +0200 Subject: [PATCH 058/134] [Bug] [UI/UX] Fix options during item transfer (#6425) --- src/ui/party-ui-handler.ts | 14 ++ test/ui/transfer-item-options.test.ts | 235 ++++++++++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 test/ui/transfer-item-options.test.ts diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 73fc1bfc010..a7c7a134488 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -613,6 +613,20 @@ export class PartyUiHandler extends MessageUiHandler { ui.playSelect(); return true; } + + if (option === PartyOption.SUMMARY) { + return this.processSummaryOption(pokemon); + } + if (option === PartyOption.POKEDEX) { + return this.processPokedexOption(pokemon); + } + if (option === PartyOption.UNPAUSE_EVOLUTION) { + return this.processUnpauseEvolutionOption(pokemon); + } + if (option === PartyOption.RENAME) { + return this.processRenameOption(pokemon); + } + return false; } diff --git a/test/ui/transfer-item-options.test.ts b/test/ui/transfer-item-options.test.ts new file mode 100644 index 00000000000..901aa261f50 --- /dev/null +++ b/test/ui/transfer-item-options.test.ts @@ -0,0 +1,235 @@ +import { BerryType } from "#enums/berry-type"; +import { Button } from "#enums/buttons"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { UiMode } from "#enums/ui-mode"; +import { GameManager } from "#test/test-utils/game-manager"; +import { type PartyUiHandler, PartyUiMode } from "#ui/party-ui-handler"; +import type { RenameFormUiHandler } from "#ui/rename-form-ui-handler"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +// todo: Some tests fail when running all tests at once, but pass when running individually. Seams like it's always the 2nd and 4th (non todo) tests that fail. +describe("UI - Transfer Item Options", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.override + .battleStyle("single") + .startingLevel(100) + .startingHeldItems([ + { name: "BERRY", count: 1, type: BerryType.SITRUS }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + { name: "BERRY", count: 2, type: BerryType.LUM }, + ]) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyMoveset(MoveId.SPLASH); + + await game.classicMode.startBattle([SpeciesId.BULBASAUR, SpeciesId.SQUIRTLE, SpeciesId.CHARMANDER]); + + game.move.use(MoveId.DRAGON_CLAW); + + await game.phaseInterceptor.to("SelectModifierPhase"); + await game.scene.ui.setModeWithoutClear(UiMode.PARTY, PartyUiMode.MODIFIER_TRANSFER); + }); + + it.todo("should open the summary screen while transfering an item", async () => { + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // Select first party member + handler.setCursor(0); + handler.processInput(Button.ACTION); + + resolve(); + }); + }); + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + // select item to transfer + handler.processInput(Button.ACTION); + resolve(); + }); + }); + + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // move to second pokemon + handler.setCursor(1); + handler.processInput(Button.ACTION); + + // select summary + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + + await new Promise(r => setTimeout(r, 100)); + expect(game.scene.ui.getMode()).toBe(UiMode.SUMMARY); + }); + + it.todo("should open the pokèdex screen while transfering an item", async () => { + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // Select first party member + handler.setCursor(0); + handler.processInput(Button.ACTION); + + resolve(); + }); + }); + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + // select item to transfer + handler.processInput(Button.ACTION); + resolve(); + }); + }); + + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + // move to second pokemon + handler.setCursor(1); + handler.processInput(Button.ACTION); + + // select pokèdex + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + + await new Promise(r => setTimeout(r, 100)); + expect(game.scene.ui.getMode()).toBe(UiMode.POKEDEX_PAGE); + }); + + it.todo("should open the rename screen and rename the pokemon while transfering an item", async () => { + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // Select first party member + handler.setCursor(0); + handler.processInput(Button.ACTION); + + resolve(); + }); + }); + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + // select item to transfer + handler.processInput(Button.ACTION); + resolve(); + }); + }); + + await new Promise(r => setTimeout(r, 100)); + let handler: PartyUiHandler | RenameFormUiHandler | undefined; + handler = game.scene.ui.getHandler() as PartyUiHandler; + + // move to second pokemon + handler.setCursor(1); + handler.processInput(Button.ACTION); + + // select rename + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + + const pokemon = game.scene.getPlayerParty()[1]; + if (!pokemon) { + expect.fail("Pokemon is undefined"); + } + const nickname = pokemon.nickname; + + expect(nickname).toBe(undefined); + + await new Promise(r => setTimeout(r, 100)); + expect(game.scene.ui.getMode()).toBe(UiMode.RENAME_POKEMON); + await new Promise(r => setTimeout(r, 100)); + handler = game.scene.ui.getHandler() as RenameFormUiHandler; + handler["inputs"][0].setText("New nickname"); + handler.processInput(Button.SUBMIT); + await new Promise(r => setTimeout(r, 100)); + // get the sanitized name + const sanitizedName = btoa(unescape(encodeURIComponent("New nickname"))); + expect(pokemon.nickname).toBe(sanitizedName); + }); + + it.todo("should pause the evolution while transfering an item", async () => { + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // Select first party member + handler.setCursor(0); + handler.processInput(Button.ACTION); + + resolve(); + }); + }); + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + // select item to transfer + handler.processInput(Button.ACTION); + resolve(); + }); + }); + + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // move to second pokemon + handler.setCursor(1); + handler.processInput(Button.ACTION); + + const pokemon = game.scene.getPlayerParty()[1]; + + if (!pokemon) { + expect.fail("Pokemon is undefined"); + } + if (pokemon.pauseEvolutions !== undefined) { + expect(pokemon.pauseEvolutions).toBe(false); + } + + // select pause evolution + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + + await new Promise(r => setTimeout(r, 100)); + expect(game.scene.ui.getMode()).toBe(UiMode.PARTY); + expect(pokemon.pauseEvolutions).toBe(true); + }); +}); From 264dd6b2d04d962b040c99e2f0d5dfba6a7900aa Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 30 Aug 2025 19:41:58 -0500 Subject: [PATCH 059/134] [Bug][Sprite] Ensure evo silhouette disappears in evo phase (#6450) Ensure evo silhouette disappears in evo phase --- src/phases/evolution-phase.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index ad3db97d520..542a2100452 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -31,6 +31,7 @@ export class EvolutionPhase extends Phase { private evolutionBgm: AnySound; private evolutionHandler: EvolutionSceneHandler; + /** Container for all assets used by the scene. When the scene is cleared, the children within this are destroyed. */ protected evolutionContainer: Phaser.GameObjects.Container; protected evolutionBaseBg: Phaser.GameObjects.Image; protected evolutionBg: Phaser.GameObjects.Video; @@ -522,6 +523,7 @@ export class EvolutionPhase extends Phase { return; } if (i === lastCycle) { + this.pokemonTintSprite.setVisible(false).setActive(false); this.pokemonEvoTintSprite.setScale(1); } }, From 5c22d9ccacf67e9330c86f10b7c6adee0a0dfed2 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 31 Aug 2025 02:54:35 +0200 Subject: [PATCH 060/134] [Bug] Pokemon not on the field can't be caught (#6454) --- src/phases/command-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 6ca0679af4d..37e07c6c282 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -456,7 +456,7 @@ export class CommandPhase extends FieldPhase { const numBallTypes = 5; if (cursor < numBallTypes) { - const targetPokemon = globalScene.getEnemyPokemon(); + const targetPokemon = globalScene.getEnemyPokemon(false); if ( targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && From 929f721ee0967333dc0e5a427d748479cd177b2b Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sun, 31 Aug 2025 03:07:50 +0200 Subject: [PATCH 061/134] [Bug][UI] Fix ribbon and status effect overlap (#6453) --- src/ui/battle-info/enemy-battle-info.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 4b37adc74aa..96215c21117 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -115,6 +115,9 @@ export class EnemyBattleInfo extends BattleInfo { globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && globalScene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0 ) { + // move the ribbon to the left if there is no owned icon + const championRibbonX = this.ownedIcon.visible ? 8 : 0; + this.championRibbon.setPositionRelative(this.nameText, championRibbonX, 11.75); this.championRibbon.setVisible(true); } From a9f6801ecb9719361b028c9c1a044cb04696f1bb Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 31 Aug 2025 02:53:05 -0700 Subject: [PATCH 062/134] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index e0657485ae7..2686cd3edc0 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit e0657485ae75ff0361a6e3f0fb4c7ed649a1fb39 +Subproject commit 2686cd3edc0bd2c7a7f12cc54c00c109e51a48d7 From 2c89295e3da6694eeb6ac7679a046525d456f3fc Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sun, 31 Aug 2025 14:23:55 +0200 Subject: [PATCH 063/134] [Sprite] Round of optimized PNGs (#6458) Round of optimized PNGs --- public/images/arenas/beach_b_2.png | Bin 197 -> 195 bytes public/images/arenas/cave_b_2.png | Bin 279 -> 276 bytes public/images/arenas/factory_b_3.png | Bin 290 -> 289 bytes public/images/arenas/forest_b.png | Bin 1102 -> 1100 bytes public/images/arenas/ice_cave_b_2.png | Bin 218 -> 215 bytes public/images/arenas/island_bg.png | Bin 341 -> 283 bytes public/images/arenas/jungle_bg.png | Bin 349 -> 261 bytes public/images/arenas/laboratory_b_2.png | Bin 336 -> 331 bytes public/images/arenas/laboratory_bg.png | Bin 364 -> 289 bytes public/images/arenas/lake_b_1.png | Bin 280 -> 278 bytes public/images/arenas/lake_b_2.png | Bin 206 -> 205 bytes public/images/arenas/metropolis_bg.png | Bin 347 -> 283 bytes public/images/arenas/plains_b_2.png | Bin 235 -> 230 bytes public/images/arenas/plains_bg.png | Bin 645 -> 610 bytes public/images/arenas/snowy_forest_b_3.png | Bin 419 -> 417 bytes public/images/arenas/snowy_forest_bg.png | Bin 363 -> 296 bytes public/images/arenas/wasteland_b_1.png | Bin 208 -> 206 bytes public/images/arenas/wasteland_b_3.png | Bin 338 -> 335 bytes .../PRAS- Pulverizing Pancake BG2.png | Bin 3746 -> 3700 bytes .../PRAS- Pulverizing Pancake.png | Bin 14454 -> 14326 bytes .../battle_anims/PRAS- Spectral thief BG.png | Bin 1949 -> 1938 bytes public/images/egg/egg_crack.png | Bin 290 -> 276 bytes public/images/items.png | Bin 59635 -> 54370 bytes public/images/items/common_egg.png | Bin 471 -> 247 bytes public/images/items/great_ribbon.png | Bin 296 -> 295 bytes .../fun_and_games_wobbuffet.png | Bin 691 -> 689 bytes .../mysterious_chest_blue.png | Bin 2273 -> 2269 bytes public/images/ui/champion_ribbon_bronze.png | Bin 183 -> 152 bytes public/images/ui/champion_ribbon_diamond.png | Bin 201 -> 154 bytes public/images/ui/champion_ribbon_silver.png | Bin 201 -> 162 bytes .../ui/legacy/champion_ribbon_bronze.png | Bin 183 -> 152 bytes .../ui/legacy/champion_ribbon_diamond.png | Bin 201 -> 154 bytes .../ui/legacy/champion_ribbon_silver.png | Bin 201 -> 162 bytes 33 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/arenas/beach_b_2.png b/public/images/arenas/beach_b_2.png index 50c9be97b0d964c37e379543bf8945185c8d48b8..6c3e89c1b25dc8f1230874db88d9559dfc611ff8 100644 GIT binary patch delta 126 zcmX@gc$jg5PkEB3i(`m{6jaxp`|_=cY-WNF RLJxpMJYD@<);T3K0RZm5ERp~K delta 128 zcmX@ic$9I1Pi2ayi(^Pd+}n%Xye$p_E(afqY&gmJAiaT=Ipz3%wHzOhsZG=0{jg#{ zfP~&#+m@Hzo0i;p=-WZ-NL;Jn-2_mXjZFy=zf}XB^F6*2UngDm&P?i7y delta 202 zcmbQjG@WTeX#HAG7srr_xVP5~vknIcv>iMuap%^)gVC-pbtlG2IRE1KYS+}&uugtr zjN;KrXGH4%ZoGO-o{<3tWb|5ZpZopg^FG(F+e_#7o4NWfU+4QfrP?j<{rvA`_db1< zO#SL?oqJmomm9OZs|ogpQxZtbU{irL4DL!76cu84iM&^7e$oLtFusm%R% yC*;1#FJ*o|Q@=kaIOOXOL)XOPn*S6b7B=XoPY_Wpx+kjv;(NOKxvXdQ+U7S z{ehXAPpkd7XUu>CKG^5Z)7g--neVh%=n?^6`duCtAO z@BebcgtScgU-OrrN>uFi)}3p*RcCc;$v)3_K6-DPTd&-CGAX7yUD0&0erW2)t(#|@ wi~jXF{1zMcD$l<=*4Dn#Sr@!Z0@>Pz{CwRl%EB?iOp`#up00i_>zopr0O{mdUH||9 delta 212 zcmZ3;w1{a!Sp9ZS7srr_xVIM!`I;OA+#WjWGaO+)A?1|4Y1UqbhYS*rc+;votgnkF zXQrAT{XJ=J(rSDEf6NRhpzotrpR4Dtx7SxMKDx+q*6j|@{buVK->bHt_WgV~^H9pJ zcg*VBIVZomWxCvR^X10B5k+QpO;6rv%y?%tWdPaX>$xRpt0%%qV62``>X8!+QGa5#;U~$EjJz3s9fNCiF z@T!q)VCP3bId&0i&PMMXF(v{EA5ajmfrVbcI*~UAB#D@YS4yY_o9cvwRqqnuv)T_T>-Lr*f3J^ zE2U@^PY5YLUauGCcDs#ZaMU)bD?o>$*&)A6HpH)*v2h(nCA`%XL@S{(&m~7c;Prp_ zfo~Q`_T6*ArxL=*sNq%l#-M!nlF8d{fOzfyD9Q%oBOuY3o#1~{jDZ;~A;iK*zyu4o z!q*ivzxoc(mizsopk0_}Ep=glvu5HcMZeb-bV3-Px8(DagnPl~{aR<;1Y?}sZ=Qyf z`Z;Q2>%m`RFCRnbMXBZ$3NInqI27CyK6s)7_{ky!*_1#5xeiXFpu%^!1K)w{RE(;80 z9gv@;QEN9;S9ubtv#TiA%x43uUkTf zf-C9@Nm75b)jF%20O*~M$v78uJ~yJ&=G$6>51Ez^nE-toQV{z!NMviY)O^akgC3JJ z_KIjR!P;>|Uau+586Z>d%@i51b|=1VDIeSYD6)2sp8nYF9WyBTTma;w+)rTnhnwba zJ8(<@004k6$o{FVu>+O_000000000000000a1#>_&E1xcsjvV5002ovPDHLkV1fpR Bw+{dS delta 929 zcmV;S177^h2+jzQc>%zYdPaX}D^eH;0_ciMV3+|@^#A|scDfTPARcvnB4a&3XpZx6 zPeBma`4Lc#U4-Xs^vn@5v49RpLBIwUdI3I>CkG^nms0EwqgoNayAL#v5fEt=f zCS~DrFJ%>4+DV7E9Ss^#H#70NI)a0y3wBd=oOLFa4kQL*?3!O86*IIxnFz&nZVg;QAka z;FCp?efKE%dAe?7)bOr+W2bye%H)6$*TX88esW=a1SA@>6a0S?W5+mS*M-DKzyTKS zCD#=+zw!*vmSy=+&<@O3Ekkg?Su=5$qThuDoe<8qSl-@9xEK7oU+t`0NC=brDPTVg z?QF#c2aQ&6T5{er^O?#w{MJZ5+d{f&nlqrnp%K3**fxt!0V%l5;Rm5#`j8n%bqifT zS`FavlDrf-KDZBfkP@d|mq8DTLm_4{G{d7*NW;yS)O|f>VCc{|wM} z-~>3&{(}Wh)&bj$2PQ8YXC)3epkR(*c=39Nq>h(H0F5OhEh%q5fhi4=dZl_8w3^AKfdf~JT37#ruy zORs*Y0nM)wK{3H}oO1dek^#vF0@{E#A%TKrRJ>o)<6NFyH0MV_JNBM3s{?sg$g)f@ zl(nGxYx;?-Xv>d;9wanC2uKlO=k{S+3HZ)G%c0_Hl@MGXku=+ks||Y(D5wbetK@5x zkfETXIwXHdQCI7%ZUUfnJ|>)h${9@Z{fl^xd? j#}RTYkzjAixE=mAU(tZrRp9<=Xaguig3YFPZOoQ@cd8&tmVd6E^!+zS_J-`SRv> o2Z|&6=eTq27F){>(R+YDUztO;XYW}TAfJ=L)78&qol`;+02Eq0>i_@% diff --git a/public/images/arenas/island_bg.png b/public/images/arenas/island_bg.png index e05c3afa7756b15d5c5d6edf1679f2acf504c894..8a8d703af5dc314c422d86b6c903bad80de113d0 100644 GIT binary patch delta 213 zcmcc0G@EIHU;PeG7srr_TW_x!iZ&PsxEzc)z$CVzfmJ7gkvrmmE}zDZCe@ki6S{8i z*`mFNjROQCnAbgg%H02f;WxY9L&j;1(G@=(%)v51!osY8i+=-;iI6fQi;V1!_UZgK zhnZQx;E%+M-A{M3W~jJ5Vzb`w=%BqVNtw|PC{@F94rpMl*eVC}7i@PQ+|L&f5V+v{ ob|D)?AC#04*YKRA0z+{n%!;zH5w24m{TYD3)78&qol`;+0GUff0{{R3 delta 272 zcmbQubd_m>U;QUf7srr_xTG1DCl0P))?{AHCsX=h1+%-X#VZH4>5hDC`rm1F^GC{Cka|&Vk>Y_x$)w-F}w) zGqQldnULk2YU($91TKhGA6X~qo#e^D2m!VHRY&S(>2#_xvTQl3mH`$2TQ+OKd0p?M zrfEkcOU~Y5<4HHzeRMr16A)Bgm9=%Ww`{)kkEbkMKtLcsFUy;W0~u&|PEvuPec6n6 W?710NDRV7j00K`}KbLh*2~7ZFLO$;R delta 287 zcmZo=y2~`dy`GW5)5S5QBJRxB-Mj2y zAUmHyf`H7EgbUUMCcFr16xbJs$}Vka3^L$iVVCFuDr87l&ez4jkRZ@jIkSG^X2zIR z3hU!4zB&Mbbed^GMEyNa7sn6@$+rg$vsxS^8ZMr{$$dtIdz#XrZH$~b(#jFh6%8Vu^A&t@ zH&?tla8Kbb|Id5QlTR3l%5C>CS*cuV zA}R6g*Dj&67nUx3oEh=$x~QIVTxoy&y^!<`f()paz(>)k~z|+;wWt~$(695AscliJS delta 256 zcmX@jbb)C?MEzq=7srr_xVKjgvzQG9S|6(aWSVto!&4=e+iWcdbIrI{#r|N>oMe~i z_|@##alWQG3RfNe@r$mnIdj0{zaRq=Xh`r}H+Nq9`?if%c{5a}hRK^-hEAIDJM6vZ zy(5)-Ca6qZ8~>+w!5caW&3tDnm{r-UW|4y)#vR zOYc53bpU|_QXjbV<#)8RTi6xw@o(TMQR!n5fPxK7a}F`bP0l+XkK_jF3Y delta 293 zcmZ3;^oD6dKs_Uyr;B4qMO;#Z>4}3Ym^E1z^U0JxSi$TrYw_y9%w`#$I(DWT%af%T z7$n*fW7zWkDDt?>&ngo5adO&sc@B%GjLT-KoK$Im0d=;6j(l#i9-0XTa!(R2SQngF zelU=|&#K@`BSYEi8Egy^Y)ui7?M{j8Zh0RRKYXgc^uMC^!4YPbJ-h-yaN%yzc81;~ z9*_23&5#1RgMpcCx+5RkUS{{pFgFFV^A#~9Z13x2XmC{EIF|A!+L47d{Eg;~N9_;) zR#YxXPn^wr>p`g*2M5QCfa9AT9UL4E6u_L<&~TYgMwo$tL4jveeU|l`HaS)x2Lui< XzWEb5<(|-LHxSR$)z4*}Q$iB}E{Sp^ diff --git a/public/images/arenas/lake_b_1.png b/public/images/arenas/lake_b_1.png index 5426dd1e8d936701f55a0ff5e3509ac47f98e493..8786fb6c728707382006ba4698095f944f505bb7 100644 GIT binary patch delta 201 zcmbQiG>vIOX#E;b7sn6@$+rg#xehsqxL%wtxW)HCg0$OZ?sW+XF%C`Z`=_ooJNNDG zG4XeT3@G4-c4bh;&Am$AaUvn7A}_shbu29l+f?mpdMmgnFkD delta 203 zcmbQnG=phEX#F}*7srr_xVKjvy$%Nm9DnH9vdc7~Pj?OS(e+w5n* zCPn)^{O$Ll{h|5C00tOnNY&e?AHQgm;r`Qp(bGC2Uh~NqO_$jGp|yYJ=NY=Eq>RqL z_J8Wqchf#f#O%wx``@Bg?K|{*<@V~H?7IQma(BO3>*JDY|M0hFUcBYivp;N(ul4_a yNOHTypWNvyUVYyhJKt{cy2EmwxyvgeU^f2WRVx;e`_^_UNWjz8&t;ucLK6Th6<}xp diff --git a/public/images/arenas/lake_b_2.png b/public/images/arenas/lake_b_2.png index b08ccd7b8e4524df19899a2da2af8a474046e551..454c9e89d29a3898efbe0f8857d73cac454dc49e 100644 GIT binary patch delta 130 zcmX@dc$RTOP<5K8i(`m{d7B&r7!Ewmc+kNsz_IV*+lGL~i9&DovwDAcX_uzP z00Ry3w~X8~zn|BBm38`am3(!GY2Nc$Gi_H%8OaB4u{<@a>c|e+>JYO#o7iDG7(V#N X*SoN;*mi68dXSi>tDnm{r-UW|L(VbE delta 131 zcmX@hc#d&GP))k0i(^Pd+}lfzyv+;(E*DvO91I*3-p(wO6%d&a=JYo@BjCV9+db+J z&mUoBfPn>bmutNJY3=pAy59b_RA^~`?a4ECtFnyZowv05TYO1BmfL%3*2ibPj4%xi Y_Vq5TE1o-~90rMay85}Sb4q9e0Q=)HfB*mh diff --git a/public/images/arenas/metropolis_bg.png b/public/images/arenas/metropolis_bg.png index 374744f245edbb186c3117b20801d8190dc19801..b790221b32332e4ffe5d18ba56480b4350c042d0 100644 GIT binary patch delta 216 zcmcc3G@EIHcl~Zp7srr_TW_y9@*YqSU~!nxz^Ze_NjHI!JHnxi_lvW>uZQ*Wgh_W* zpUnKWkB0*UB$($lI3}>OmgTe~DWM4frtmkT delta 281 zcmbQubem~{cl~cq7srr_xTF^nPZF*)iZlhX_gNKOXxHVYo)=&(3U9SmM7x2 z@Q-3o+xp3ZFDA~ZsC{rGnxEy)|D*%b`uu-tnj2ui|5&q3kJW@AgG_OI5$82#T;MHz%cvi-9sKdEan;pr@GeO@L=H* z(fDvOw5r>mdKI;Vst0HYXc-T(jq diff --git a/public/images/arenas/plains_b_2.png b/public/images/arenas/plains_b_2.png index a35dbec9917021179dfde1e8ea3708a0e463484d..4d8d679d12f4f91c15cc92c6ce338dcdb155e7b7 100644 GIT binary patch delta 168 zcmaFO_>6IaTYa~ui(`m{+}E#IF-llx^=*7W~T zn6+LzW#gUB6&i7qmfPk;qFn7Kfsqn@x8a0*=(KkcBw O00f?{elF{r5}E+SyG6eM delta 173 zcmaFH_?mHoTm1x27srr_xVM)!@*WD{X?b`!Xjb@Pz79 Se*EPZi0A3*=d#Wzp$PzFEKFtq diff --git a/public/images/arenas/plains_bg.png b/public/images/arenas/plains_bg.png index f2cbec9197ce584c64be9d7323c7569ae4b0ed64..9c0cff9b7dc96f3c0b7c370fbbf59e768828a377 100644 GIT binary patch delta 549 zcmZo=eZ(@sqn_2%#WAGf*4wMTRm}<_t%+7I_VCU`=C%C^mU77wtqk(~uiG|~X-Gk*HPOx8UX0SZ!ZhsUgro&*L@|?k;N9JzuhrKH`&7Y?`FWetT2)a5($KT>S$PNy1)pKKD9_n}1CWUeu>rw(-a>mXgT%U29gpkj{Ht@zeJ` zuiWEhb(h>!Z@q6XSa;WWRsECMA=CMPGjl4o2smxJct}~^<6n)`!-@PVUla~3X1?F* zZZ|=Wg+oBW;i1F7S3g!SW`F5eH9_uA{QjTEdS~^9?clsnU$&{ysmAj` zLhJO3h~16+w|^)E^sg(ZOm)6nUBj8nlyQ7xUT*K-OS^Q|uh#0X@AZARK>XHK+l<`0 z?p^C{+^=K&H}kSlNYbRQ?G+kp&R$=pox8AJZCZe?e_{KDXN}HhcdutT#l;V?4sI_J eLk{W`4Ws+Ud=3*9u-`qw00f?{elF{r5}E)cF#F5^ delta 584 zcmaFF(#kr)qh7<)#WAEJE=fcFNy3#zk)}ZQKC6N&jf?qYN)v7=us7dpT$~ByGxIXM zxnj+A*nx*7U}u56sMU?K~HQ)TIAAEW6 zou}ZM&*u^rui^!I2P7xWeDpc+pMlDszAe&1JCy6$*&G>L>enAtUBz8-?M%K?cI|67 zo6uU$p80CRP5CEZSu0%0+5N}5d+)+a-xa*g-f}MV(sSrL9Ihm4=k!j;U=w$S8+%vx z;v-x6oz8mi-6nK%p2iGo*%eFqcLtOka*v)i|KuU%tiMM-B~9=1WoSs0;K*uS^Wbm0 zkGMEz9*v&B9Cj&#m%+LIPivIIU*pPzdtYN zSLI3j_WZy$;Ugb2a=)JwUst}lM7 zHP5-$l^lLKIdZ~!E=z`;#uG&rX-;46{&m60jY&J^KVd2^KG_j%uY_sjbubJh1Yz&SJ3=$lUXYc1qeb;CbQ`Z2387d$W8>lembC_Ty SJntL>5O})!xvX_05FykoMtX^l?7`Bb8A#g#junjNM4sEB|aUZVCZ}{D2 zb@x@#Ii?%V2D$;q*IkZ#&2{u&<6Z zetN$@_>;U*`kfk0RquBvqU4N@=X&Sn2A5af?mEa_e|qbzOJB~^-Rpm@RsF1X>Yc*b zua%d^J^Nw%HMZya=5@{!96$d$#XakmolE4DUwR%=ueC1gy-u(-@YdYti4u9H_KC|?v+_Jx$-*g%7sMbH66mV%j d8_b&!x{fJ-m2qf%f9_!r-_zC4Wt~$(699~4q#XbN diff --git a/public/images/arenas/snowy_forest_bg.png b/public/images/arenas/snowy_forest_bg.png index b0dcc3ddfc56a0c4c9c26a4d4b9427577beaa9ae..62ff03f5b1c68ca259b58d9e99ff78f8d7ce70f2 100644 GIT binary patch delta 224 zcmaFOw1R0uKt01DPZ!6Kid%1QIPx|a2(UP4F>*&7U=rKVz^aqL$i3nSgZ?+hmuEF+ zq5c3ThPDHO0#LBQq=4a#Y=&ovfWQW;0(PE8 zZLkgng$2dl?2Njd9i;*S7sR?HK*~QvN>(to9bgV%cU{xm00eSbvMeY-hwIB%Mh<-7 aM^fJEy8-QIY+lwd0D-5gpUXO@geCx_!9HUE delta 292 zcmZ3%^qOfxKs_U?r;B4qMO@Mh%M%AzFl(|b=94LXu!7lL*5Z}JV@E!={mhryEG7N{ zMHgIBU|-C)M8seRPm#e3*%JyDARX?q9>E5$4g|9ISruGqgzA=TvzB00wwv6OHYw16 z%Z;(&uGKO|h6YE46`P{6d45O_bWocn@D&yu;)ENjw^ zhUKU<072sNzD@=P2MM-Y?%Y}v9ozbwc#d&`TYa&oi(`m{bS}(^fC(oXl}U zQpIx;2)&G#5m2!T+hbjsborQ)fAeadPjjY3o)m6Azv9VD8?(74hNpdXE}6X2sh#v} v$;Ue?TH@ao0%Z+PUiJ9q1TjE;pXN*fi&M^RHyIchI2k-${an^LB{Ts5h=o0F delta 146 zcmX@dc!6<(TYaggi(^Pd+}n#Ac@G&#us$sQn9eNlDa0gT$D$siR`){5RIh0jLag6; z3(kJjSMi(#LN8fG-_HFi^W=)_e059NZ)PWdUbyDw=X=jsQs#~xo8i`5j&o0{-p)!^ xonG=z+%fn043^x@Vv%zaIE7sn6@$+rhC7B(9QxL#z>Ygo#pa@aoEk=e;a;Ksk`PEXO*Z~de*Y)3=Gj&6&0UB76%&--kYY z;`vwQYjpOz+)$If|1;(-(R==V?^VZ(I`=kR_ndq4ktuIiTHf0|w^e4Ijq`ojv$o=F z^OC$A&yNw`tY^x_hB@4=2n$ZBUES<-+7rpqf5P`OODXN{{veeG67_WTb6Mwb@!7srr_xVM)Nu5EVUVF+}V>R8!O`amvqVPkKmLge@Rr`VTr)@R;3 zxUWwqGKi4@89WG^Uo^3J`Ih6~#jD;;+1Bw~|I1vH4;|+h@6)Nebl~O2qfdWpO`5ds z;@=XNOX`x>-sv0Pexz%ud#`KNtaRQvYhE1fdQxw);@b_j* zd(QJ2n|n5&*s;^SV&4HnyG>`5nr|-7*S$Y|%|o%=X^y46VV_v_-noB|bSdpzHtF0G z(^;|Y(rWsX`lG%qDw6aOl3KQSWr|tVZttwHC;OQYPJY18ETyzN^8ex8ATdu@KNpsD HP6!Kt diff --git a/public/images/battle_anims/PRAS- Pulverizing Pancake BG2.png b/public/images/battle_anims/PRAS- Pulverizing Pancake BG2.png index 44b50a6d38558ac9927ca779aa0d43f142d23acd..4c55dd5f1c897cacc9ca0c89a2c39e18619ef943 100644 GIT binary patch delta 3651 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 V*_}1*Q2GD>002ovPDHLkV1j+o=+FQF delta 3697 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 P00000NkvXXu0mjfvJnBX diff --git a/public/images/battle_anims/PRAS- Pulverizing Pancake.png b/public/images/battle_anims/PRAS- Pulverizing Pancake.png index 519a52c63c63128f604ba896cc78391c6c34b577..b284493c6da5bc1570defbff3179732b55955bed 100644 GIT binary patch delta 13592 zcmcKAML-m6+%50{hVE{pJBIF%ZlxQB?nW901_T5I=}rmh0i%0Du>#%_mvXk0U%k8p#h>~H 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 YO6x9waH20g^?w|#p`xqYs0fDsAJ1wNx&QzG delta 13721 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 z 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 diff --git a/public/images/battle_anims/PRAS- Spectral thief BG.png b/public/images/battle_anims/PRAS- Spectral thief BG.png index 35fc434fdca83731a69fc1815665df27f0093872..92c356c5ec5794689743b3ef160480ebc5789ed2 100644 GIT binary patch delta 1706 zcmV;b237f;50Vd%X#o_GYHNRCj@)({h+!a_+ip^LBLDxf_!f>*)J3HdVj?>`_IPTg zbHj%mketxB5S;DB!()QGgeyyYg)9F<161+M&RG(!(V&5!Gp zy@jl=aL&}(rEV;G&Qceg{Zw?ngsCCu*3bY;(pTSn@Iudo)$qgLhjB%*dbK;y=NsH1;khj?Y?mWz*j+PB7Q z1dwk?PHXZG_{isosSwJ(AnhR=c~)zz`~<^_H-H{n!7ih7Y;2D@zc=lDGi7I#w`Ppd zYqWGn=Ggak1gv-ha7A>2vuwH)kA=s-8c`*jT8pulhvjoUAp@r(qy916%@a9YdrU5r+ z8ZZqQ3Gh=umGqN$6(s5fSDuZl8KQqzQ|lU3i>zbQteY*o1_6IkX?;4IUCX@LG6Vh424;fnzbP%h!xmH<*llh*4E z5aqPz@1^r9KU_QkBWB`5`RH7>idCmG(tzncuy5AaY^?EM*Nl=?g@GVC3phPw|Eqn4 zrkDywpLjz+!|Cb}zN|C@8b&%}9X|8a`>20wJFMNHat;XYM}eqX0_tv#;ox_8ZiF0E zDj>%0021Og%4T&mZ-SnQ+bFTsdsik10P}vpJUAJ5-a}FT=&p8{p9HTKY zG`aiqpc8>RauEVSn+z=0ds5<7+4PJc`_)qbz@|ssXFp{McZ3Cf0$G`u*|Zh!jlzE= zAH~5+HvJvH58eY-^4Xbfad0y&0yyUR3EA>RpjWUMk+G($?_UE7y}{}yMf(cq1lb?0 zzobb39(MPsX9WbHk20{S2|o4xcEp{Vao$gX!l+pVggQeOEA&3r_8Hh8N)sS<3cw5d zfv`yKHAl(+HvrG;S?L@=zQh#PgFt^bp?9&)p;9}K?fR>N(T{>N(T)=@9B>J8%<`%1sF#7?6?2} z&&UR&0WcZ>qX96o!Ds-C2EYiP9T#92;j`lc0Cee@Fzex|zW@LL07*qoM6N<$f;oaV AqyPW_ delta 1718 zcmV;n21)sn51kK?X#pRRYHNQXjEa&h20<7Cb-(5Qhg}dJ8Qs~wIG}-qI@S&>UjVJE zo9}X!ilc5+?v?W*=Swa}i3_$c7w2Ps^a$0OO$1(}OSKa12nP*(^>r z0_G%P`)s)<2ha;&@7;0W_N9FX`rz>1{V~2wTJ{2B;fBO3yx?da+Hrq7<#gKCkI=Q= zBNwKlk4WyoTu^w6e_sCdW>jX*b23u#r79A;B%HApM{GdH%&4n+K-){WZGC_FRJqnh zX^X*ARc71>D%{fnrK2aKj*P`jdO?t1aBH4m&;J_PAx8!L0*0b1?>c-7|KJ2}QJTs$ zpE*6AfFIPi$O#P|h30<%&SCWERDgeHbwsX;b|hv`#aDB0Js8yZc(^=NXFf=BxaQBJ zS*cz!`elX;R2T?h7%G4!y8r**(VQg|HrPBEd(wDElTrkLfe`>hK#yXeMwCelvX4;D zN`Fn@!qjyVF_@xC5=sDN zb1ZwRpD;C8A8~))1fNA%o_QUfo7V1(W<-@=cGz5NgT(+G1;lP5 z(|{m|GZ5MGfQamUM$kE}$vfa9pChJ1DEor6hiv3ot+DbG3@hFMdTa%|jLxyKJ?i}4 zwD--Fol)MJF-EV^(jA#&-`f$e;t9YN(E)G*O|&D}pwxf%(Zrb3xURE}pDP}P{byV? zc(r+L@eOBhR{R2O0V$ZjANgfRFcsUXz=c-Yap$mz#;bS2YyoUye)m-!I=9r@Na8LQ zfVc@!n-6AeMvVzNg#*FcY#biDRH>ysJ)ZAD$Z$klA_NkeKpt9yS1X5@_NgqmBu>wFHqEZlI?s0I6#i$Or;_0gV~6ao?JNjvNfQ=jFb7 zcpkGaqLPHy`2#HfRVjq6N8fU&ZRWB!VoW{%Zoovt4S}^0=!|dOFME;AMGv6ISwVcZ z>x%t4zeF7Il;5`xAG}=z=BKH;L)?V^*fqlygn@q;2KV=p_kUj5lwb*WTbaYt-B${i zn>dUWvdvWlal9ban-sQ+jXiHPi{%#5X+OYv`PGMDuQuex7zAq|EA`J3Ak%~vsx$8n zI3~fHGYyyq+?;8^G+-paPXSfZPu^9Ks25y$Hm+uf{#{M2Yfvq+j!m~d8+#t?H=DZN zR}p`>IRVEeTWHU&4D-sAcK4o^e8YeR|HHCX<)%zvnLmNEOarC?`ge#O&_RbU1~5Rm zglk&@NEuC9uQx!H)1JSV&a3=z@dS*Ri4WzYbJ;3Zoz6%Dru)FYSzoiU#)DlmN>&vH zg6J&Z^pO3p_7$39Dj0p@4FL_Ot3&v*(hPrS80n04_{>x9qpt0+c7w_}Ah;g|qG}1K zyE%q~-{H9ta!{#&7`p>Vh}S5a)zQ2OdM0k8#8&TJnIHhn`vLRdWZZcVMfsz<+F^bw zbkhs~PK~Dbn@!W??$d)#1n$U12n201uvqU&iCbmUGlJ|_PXPd%9&w-jlquX17W97! zWMyJz(^kAU3YUBo2P@h1clPjFYE`xBDvQbCI8<5JguJ5>r?Y0^Nk(#ZI$ID$?Q^Wx2-+fvq?+{o#SdsfLO+iDAAb%Py>oYmW(1hN}U7~+8I_T1jP*Ko{gbHp$I9asPEt8 z*eJEyFY{ELs=;(P5oxTrk_9nqiHVF3fieXmfiP6(ZLpIs2O^U|2N9D%2LwXCr#t>{ zG?^V2U>M=E;{pskBO8ncz-R!B2EfP$qX94)03&>MT!3MO&yEWK0Cee@Fqy8p>i_@% M07*qoM6N<$f-IpjkN^Mx diff --git a/public/images/egg/egg_crack.png b/public/images/egg/egg_crack.png index 9d553ebf3788faf71d62b79176113690038c0f88..f5b5ee7b7e15cb2d3ec6458c98d951af25a9080f 100644 GIT binary patch delta 214 zcmV;{04e{X0+a%fMt`|UL_t&-83n+xO~f!10MPd>2l=Rslw9rRB*yqKL5d`zOvxB2 zS%98~hA9!OK%BrMfhB?Evs}pK_=CRe3H5tFVS3xY;3@XjlC9RRdiE9Wc@1&Oq5n#80L`92bcF1hH@6wjW?# zJ}x+y^%Y@Cr~*_Kyci%2V4}mFfwGZ^O>~s^tT%+-T!h*TT9yHQvpF delta 228 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 O0000<~T3T98PR{4&=gGN+PR!-V8` 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 LO;5E^**@}rHSD{! diff --git a/public/images/items/common_egg.png b/public/images/items/common_egg.png index 5eccff2f690d2313014ebf6d8b8c89cd902fd03b..c449611d5328bd3c97b3f0fbfce21813ccecfc84 100644 GIT binary patch delta 231 zcmVoeg6#r4x5c18q4r8c`D2U z#K8bi|Nf}!1ymeeI2d4MjnZeA!3Jd0b!km}q=Ti%Dnsf*6-^a@ovwo|nFYXcfdX)% zhd_b=un77Alw;oU_BXs#1^YB`#n}J|0WCTG{wkCig+kyoAAb+a0o;I(5dgV59~HDw z7=B6~B_aR{LZg=m{lA{bHIkS;#yKxeBpP}KYD12GHT9qc|2 m1T8kR`zRc}%*f#=$G|X8#w(yWhmV^92s~Z=T-G@yGywpNHZErX diff --git a/public/images/mystery-encounters/fun_and_games_wobbuffet.png b/public/images/mystery-encounters/fun_and_games_wobbuffet.png index 71997be5692bb37cdcfe82f575e9b8f117af446b..5d61512ea78cc1742887eea60be46f9b6c76826a 100644 GIT binary patch delta 579 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 delta 167 zcmV;Y09gN+0k;8=7=H)`0002~ST>^o0004VQb$4nuFf3k0001RNklO4TfzSUNA6%BtfDe1t38X07<~@gehobU|{rvDj?p(zyPrm7a(5}0H~!i Vr1pptfB*mh07*qoM6N<$f&kBWKz9HD diff --git a/public/images/ui/champion_ribbon_diamond.png b/public/images/ui/champion_ribbon_diamond.png index fd0e1f7748011c9ad08a0b3dc49d5037a64b03fa..207ade56c19f79f3f80939437f9c83fdc6a17920 100644 GIT binary patch delta 138 zcmX@fIE!(DL_G^L0|Nt3nf3%AB^}@s;tHfSDpvS0FeGevP;vNOJp)6>g&#}q{5bI9 zhuWkDeV{aBNswPKgTu2MX+Vyyr;B4qMO<=1fnh>ILZ*LOLV`ZC(80_$E}n&LPFy@| m9KCpW7IJxU2{dtXFiyY7`r$O!+Yq2e22WQ%mvzie2~7YEN-R_W delta 185 zcmV;q07n0s0m%W77=H)`0002~ST>^o0004VQb$4nuFf3k0001kNklVKNf~10!4~NCG6_2Q>+- n6ImCABuE8FHAn(xDvS>RWx_l@|ER*L00000NkvXXu0mjfED1q0 diff --git a/public/images/ui/champion_ribbon_silver.png b/public/images/ui/champion_ribbon_silver.png index 92b6f4cf8c7f1ed1f0cfb8efcf1cda43e24e800a..52cde02840632c6b74bd413689669ed78a8d903c 100644 GIT binary patch delta 146 zcmX@fxQKCrL_G^L0|Nt3nf3%AB^Tfm;tHhy|NrmDz);V?P%&e{gdIEDR)&j^g^mK6ysfbHX@F-45NSG~n=)i%CTq-_JcSR+7 w?skhv%;=pWAu&VLfrVL^xp~2Y1q=++ud_xKs(bk}a09h_y85}Sb4q9e0BPkh#Q*>R delta 185 zcmV;q07n0!0m%W77=H)`0002~ST>^o0004VQb$4nuFf3k0001jNkl;8k7pWc3A=*UQ51hK&cNWw~2i{ZtG4-ov|1y})Ca>a=gU|k>yFb$KeXJGjMbH)M& z2?Ytb#DxnN7}#b^U|J5L_G^L0|Nt3nf3%AB^Tfm;`;ype;{*5fkQn5gC7IKhXob4dXr`ZNPO8c z<;RH)A13T_07^5J1o;IsFqBO`YXRh`d%8G=RKz6<_ymh22+S5#IiPTnOQpx@s;orM lRc{%I7T#DEi2z211%|9XYhQkt1=Pae>FVdQ&MASh2>|#dEL;Ep delta 167 zcmV;Y09gN+0k;8=7=H)`0002~ST>^o0004VQb$4nuFf3k0001RNklO4TfzSUNA6%BtfDe1t38X07<~@gehobU|{rvDj?p(zyPrm7a(5}0H~!i Vr1pptfB*mh07*qoM6N<$f&kBWKz9HD diff --git a/public/images/ui/legacy/champion_ribbon_diamond.png b/public/images/ui/legacy/champion_ribbon_diamond.png index fd0e1f7748011c9ad08a0b3dc49d5037a64b03fa..207ade56c19f79f3f80939437f9c83fdc6a17920 100644 GIT binary patch delta 138 zcmX@fIE!(DL_G^L0|Nt3nf3%AB^}@s;tHfSDpvS0FeGevP;vNOJp)6>g&#}q{5bI9 zhuWkDeV{aBNswPKgTu2MX+Vyyr;B4qMO<=1fnh>ILZ*LOLV`ZC(80_$E}n&LPFy@| m9KCpW7IJxU2{dtXFiyY7`r$O!+Yq2e22WQ%mvzie2~7YEN-R_W delta 185 zcmV;q07n0s0m%W77=H)`0002~ST>^o0004VQb$4nuFf3k0001kNklVKNf~10!4~NCG6_2Q>+- n6ImCABuE8FHAn(xDvS>RWx_l@|ER*L00000NkvXXu0mjfED1q0 diff --git a/public/images/ui/legacy/champion_ribbon_silver.png b/public/images/ui/legacy/champion_ribbon_silver.png index 92b6f4cf8c7f1ed1f0cfb8efcf1cda43e24e800a..52cde02840632c6b74bd413689669ed78a8d903c 100644 GIT binary patch delta 146 zcmX@fxQKCrL_G^L0|Nt3nf3%AB^Tfm;tHhy|NrmDz);V?P%&e{gdIEDR)&j^g^mK6ysfbHX@F-45NSG~n=)i%CTq-_JcSR+7 w?skhv%;=pWAu&VLfrVL^xp~2Y1q=++ud_xKs(bk}a09h_y85}Sb4q9e0BPkh#Q*>R delta 185 zcmV;q07n0!0m%W77=H)`0002~ST>^o0004VQb$4nuFf3k0001jNkl;8k7pWc3A=*UQ51hK&cNWw~2i{ZtG4-ov|1y})Ca>a=gU|k>yFb$KeXJGjMbH)M& z2?Ytb#DxnN7}#b^U| Date: Sun, 31 Aug 2025 15:25:27 +0200 Subject: [PATCH 064/134] fix position --- src/ui/battle-info/enemy-battle-info.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 4b37adc74aa..0f980d6f02a 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -180,7 +180,6 @@ export class EnemyBattleInfo extends BattleInfo { this.ownedIcon, this.championRibbon, this.statusIndicator, - this.levelContainer, this.statValuesContainer, ].map(e => (e.x += 48 * (boss ? -1 : 1))); this.hpBar.x += 38 * (boss ? -1 : 1); From e0a752aa70be149e51a94b5ed6a48412417bb081 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sun, 31 Aug 2025 15:55:50 +0200 Subject: [PATCH 065/134] [UI/UX] [Localization] Korean and Chinese Visual Fixes (#6452) --- src/ui/text.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ui/text.ts b/src/ui/text.ts index 8aa50983874..bac53f81ba6 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -349,6 +349,15 @@ export function getTextStyleOptions( styleOptions.fontSize = defaultFontSize - 42; styleOptions.padding = { top: 4 }; break; + case "ko": + styleOptions.fontSize = defaultFontSize - 38; + styleOptions.padding = { top: 4, left: 6 }; + break; + case "zh-CN": + case "zh-TW": + styleOptions.fontSize = defaultFontSize - 42; + styleOptions.padding = { top: 5, left: 14 }; + break; default: styleOptions.fontSize = defaultFontSize - 30; styleOptions.padding = { left: 12 }; From 2a5e66d85f33edac99ab54e171280eeecd2a7f63 Mon Sep 17 00:00:00 2001 From: fabske0 <192151969+fabske0@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:17:25 +0200 Subject: [PATCH 066/134] update pos --- src/ui/battle-info/enemy-battle-info.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 0f980d6f02a..e1063be95af 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -185,6 +185,7 @@ export class EnemyBattleInfo extends BattleInfo { this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); + this.levelContainer.x += 2 * (boss ? -1 : 1); this.box.setTexture(this.getTextureName()); this.statsBox.setTexture(`${this.getTextureName()}_stats`); } From 231cfd040cfb2e34e10305c418281b068c5cafd4 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 31 Aug 2025 13:47:53 -0400 Subject: [PATCH 067/134] [Balance] TM tier changes 1.10.6 (#6461) * TM tier changes 1.10.6 --- src/data/balance/tms.ts | 64 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/data/balance/tms.ts b/src/data/balance/tms.ts index bd7cf401ad1..f7c330e3d95 100644 --- a/src/data/balance/tms.ts +++ b/src/data/balance/tms.ts @@ -68875,27 +68875,27 @@ interface TmPoolTiers { export const tmPoolTiers: TmPoolTiers = { [MoveId.MEGA_PUNCH]: ModifierTier.GREAT, - [MoveId.PAY_DAY]: ModifierTier.ULTRA, + [MoveId.PAY_DAY]: ModifierTier.COMMON, [MoveId.FIRE_PUNCH]: ModifierTier.GREAT, [MoveId.ICE_PUNCH]: ModifierTier.GREAT, [MoveId.THUNDER_PUNCH]: ModifierTier.GREAT, - [MoveId.SWORDS_DANCE]: ModifierTier.COMMON, + [MoveId.SWORDS_DANCE]: ModifierTier.GREAT, [MoveId.CUT]: ModifierTier.COMMON, - [MoveId.FLY]: ModifierTier.COMMON, + [MoveId.FLY]: ModifierTier.GREAT, [MoveId.MEGA_KICK]: ModifierTier.GREAT, [MoveId.BODY_SLAM]: ModifierTier.GREAT, [MoveId.TAKE_DOWN]: ModifierTier.GREAT, [MoveId.DOUBLE_EDGE]: ModifierTier.ULTRA, - [MoveId.PIN_MISSILE]: ModifierTier.COMMON, + [MoveId.PIN_MISSILE]: ModifierTier.GREAT, [MoveId.ROAR]: ModifierTier.COMMON, [MoveId.FLAMETHROWER]: ModifierTier.ULTRA, [MoveId.HYDRO_PUMP]: ModifierTier.ULTRA, [MoveId.SURF]: ModifierTier.ULTRA, [MoveId.ICE_BEAM]: ModifierTier.ULTRA, [MoveId.BLIZZARD]: ModifierTier.ULTRA, - [MoveId.PSYBEAM]: ModifierTier.GREAT, + [MoveId.PSYBEAM]: ModifierTier.COMMON, [MoveId.HYPER_BEAM]: ModifierTier.ULTRA, - [MoveId.LOW_KICK]: ModifierTier.COMMON, + [MoveId.LOW_KICK]: ModifierTier.GREAT, [MoveId.COUNTER]: ModifierTier.COMMON, [MoveId.STRENGTH]: ModifierTier.GREAT, [MoveId.SOLAR_BEAM]: ModifierTier.ULTRA, @@ -68907,9 +68907,9 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.DIG]: ModifierTier.GREAT, [MoveId.TOXIC]: ModifierTier.GREAT, [MoveId.PSYCHIC]: ModifierTier.ULTRA, - [MoveId.AGILITY]: ModifierTier.COMMON, + [MoveId.AGILITY]: ModifierTier.GREAT, [MoveId.NIGHT_SHADE]: ModifierTier.COMMON, - [MoveId.SCREECH]: ModifierTier.COMMON, + [MoveId.SCREECH]: ModifierTier.GREAT, [MoveId.DOUBLE_TEAM]: ModifierTier.COMMON, [MoveId.CONFUSE_RAY]: ModifierTier.COMMON, [MoveId.LIGHT_SCREEN]: ModifierTier.COMMON, @@ -68921,7 +68921,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.FIRE_BLAST]: ModifierTier.ULTRA, [MoveId.WATERFALL]: ModifierTier.GREAT, [MoveId.SWIFT]: ModifierTier.COMMON, - [MoveId.AMNESIA]: ModifierTier.COMMON, + [MoveId.AMNESIA]: ModifierTier.GREAT, [MoveId.DREAM_EATER]: ModifierTier.GREAT, [MoveId.LEECH_LIFE]: ModifierTier.ULTRA, [MoveId.FLASH]: ModifierTier.COMMON, @@ -68933,11 +68933,11 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.SUBSTITUTE]: ModifierTier.COMMON, [MoveId.THIEF]: ModifierTier.GREAT, [MoveId.SNORE]: ModifierTier.COMMON, - [MoveId.CURSE]: ModifierTier.COMMON, + [MoveId.CURSE]: ModifierTier.GREAT, [MoveId.REVERSAL]: ModifierTier.COMMON, [MoveId.SPITE]: ModifierTier.COMMON, [MoveId.PROTECT]: ModifierTier.COMMON, - [MoveId.SCARY_FACE]: ModifierTier.COMMON, + [MoveId.SCARY_FACE]: ModifierTier.GREAT, [MoveId.SLUDGE_BOMB]: ModifierTier.GREAT, [MoveId.MUD_SLAP]: ModifierTier.COMMON, [MoveId.SPIKES]: ModifierTier.COMMON, @@ -68979,8 +68979,8 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.TORMENT]: ModifierTier.COMMON, [MoveId.WILL_O_WISP]: ModifierTier.COMMON, [MoveId.FACADE]: ModifierTier.GREAT, - [MoveId.FOCUS_PUNCH]: ModifierTier.COMMON, - [MoveId.NATURE_POWER]: ModifierTier.COMMON, + [MoveId.FOCUS_PUNCH]: ModifierTier.GREAT, + [MoveId.NATURE_POWER]: ModifierTier.GREAT, [MoveId.CHARGE]: ModifierTier.COMMON, [MoveId.TAUNT]: ModifierTier.COMMON, [MoveId.HELPING_HAND]: ModifierTier.COMMON, @@ -68993,7 +68993,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.ENDEAVOR]: ModifierTier.COMMON, [MoveId.SKILL_SWAP]: ModifierTier.COMMON, [MoveId.IMPRISON]: ModifierTier.COMMON, - [MoveId.SECRET_POWER]: ModifierTier.COMMON, + [MoveId.SECRET_POWER]: ModifierTier.GREAT, [MoveId.DIVE]: ModifierTier.GREAT, [MoveId.FEATHER_DANCE]: ModifierTier.COMMON, [MoveId.BLAZE_KICK]: ModifierTier.GREAT, @@ -69001,12 +69001,12 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.BLAST_BURN]: ModifierTier.ULTRA, [MoveId.HYDRO_CANNON]: ModifierTier.ULTRA, [MoveId.WEATHER_BALL]: ModifierTier.COMMON, - [MoveId.FAKE_TEARS]: ModifierTier.COMMON, + [MoveId.FAKE_TEARS]: ModifierTier.GREAT, [MoveId.AIR_CUTTER]: ModifierTier.GREAT, [MoveId.OVERHEAT]: ModifierTier.ULTRA, [MoveId.ROCK_TOMB]: ModifierTier.GREAT, - [MoveId.METAL_SOUND]: ModifierTier.COMMON, - [MoveId.COSMIC_POWER]: ModifierTier.COMMON, + [MoveId.METAL_SOUND]: ModifierTier.GREAT, + [MoveId.COSMIC_POWER]: ModifierTier.GREAT, [MoveId.SIGNAL_BEAM]: ModifierTier.GREAT, [MoveId.SAND_TOMB]: ModifierTier.COMMON, [MoveId.MUDDY_WATER]: ModifierTier.GREAT, @@ -69016,10 +69016,10 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.IRON_DEFENSE]: ModifierTier.GREAT, [MoveId.DRAGON_CLAW]: ModifierTier.ULTRA, [MoveId.FRENZY_PLANT]: ModifierTier.ULTRA, - [MoveId.BULK_UP]: ModifierTier.COMMON, + [MoveId.BULK_UP]: ModifierTier.GREAT, [MoveId.BOUNCE]: ModifierTier.GREAT, [MoveId.MUD_SHOT]: ModifierTier.GREAT, - [MoveId.POISON_TAIL]: ModifierTier.GREAT, + [MoveId.POISON_TAIL]: ModifierTier.COMMON, [MoveId.COVET]: ModifierTier.GREAT, [MoveId.MAGICAL_LEAF]: ModifierTier.GREAT, [MoveId.CALM_MIND]: ModifierTier.GREAT, @@ -69047,7 +69047,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.TOXIC_SPIKES]: ModifierTier.GREAT, [MoveId.FLARE_BLITZ]: ModifierTier.ULTRA, [MoveId.AURA_SPHERE]: ModifierTier.GREAT, - [MoveId.ROCK_POLISH]: ModifierTier.COMMON, + [MoveId.ROCK_POLISH]: ModifierTier.GREAT, [MoveId.POISON_JAB]: ModifierTier.GREAT, [MoveId.DARK_PULSE]: ModifierTier.GREAT, [MoveId.AQUA_TAIL]: ModifierTier.GREAT, @@ -69063,8 +69063,8 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.ENERGY_BALL]: ModifierTier.GREAT, [MoveId.BRAVE_BIRD]: ModifierTier.ULTRA, [MoveId.EARTH_POWER]: ModifierTier.ULTRA, - [MoveId.GIGA_IMPACT]: ModifierTier.GREAT, - [MoveId.NASTY_PLOT]: ModifierTier.COMMON, + [MoveId.GIGA_IMPACT]: ModifierTier.ULTRA, + [MoveId.NASTY_PLOT]: ModifierTier.GREAT, [MoveId.AVALANCHE]: ModifierTier.GREAT, [MoveId.SHADOW_CLAW]: ModifierTier.GREAT, [MoveId.THUNDER_FANG]: ModifierTier.GREAT, @@ -69084,7 +69084,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.IRON_HEAD]: ModifierTier.GREAT, [MoveId.STONE_EDGE]: ModifierTier.ULTRA, [MoveId.STEALTH_ROCK]: ModifierTier.COMMON, - [MoveId.GRASS_KNOT]: ModifierTier.ULTRA, + [MoveId.GRASS_KNOT]: ModifierTier.GREAT, [MoveId.BUG_BITE]: ModifierTier.GREAT, [MoveId.CHARGE_BEAM]: ModifierTier.GREAT, [MoveId.HONE_CLAWS]: ModifierTier.COMMON, @@ -69102,7 +69102,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.FOUL_PLAY]: ModifierTier.ULTRA, [MoveId.ROUND]: ModifierTier.COMMON, [MoveId.ECHOED_VOICE]: ModifierTier.COMMON, - [MoveId.STORED_POWER]: ModifierTier.COMMON, + [MoveId.STORED_POWER]: ModifierTier.GREAT, [MoveId.ALLY_SWITCH]: ModifierTier.COMMON, [MoveId.SCALD]: ModifierTier.GREAT, [MoveId.HEX]: ModifierTier.GREAT, @@ -69130,7 +69130,7 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.SNARL]: ModifierTier.COMMON, [MoveId.PHANTOM_FORCE]: ModifierTier.ULTRA, [MoveId.PETAL_BLIZZARD]: ModifierTier.GREAT, - [MoveId.DISARMING_VOICE]: ModifierTier.GREAT, + [MoveId.DISARMING_VOICE]: ModifierTier.COMMON, [MoveId.DRAINING_KISS]: ModifierTier.GREAT, [MoveId.GRASSY_TERRAIN]: ModifierTier.COMMON, [MoveId.MISTY_TERRAIN]: ModifierTier.COMMON, @@ -69161,12 +69161,12 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.BREAKING_SWIPE]: ModifierTier.GREAT, [MoveId.STEEL_BEAM]: ModifierTier.ULTRA, [MoveId.EXPANDING_FORCE]: ModifierTier.GREAT, - [MoveId.STEEL_ROLLER]: ModifierTier.COMMON, + [MoveId.STEEL_ROLLER]: ModifierTier.GREAT, [MoveId.SCALE_SHOT]: ModifierTier.ULTRA, [MoveId.METEOR_BEAM]: ModifierTier.GREAT, - [MoveId.MISTY_EXPLOSION]: ModifierTier.COMMON, + [MoveId.MISTY_EXPLOSION]: ModifierTier.GREAT, [MoveId.GRASSY_GLIDE]: ModifierTier.COMMON, - [MoveId.RISING_VOLTAGE]: ModifierTier.COMMON, + [MoveId.RISING_VOLTAGE]: ModifierTier.GREAT, [MoveId.TERRAIN_PULSE]: ModifierTier.COMMON, [MoveId.SKITTER_SMACK]: ModifierTier.GREAT, [MoveId.BURNING_JEALOUSY]: ModifierTier.GREAT, @@ -69175,20 +69175,20 @@ export const tmPoolTiers: TmPoolTiers = { [MoveId.CORROSIVE_GAS]: ModifierTier.COMMON, [MoveId.COACHING]: ModifierTier.COMMON, [MoveId.FLIP_TURN]: ModifierTier.COMMON, - [MoveId.TRIPLE_AXEL]: ModifierTier.COMMON, - [MoveId.DUAL_WINGBEAT]: ModifierTier.COMMON, + [MoveId.TRIPLE_AXEL]: ModifierTier.ULTRA, + [MoveId.DUAL_WINGBEAT]: ModifierTier.GREAT, [MoveId.SCORCHING_SANDS]: ModifierTier.GREAT, [MoveId.TERA_BLAST]: ModifierTier.GREAT, [MoveId.ICE_SPINNER]: ModifierTier.GREAT, [MoveId.SNOWSCAPE]: ModifierTier.COMMON, [MoveId.POUNCE]: ModifierTier.COMMON, - [MoveId.TRAILBLAZE]: ModifierTier.COMMON, + [MoveId.TRAILBLAZE]: ModifierTier.GREAT, [MoveId.CHILLING_WATER]: ModifierTier.COMMON, [MoveId.HARD_PRESS]: ModifierTier.GREAT, [MoveId.DRAGON_CHEER]: ModifierTier.COMMON, [MoveId.ALLURING_VOICE]: ModifierTier.GREAT, [MoveId.TEMPER_FLARE]: ModifierTier.GREAT, - [MoveId.SUPERCELL_SLAM]: ModifierTier.GREAT, + [MoveId.SUPERCELL_SLAM]: ModifierTier.ULTRA, [MoveId.PSYCHIC_NOISE]: ModifierTier.GREAT, [MoveId.UPPER_HAND]: ModifierTier.COMMON, }; From 64ad2ee9c21ebf9e6f9307ebc4edb98164518643 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 1 Sep 2025 08:12:04 +1000 Subject: [PATCH 068/134] Make e4 not automatically recharge tera --- src/battle-scene.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index be02962867c..153e274a296 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1476,10 +1476,7 @@ export class BattleScene extends SceneBase { pokemon.resetBattleAndWaveData(); pokemon.resetTera(); applyAbAttrs("PostBattleInitAbAttr", { pokemon }); - if ( - pokemon.hasSpecies(SpeciesId.TERAPAGOS) || - (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190) - ) { + if (pokemon.hasSpecies(SpeciesId.TERAPAGOS)) { this.arena.playerTerasUsed = 0; } } From 17c28c40248cd9ffa0611459d6d2f27b36da7dc1 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Mon, 1 Sep 2025 08:57:46 -0400 Subject: [PATCH 069/134] [Bug] Fix monotype challenge using unlocalized type names (#6438) --- src/data/challenge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 01e6fa78ffc..cea8661e78c 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -27,7 +27,7 @@ import type { DexEntry } from "#types/dex-data"; import { type BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common"; import { deepCopy } from "#utils/data"; import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; -import { toCamelCase, toSnakeCase } from "#utils/strings"; +import { toCamelCase } from "#utils/strings"; import i18next from "i18next"; /** A constant for the default max cost of the starting party before a run */ @@ -764,7 +764,7 @@ export class SingleTypeChallenge extends Challenge { } getValue(overrideValue: number = this.value): string { - return toSnakeCase(PokemonType[overrideValue - 1]); + return i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[overrideValue - 1])}`); } getDescription(overrideValue: number = this.value): string { From 446908ae1300ddb101d492c44b889a40715a78dc Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 1 Sep 2025 07:02:40 -0700 Subject: [PATCH 070/134] [Misc] Add " (Beta)" to site title and version display on beta (#6418) --- src/main.ts | 4 ++++ src/ui/title-ui-handler.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 7e4943bdca5..80f2ca3ed8b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,6 +10,10 @@ import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin"; import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin"; import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; +if (import.meta.env.DEV) { + document.title += " (Beta)"; +} + // Catch global errors and display them in an alert so users can report the issue. window.onerror = (_message, _source, _lineno, _colno, error) => { console.error(error); diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 5ae195231e5..ef814167631 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -141,7 +141,8 @@ export class TitleUiHandler extends OptionSelectUiHandler { }), ); - this.appVersionText.setText("v" + version); + const betaText = import.meta.env.DEV ? " (Beta)" : ""; + this.appVersionText.setText("v" + version + betaText); const ui = this.getUi(); From bd7de61a5620afdf9a0b6c13e77400dd51c7a411 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 2 Sep 2025 06:13:15 +1000 Subject: [PATCH 071/134] Improve error handling when playing unloaded sounds --- src/battle-scene.ts | 15 ++++++---- src/data/battle-anims.ts | 12 ++++++-- src/data/pokemon-species.ts | 4 +-- src/field/pokemon.ts | 54 ++++++++++++++++++++-------------- src/phases/egg-hatch-phase.ts | 2 +- src/phases/evolution-phase.ts | 10 +++++-- src/phases/party-heal-phase.ts | 16 +++++----- 7 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index be02962867c..9ac6e385220 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2318,7 +2318,7 @@ export class BattleScene extends SceneBase { }); } - playSound(sound: string | AnySound, config?: object): AnySound { + playSound(sound: string | AnySound, config?: object): AnySound | null { const key = typeof sound === "string" ? sound : sound.key; config = config ?? {}; try { @@ -2354,16 +2354,19 @@ export class BattleScene extends SceneBase { this.sound.play(key, config); return this.sound.get(key) as AnySound; } catch { - console.log(`${key} not found`); - return sound as AnySound; + console.warn(`${key} not found`); + return null; } } - playSoundWithoutBgm(soundName: string, pauseDuration?: number): AnySound { + playSoundWithoutBgm(soundName: string, pauseDuration?: number): AnySound | null { this.bgmCache.add(soundName); const resumeBgm = this.pauseBgm(); this.playSound(soundName); - const sound = this.sound.get(soundName) as AnySound; + const sound = this.sound.get(soundName); + if (!sound) { + return sound; + } if (this.bgmResumeTimer) { this.bgmResumeTimer.destroy(); } @@ -2373,7 +2376,7 @@ export class BattleScene extends SceneBase { this.bgmResumeTimer = null; }); } - return sound; + return sound as AnySound; } /** The loop point of any given battle, mystery encounter, or title track, read as seconds and milliseconds. */ diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index aa4951f3263..5ff4472d148 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -291,9 +291,17 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } catch (err) { console.error(err); } - return Math.ceil((globalScene.sound.get(`battle_anims/${this.resourceName}`).totalDuration * 1000) / 33.33); + const sound = globalScene.sound.get(`battle_anims/${this.resourceName}`); + if (!sound) { + return 0; + } + return Math.ceil((sound.totalDuration * 1000) / 33.33); } - return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? + const cry = battleAnim.user!.cry(soundConfig); // TODO: is the bang behind user correct? + if (!cry) { + return 0; + } + return Math.ceil((cry.totalDuration * 1000) / 33.33); } getEventType(): string { diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index fd8551f2289..d5049569e61 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -593,14 +593,14 @@ export abstract class PokemonSpeciesForm { }); } - cry(soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound { + cry(soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound | null { const cryKey = this.getCryKey(this.formIndex); let cry: AnySound | null = globalScene.sound.get(cryKey) as AnySound; if (cry?.pendingRemove) { cry = null; } cry = globalScene.playSound(cry ?? cryKey, soundConfig); - if (ignorePlay) { + if (cry && ignorePlay) { cry.stop(); } return cry; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index db973ef2d78..207ec0feecd 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4547,28 +4547,36 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { }); } - cry(soundConfig?: Phaser.Types.Sound.SoundConfig, sceneOverride?: BattleScene): AnySound { + cry(soundConfig?: Phaser.Types.Sound.SoundConfig, sceneOverride?: BattleScene): AnySound | null { const scene = sceneOverride ?? globalScene; // TODO: is `sceneOverride` needed? const cry = this.getSpeciesForm(undefined, true).cry(soundConfig); + if (!cry) { + return cry; + } let duration = cry.totalDuration * 1000; if (this.fusionSpecies && this.getSpeciesForm(undefined, true) !== this.getFusionSpeciesForm(undefined, true)) { let fusionCry = this.getFusionSpeciesForm(undefined, true).cry(soundConfig, true); + if (!fusionCry) { + return cry; + } duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); scene.time.delayedCall(fixedInt(Math.ceil(duration * 0.4)), () => { try { SoundFade.fadeOut(scene, cry, fixedInt(Math.ceil(duration * 0.2))); fusionCry = this.getFusionSpeciesForm(undefined, true).cry({ - seek: Math.max(fusionCry.totalDuration * 0.4, 0), + seek: Math.max(fusionCry!.totalDuration * 0.4, 0), ...soundConfig, }); - SoundFade.fadeIn( - scene, - fusionCry, - fixedInt(Math.ceil(duration * 0.2)), - scene.masterVolume * scene.fieldVolume, - 0, - ); + if (fusionCry) { + SoundFade.fadeIn( + scene, + fusionCry, + fixedInt(Math.ceil(duration * 0.2)), + scene.masterVolume * scene.fieldVolume, + 0, + ); + } } catch (err) { console.error(err); } @@ -4596,14 +4604,14 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { crySoundConfig.rate = 0.7; } } - const cry = globalScene.playSound(key, crySoundConfig) as AnySound; + const cry = globalScene.playSound(key, crySoundConfig); if (!cry || globalScene.fieldVolume === 0) { callback(); return; } const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); - const delay = Math.max(globalScene.sound.get(key).totalDuration * 50, 25); + const delay = Math.max(cry.totalDuration * 50, 25); let frameProgress = 0; let frameThreshold: number; @@ -4656,20 +4664,20 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { const key = this.species.getCryKey(this.formIndex); let i = 0; let rate = 0.85; - const cry = globalScene.playSound(key, { rate: rate }) as AnySound; + const cry = globalScene.playSound(key, { rate: rate }); const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); - let duration = cry.totalDuration * 1000; const fusionCryKey = this.fusionSpecies!.getCryKey(this.fusionFormIndex); let fusionCry = globalScene.playSound(fusionCryKey, { rate: rate, - }) as AnySound; + }); if (!cry || !fusionCry || globalScene.fieldVolume === 0) { callback(); return; } fusionCry.stop(); + let duration = cry.totalDuration * 1000; duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); const delay = Math.max(duration * 0.05, 25); @@ -4712,16 +4720,18 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { if (i === transitionIndex && fusionCryKey) { SoundFade.fadeOut(globalScene, cry, fixedInt(Math.ceil((duration / rate) * 0.2))); fusionCry = globalScene.playSound(fusionCryKey, { - seek: Math.max(fusionCry.totalDuration * 0.4, 0), + seek: Math.max(fusionCry!.totalDuration * 0.4, 0), rate: rate, }); - SoundFade.fadeIn( - globalScene, - fusionCry, - fixedInt(Math.ceil((duration / rate) * 0.2)), - globalScene.masterVolume * globalScene.fieldVolume, - 0, - ); + if (fusionCry) { + SoundFade.fadeIn( + globalScene, + fusionCry, + fixedInt(Math.ceil((duration / rate) * 0.2)), + globalScene.masterVolume * globalScene.fieldVolume, + 0, + ); + } } rate *= 0.99; if (cry && !cry.pendingRemove) { diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index e9d28e0fe2a..547ca778c6b 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -64,7 +64,7 @@ export class EggHatchPhase extends Phase { private canSkip: boolean; private skipped: boolean; /** The sound effect being played when the egg is hatched */ - private evolutionBgm: AnySound; + private evolutionBgm: AnySound | null; private eggLapsePhase: EggLapsePhase; constructor(hatchScene: EggLapsePhase, egg: Egg, eggsToHatchCount: number) { diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 542a2100452..6095dfafa21 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -28,7 +28,7 @@ export class EvolutionPhase extends Phase { private evolution: SpeciesFormEvolution | null; private fusionSpeciesEvolved: boolean; // Whether the evolution is of the fused species - private evolutionBgm: AnySound; + private evolutionBgm: AnySound | null; private evolutionHandler: EvolutionSceneHandler; /** Container for all assets used by the scene. When the scene is cleared, the children within this are destroyed. */ @@ -298,7 +298,9 @@ export class EvolutionPhase extends Phase { this.evolutionBg.setVisible(false); }, }); - SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + if (this.evolutionBgm) { + SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + } } /** @@ -378,7 +380,9 @@ export class EvolutionPhase extends Phase { * Fadeout evolution music, play the cry, show the evolution completed text, and end the phase */ private onEvolutionComplete(evolvedPokemon: Pokemon) { - SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + if (this.evolutionBgm) { + SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + } globalScene.time.delayedCall(250, () => { this.pokemon.cry(); globalScene.time.delayedCall(1250, () => { diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index 1030d5eb9d9..154e95bc970 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -38,13 +38,15 @@ export class PartyHealPhase extends BattlePhase { pokemon.updateInfo(true); } const healSong = globalScene.playSoundWithoutBgm("heal"); - globalScene.time.delayedCall(fixedInt(healSong.totalDuration * 1000), () => { - healSong.destroy(); - if (this.resumeBgm && bgmPlaying) { - globalScene.playBgm(); - } - globalScene.ui.fadeIn(500).then(() => this.end()); - }); + if (healSong) { + globalScene.time.delayedCall(fixedInt(healSong.totalDuration * 1000), () => { + healSong.destroy(); + if (this.resumeBgm && bgmPlaying) { + globalScene.playBgm(); + } + globalScene.ui.fadeIn(500).then(() => this.end()); + }); + } }); globalScene.arena.playerTerasUsed = 0; } From eb8c0c0243490827dd6a339bfad7294d4b7164ef Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 2 Sep 2025 06:15:35 +1000 Subject: [PATCH 072/134] Add comment explaining bang --- src/field/pokemon.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 207ec0feecd..3f5dbc2e320 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4565,6 +4565,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { try { SoundFade.fadeOut(scene, cry, fixedInt(Math.ceil(duration * 0.2))); fusionCry = this.getFusionSpeciesForm(undefined, true).cry({ + // Typescript's type checker doesn't handle using and assigning to the same variable in one line correctly. seek: Math.max(fusionCry!.totalDuration * 0.4, 0), ...soundConfig, }); From bc0e2662fa95d2e9457979207ffdaa17062241af Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 2 Sep 2025 06:37:25 +1000 Subject: [PATCH 073/134] Clean up bangs --- src/field/pokemon.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 3f5dbc2e320..aac2ed55a72 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4555,7 +4555,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } let duration = cry.totalDuration * 1000; if (this.fusionSpecies && this.getSpeciesForm(undefined, true) !== this.getFusionSpeciesForm(undefined, true)) { - let fusionCry = this.getFusionSpeciesForm(undefined, true).cry(soundConfig, true); + const fusionCry = this.getFusionSpeciesForm(undefined, true).cry(soundConfig, true); if (!fusionCry) { return cry; } @@ -4564,15 +4564,14 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { scene.time.delayedCall(fixedInt(Math.ceil(duration * 0.4)), () => { try { SoundFade.fadeOut(scene, cry, fixedInt(Math.ceil(duration * 0.2))); - fusionCry = this.getFusionSpeciesForm(undefined, true).cry({ - // Typescript's type checker doesn't handle using and assigning to the same variable in one line correctly. - seek: Math.max(fusionCry!.totalDuration * 0.4, 0), + const fusionCryInner = this.getFusionSpeciesForm(undefined, true).cry({ + seek: Math.max(fusionCry.totalDuration * 0.4, 0), ...soundConfig, }); - if (fusionCry) { + if (fusionCryInner) { SoundFade.fadeIn( scene, - fusionCry, + fusionCryInner, fixedInt(Math.ceil(duration * 0.2)), scene.masterVolume * scene.fieldVolume, 0, @@ -4721,6 +4720,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { if (i === transitionIndex && fusionCryKey) { SoundFade.fadeOut(globalScene, cry, fixedInt(Math.ceil((duration / rate) * 0.2))); fusionCry = globalScene.playSound(fusionCryKey, { + // TODO: This bang is correct as this callback can only be called once, but + // this whole block with conditionally reassigning fusionCry needs a second lock. seek: Math.max(fusionCry!.totalDuration * 0.4, 0), rate: rate, }); From 34430b4057e0e86cf140c5f2e950324da6ceaca3 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Tue, 2 Sep 2025 05:25:41 +0200 Subject: [PATCH 074/134] [UI/UX] [Localization] Summary UI translation (#6433) * Summary UI Transaltion * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Summary UI Translation * Remove unnecessary loading of en images when lang is not en Consolidate duplicate code --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: damocleas --- .../images/ui/legacy/pokedex_summary_bg.png | Bin 344 -> 351 bytes public/images/ui/legacy/starter_select_bg.png | Bin 350 -> 337 bytes public/images/ui/legacy/summary_bg.png | Bin 476 -> 444 bytes public/images/ui/legacy/summary_moves.png | Bin 549 -> 377 bytes .../images/ui/legacy/summary_moves_effect.png | Bin 289 -> 217 bytes public/images/ui/legacy/summary_profile.png | Bin 528 -> 284 bytes .../ui/legacy/summary_profile_ability.png | Bin 172 -> 0 bytes .../ui/legacy/summary_profile_passive.png | Bin 190 -> 0 bytes public/images/ui/legacy/summary_stats.png | Bin 636 -> 430 bytes .../ca/summary/summary_dexnb_label_ca.png | Bin 0 -> 1618 bytes .../summary_dexnb_label_overlay_shiny_ca.png | Bin 0 -> 1753 bytes .../summary_moves_descriptions_title_ca.png | Bin 0 -> 243 bytes .../summary/summary_moves_effect_title_ca.png | Bin 0 -> 191 bytes .../summary/summary_moves_moves_title_ca.png | Bin 0 -> 221 bytes .../summary/summary_moves_overlay_pp_ca.png} | Bin .../ca/summary/summary_profile_ability_ca.png | Bin 0 -> 198 bytes .../summary/summary_profile_memo_title_ca.png | Bin 0 -> 235 bytes .../ca/summary/summary_profile_passive_ca.png | Bin 0 -> 194 bytes .../summary_profile_profile_title_ca.png | Bin 0 -> 180 bytes .../ca/summary/summary_stats_exp_title_ca.png | Bin 0 -> 255 bytes .../summary/summary_stats_expbar_title_ca.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_ca.png | Bin 0 -> 214 bytes .../summary/summary_stats_stats_title_ca.png | Bin 0 -> 277 bytes .../ca/summary/summary_tabs_1_ca.png} | Bin .../ca/summary/summary_tabs_2_ca.png} | Bin .../ca/summary/summary_tabs_3_ca.png} | Bin .../da/summary/summary_dexnb_label_da.png | Bin 0 -> 135 bytes .../summary_dexnb_label_overlay_shiny_da.png | Bin 0 -> 206 bytes .../summary_moves_descriptions_title_da.png | Bin 0 -> 247 bytes .../summary/summary_moves_effect_title_da.png | Bin 0 -> 216 bytes .../summary/summary_moves_moves_title_da.png | Bin 0 -> 268 bytes .../summary/summary_moves_overlay_pp_da.png | Bin 0 -> 132 bytes .../da/summary/summary_profile_ability_da.png | Bin 0 -> 160 bytes .../summary/summary_profile_memo_title_da.png | Bin 0 -> 229 bytes .../da/summary/summary_profile_passive_da.png | Bin 0 -> 185 bytes .../summary_profile_profile_title_da.png | Bin 0 -> 188 bytes .../da/summary/summary_stats_exp_title_da.png | Bin 0 -> 218 bytes .../summary/summary_stats_expbar_title_da.png | Bin 0 -> 137 bytes .../summary/summary_stats_item_title_da.png | Bin 0 -> 232 bytes .../summary/summary_stats_stats_title_da.png | Bin 0 -> 221 bytes .../da/summary/summary_tabs_1_da.png | Bin 0 -> 200 bytes .../da/summary/summary_tabs_2_da.png | Bin 0 -> 204 bytes .../da/summary/summary_tabs_3_da.png | Bin 0 -> 168 bytes .../de/summary/summary_dexnb_label_de.png | Bin 0 -> 135 bytes .../summary_dexnb_label_overlay_shiny_de.png | Bin 0 -> 206 bytes .../summary_moves_descriptions_title_de.png | Bin 0 -> 255 bytes .../summary/summary_moves_effect_title_de.png | Bin 0 -> 207 bytes .../summary/summary_moves_moves_title_de.png | Bin 0 -> 210 bytes .../summary/summary_moves_overlay_pp_de.png | Bin 0 -> 130 bytes .../de/summary/summary_profile_ability_de.png | Bin 0 -> 237 bytes .../summary/summary_profile_memo_title_de.png | Bin 0 -> 234 bytes .../de/summary/summary_profile_passive_de.png | Bin 0 -> 185 bytes .../summary_profile_profile_title_de.png | Bin 0 -> 188 bytes .../de/summary/summary_stats_exp_title_de.png | Bin 0 -> 219 bytes .../summary/summary_stats_expbar_title_de.png | Bin 0 -> 137 bytes .../summary/summary_stats_item_title_de.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_de.png | Bin 0 -> 184 bytes .../de/summary/summary_tabs_1_de.png | Bin 0 -> 200 bytes .../de/summary/summary_tabs_2_de.png | Bin 0 -> 204 bytes .../de/summary/summary_tabs_3_de.png | Bin 0 -> 168 bytes .../en/summary/summary_dexnb_label.png | Bin 0 -> 1612 bytes .../summary_dexnb_label_overlay_shiny.png} | Bin .../summary_moves_descriptions_title.png | Bin 0 -> 2173 bytes .../en/summary/summary_moves_effect_title.png | Bin 0 -> 1870 bytes .../en/summary/summary_moves_moves_title.png | Bin 0 -> 2035 bytes .../en/summary/summary_moves_overlay_pp.png | Bin 0 -> 128 bytes .../en/summary/summary_profile_ability.png | Bin 0 -> 1675 bytes .../en/summary/summary_profile_memo_title.png | Bin 0 -> 1965 bytes .../en/summary/summary_profile_passive.png | Bin 0 -> 1503 bytes .../summary/summary_profile_profile_title.png | Bin 0 -> 2050 bytes .../en/summary/summary_stats_exp_title.png | Bin 0 -> 224 bytes .../en/summary/summary_stats_expbar_title.png | Bin 0 -> 1600 bytes .../en/summary/summary_stats_item_title.png | Bin 0 -> 1892 bytes .../en/summary/summary_stats_stats_title.png | Bin 0 -> 1869 bytes .../text_images/en/summary/summary_tabs_1.png | Bin 0 -> 200 bytes .../text_images/en/summary/summary_tabs_2.png | Bin 0 -> 204 bytes .../text_images/en/summary/summary_tabs_3.png | Bin 0 -> 168 bytes .../summary/summary_dexnb_label_es-ES.png | Bin 0 -> 1618 bytes ...ummary_dexnb_label_overlay_shiny_es-ES.png | Bin 0 -> 1753 bytes ...summary_moves_descriptions_title_es-ES.png | Bin 0 -> 2193 bytes .../summary_moves_effect_title_es-ES.png | Bin 0 -> 2033 bytes .../summary_moves_moves_title_es-ES.png | Bin 0 -> 2231 bytes .../summary_moves_overlay_pp_es-ES.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_es-ES.png | Bin 0 -> 2059 bytes .../summary_profile_memo_title_es-ES.png | Bin 0 -> 1976 bytes .../summary/summary_profile_passive_es-ES.png | Bin 0 -> 1834 bytes .../summary_profile_profile_title_es-ES.png | Bin 0 -> 2030 bytes .../summary/summary_stats_exp_title_es-ES.png | Bin 0 -> 241 bytes .../summary_stats_expbar_title_es-ES.png | Bin 0 -> 1600 bytes .../summary_stats_item_title_es-ES.png | Bin 0 -> 2172 bytes .../summary_stats_stats_title_es-ES.png | Bin 0 -> 2532 bytes .../es-ES/summary/summary_tabs_1_es-ES.png | Bin 0 -> 200 bytes .../es-ES/summary/summary_tabs_2_es-ES.png | Bin 0 -> 204 bytes .../es-ES/summary/summary_tabs_3_es-ES.png | Bin 0 -> 168 bytes .../summary/summary_dexnb_label_es-MX.png | Bin 0 -> 1618 bytes ...ummary_dexnb_label_overlay_shiny_es-MX.png | Bin 0 -> 1753 bytes ...summary_moves_descriptions_title_es-MX.png | Bin 0 -> 2193 bytes .../summary_moves_effect_title_es-MX.png | Bin 0 -> 2033 bytes .../summary_moves_moves_title_es-MX.png | Bin 0 -> 2231 bytes .../summary_moves_overlay_pp_es-MX.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_es-MX.png | Bin 0 -> 2059 bytes .../summary_profile_memo_title_es-MX.png | Bin 0 -> 1976 bytes .../summary/summary_profile_passive_es-MX.png | Bin 0 -> 1834 bytes .../summary_profile_profile_title_es-MX.png | Bin 0 -> 2030 bytes .../summary/summary_stats_exp_title_es-MX.png | Bin 0 -> 241 bytes .../summary_stats_expbar_title_es-MX.png | Bin 0 -> 1600 bytes .../summary_stats_item_title_es-MX.png | Bin 0 -> 2172 bytes .../summary_stats_stats_title_es-MX.png | Bin 0 -> 2532 bytes .../es-MX/summary/summary_tabs_1_es-MX.png | Bin 0 -> 200 bytes .../es-MX/summary/summary_tabs_2_es-MX.png | Bin 0 -> 204 bytes .../es-MX/summary/summary_tabs_3_es-MX.png | Bin 0 -> 168 bytes .../fr/summary/summary_dexnb_label_fr.png | Bin 0 -> 131 bytes .../summary_dexnb_label_overlay_shiny_fr.png | Bin 0 -> 202 bytes .../summary_moves_descriptions_title_fr.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_fr.png | Bin 0 -> 177 bytes .../summary/summary_moves_moves_title_fr.png | Bin 0 -> 208 bytes .../summary/summary_moves_overlay_pp_fr.png | Bin 0 -> 128 bytes .../fr/summary/summary_profile_ability_fr.png | Bin 0 -> 178 bytes .../summary/summary_profile_memo_title_fr.png | Bin 0 -> 279 bytes .../fr/summary/summary_profile_passive_fr.png | Bin 0 -> 184 bytes .../summary_profile_profile_title_fr.png | Bin 0 -> 194 bytes .../fr/summary/summary_stats_exp_title_fr.png | Bin 0 -> 256 bytes .../summary/summary_stats_expbar_title_fr.png | Bin 0 -> 119 bytes .../summary/summary_stats_item_title_fr.png | Bin 0 -> 180 bytes .../summary/summary_stats_stats_title_fr.png | Bin 0 -> 166 bytes .../fr/summary/summary_tabs_1_fr.png | Bin 0 -> 200 bytes .../fr/summary/summary_tabs_2_fr.png | Bin 0 -> 204 bytes .../fr/summary/summary_tabs_3_fr.png | Bin 0 -> 168 bytes .../it/summary/summary_dexnb_label_it.png | Bin 0 -> 131 bytes .../summary_dexnb_label_overlay_shiny_it.png | Bin 0 -> 202 bytes .../summary_moves_descriptions_title_it.png | Bin 0 -> 239 bytes .../summary/summary_moves_effect_title_it.png | Bin 0 -> 197 bytes .../summary/summary_moves_moves_title_it.png | Bin 0 -> 179 bytes .../summary/summary_moves_overlay_pp_it.png | Bin 0 -> 128 bytes .../it/summary/summary_profile_ability_it.png | Bin 0 -> 197 bytes .../summary/summary_profile_memo_title_it.png | Bin 0 -> 227 bytes .../it/summary/summary_profile_passive_it.png | Bin 0 -> 194 bytes .../summary_profile_profile_title_it.png | Bin 0 -> 198 bytes .../it/summary/summary_stats_exp_title_it.png | Bin 0 -> 227 bytes .../summary/summary_stats_expbar_title_it.png | Bin 0 -> 137 bytes .../summary/summary_stats_item_title_it.png | Bin 0 -> 225 bytes .../summary/summary_stats_stats_title_it.png | Bin 0 -> 244 bytes .../it/summary/summary_tabs_1_it.png | Bin 0 -> 200 bytes .../it/summary/summary_tabs_2_it.png | Bin 0 -> 204 bytes .../it/summary/summary_tabs_3_it.png | Bin 0 -> 168 bytes .../ja/summary/summary_dexnb_label_ja.png | Bin 0 -> 124 bytes .../summary_dexnb_label_overlay_shiny_ja.png | Bin 0 -> 169 bytes .../summary_moves_descriptions_title_ja.png | Bin 0 -> 175 bytes .../summary/summary_moves_effect_title_ja.png | Bin 0 -> 163 bytes .../summary/summary_moves_moves_title_ja.png | Bin 0 -> 235 bytes .../summary/summary_moves_overlay_pp_ja.png | Bin 0 -> 128 bytes .../ja/summary/summary_profile_ability_ja.png | Bin 0 -> 167 bytes .../summary/summary_profile_memo_title_ja.png | Bin 0 -> 195 bytes .../ja/summary/summary_profile_passive_ja.png | Bin 0 -> 197 bytes .../summary_profile_profile_title_ja.png | Bin 0 -> 179 bytes .../ja/summary/summary_stats_exp_title_ja.png | Bin 0 -> 186 bytes .../summary/summary_stats_expbar_title_ja.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_ja.png | Bin 0 -> 167 bytes .../summary/summary_stats_stats_title_ja.png | Bin 0 -> 176 bytes .../ja/summary/summary_tabs_1_ja.png | Bin 0 -> 200 bytes .../ja/summary/summary_tabs_2_ja.png | Bin 0 -> 204 bytes .../ja/summary/summary_tabs_3_ja.png | Bin 0 -> 168 bytes .../ko/summary/summary_dexnb_label_ko.png | Bin 0 -> 124 bytes .../summary_dexnb_label_overlay_shiny_ko.png | Bin 0 -> 169 bytes .../summary_moves_descriptions_title_ko.png | Bin 0 -> 179 bytes .../summary/summary_moves_effect_title_ko.png | Bin 0 -> 179 bytes .../summary/summary_moves_moves_title_ko.png | Bin 0 -> 177 bytes .../summary/summary_moves_overlay_pp_ko.png | Bin 0 -> 128 bytes .../ko/summary/summary_profile_ability_ko.png | Bin 0 -> 177 bytes .../summary/summary_profile_memo_title_ko.png | Bin 0 -> 274 bytes .../ko/summary/summary_profile_passive_ko.png | Bin 0 -> 188 bytes .../summary_profile_profile_title_ko.png | Bin 0 -> 186 bytes .../ko/summary/summary_stats_exp_title_ko.png | Bin 0 -> 209 bytes .../summary/summary_stats_expbar_title_ko.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_ko.png | Bin 0 -> 233 bytes .../summary/summary_stats_stats_title_ko.png | Bin 0 -> 174 bytes .../ko/summary/summary_tabs_1_ko.png | Bin 0 -> 200 bytes .../ko/summary/summary_tabs_2_ko.png | Bin 0 -> 204 bytes .../ko/summary/summary_tabs_3_ko.png | Bin 0 -> 168 bytes ...ummary_dexnb_label_overlay_shiny_pt-BR.png | Bin 0 -> 1753 bytes .../summary/summary_dexnb_label_pt-BR.png | Bin 0 -> 131 bytes ...summary_moves_descriptions_title_pt-BR.png | Bin 0 -> 248 bytes .../summary_moves_effect_title_pt-BR.png | Bin 0 -> 188 bytes .../summary_moves_moves_title_pt-BR.png | Bin 0 -> 235 bytes .../summary_moves_overlay_pp_pt-BR.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_pt-BR.png | Bin 0 -> 207 bytes .../summary_profile_memo_title_pt-BR.png | Bin 0 -> 235 bytes .../summary/summary_profile_passive_pt-BR.png | Bin 0 -> 199 bytes .../summary_profile_profile_title_pt-BR.png | Bin 0 -> 180 bytes .../summary/summary_stats_exp_title_pt-BR.png | Bin 0 -> 256 bytes .../summary_stats_expbar_title_pt-BR.png | Bin 0 -> 1600 bytes .../summary_stats_item_title_pt-BR.png | Bin 0 -> 183 bytes .../summary_stats_stats_title_pt-BR.png | Bin 0 -> 218 bytes .../pt-BR/summary/summary_tabs_1_pt-BR.png | Bin 0 -> 200 bytes .../pt-BR/summary/summary_tabs_2_pt-BR.png | Bin 0 -> 204 bytes .../pt-BR/summary/summary_tabs_3_pt-BR.png | Bin 0 -> 168 bytes .../summary_dexnb_label_overlay_shiny_ro.png | Bin 0 -> 169 bytes .../ro/summary/summary_dexnb_label_ro.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_ro.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_ro.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_ro.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_ro.png | Bin 0 -> 128 bytes .../ro/summary/summary_profile_ability_ro.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_ro.png | Bin 0 -> 242 bytes .../ro/summary/summary_profile_passive_ro.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_ro.png | Bin 0 -> 196 bytes .../ro/summary/summary_stats_exp_title_ro.png | Bin 0 -> 224 bytes .../summary/summary_stats_expbar_title_ro.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_ro.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_ro.png | Bin 0 -> 169 bytes .../ro/summary/summary_tabs_1_ro.png | Bin 0 -> 200 bytes .../ro/summary/summary_tabs_2_ro.png | Bin 0 -> 204 bytes .../ro/summary/summary_tabs_3_ro.png | Bin 0 -> 168 bytes .../summary_dexnb_label_overlay_shiny_ru.png | Bin 0 -> 205 bytes .../ru/summary/summary_dexnb_label_ru.png | Bin 0 -> 135 bytes .../summary_moves_descriptions_title_ru.png | Bin 0 -> 206 bytes .../summary/summary_moves_effect_title_ru.png | Bin 0 -> 193 bytes .../summary/summary_moves_moves_title_ru.png | Bin 0 -> 201 bytes .../summary/summary_moves_overlay_pp_ru.png | Bin 0 -> 149 bytes .../ru/summary/summary_profile_ability_ru.png | Bin 0 -> 178 bytes .../summary/summary_profile_memo_title_ru.png | Bin 0 -> 279 bytes .../ru/summary/summary_profile_passive_ru.png | Bin 0 -> 182 bytes .../summary_profile_profile_title_ru.png | Bin 0 -> 195 bytes .../ru/summary/summary_stats_exp_title_ru.png | Bin 0 -> 160 bytes .../summary/summary_stats_expbar_title_ru.png | Bin 0 -> 134 bytes .../summary/summary_stats_item_title_ru.png | Bin 0 -> 224 bytes .../summary/summary_stats_stats_title_ru.png | Bin 0 -> 230 bytes .../ru/summary/summary_tabs_1_ru.png | Bin 0 -> 200 bytes .../ru/summary/summary_tabs_2_ru.png | Bin 0 -> 204 bytes .../ru/summary/summary_tabs_3_ru.png | Bin 0 -> 168 bytes .../summary_dexnb_label_overlay_shiny_tl.png | Bin 0 -> 169 bytes .../tl/summary/summary_dexnb_label_tl.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_tl.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_tl.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_tl.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_tl.png | Bin 0 -> 128 bytes .../tl/summary/summary_profile_ability_tl.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_tl.png | Bin 0 -> 242 bytes .../tl/summary/summary_profile_passive_tl.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_tl.png | Bin 0 -> 196 bytes .../tl/summary/summary_stats_exp_title_tl.png | Bin 0 -> 224 bytes .../tl/summary/summary_stats_expbar_title.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_tl.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_tl.png | Bin 0 -> 169 bytes .../tl/summary/summary_tabs_1_tl.png | Bin 0 -> 200 bytes .../tl/summary/summary_tabs_2_tl.png | Bin 0 -> 204 bytes .../tl/summary/summary_tabs_3_tl.png | Bin 0 -> 168 bytes .../summary_dexnb_label_overlay_shiny_tr.png | Bin 0 -> 169 bytes .../tr/summary/summary_dexnb_label_tr.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_tr.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_tr.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_tr.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_tr.png | Bin 0 -> 128 bytes .../tr/summary/summary_profile_ability_tr.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_tr.png | Bin 0 -> 242 bytes .../tr/summary/summary_profile_passive_tr.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_tr.png | Bin 0 -> 196 bytes .../tr/summary/summary_stats_exp_title_tr.png | Bin 0 -> 224 bytes .../summary/summary_stats_expbar_title_tr.png | Bin 0 -> 1600 bytes .../summary/summary_stats_item_title_tr.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_tr.png | Bin 0 -> 169 bytes .../tr/summary/summary_tabs_1_tr.png | Bin 0 -> 200 bytes .../tr/summary/summary_tabs_2_tr.png | Bin 0 -> 204 bytes .../tr/summary/summary_tabs_3_tr.png | Bin 0 -> 168 bytes ...ummary_dexnb_label_overlay_shiny_zh-CN.png | Bin 0 -> 169 bytes .../summary/summary_dexnb_label_zh-CN.png | Bin 0 -> 1612 bytes ...summary_moves_descriptions_title_zh-CN.png | Bin 0 -> 2173 bytes .../summary_moves_effect_title_zh-CN.png | Bin 0 -> 1870 bytes .../summary_moves_moves_title_zh-CN.png | Bin 0 -> 2035 bytes .../summary_moves_overlay_pp_zh-CN.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_zh-CN.png | Bin 0 -> 1675 bytes .../summary_profile_memo_title_zh-CN.png | Bin 0 -> 1965 bytes .../summary/summary_profile_passive_zh-CN.png | Bin 0 -> 1503 bytes .../summary_profile_profile_title_zh-CN.png | Bin 0 -> 2050 bytes .../summary/summary_stats_exp_title_zh-CN.png | Bin 0 -> 224 bytes .../summary_stats_expbar_title_zh-CN.png | Bin 0 -> 1600 bytes .../summary_stats_item_title_zh-CN.png | Bin 0 -> 1892 bytes .../summary_stats_stats_title_zh-CN.png | Bin 0 -> 1869 bytes .../zh-CN/summary/summary_tabs_1_zh-CN.png | Bin 0 -> 200 bytes .../zh-CN/summary/summary_tabs_2_zh-CN.png | Bin 0 -> 204 bytes .../zh-CN/summary/summary_tabs_3_zh-CN.png | Bin 0 -> 168 bytes ...ummary_dexnb_label_overlay_shiny_zh-TW.png | Bin 0 -> 169 bytes .../summary/summary_dexnb_label_zh-TW.png | Bin 0 -> 1612 bytes ...summary_moves_descriptions_title_zh-TW.png | Bin 0 -> 2173 bytes .../summary_moves_effect_title_zh-TW.png | Bin 0 -> 1870 bytes .../summary_moves_moves_title_zh-TW.png | Bin 0 -> 2035 bytes .../summary_moves_overlay_pp_zh-TW.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_zh-TW.png | Bin 0 -> 1675 bytes .../summary_profile_memo_title_zh-TW.png | Bin 0 -> 1965 bytes .../summary/summary_profile_passive_zh-TW.png | Bin 0 -> 1503 bytes .../summary_profile_profile_title_zh-TW.png | Bin 0 -> 2050 bytes .../summary/summary_stats_exp_title_zh-TW.png | Bin 0 -> 224 bytes .../summary_stats_expbar_title_zh-TW.png | Bin 0 -> 1600 bytes .../summary_stats_item_title_zh-TW.png | Bin 0 -> 1892 bytes .../summary_stats_stats_title_zh-TW.png | Bin 0 -> 1869 bytes .../zh-TW/summary/summary_tabs_1_zh-TW.png | Bin 0 -> 200 bytes .../zh-TW/summary/summary_tabs_2_zh-TW.png | Bin 0 -> 204 bytes .../zh-TW/summary/summary_tabs_3_zh-TW.png | Bin 0 -> 168 bytes public/images/ui/pokedex_summary_bg.png | Bin 891 -> 846 bytes public/images/ui/starter_select_bg.png | Bin 917 -> 874 bytes public/images/ui/summary_bg.png | Bin 893 -> 854 bytes public/images/ui/summary_moves.png | Bin 514 -> 290 bytes public/images/ui/summary_moves_effect.png | Bin 292 -> 215 bytes public/images/ui/summary_overlay_shiny.png | Bin 144 -> 0 bytes public/images/ui/summary_profile.png | Bin 539 -> 298 bytes public/images/ui/summary_profile_ability.png | Bin 172 -> 0 bytes public/images/ui/summary_profile_passive.png | Bin 190 -> 0 bytes public/images/ui/summary_stats.png | Bin 871 -> 599 bytes public/images/ui/summary_tabs_2.png | Bin 190 -> 0 bytes public/images/ui/summary_tabs_3.png | Bin 196 -> 0 bytes .../ca/summary/summary_dexnb_label_ca.png | Bin 0 -> 131 bytes .../summary_dexnb_label_overlay_shiny_ca.png | Bin 0 -> 142 bytes .../summary_moves_descriptions_title_ca.png | Bin 0 -> 243 bytes .../summary/summary_moves_effect_title_ca.png | Bin 0 -> 191 bytes .../summary/summary_moves_moves_title_ca.png | Bin 0 -> 221 bytes .../summary/summary_moves_overlay_pp_ca.png} | Bin .../ca/summary/summary_profile_ability_ca.png | Bin 0 -> 198 bytes .../summary/summary_profile_memo_title_ca.png | Bin 0 -> 235 bytes .../ca/summary/summary_profile_passive_ca.png | Bin 0 -> 194 bytes .../summary_profile_profile_title_ca.png | Bin 0 -> 180 bytes .../ca/summary/summary_stats_exp_title_ca.png | Bin 0 -> 255 bytes .../summary/summary_stats_expbar_title_ca.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_ca.png | Bin 0 -> 214 bytes .../summary/summary_stats_stats_title_ca.png | Bin 0 -> 277 bytes .../ca/summary/summary_tabs_1_ca.png | Bin 0 -> 187 bytes .../ca/summary/summary_tabs_2_ca.png | Bin 0 -> 275 bytes .../ca/summary/summary_tabs_3_ca.png | Bin 0 -> 234 bytes .../da/summary/summary_dexnb_label_da.png | Bin 0 -> 135 bytes .../summary_dexnb_label_overlay_shiny_da.png | Bin 0 -> 150 bytes .../summary_moves_descriptions_title_da.png | Bin 0 -> 247 bytes .../summary/summary_moves_effect_title_da.png | Bin 0 -> 216 bytes .../summary/summary_moves_moves_title_da.png | Bin 0 -> 268 bytes .../summary/summary_moves_overlay_pp_da.png | Bin 0 -> 147 bytes .../da/summary/summary_profile_ability_da.png | Bin 0 -> 160 bytes .../summary/summary_profile_memo_title_da.png | Bin 0 -> 229 bytes .../da/summary/summary_profile_passive_da.png | Bin 0 -> 185 bytes .../summary_profile_profile_title_da.png | Bin 0 -> 188 bytes .../da/summary/summary_stats_exp_title_da.png | Bin 0 -> 218 bytes .../summary/summary_stats_expbar_title_da.png | Bin 0 -> 119 bytes .../summary/summary_stats_item_title_da.png | Bin 0 -> 232 bytes .../summary/summary_stats_stats_title_da.png | Bin 0 -> 221 bytes .../da/summary/summary_tabs_1_da.png} | Bin .../da/summary/summary_tabs_2_da.png | Bin 0 -> 229 bytes .../da/summary/summary_tabs_3_da.png | Bin 0 -> 273 bytes .../de/summary/summary_dexnb_label_de.png | Bin 0 -> 135 bytes .../summary_dexnb_label_overlay_shiny_de.png | Bin 0 -> 150 bytes .../summary_moves_descriptions_title_de.png | Bin 0 -> 255 bytes .../summary/summary_moves_effect_title_de.png | Bin 0 -> 207 bytes .../summary/summary_moves_moves_title_de.png | Bin 0 -> 210 bytes .../summary/summary_moves_overlay_pp_de.png | Bin 0 -> 130 bytes .../de/summary/summary_profile_ability_de.png | Bin 0 -> 237 bytes .../summary/summary_profile_memo_title_de.png | Bin 0 -> 234 bytes .../de/summary/summary_profile_passive_de.png | Bin 0 -> 185 bytes .../summary_profile_profile_title_de.png | Bin 0 -> 188 bytes .../de/summary/summary_stats_exp_title_de.png | Bin 0 -> 219 bytes .../summary/summary_stats_expbar_title_de.png | Bin 0 -> 119 bytes .../summary/summary_stats_item_title_de.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_de.png | Bin 0 -> 184 bytes .../de/summary/summary_tabs_1_de.png | Bin 0 -> 242 bytes .../de/summary/summary_tabs_2_de.png | Bin 0 -> 196 bytes .../de/summary/summary_tabs_3_de.png | Bin 0 -> 221 bytes .../en/summary/summary_dexnb_label.png | Bin 0 -> 124 bytes .../summary_dexnb_label_overlay_shiny.png | Bin 0 -> 137 bytes .../summary_moves_descriptions_title.png | Bin 0 -> 235 bytes .../en/summary/summary_moves_effect_title.png | Bin 0 -> 187 bytes .../en/summary/summary_moves_moves_title.png | Bin 0 -> 180 bytes .../en/summary/summary_moves_overlay_pp.png | Bin 0 -> 128 bytes .../en/summary/summary_profile_ability.png | Bin 0 -> 181 bytes .../en/summary/summary_profile_memo_title.png | Bin 0 -> 242 bytes .../en/summary/summary_profile_passive.png | Bin 0 -> 198 bytes .../summary/summary_profile_profile_title.png | Bin 0 -> 196 bytes .../en/summary/summary_stats_exp_title.png | Bin 0 -> 224 bytes .../en/summary/summary_stats_expbar_title.png | Bin 0 -> 110 bytes .../en/summary/summary_stats_item_title.png | Bin 0 -> 183 bytes .../en/summary/summary_stats_stats_title.png | Bin 0 -> 169 bytes .../text_images/en/summary/summary_tabs_1.png | Bin 0 -> 196 bytes .../text_images/en/summary/summary_tabs_2.png | Bin 0 -> 190 bytes .../text_images/en/summary/summary_tabs_3.png | Bin 0 -> 195 bytes .../summary/summary_dexnb_label_es-ES.png | Bin 0 -> 131 bytes ...ummary_dexnb_label_overlay_shiny_es-ES.png | Bin 0 -> 142 bytes ...summary_moves_descriptions_title_es-ES.png | Bin 0 -> 249 bytes .../summary_moves_effect_title_es-ES.png | Bin 0 -> 190 bytes .../summary_moves_moves_title_es-ES.png | Bin 0 -> 244 bytes .../summary_moves_overlay_pp_es-ES.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_es-ES.png | Bin 0 -> 195 bytes .../summary_profile_memo_title_es-ES.png | Bin 0 -> 235 bytes .../summary/summary_profile_passive_es-ES.png | Bin 0 -> 193 bytes .../summary_profile_profile_title_es-ES.png | Bin 0 -> 180 bytes .../summary/summary_stats_exp_title_es-ES.png | Bin 0 -> 241 bytes .../summary_stats_expbar_title_es-ES.png | Bin 0 -> 110 bytes .../summary_stats_item_title_es-ES.png | Bin 0 -> 197 bytes .../summary_stats_stats_title_es-ES.png | Bin 0 -> 307 bytes .../es-ES/summary/summary_tabs_1_es-ES.png | Bin 0 -> 202 bytes .../es-ES/summary/summary_tabs_2_es-ES.png | Bin 0 -> 259 bytes .../es-ES/summary/summary_tabs_3_es-ES.png | Bin 0 -> 236 bytes .../summary/summary_dexnb_label_es-MX.png | Bin 0 -> 131 bytes ...ummary_dexnb_label_overlay_shiny_es-MX.png | Bin 0 -> 142 bytes ...summary_moves_descriptions_title_es-MX.png | Bin 0 -> 249 bytes .../summary_moves_effect_title_es-MX.png | Bin 0 -> 190 bytes .../summary_moves_moves_title_es-MX.png | Bin 0 -> 244 bytes .../summary_moves_overlay_pp_es-MX.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_es-MX.png | Bin 0 -> 195 bytes .../summary_profile_memo_title_es-MX.png | Bin 0 -> 235 bytes .../summary/summary_profile_passive_es-MX.png | Bin 0 -> 193 bytes .../summary_profile_profile_title_es-MX.png | Bin 0 -> 180 bytes .../summary/summary_stats_exp_title_es-MX.png | Bin 0 -> 241 bytes .../summary_stats_expbar_title_es-MX.png | Bin 0 -> 110 bytes .../summary_stats_item_title_es-MX.png | Bin 0 -> 197 bytes .../summary_stats_stats_title_es-MX.png | Bin 0 -> 307 bytes .../es-MX/summary/summary_tabs_1_es-MX.png | Bin 0 -> 202 bytes .../es-MX/summary/summary_tabs_2_es-MX.png | Bin 0 -> 259 bytes .../es-MX/summary/summary_tabs_3_es-MX.png | Bin 0 -> 236 bytes .../fr/summary/summary_dexnb_label_fr.png | Bin 0 -> 131 bytes .../summary_dexnb_label_overlay_shiny_fr.png | Bin 0 -> 142 bytes .../summary_moves_descriptions_title_fr.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_fr.png | Bin 0 -> 177 bytes .../summary/summary_moves_moves_title_fr.png | Bin 0 -> 208 bytes .../summary/summary_moves_overlay_pp_fr.png | Bin 0 -> 128 bytes .../fr/summary/summary_profile_ability_fr.png | Bin 0 -> 178 bytes .../summary/summary_profile_memo_title_fr.png | Bin 0 -> 279 bytes .../fr/summary/summary_profile_passive_fr.png | Bin 0 -> 184 bytes .../summary_profile_profile_title_fr.png | Bin 0 -> 194 bytes .../fr/summary/summary_stats_exp_title_fr.png | Bin 0 -> 256 bytes .../summary/summary_stats_expbar_title_fr.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_fr.png | Bin 0 -> 180 bytes .../summary/summary_stats_stats_title_fr.png | Bin 0 -> 166 bytes .../fr/summary/summary_tabs_1_fr.png | Bin 0 -> 212 bytes .../fr/summary/summary_tabs_2_fr.png | Bin 0 -> 193 bytes .../fr/summary/summary_tabs_3_fr.png | Bin 0 -> 223 bytes .../it/summary/summary_dexnb_label_it.png | Bin 0 -> 131 bytes .../summary_dexnb_label_overlay_shiny_it.png | Bin 0 -> 142 bytes .../summary_moves_descriptions_title_it.png | Bin 0 -> 239 bytes .../summary/summary_moves_effect_title_it.png | Bin 0 -> 197 bytes .../summary/summary_moves_moves_title_it.png | Bin 0 -> 179 bytes .../summary/summary_moves_overlay_pp_it.png | Bin 0 -> 128 bytes .../it/summary/summary_profile_ability_it.png | Bin 0 -> 197 bytes .../summary/summary_profile_memo_title_it.png | Bin 0 -> 227 bytes .../it/summary/summary_profile_passive_it.png | Bin 0 -> 194 bytes .../summary_profile_profile_title_it.png | Bin 0 -> 198 bytes .../it/summary/summary_stats_exp_title_it.png | Bin 0 -> 227 bytes .../summary/summary_stats_expbar_title_it.png | Bin 0 -> 114 bytes .../summary/summary_stats_item_title_it.png | Bin 0 -> 225 bytes .../summary/summary_stats_stats_title_it.png | Bin 0 -> 244 bytes .../it/summary/summary_tabs_1_it.png | Bin 0 -> 212 bytes .../it/summary/summary_tabs_2_it.png | Bin 0 -> 235 bytes .../it/summary/summary_tabs_3_it.png | Bin 0 -> 193 bytes .../ja/summary/summary_dexnb_label_ja.png | Bin 0 -> 124 bytes .../summary_dexnb_label_overlay_shiny_ja.png | Bin 0 -> 137 bytes .../summary_moves_descriptions_title_ja.png | Bin 0 -> 175 bytes .../summary/summary_moves_effect_title_ja.png | Bin 0 -> 163 bytes .../summary/summary_moves_moves_title_ja.png | Bin 0 -> 235 bytes .../summary/summary_moves_overlay_pp_ja.png | Bin 0 -> 128 bytes .../ja/summary/summary_profile_ability_ja.png | Bin 0 -> 167 bytes .../summary/summary_profile_memo_title_ja.png | Bin 0 -> 195 bytes .../ja/summary/summary_profile_passive_ja.png | Bin 0 -> 197 bytes .../summary_profile_profile_title_ja.png | Bin 0 -> 179 bytes .../ja/summary/summary_stats_exp_title_ja.png | Bin 0 -> 186 bytes .../summary/summary_stats_expbar_title_ja.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_ja.png | Bin 0 -> 167 bytes .../summary/summary_stats_stats_title_ja.png | Bin 0 -> 176 bytes .../ja/summary/summary_tabs_1_ja.png | Bin 0 -> 195 bytes .../ja/summary/summary_tabs_2_ja.png | Bin 0 -> 195 bytes .../ja/summary/summary_tabs_3_ja.png | Bin 0 -> 219 bytes .../ko/summary/summary_dexnb_label_ko.png | Bin 0 -> 124 bytes .../summary_dexnb_label_overlay_shiny_ko.png | Bin 0 -> 137 bytes .../summary_moves_descriptions_title_ko.png | Bin 0 -> 179 bytes .../summary/summary_moves_effect_title_ko.png | Bin 0 -> 179 bytes .../summary/summary_moves_moves_title_ko.png | Bin 0 -> 177 bytes .../summary/summary_moves_overlay_pp_ko.png | Bin 0 -> 128 bytes .../ko/summary/summary_profile_ability_ko.png | Bin 0 -> 177 bytes .../summary/summary_profile_memo_title_ko.png | Bin 0 -> 274 bytes .../ko/summary/summary_profile_passive_ko.png | Bin 0 -> 188 bytes .../summary_profile_profile_title_ko.png | Bin 0 -> 186 bytes .../ko/summary/summary_stats_exp_title_ko.png | Bin 0 -> 209 bytes .../summary/summary_stats_expbar_title_ko.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_ko.png | Bin 0 -> 233 bytes .../summary/summary_stats_stats_title_ko.png | Bin 0 -> 174 bytes .../ko/summary/summary_tabs_1_ko.png | Bin 0 -> 180 bytes .../ko/summary/summary_tabs_2_ko.png | Bin 0 -> 188 bytes .../ko/summary/summary_tabs_3_ko.png | Bin 0 -> 232 bytes ...ummary_dexnb_label_overlay_shiny_pt-BR.png | Bin 0 -> 142 bytes .../summary/summary_dexnb_label_pt-BR.png | Bin 0 -> 131 bytes ...summary_moves_descriptions_title_pt-BR.png | Bin 0 -> 248 bytes .../summary_moves_effect_title_pt-BR.png | Bin 0 -> 188 bytes .../summary_moves_moves_title_pt-BR.png | Bin 0 -> 235 bytes .../summary_moves_overlay_pp_pt-BR.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_pt-BR.png | Bin 0 -> 207 bytes .../summary_profile_memo_title_pt-BR.png | Bin 0 -> 235 bytes .../summary/summary_profile_passive_pt-BR.png | Bin 0 -> 199 bytes .../summary_profile_profile_title_pt-BR.png | Bin 0 -> 180 bytes .../summary/summary_stats_exp_title_pt-BR.png | Bin 0 -> 256 bytes .../summary_stats_expbar_title_pt-BR.png | Bin 0 -> 110 bytes .../summary_stats_item_title_pt-BR.png | Bin 0 -> 183 bytes .../summary_stats_stats_title_pt-BR.png | Bin 0 -> 218 bytes .../pt-BR/summary/summary_tabs_1_pt-BR.png | Bin 0 -> 200 bytes .../pt-BR/summary/summary_tabs_2_pt-BR.png | Bin 0 -> 235 bytes .../pt-BR/summary/summary_tabs_3_pt-BR.png | Bin 0 -> 238 bytes .../summary_dexnb_label_overlay_shiny_ro.png | Bin 0 -> 137 bytes .../ro/summary/summary_dexnb_label_ro.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_ro.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_ro.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_ro.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_ro.png | Bin 0 -> 128 bytes .../ro/summary/summary_profile_ability_ro.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_ro.png | Bin 0 -> 242 bytes .../ro/summary/summary_profile_passive_ro.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_ro.png | Bin 0 -> 196 bytes .../ro/summary/summary_stats_exp_title_ro.png | Bin 0 -> 224 bytes .../summary/summary_stats_expbar_title_ro.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_ro.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_ro.png | Bin 0 -> 169 bytes .../ro/summary/summary_tabs_1_ro.png | Bin 0 -> 196 bytes .../ro/summary/summary_tabs_2_ro.png | Bin 0 -> 190 bytes .../ro/summary/summary_tabs_3_ro.png | Bin 0 -> 195 bytes .../summary_dexnb_label_overlay_shiny_ru.png | Bin 0 -> 152 bytes .../ru/summary/summary_dexnb_label_ru.png | Bin 0 -> 135 bytes .../summary_moves_descriptions_title_ru.png | Bin 0 -> 206 bytes .../summary/summary_moves_effect_title_ru.png | Bin 0 -> 193 bytes .../summary/summary_moves_moves_title_ru.png | Bin 0 -> 201 bytes .../summary/summary_moves_overlay_pp_ru.png | Bin 0 -> 152 bytes .../ru/summary/summary_profile_ability_ru.png | Bin 0 -> 178 bytes .../summary/summary_profile_memo_title_ru.png | Bin 0 -> 279 bytes .../ru/summary/summary_profile_passive_ru.png | Bin 0 -> 182 bytes .../summary_profile_profile_title_ru.png | Bin 0 -> 195 bytes .../ru/summary/summary_stats_exp_title_ru.png | Bin 0 -> 160 bytes .../summary/summary_stats_expbar_title_ru.png | Bin 0 -> 119 bytes .../summary/summary_stats_item_title_ru.png | Bin 0 -> 224 bytes .../summary/summary_stats_stats_title_ru.png | Bin 0 -> 230 bytes .../ru/summary/summary_tabs_1_ru.png | Bin 0 -> 201 bytes .../ru/summary/summary_tabs_2_ru.png | Bin 0 -> 251 bytes .../ru/summary/summary_tabs_3_ru.png | Bin 0 -> 220 bytes .../summary_dexnb_label_overlay_shiny_tl.png | Bin 0 -> 137 bytes .../tl/summary/summary_dexnb_label_tl.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_tl.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_tl.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_tl.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_tl.png | Bin 0 -> 128 bytes .../tl/summary/summary_profile_ability_tl.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_tl.png | Bin 0 -> 242 bytes .../tl/summary/summary_profile_passive_tl.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_tl.png | Bin 0 -> 196 bytes .../tl/summary/summary_stats_exp_title_tl.png | Bin 0 -> 224 bytes .../summary/summary_stats_expbar_title_tl.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_tl.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_tl.png | Bin 0 -> 169 bytes .../tl/summary/summary_tabs_1_tl.png | Bin 0 -> 196 bytes .../tl/summary/summary_tabs_2_tl.png | Bin 0 -> 190 bytes .../tl/summary/summary_tabs_3_tl.png | Bin 0 -> 195 bytes .../summary_dexnb_label_overlay_shiny_tr.png | Bin 0 -> 137 bytes .../tr/summary/summary_dexnb_label_tr.png | Bin 0 -> 124 bytes .../summary_moves_descriptions_title_tr.png | Bin 0 -> 235 bytes .../summary/summary_moves_effect_title_tr.png | Bin 0 -> 187 bytes .../summary/summary_moves_moves_title_tr.png | Bin 0 -> 180 bytes .../summary/summary_moves_overlay_pp_tr.png | Bin 0 -> 128 bytes .../tr/summary/summary_profile_ability_tr.png | Bin 0 -> 181 bytes .../summary/summary_profile_memo_title_tr.png | Bin 0 -> 242 bytes .../tr/summary/summary_profile_passive_tr.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_tr.png | Bin 0 -> 196 bytes .../tr/summary/summary_stats_exp_title_tr.png | Bin 0 -> 224 bytes .../summary/summary_stats_expbar_title_tr.png | Bin 0 -> 110 bytes .../summary/summary_stats_item_title_tr.png | Bin 0 -> 183 bytes .../summary/summary_stats_stats_title_tr.png | Bin 0 -> 169 bytes .../tr/summary/summary_tabs_1_tr.png | Bin 0 -> 196 bytes .../tr/summary/summary_tabs_2_tr.png | Bin 0 -> 190 bytes .../tr/summary/summary_tabs_3_tr.png | Bin 0 -> 195 bytes ...ummary_dexnb_label_overlay_shiny_zh-CN.png | Bin 0 -> 137 bytes .../summary/summary_dexnb_label_zh-CN.png | Bin 0 -> 124 bytes ...summary_moves_descriptions_title_zh-CN.png | Bin 0 -> 235 bytes .../summary_moves_effect_title_zh-CN.png | Bin 0 -> 187 bytes .../summary_moves_moves_title_zh-CN.png | Bin 0 -> 180 bytes .../summary_moves_overlay_pp_zh-CN.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_zh-CN.png | Bin 0 -> 181 bytes .../summary_profile_memo_title_zh-CN.png | Bin 0 -> 242 bytes .../summary/summary_profile_passive_zh-CN.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_zh-CN.png | Bin 0 -> 196 bytes .../summary/summary_stats_exp_title_zh-CN.png | Bin 0 -> 224 bytes .../summary_stats_expbar_title_zh-CN.png | Bin 0 -> 110 bytes .../summary_stats_item_title_zh-CN.png | Bin 0 -> 183 bytes .../summary_stats_stats_title_zh-CN.png | Bin 0 -> 169 bytes .../zh-CN/summary/summary_tabs_1_zh-CN.png | Bin 0 -> 196 bytes .../zh-CN/summary/summary_tabs_2_zh-CN.png | Bin 0 -> 190 bytes .../zh-CN/summary/summary_tabs_3_zh-CN.png | Bin 0 -> 195 bytes ...ummary_dexnb_label_overlay_shiny_zh-TW.png | Bin 0 -> 137 bytes .../summary/summary_dexnb_label_zh-TW.png | Bin 0 -> 124 bytes ...summary_moves_descriptions_title_zh-TW.png | Bin 0 -> 235 bytes .../summary_moves_effect_title_zh-TW.png | Bin 0 -> 187 bytes .../summary_moves_moves_title_zh-TW.png | Bin 0 -> 180 bytes .../summary_moves_overlay_pp_zh-TW.png | Bin 0 -> 128 bytes .../summary/summary_profile_ability_zh-TW.png | Bin 0 -> 181 bytes .../summary_profile_memo_title_zh-TW.png | Bin 0 -> 242 bytes .../summary/summary_profile_passive_zh-TW.png | Bin 0 -> 198 bytes .../summary_profile_profile_title_zh-TW.png | Bin 0 -> 196 bytes .../summary/summary_stats_exp_title_zh-TW.png | Bin 0 -> 224 bytes .../summary_stats_expbar_title_zh-TW.png | Bin 0 -> 110 bytes .../summary_stats_item_title_zh-TW.png | Bin 0 -> 183 bytes .../summary_stats_stats_title_zh-TW.png | Bin 0 -> 169 bytes .../zh-TW/summary/summary_tabs_1_zh-TW.png | Bin 0 -> 196 bytes .../zh-TW/summary/summary_tabs_2_zh-TW.png | Bin 0 -> 190 bytes .../zh-TW/summary/summary_tabs_3_zh-TW.png | Bin 0 -> 195 bytes src/loading-scene.ts | 103 ++++++++++++++---- src/ui/pokedex-page-ui-handler.ts | 9 +- src/ui/starter-select-ui-handler.ts | 10 +- src/ui/summary-ui-handler.ts | 96 ++++++++++++++-- 603 files changed, 182 insertions(+), 36 deletions(-) delete mode 100644 public/images/ui/legacy/summary_profile_ability.png delete mode 100644 public/images/ui/legacy/summary_profile_passive.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_dexnb_label_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_dexnb_label_overlay_shiny_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_moves_descriptions_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_moves_effect_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_moves_moves_title_ca.png rename public/images/ui/legacy/{summary_moves_overlay_pp.png => text_images/ca/summary/summary_moves_overlay_pp_ca.png} (100%) create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_profile_ability_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_profile_memo_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_profile_passive_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_profile_profile_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_stats_exp_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_stats_expbar_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_stats_item_title_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/summary/summary_stats_stats_title_ca.png rename public/images/ui/legacy/{summary_tabs_1.png => text_images/ca/summary/summary_tabs_1_ca.png} (100%) rename public/images/ui/legacy/{summary_tabs_2.png => text_images/ca/summary/summary_tabs_2_ca.png} (100%) rename public/images/ui/legacy/{summary_tabs_3.png => text_images/ca/summary/summary_tabs_3_ca.png} (100%) create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_moves_descriptions_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_moves_effect_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_moves_moves_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_moves_overlay_pp_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_profile_ability_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_profile_memo_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_profile_passive_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_profile_profile_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_stats_exp_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_stats_expbar_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_stats_item_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_stats_stats_title_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_tabs_1_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_tabs_2_da.png create mode 100644 public/images/ui/legacy/text_images/da/summary/summary_tabs_3_da.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_moves_descriptions_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_moves_effect_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_moves_moves_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_moves_overlay_pp_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_profile_ability_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_profile_memo_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_profile_passive_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_profile_profile_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_stats_exp_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_stats_expbar_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_stats_item_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_stats_stats_title_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_tabs_1_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_tabs_2_de.png create mode 100644 public/images/ui/legacy/text_images/de/summary/summary_tabs_3_de.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_dexnb_label.png rename public/images/ui/legacy/{summary_overlay_shiny.png => text_images/en/summary/summary_dexnb_label_overlay_shiny.png} (100%) create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_moves_descriptions_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_moves_effect_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_moves_moves_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_moves_overlay_pp.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_profile_ability.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_profile_memo_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_profile_passive.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_profile_profile_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_stats_exp_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_stats_expbar_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_stats_item_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_stats_stats_title.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_tabs_1.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_tabs_2.png create mode 100644 public/images/ui/legacy/text_images/en/summary/summary_tabs_3.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_dexnb_label_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_dexnb_label_overlay_shiny_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_moves_descriptions_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_moves_effect_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_moves_moves_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_moves_overlay_pp_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_profile_ability_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_profile_memo_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_profile_passive_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_profile_profile_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_stats_exp_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_stats_expbar_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_stats_item_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_stats_stats_title_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_1_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_2_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_3_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_dexnb_label_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_dexnb_label_overlay_shiny_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_moves_descriptions_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_moves_effect_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_moves_moves_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_moves_overlay_pp_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_profile_ability_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_profile_memo_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_profile_passive_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_profile_profile_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_stats_exp_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_stats_expbar_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_stats_item_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_stats_stats_title_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_1_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_2_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_3_es-MX.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_moves_descriptions_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_moves_effect_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_moves_moves_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_moves_overlay_pp_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_profile_ability_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_profile_memo_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_profile_passive_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_profile_profile_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_stats_exp_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_stats_expbar_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_stats_item_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_stats_stats_title_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_tabs_1_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_tabs_2_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/summary/summary_tabs_3_fr.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_moves_descriptions_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_moves_effect_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_moves_moves_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_moves_overlay_pp_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_profile_ability_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_profile_memo_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_profile_passive_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_profile_profile_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_stats_exp_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_stats_expbar_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_stats_item_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_stats_stats_title_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_tabs_1_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_tabs_2_it.png create mode 100644 public/images/ui/legacy/text_images/it/summary/summary_tabs_3_it.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_dexnb_label_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_dexnb_label_overlay_shiny_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_moves_descriptions_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_moves_effect_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_moves_moves_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_moves_overlay_pp_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_profile_ability_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_profile_memo_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_profile_passive_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_profile_profile_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_stats_exp_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_stats_expbar_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_stats_item_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_stats_stats_title_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_tabs_1_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_tabs_2_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/summary/summary_tabs_3_ja.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_dexnb_label_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_dexnb_label_overlay_shiny_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_moves_descriptions_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_moves_effect_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_moves_moves_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_moves_overlay_pp_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_profile_ability_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_profile_memo_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_profile_passive_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_profile_profile_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_stats_exp_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_stats_expbar_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_stats_item_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_stats_stats_title_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_tabs_1_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_tabs_2_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/summary/summary_tabs_3_ko.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_overlay_shiny_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_effect_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_profile_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_item_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_1_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_overlay_shiny_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_moves_descriptions_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_moves_effect_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_moves_moves_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_moves_overlay_pp_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_profile_ability_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_profile_memo_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_profile_passive_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_profile_profile_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_stats_exp_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_stats_expbar_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_stats_item_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_stats_stats_title_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_tabs_1_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_tabs_2_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/summary/summary_tabs_3_ro.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_moves_descriptions_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_moves_effect_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_moves_moves_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_moves_overlay_pp_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_profile_ability_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_profile_memo_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_profile_passive_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_profile_profile_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_stats_exp_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_stats_expbar_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_stats_item_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_stats_stats_title_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_tabs_1_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_tabs_2_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/summary/summary_tabs_3_ru.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_overlay_shiny_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_moves_descriptions_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_moves_effect_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_moves_moves_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_moves_overlay_pp_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_profile_ability_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_profile_memo_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_profile_passive_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_profile_profile_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_stats_exp_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_stats_expbar_title.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_stats_item_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_stats_stats_title_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_tabs_1_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_tabs_2_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/summary/summary_tabs_3_tl.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_moves_descriptions_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_moves_effect_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_moves_moves_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_moves_overlay_pp_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_profile_ability_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_profile_memo_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_profile_passive_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_profile_profile_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_stats_exp_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_stats_expbar_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_stats_item_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_stats_stats_title_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_tabs_1_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_tabs_2_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/summary/summary_tabs_3_tr.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_descriptions_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_effect_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_moves_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_memo_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_passive_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_profile_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_exp_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_expbar_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_item_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_1_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_descriptions_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_effect_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_moves_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_memo_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_passive_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_profile_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_exp_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_expbar_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_item_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_1_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png delete mode 100644 public/images/ui/summary_overlay_shiny.png delete mode 100644 public/images/ui/summary_profile_ability.png delete mode 100644 public/images/ui/summary_profile_passive.png delete mode 100644 public/images/ui/summary_tabs_2.png delete mode 100644 public/images/ui/summary_tabs_3.png create mode 100644 public/images/ui/text_images/ca/summary/summary_dexnb_label_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_dexnb_label_overlay_shiny_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_moves_descriptions_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_moves_effect_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_moves_moves_title_ca.png rename public/images/ui/{summary_moves_overlay_pp.png => text_images/ca/summary/summary_moves_overlay_pp_ca.png} (100%) create mode 100644 public/images/ui/text_images/ca/summary/summary_profile_ability_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_profile_memo_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_profile_passive_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_profile_profile_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_stats_exp_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_stats_expbar_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_stats_item_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_stats_stats_title_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_tabs_1_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_tabs_2_ca.png create mode 100644 public/images/ui/text_images/ca/summary/summary_tabs_3_ca.png create mode 100644 public/images/ui/text_images/da/summary/summary_dexnb_label_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_moves_descriptions_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_moves_effect_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_moves_moves_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_moves_overlay_pp_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_profile_ability_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_profile_memo_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_profile_passive_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_profile_profile_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_stats_exp_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_stats_expbar_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_stats_item_title_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_stats_stats_title_da.png rename public/images/ui/{summary_tabs_1.png => text_images/da/summary/summary_tabs_1_da.png} (100%) create mode 100644 public/images/ui/text_images/da/summary/summary_tabs_2_da.png create mode 100644 public/images/ui/text_images/da/summary/summary_tabs_3_da.png create mode 100644 public/images/ui/text_images/de/summary/summary_dexnb_label_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_moves_descriptions_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_moves_effect_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_moves_moves_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_moves_overlay_pp_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_profile_ability_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_profile_memo_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_profile_passive_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_profile_profile_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_stats_exp_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_stats_expbar_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_stats_item_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_stats_stats_title_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_tabs_1_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_tabs_2_de.png create mode 100644 public/images/ui/text_images/de/summary/summary_tabs_3_de.png create mode 100644 public/images/ui/text_images/en/summary/summary_dexnb_label.png create mode 100644 public/images/ui/text_images/en/summary/summary_dexnb_label_overlay_shiny.png create mode 100644 public/images/ui/text_images/en/summary/summary_moves_descriptions_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_moves_effect_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_moves_moves_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_moves_overlay_pp.png create mode 100644 public/images/ui/text_images/en/summary/summary_profile_ability.png create mode 100644 public/images/ui/text_images/en/summary/summary_profile_memo_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_profile_passive.png create mode 100644 public/images/ui/text_images/en/summary/summary_profile_profile_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_stats_exp_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_stats_expbar_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_stats_item_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_stats_stats_title.png create mode 100644 public/images/ui/text_images/en/summary/summary_tabs_1.png create mode 100644 public/images/ui/text_images/en/summary/summary_tabs_2.png create mode 100644 public/images/ui/text_images/en/summary/summary_tabs_3.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_dexnb_label_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_dexnb_label_overlay_shiny_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_moves_descriptions_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_moves_effect_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_moves_moves_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_moves_overlay_pp_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_profile_ability_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_profile_memo_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_profile_passive_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_profile_profile_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_stats_exp_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_stats_expbar_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_stats_item_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_stats_stats_title_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_tabs_1_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_tabs_2_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/summary/summary_tabs_3_es-ES.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_dexnb_label_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_dexnb_label_overlay_shiny_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_moves_descriptions_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_moves_effect_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_moves_moves_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_moves_overlay_pp_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_profile_ability_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_profile_memo_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_profile_passive_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_profile_profile_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_stats_exp_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_stats_expbar_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_stats_item_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_stats_stats_title_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_tabs_1_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_tabs_2_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/summary/summary_tabs_3_es-MX.png create mode 100644 public/images/ui/text_images/fr/summary/summary_dexnb_label_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_moves_descriptions_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_moves_effect_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_moves_moves_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_moves_overlay_pp_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_profile_ability_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_profile_memo_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_profile_passive_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_profile_profile_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_stats_exp_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_stats_expbar_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_stats_item_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_stats_stats_title_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_tabs_1_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_tabs_2_fr.png create mode 100644 public/images/ui/text_images/fr/summary/summary_tabs_3_fr.png create mode 100644 public/images/ui/text_images/it/summary/summary_dexnb_label_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_moves_descriptions_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_moves_effect_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_moves_moves_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_moves_overlay_pp_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_profile_ability_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_profile_memo_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_profile_passive_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_profile_profile_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_stats_exp_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_stats_expbar_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_stats_item_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_stats_stats_title_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_tabs_1_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_tabs_2_it.png create mode 100644 public/images/ui/text_images/it/summary/summary_tabs_3_it.png create mode 100644 public/images/ui/text_images/ja/summary/summary_dexnb_label_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_dexnb_label_overlay_shiny_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_moves_descriptions_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_moves_effect_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_moves_moves_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_moves_overlay_pp_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_profile_ability_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_profile_memo_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_profile_passive_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_profile_profile_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_stats_exp_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_stats_expbar_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_stats_item_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_stats_stats_title_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_tabs_1_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_tabs_2_ja.png create mode 100644 public/images/ui/text_images/ja/summary/summary_tabs_3_ja.png create mode 100644 public/images/ui/text_images/ko/summary/summary_dexnb_label_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_dexnb_label_overlay_shiny_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_moves_descriptions_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_moves_effect_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_moves_moves_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_moves_overlay_pp_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_profile_ability_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_profile_memo_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_profile_passive_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_profile_profile_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_stats_exp_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_stats_expbar_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_stats_item_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_stats_stats_title_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_tabs_1_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_tabs_2_ko.png create mode 100644 public/images/ui/text_images/ko/summary/summary_tabs_3_ko.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_dexnb_label_overlay_shiny_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_dexnb_label_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_moves_effect_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_profile_profile_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_stats_item_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_tabs_1_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png create mode 100644 public/images/ui/text_images/ro/summary/summary_dexnb_label_overlay_shiny_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_dexnb_label_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_moves_descriptions_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_moves_effect_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_moves_moves_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_moves_overlay_pp_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_profile_ability_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_profile_memo_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_profile_passive_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_profile_profile_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_stats_exp_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_stats_expbar_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_stats_item_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_stats_stats_title_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_tabs_1_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_tabs_2_ro.png create mode 100644 public/images/ui/text_images/ro/summary/summary_tabs_3_ro.png create mode 100644 public/images/ui/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_dexnb_label_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_moves_descriptions_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_moves_effect_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_moves_moves_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_moves_overlay_pp_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_profile_ability_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_profile_memo_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_profile_passive_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_profile_profile_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_stats_exp_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_stats_expbar_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_stats_item_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_stats_stats_title_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_tabs_1_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_tabs_2_ru.png create mode 100644 public/images/ui/text_images/ru/summary/summary_tabs_3_ru.png create mode 100644 public/images/ui/text_images/tl/summary/summary_dexnb_label_overlay_shiny_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_dexnb_label_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_moves_descriptions_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_moves_effect_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_moves_moves_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_moves_overlay_pp_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_profile_ability_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_profile_memo_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_profile_passive_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_profile_profile_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_stats_exp_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_stats_expbar_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_stats_item_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_stats_stats_title_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_tabs_1_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_tabs_2_tl.png create mode 100644 public/images/ui/text_images/tl/summary/summary_tabs_3_tl.png create mode 100644 public/images/ui/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_dexnb_label_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_moves_descriptions_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_moves_effect_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_moves_moves_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_moves_overlay_pp_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_profile_ability_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_profile_memo_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_profile_passive_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_profile_profile_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_stats_exp_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_stats_expbar_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_stats_item_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_stats_stats_title_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_tabs_1_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_tabs_2_tr.png create mode 100644 public/images/ui/text_images/tr/summary/summary_tabs_3_tr.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_moves_descriptions_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_moves_effect_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_moves_moves_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_profile_memo_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_profile_passive_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_profile_profile_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_stats_exp_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_stats_expbar_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_stats_item_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_tabs_1_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_moves_descriptions_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_moves_effect_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_moves_moves_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_profile_memo_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_profile_passive_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_profile_profile_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_stats_exp_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_stats_expbar_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_stats_item_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_tabs_1_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png diff --git a/public/images/ui/legacy/pokedex_summary_bg.png b/public/images/ui/legacy/pokedex_summary_bg.png index 0f8fed843c9311eb0095d3d07a717b154f3e9851..62369eaa24858582bdc2d31376944af7a1a0d03c 100644 GIT binary patch delta 272 zcmcb?bf0O0O1(sYPlzi61H=FS{}VQJ7<3c>$r(2mT)42~#)A*rE+@+Y<(Nx?{DK)6 zboZ~Eu^Pzz?CIhdQW5v&b|7bifkf*?Nk@YYH-R+ft&O)1T;1OIp}U9ix!Mnl_vT-F z^?5D#ZOpbY2S^tUc|U}E544!ptwr71m^W0m>21Q9US0Z8v2m`fn&rWpl297UHx3vIVCg!094~@ AssI20 delta 262 zcmV+h0r~#l0@wnOB!3%FOjJbx003aHh%kt7U|?Wiu!xx0pwQ5`*x>N^`1meAj`#oo z00MMUPE!CaGfa_90002$Nkl;uQH11~jPSHdj=Z)XEP1}?VRat~aO`3J5o^%1w$ zat}OZANa^V@S6M^EVY#4NBz$O?@Oqu`@lI^_kl|=kt-2eap M07*qoM6N<$f~_WX%m4rY diff --git a/public/images/ui/legacy/starter_select_bg.png b/public/images/ui/legacy/starter_select_bg.png index 501e892969e82a6e144aca7ff330768c7908bc5a..09d21d4a630bb8d10bf0786edbef31322ac80928 100644 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yox3Dk+N%2!Jlz^0IfKP}kkpBPwzd=Vq!iJ6+ zHx^vDu;a#q4?=wtegY+!N`m}?85qhYpS1w;UV6GXhE&8Q3CKKYaJ(_2WWfQ86S5gT z;q0?^OyKDeW#7p>m)Bj^;?;pb_CBkED~%y6i}_?q7ic%gTB$KGv?MYt<74MxKeM03 zWJ+?llA`R*$IYTr@^2(3Jh(-Zii=Ft9O3u>GEH zdc>0B42$*xEeB>M9N=E~)9>X!ZKYF88yfyIvLJv?$;H;Fbv`${fSzXXboFyt=akR{ E0Ob8^6951J literal 350 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yox3Dk+N%2!Jlz@~(fKP}kkT&QjNC1Kj9W!n$ zxNu>|jRzlo{P=O|-)c9Y9Ain4UoeBivm0qZ&KFM?$B>F!Z|`p8J!Bx_8tAQafJaP7 zH)sY!PlUn-M#%%d*Oo8)qq&BEj`_i>o>R{GY2MsE`_b)m{yA-I^P(%9Ik&UK`7_xw zRlnZJeBJrqfvwByj_mz@r}6lk#_w+$r$2e0kh?WZ{#88R9^Hj!4>QXjef`+d^Pb7ULDGy)blG%~SriC{7!_B{;y`Q`hk^#7Y1XM({^ b`S-kgTe~DWM4fhtq+c diff --git a/public/images/ui/legacy/summary_bg.png b/public/images/ui/legacy/summary_bg.png index 668a7438bf0bdb5a06198578f300e65f1fc8685b..b08bd406a819c290267f86afedb85434abe56815 100644 GIT binary patch delta 385 zcmcb^yoY&$3ZHI(Plzi+MuI^{fro>|L{pXe1&eJSFfcHBdAc};RKz8DD2tXXXxzPp zb&0hB^V!C|&1V}kWit{kSZ-iC+gQy$nYs9!!=oKXmo8q+?Dd^bjeTGBcOBimix)e4 zdV++?`IXq8?Wz8*rn`3WVpmVkrHh%}f?u@-viB`>lzRT?Vv&F>(D;kHDkf}Ci}7H| z%cy_ntG`?~!9Yz`!r+3i1b>;h)a&^9ZvX>bc8Vm%kgy?>K&nl?G^Ca%zQtLgo4Qwn}K#t9sdyMDVrl@#MVw-sU VZd$8P$Q1@4@O1TaS?83{1OQmQj$i-) delta 418 zcmdnPe2000il9M&Plzi+MuI^{fro=dLPEksBbEAS;cMXx42)-U9Z)6hB{e3sK<@6?-myEv`9}r}1+t2p6zWeZf_Wy?_tNht)@qPVF z&qwRn_kM1Fyl%zi^1vrCvU@k|%L+2@mAi3;sh&NreEx;Tw~>Dilu7>*Dd(20khA@u zSM|X6L-vNORjY~?%N0L(tCsotO{0G2X}KMqGLB6woI)xd6BHcl;Ve=Z2M;sHUuL-f zY5%_2Y&*U&ZEqKbLh*2~7Yr)2?6u diff --git a/public/images/ui/legacy/summary_moves.png b/public/images/ui/legacy/summary_moves.png index ab90958816069b895489fdb85ae72b19ca92ff59..abb499fdbb01c630b411859c7d314a4620af1fd5 100644 GIT binary patch delta 350 zcmZ3=@{?(TO1(;ePlzi61A~WyMF7K(42BOG9xoa=K6FfYuz=&miW@g}2)wu<@#4de z55KY=u>jREmIV0)GdMiEkp^Tld%8G=RKz6-hy)q&>CWHTm0_^i=1N2-&jO7T3M*XH zcTZvKj$K^Vduu6E!udX5hL(j49eT=-WF(Isa$Litr}F1%ea|$-*eBud#VVL%-dd@x zUVJJ&_F|}dci{JI-HA!Anb&5eyghqs(wfiu-A9u)M(Bv4Qre%Fr_?Pv@_*{juX1H? z7qBrfusO}x{!@JG6PFKKY*`JFfiN9mzs_xpsJpmm_Sd&}40#V22(TP%aTMVQZ<}>( zg44OD$~#u4ar)F({r&g&?B0xhJH^kMe_u4$PON)s2a>&Kb(iiG6y3i5+p_QLN^kfS3j3^P6((xYRR zbV2*du-ioq*9%y)c6rQcxOY{9-NDOR^w;}OUA&9|cN)I0uTRUl8Q4{G>ekhF8OysT zO|=g`c{)Vz`J6wx!84!V{(W3L=!)H{6&!CD7wPKvf8TC@$S(4tipLZNM`vBnB>SCu zxhW4bT(6i_@K|4wYT4Bz=j?T5U+BbqnY^tB7D+7>lgMg}2;gLjFnCcJ`*z>chtqG) zJ$*N3nUTHxzSQrhWzIdVFVzd)X|*JxeYern*D9~$XP)w%^fl%5G~MWJIX5?@qBE=_ zXJ#|b%$Av%ZN4%)C~_l0LH62uiLKjZz6bt({{8hv=ADJ=0s>dgU%r?hxV6;3U&*yY z-hIEPboAb*KmL7=U%Tz=f2UZ5iGmC2`>rqEnq%LVKSg7!SKtcyYs=odu~ePj$ht+t zNlEjY{`Rd6x1#&FwKy0Q{I9wTIPdCn-gK!{X42Gkk7vwzZ`F75Cy-%-=~CWJM$dzc uo_82M-)Hpvi_v#mk2~iT3+H$J@6UTFf95CaAz&mjc)I$rx~y|bXaWEalmZC= diff --git a/public/images/ui/legacy/summary_moves_effect.png b/public/images/ui/legacy/summary_moves_effect.png index 61567c9749bbc77e85df7f319413f716f2d2dc2d..f12e7e523b81df7b7af3ae72f09758f5405dde07 100644 GIT binary patch delta 189 zcmV;u07Czv0@(qOB!47OOjJbx002lpI8p%rYXJ9aO7DaS_l%V1r3mk>-rl_s@7@^i z_y70Rfd!%f0004WQchC*6eJZe2$G>iNQp$iAgH8d99lke z6&^6NJk*%(T1K^~q!9oer~s%Xqk{n0jS3h9RXRx4qBg1pA2t}(GOA@%%cz!7Eu&gS rwa~snLPoQPjK&pNO>2??8QlZ`(7`E7bS92I00000NkvXXu0mjfN(V{| delta 261 zcmV+g0s8*g0ignrB!4PUOjJbx002lpI8p%rYXJ9aO7C-PV}uCzjFji42=A@l-n|g- z-Wc!q|M&m@{{lL-9RL6T0d!JMQvg8b*k%9#0HsMpK~#8N?boplLLm?aU>pHQAS4d( zX1R*kvVw5~R$ztKTM;*~z4CVPq`*-4fJ^M|=ZDaI3FTon!Pta}UE0sh2Ck3;_fM#6@U88;Su`0;}wjb$4H z1H(>F7srr_TW@b})T6@e&byLK1&54EEmif%9yk?dn8>u7Kee~DD zt-I5U5;sQZTsyr=G5cQUI>A@l-b|hO)tmo7(#wt#mog=ws!RDBB0#E>fa<1IcL5<+ y_t$vsAJZlqYgttPoeGnKD0#i*%jf%LRs1^dW3R0{WqSwc3kFYDKbLh*2~7ZJK6iEi delta 502 zcmbQkG=XJ;O1*l3Pl&6)gaU;L9R?i*784eDI9Pa0*pV>fM#6@Uf(#(N;KL6P`2YWZ zmd5#51_s6@o-U3d6}R5rI_P!8K!EMRzC-(*1dn{)*ZAc{X}ls!(PyQ72Mi3%^*8Nn zv^(gq&ThucC6VHLI%e}N`fuWMInM4@+V0tJeBO75-|_9PkM}wK_Kk4((OJ(kx7)W& zFrGS1Cp$AM-RqZ7``^4@f@Nu%+4*Nu)6*-owKMX+9tgT|>(tCysdIDJ%-L!3xMJ&? z%~wAwiGJGE?zp%sHY&rpaChN}YZgY4%a0elKBzqFYsHt2=UK9~ht_1Pzm^lziP(@Z zcg<|``4vs9+(4dsc755VSMPs{i@(}>wzFm#-}B*Cv>7 zZ;lX?+Mc#9TQdFb%5B1)OC(H}_v&nvj?fi5nN_(V)H~m8wP@(fQ;D^4XQsKwPoGe< zzxyEH>aEWXhQ+u)n66_EE%#M_jO9df n6v%f6o4#7>t~npSYuR_kIqs)4=dB9xI&8 z^zEKBYyH_19SXlT6nZ)R$f~#}bm+BTss{(Ro0n6>gP&JwPK#}+`xc+gEx*}OMlJ1h RMF-Gu22WQ%mvv4FO#uD>I(+~D diff --git a/public/images/ui/legacy/summary_profile_passive.png b/public/images/ui/legacy/summary_profile_passive.png deleted file mode 100644 index 1ff9ad8e09a7045f310b1b0327d39fec0d8cc2b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq&Ne7LR^7#LPElaA3r|3u*?T? z7)yfuf*Bm1-ADs+l097P4ToIbEGHTh#U1r8O^) ziy?uqkjPW9ns-j0l5e>GER~!4b<%M@KZce@h5D|r~H>W>ulSzvsS%aX+B*_@9L{frTJAq8<)Hj;2&;VDuve7pE;>(}Q z19fzM?TI`8ao)F|;=9@>j&)*)AxFt zdOE`n7u((Mq=XpC-QP<2d|dj(iGe{^LMOBC%DTYaEiW>}|1vNu-(4fbz_2RTzF^5V RwK@hM@O1TaS?83{1OVq+oCN>? delta 545 zcmV++0^a?u1N;P#W`6Hxn~AwvYV}?ZDXIV~#(!X9x$_)$$0Z>RE7%;W zJ*lr1qcwAArj|$XJr6}x>M;!~aeBWd3q)p(b+_3OJ%6S~^zNhbD7u?Nah}7V(rtcy)co^Y@4rCjed)WF`+nv({&w~L5+A?y zq3NR*5UcH@Kvn^?ZfVh?MT-_KTC`}6u!5(<=M* z^OEQCwwZVA=T{cqck^ENI)+a^2k@H1(Dd_ynZtD+On<_Mv%}?nQ4>odz-sRl6;*Mx zCiBDcjca_-cP$_K+Mj*q_;o)&to3z2Kd@B*ty@~OXwjlYixw?fv|gnE|BsDaJ3!Y& zsQlW}s;acQhJVRM!R+h^WV=c>+4D)_8G^BNq0C@{_HeWrB)yw00000NkvXXu0mjfwB{1f diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_dexnb_label_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_dexnb_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a457468d8d0630acdec6da6a17d0174454a9f198 GIT binary patch literal 1618 zcmbVM&5IOA6mNqDKXWnQst8ScF^N6Z-P1EWUD)b4y~z%w*JT}a1qG|CYG#_9?rOVh zcV_n(4-!F;KtN2q1U8TaJmnAwA-N=%`~f-T5hjuH9vadPoEx>Q3p{k&hWt1hH)|2`D>)9Lx@~*wR)aVUG(SGhDfj@0a@J zl1MwqbQ}j67P2fI5PG&6OES>o?C2zd$1|FSi3~-o<`GFCmZhr!(@_agQiP4OahsrF zXh0HVmW;flA&}7mmn^5fVRA+h@9~JoG6SqxV3V$pBI}ARLKmMmB!JfXevxBSE>TpZ z$mGlllre6|rs%A-nsBthGqIdfKC=QekLJ}RxRG)qMcNXgHyPCYgtFRbsK+jZF%$jl zlb7J!Ba*wCWmpy6sOgs7GEHoo*s6VISlBQ|P+zdHy}B8+0u#13Kw)7Rk>rhFMsZuD z5rJ~Uh;%qg;*O>kO~eh+6DcGHcI6=p-^a~3lO(3R>A4zITna;mExT4_HY`f5Vz>2x z*fl)}NLjZ7+qT;dEe8Re_2y20$KP6)SjR%6wm;sjY<@LnhZgg7{->`h|PJG-_+9h#^gGeGR zF9qdtG8zbabymY~FGqXt17rY|XWt~;~4bI3L(yRlj5#wFR3RK@1(nX|iNcIHfH zW^X|uu0AMu0R>Y;O8a1?FX~HMq1a-fQXeD_)+YF3r4RK*qAiHNh-daPwh~(`4$RCs zv)}o?|NGB>{(U1qvwtZ1Sd?Lyq3m>KmcAG1{o;dz^qJmXc!9olIMatbhS~X0a7UOA zJ{)0~ftFcV@E39i03wzE4N}BH({d=9VaCRr4n#}XXN$OO+9_`H+y#y`jTASp<)oaG z#uamV*~N3qGX=D~gmi-&-^Y$M0VS}o580+wwLQ>GaUEVj$H8ZjV>=LkDaB0$g6u*r z&!&lsSxt!ZNLCd#p$l?c(iL?tt4MM}loFyG<0TnLaS+ql-o;Th*C>J6%+ozBI!kdC z-*mGRKBV1Zh$wE)}NH#X3>sav*DaKC}_eW>Oq=ESRPN za8XW{Ak=uQV~vlgD&~twQg~e}Ce^sEp;#RE*JlW-1^e1xZ~Vvg&$uQ%SFn2DJhcA* zcGzc`ppHDcabE9qOu}++R5kYnHiIw?T~#Cvm3U2;3?9m=#wQacorgsQ%7%gCs8k#i zgQGwfvE5OZNW8mZr$E898AQ

CWLJVFYZaCILjjSxa#!C^Bqtz0c--??{)nQNfh- zF6GySd8Fhwpo=HUbocI2++yE;*M;~`gPkPZ)<61i+LVG}*bV6CK)6}pIdov$Nt3P@cgx}2DP_NeVMUudd*`GaKHZc z-Pub=XQLMme0%-YrR3WutWEis#_HHl@biyG(B=7-@M`(`z~!?i&B-4cUnh4xyP~z= z#?{kRZ8Lgt{ruX@&d;8I?c#}Zw;s7t`{I=+ULM@2@7id;pI&=-?^@){qw9aZex$vg zua6#o>FAA*hwFudr&o{74PRS*XWN^Rft77fMUFFhW|SFbqRjs={rzy{kCSawIQaPC Y#qBq4*3RttH2Cw$PR(RKnOtoD1sggu#{d8T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_moves_descriptions_title_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_moves_descriptions_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a37aad953cc0781d1b609d57d55ff3568286f909 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Za~b#!VDyJ4`160r1%4TLR=FP5`O&n@&EsSAOlFQ z$~dC~lwvLk@(Tvizsio>15y(_T^vIy;(B{8avnAiaMpjz#QT(0$Y!eGdA6u=n)zmeut1lk-r~R?X`o>F- zdrwSm&wc(bqWx(J$NuJ+JfTAq4|xA9&8l3VvZd0V@%-X!Dafg$Tw+CJ_ey z8!v3wP{L67@236#@Ph$~{~6Yt$@;mftAT4Zt3c|TU|nr39p(ee-X{Ft|IfA6_QaMA jq1rdXN_8(>h+<^0`mP_KvUSIKpj`}}u6{1-oD!M`>N3cf&b zrjj7PUG+WDefm$*bQ_{{5e?XWoAXt|RZOzxw6f{Z+gE+V{25 z+xeC}y4ze{R8#YQ-lx5fA9FKsuBrav=hv5i_kZQ@Cp#RY9{rHpcTe>A@$Xsl=FO3a z=)QCLxb>qyPv-slc=F`2M%HioRh%1L`+kcDD0F$RPCU3OG{)h`(Jf32Q+;e-dGBje Q1iFO5)78&qol`;+0Ni3={Qv*} literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/summary_moves_overlay_pp.png b/public/images/ui/legacy/text_images/ca/summary/summary_moves_overlay_pp_ca.png similarity index 100% rename from public/images/ui/legacy/summary_moves_overlay_pp.png rename to public/images/ui/legacy/text_images/ca/summary/summary_moves_overlay_pp_ca.png diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_profile_ability_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_profile_ability_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9e8ac317d97a38569a3148d5098eab4b7008c8 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^W$E6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6oPWN_Xbw7OOHIv8Ti}T`pberbimYv~oOJecMrw1fmEZq(M?z~d= nHF%A>MUbD~%q8ne_kCh$Ytm-?$ocIM&^iWBS3j3^P6u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_profile_passive_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_profile_passive_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a072b663d25480604ae4295c11b872248eed64c1 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf!VDy9I}1XA6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6!FpF<#OknL|-SI?fLe78FnYNZj^LY#c zzrN|#;@qX}d?ksm)_J;A%g&N*M>j2&GtP}Ke|hKNv9g|hipy4rFMDhE>3xz|#;Prv jyS*D895hk+yO;mqEk)@^lP3xRtzz(W^>bP0l+XkKNrOj& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_profile_profile_title_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_profile_profile_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ed0e3e169c949060a541c9c23dc8ec4a704b32 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_stats_exp_title_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_stats_exp_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ac7268b54b4d78d893f8cb3fe573397fc7dfd8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUF#0(_2F5G+t#0l^TaZN}_`2YVuggpI3!51jb zR1)MD%)n4K`K$$yx4_fIF{C0cx7U{Ikb{8Rb+ek5f}DxV{Caxd?;6#~XCIsMb5%k2LY^G|cnulcsKb0^TP44$rjF6*2UngA!+Xlwug literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_stats_expbar_title_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_stats_expbar_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..e9dfb10e5d62cbd9e2c24bef5d40012719e0a292 GIT binary patch literal 1600 zcmbVMJ#W)M7&fZ-DlmZ%LPE040s`mGcH+b*OjVLXBjHk&0A+&n`I1< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)5+SkUI=008Js=Z@JSf(ihgL#Zo=eLQvyMRt$@O1Ta JS?83{1OW5_U#$QD literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/summary/summary_stats_stats_title_ca.png b/public/images/ui/legacy/text_images/ca/summary/summary_stats_stats_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..426848af866727b303ff3acd2e512232b96c0c4c GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yb#0(_krg2;caRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwZS!<-45^4q=5S@>KiDH6a_~cIz`c`x@_pjdF)%D6buEGfqv@{odd+_1gx2p~ZFP-B0c=B^un7`@T zgcbk4uHU=2^8f4quj9jR{QtFA?nK4G30spygM%-xa$UVkEF)uW#8uWLgO;Qwfi+DG YrX3Y#zqT000DZvV>FVdQ&MBb@03eTsGynhq literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/summary_tabs_1.png b/public/images/ui/legacy/text_images/ca/summary/summary_tabs_1_ca.png similarity index 100% rename from public/images/ui/legacy/summary_tabs_1.png rename to public/images/ui/legacy/text_images/ca/summary/summary_tabs_1_ca.png diff --git a/public/images/ui/legacy/summary_tabs_2.png b/public/images/ui/legacy/text_images/ca/summary/summary_tabs_2_ca.png similarity index 100% rename from public/images/ui/legacy/summary_tabs_2.png rename to public/images/ui/legacy/text_images/ca/summary/summary_tabs_2_ca.png diff --git a/public/images/ui/legacy/summary_tabs_3.png b/public/images/ui/legacy/text_images/ca/summary/summary_tabs_3_ca.png similarity index 100% rename from public/images/ui/legacy/summary_tabs_3.png rename to public/images/ui/legacy/text_images/ca/summary/summary_tabs_3_ca.png diff --git a/public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_da.png b/public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_da.png new file mode 100644 index 0000000000000000000000000000000000000000..ef081f493f3fec8a6b9f06500e85053c5109f6be GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`@dWsUxc>kDKLHGW{P@w>b~ykj z&QucQ7tFv=HumdKI;Vst0EOKxivR!s literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png b/public/images/ui/legacy/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png new file mode 100644 index 0000000000000000000000000000000000000000..92c2412f4266089cbd210e247bb3f97bccd0fbf4 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35!VDzMcUm6?QbGYfA+A7r!GeVU|NjHY7cW+P z_;5pab(Strl({6xFBnMwDm!uyNM(4sIEGZjy*+=Lx50piCGhiZVJ(N13@KJOL=LF_ z-R=|>(fN4I`Nit($0D<*Ka29$p1`L(;mRd0xtH6TLbbv+%&<>MdB!ov_b6W(`-^Lb k;?2L$Z$JkdDi8c-?BixValmdKI;Vst0Q0&~C;$Ke literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_moves_descriptions_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_moves_descriptions_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..79b16227bfe298a787406530b12d21c088bcb1b0 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD!VDxA7O*4%DgFST5Z8o+gdabC{Qv(S$N-Y7 zGS27#rI<^C{DOh>ud*ZefYcOE7srr_IN!cT-a`gFEQ_bGYDp|Gl0EQfGsB2+4but-I-Lc5= q(!^(6XO}W^CKyYnNtdp<@Q3NWnnjUIa-25MeGHzielF{r5}E)Wn_^!8 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_moves_effect_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_moves_effect_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ac04e62c4b9c0861c03041e2c80c04131b2628 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^)~It5e%NL KelF{r5}E))yj)EH literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_moves_moves_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_moves_moves_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..f1732e3e2c0827b8f2ba16b129249c982203b69d GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^VL;5m#0(_m_B?nDq<8{+LR=FP68``H45Zt(n&1YTAAAl3ww<6PZfe zRaDrdcy9imv-pzkDvr>Otm{U}4+Iwn`sk=-tP=dGy3~E0zhbePu>4N3?aMAH-)2uN zI;2utd`r4@w!M+(_uQrPQ)bNmeP?6+ru7G-xVK9&go$quX#C44{yVo>QR@yT(BTZ8 Lu6{1-oD!MeyXA3~mfqTmY@ zXDSKu3ua&_n|#&+$aC~`aSY**P5$%$-U9=9`^T%5S-0ssYWV%)xqhgTe~DWM4f D=Hfi9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_profile_memo_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_profile_memo_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..48886d25e3944ae0c3893668616182ea74ddbd53 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>b!VDzmJW6E&Qv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15!<%E{-7;aiRTtb(WA zZbh9oF76c*6+Zj=?z!Om@N`IC{)U8`T`ON6Te;zC!UH!4Yc_`6>IU2VCiv(~xSab_ zGVFx8hghdqjDxRfE89utBVHnpjy2pldr;vOi#^l4`0u6NsRcO&Q=b0ao)^CKT(tei X!&Vjt>h=l&UBlq%>gTe~DWM4fakX9f literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_profile_passive_da.png b/public/images/ui/legacy/text_images/da/summary/summary_profile_passive_da.png new file mode 100644 index 0000000000000000000000000000000000000000..681ae3f1b5e0ed33043de0119dc848d319405e5c GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ1x;TbZ#JQe+$a%nkqa|=*q=S*8vE!4N1$W-s2m5Ad?6a>c zP&-@ZvE(v`-0L!_m^-H){9S%UCw`K`#^jY#IF*|oJWgFYEztSCvq-1-;Rk%~?jj6d Z_s{N-{&Db><58du44$rjF6*2UngBilL-POt literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_profile_profile_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_profile_profile_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8a1d5e99c698d40925b475801eb0acec196a3 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWq&7srr_xYTovoDBv%E*BfLEgX8dS>C#0K zb_;D3t}I%vb@krtu0kL69ZVg^CExhmZvOXuRZX?%lsP{vChiH+lYIBO@8gru3Fq~F h+a-CVH_0dGX`EEtu>Q!xH$Y1mJYD@<);T3K0RTdlN-h8Z literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_stats_exp_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_stats_exp_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..feae0c9cb90d2e9a3e13b3bcce149aaf7a8a2eea GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b#0(^_rnATbDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdDWgSjv*Cs$sD}B|G)45A7A^w|Nr|ZucRCP>%k5!Sva{P)&M($*<$uMmf5$JE7Z%n0ma}Sj68|Vf6vgSVmZ4>y}d{Ml~t^(CB)V|irU)cy_%81McZ}HwW#oDpfeae MUHx3vIVCg!09u$^?f?J) literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_stats_expbar_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_stats_expbar_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..78bfe5d97358f33dcb0bbc330188a1975d4a0fd5 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A!VDx6JGfJU6n}tEi0l9V|6kmYxUj*{m8+jQNIF20H70AhL)Al#r=vjvS5|OCYif=e` b-ucLdO<~oq?%iMl)WP8C>gTe~DWM4fKV>SA literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_stats_item_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_stats_item_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbce6c3dcfc15dc6256dfcd2fda418474df0d03 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMo#0(@&cm#cb6i`>N3cf&b zrjj7PUFR(X)ztha3dl9=;M?eW9AcrQeBTq2q)C1{U`P34*t^ zuS_see!+Vy_`&j|GadW4IhNe0{bam;#j49m9HpDD8AfbY+flQnf7YzUO-2?UCp1YW zyfMzv;d?xp^{|P)DCPJMp&Nt!XlQ aU+_16_0MJ4%FhmT6oaR$pUXO@geCwde_7}N literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_stats_stats_title_da.png b/public/images/ui/legacy/text_images/da/summary/summary_stats_stats_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..ff97416c7ed4d40694e981613f0693ca9f82e93b GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^=0MEB#0(@AX7;ZIQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc^6ETY978JNk~`}E)cbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_tabs_2_da.png b/public/images/ui/legacy/text_images/da/summary/summary_tabs_2_da.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/summary/summary_tabs_3_da.png b/public/images/ui/legacy/text_images/da/summary/summary_tabs_3_da.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_de.png b/public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ef081f493f3fec8a6b9f06500e85053c5109f6be GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`@dWsUxc>kDKLHGW{P@w>b~ykj z&QucQ7tFv=HumdKI;Vst0EOKxivR!s literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png b/public/images/ui/legacy/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png new file mode 100644 index 0000000000000000000000000000000000000000..92c2412f4266089cbd210e247bb3f97bccd0fbf4 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35!VDzMcUm6?QbGYfA+A7r!GeVU|NjHY7cW+P z_;5pab(Strl({6xFBnMwDm!uyNM(4sIEGZjy*+=Lx50piCGhiZVJ(N13@KJOL=LF_ z-R=|>(fN4I`Nit($0D<*Ka29$p1`L(;mRd0xtH6TLbbv+%&<>MdB!ov_b6W(`-^Lb k;?2L$Z$JkdDi8c-?BixValmdKI;Vst0Q0&~C;$Ke literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_moves_descriptions_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_moves_descriptions_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4827c081d53e533ccf57438b73f22a19b8a43a GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^Ak4wS3?yfWZ?yzc`~f~8t_cYVKYsl9|NlRb0VG#t zoY4VFF_#4S1q10{Wk>D-sX3l5jv*CszI}{bhYfg`_kLrRzRlcqn|+3cyu_#f_f0G_ z6Wk=cJ7Ugc8!1no&(kTrT$amfYK-J&&j|-^O!epPJ2G?aq}?yQ`1bX*?ee{r@~qjk z%{8B?bmJM8rQ+p_?|xbL@1uMF_HU0pSFlAc_q8hj6jh@A>$|JhuIdw3{8sPz=fsq7 y+!79Yy8DH*_QiR=3Jh;JIN36N=VWX;RUfz1-m+uSDt(|k89ZJ6T-G@yGywo(m1Vd9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_moves_effect_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_moves_effect_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..951e92818397e4ae618c7e34224f5487d65649ca GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^ra;WW#0(@=a^fcdDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJc?F&>jv*Cs$sD}A`S<_-p6^=vyYEyzPr|!bS67$s%e$YxcNgQ4 zT(+jW-M7o%=P?!EzCC;S`|P~?Uw4bHsrdfoS^e(Wx69wmd82rR+Rz5YHdjM!RgQu&X%Q~loCIGXZ BS`z>O literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_moves_moves_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_moves_moves_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e28d3dfe7ebb8640dfa880dc37e098d2fe9606 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b#0(^_rnATbDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdBvVCjv*Csx@Q!*8Vp1l9!lzPZ=PX0`Jkf2v%ns+^B)XO9y<3$ z#O20=$o53574i@(K%Wv);J+!@E-X zkUsOND%0M+UaYHWZu;Zv#TV<|{x6?n+)&B5mQk+rj(hRM%u9QK)-!mz`njxgN@xNA D-lzopr0E2}k!~g&Q literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_profile_ability_de.png b/public/images/ui/legacy/text_images/de/summary/summary_profile_ability_de.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6bd055555aecc26a01a42da1798235717833c2 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^WAmuG8AZicv18zn=L~V^MjAsTzTuA1SF0WwLUu0 zaq;zzQzF|MdopxaIUA-Ne!uU@)5iO~|H9eps^`G6qjqKbLh*2~7aawO`}_ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_profile_memo_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_profile_memo_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..089668218faa27e9ff599ccc5c85959ed1b783ca GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>b!VDzmJW6E&Qv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15)jtE{-7;ak>2$IS(5MIP0HdTgWW3oms{*U*WBNu&VSV zhOK8GbKdJ;{Ck4J=c7{=B%Xa6p;b3iTjz(Lh<|6UwZ)pr5sAm8Wvj$IOho;7jsLYW zr<~%L@WJYD@<);T3K0RWL-T`~Xw literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_profile_passive_de.png b/public/images/ui/legacy/text_images/de/summary/summary_profile_passive_de.png new file mode 100644 index 0000000000000000000000000000000000000000..681ae3f1b5e0ed33043de0119dc848d319405e5c GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ1x;TbZ#JQe+$a%nkqa|=*q=S*8vE!4N1$W-s2m5Ad?6a>c zP&-@ZvE(v`-0L!_m^-H){9S%UCw`K`#^jY#IF*|oJWgFYEztSCvq-1-;Rk%~?jj6d Z_s{N-{&Db><58du44$rjF6*2UngBilL-POt literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_profile_profile_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_profile_profile_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8a1d5e99c698d40925b475801eb0acec196a3 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWq&7srr_xYTovoDBv%E*BfLEgX8dS>C#0K zb_;D3t}I%vb@krtu0kL69ZVg^CExhmZvOXuRZX?%lsP{vChiH+lYIBO@8gru3Fq~F h+a-CVH_0dGX`EEtu>Q!xH$Y1mJYD@<);T3K0RTdlN-h8Z literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_stats_exp_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_stats_exp_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..fa702b4c223ac628a44ad8a6d1a37e42dbdfc281 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMo#0(@&cm#cb6i`>N3cf&b zrjj7PUFR*C%#|K^2n9dtYVR<;lE1d++VjqkDAjdl@d}b@6b0_sFQ($CyQ;YUw)bOl_CK zcbyrQQkzmWE6NH(-ak( Lu6{1-oD!M*{m8+jQNIF20H70AhL)Al#r=vjvS5|OCYif=e` b-ucLdO<~oq?%iMl)WP8C>gTe~DWM4fKV>SA literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_stats_item_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_stats_item_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..42e08b3e52ab951e4b91a20c99ab0efafe20c7f4 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj!#0(_A*@T_|Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@*+H4978JNk~w&L|9}7gcYpi&dWM;S>#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_stats_stats_title_de.png b/public/images/ui/legacy/text_images/de/summary/summary_stats_stats_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..87438a5bd4ffc7d3d9430b0f6440a4ec9e3ca6ce GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^szA)a#0(^v58bN(Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@*+K5978JNk~`}E)cPU>-vEQTOF7=c8IM> aVqnNHQEyxGH8BBb34^DrpUXO@geCwqV?dz* literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_tabs_1_de.png b/public/images/ui/legacy/text_images/de/summary/summary_tabs_1_de.png new file mode 100644 index 0000000000000000000000000000000000000000..379768ea3103c68c25f7ca606aa3ca4999676fff GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^WbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_tabs_2_de.png b/public/images/ui/legacy/text_images/de/summary/summary_tabs_2_de.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/summary/summary_tabs_3_de.png b/public/images/ui/legacy/text_images/de/summary/summary_tabs_3_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_dexnb_label.png b/public/images/ui/legacy/text_images/en/summary/summary_dexnb_label.png new file mode 100644 index 0000000000000000000000000000000000000000..eab90a91c7fc8dd67b9cf24a7e8c37dffd62b2d8 GIT binary patch literal 1612 zcmbVMJB-{!7&Zl`a8XbYLOM~690`G7c4q8-oJaA6WA|WJ!N+k~DTkoQcxJq7-P&X9 zx!b)HH0T;iB4`i=Qc4h_KnRI~K!cEIXsJMHsEFtgO&IUP%Hu8xSh79#eEDonv;6e3Wm#u>-Ojdom+Mofmdx||Kk3)z^;p(@qp+;gPnP#1*2kZ$Sk|Lo#r++< z6TC{fN@`4~P}U|%X3&;({=y_j)PLb!#93o)U%NnH=jFWW@RMMSqdFVAC{FW(+&ol%6w<8f{5)>J+~ z#Pd9a9ppIBAYgHjYBqssac<$EBMY9#nT}NoN{=j5d)l`R(^(2hR=G`!d6`VX(1c}( z)Nq;76exIw%l7ioG`QeMj$|TJT^KB>u-Q;)RSeY$uB+`k0+`YUK^5azE=f{_DD=j@ zNn>7+W6?$bAd_fY7HTi&a%11nJXdCu(RMDGR(W5k(V|gX3(BC~2G3rOQ=!JibGN}| zhiU2C4t5$4uR^EZCxq4sbylCp4#ju|4U~wZgL|P4bqFQS9Z)kcf@$_Zu;4UOdBRM( zal!@?W$C~MRS{`hjZ|&|8+PuLMG(+lT41}Nj@Z2LAZn<@>1+3)z63Orl}GyCyS z8mISZ_Y793NRL@A*9WFr4;UtN67_=Z-=FxyweBS1cMacvCq6GJAF^~HjYuN9Oa+y4 zGHVFByI0e_+oWd!H+ohsDl@!a=xXz8x{`&5RZyAwZ>vh)qDe)!{^m8FZ|;?>X3KJ)mEYu(?j{l5G`@cn0JBl!CAFHe2?%@Yy)d5qWSlJ(`A WfBw`TT)k52eQ#s4^TkV7-uoA*z5f^h literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/summary_overlay_shiny.png b/public/images/ui/legacy/text_images/en/summary/summary_dexnb_label_overlay_shiny.png similarity index 100% rename from public/images/ui/legacy/summary_overlay_shiny.png rename to public/images/ui/legacy/text_images/en/summary/summary_dexnb_label_overlay_shiny.png diff --git a/public/images/ui/legacy/text_images/en/summary/summary_moves_descriptions_title.png b/public/images/ui/legacy/text_images/en/summary/summary_moves_descriptions_title.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2b4d083760bfed09c6fae182fb0a997420f282 GIT binary patch literal 2173 zcmb_eU2NM_6iy{zTeraj0(DeqmisWK;n==$?AU5r+N510HC@*Rtz%o)>+9>pYGS*# z)1-YWAW=YTi%_5FC=!)GeE?|%A*O-WZ5k6oJOE+{_JV{E51UqvfrJ=;*ZCuZt{W4P z9A965=bZ2S-QySf`}S^ce55fD2y9RE#0SW|mt31S-$(ujhj;8Jw=H(hK{pWC`k;R` z1YSAb6bNie8mS>~DA}tZD;I>CrQ%>QXA^WF(Ar+KAsWRVrQ)<@pWfyXGO|9ux!bAeb7NO1ZLC$xn1k_LsXXl-4$+(7CoW(h8dM?58HLRVnJj=~k zw@_VseUkwa+GMh3V_hz}T+M{*b&V4@Dgjv+?WQJd%no4J$~y>mjT4$JzBjfKb1?KQ zCuLdLYNGn9l&M&ZdhCE&RYCN0g- zC+eXQ1_&u$Qo=wHA~!)v!D!Hfw*_lR(JdzjiMvJ)rZH=qX_~49QHfbu%OQpdyHJTm zGN~j?*Mla)iFlMI9tRCWQxH%EK@}s6$V(Cv!2)Jf4G0WUMJa+rBuY@O%Ev8~_w!nn z*N8k3gAgKt(IKxhnk0l6Rg@uvHIWN*9H%3WugdRp4ANIHd)InM{r~M@RZ9o)$R&w$ zE8Wov)0I`$X!G6lX#xWcBDg$|lK^O>70%DzXNl%#uyD{HVc`H4J&wrv~cMy-&7*M5(Rv_{_ zHA*ADM6pI!wvBc2d1v`3t1VrZCZo96?GSmZ%iCZ5iX*V z$^)7j_G1hfHADifM?hEr2=F)ztB%(bFSkNN=Q)#nrTdqe3rg@SMIE* z{+)w$Plf->l~PfbYm5D7*_Gba%>nQNi5_3N{KQ91FVBDV#ZwDEo?wrz9eKC- z$?&JAn|FShSepwzw0iZPeGTugXy3Km*!|(Jk3RkTPOd9`YGhj9^k#2!;p)SC=9bZ7 z=LZYZm*2VAGG)x`uXX3=8v~=q#v9JH77ugR?FTM2b*~J4KeI^P*!Jy_)s<@tQy-5# zcd+GT;IqaPR}N>@`QaI7YV3OC=il0YnwgzFHuv=#=g)SZy)@H&@6xNPmij>)`DW(X p>G98Z%|>6m_Qz5}Ji5HNb?=qecdQ;dzsvtXNObkZ-|ifF<}ZAE%%=bV literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_moves_effect_title.png b/public/images/ui/legacy/text_images/en/summary/summary_moves_effect_title.png new file mode 100644 index 0000000000000000000000000000000000000000..55fb0efd832da789da351d76a5e3c7eea57b224e GIT binary patch literal 1870 zcmb_dU5MON6pjyFcU!8UAf+ON)CWZ~H@W$nTsE%jWON72y6z5i`{tdSJ2PP?xoMKw z$?l?}PgQGC=#vQc$p^*0iLDA+@j(%!4W&Q^Io}QlK&)~@05`WFa3kOm`*mZYt-zL2A<{m+q zdOm2bW~<(lh_JANeb%CtJd8P75N7A{7?U-ci7na*B1gLL(I=7^_>Q#S@Dwku(QdG? znb4KZ#U|NYBepNiJtEHLh#LrLhQ&PWMJdW1X=oSmaWM@faR|xQ9BICAD6V=-VvQwK zG%BV{R2_--Xu{=6Ut((CO)t~ zhSIpZ>knDAkx*#puAvw zoZ%aSeS+F72{D%>$XN9CakI3?izr9!t1m&Q2S$@I2Ir(hNt0He5&IiYr0jBjOWE z+nhcnRFMr|*X62ZSh8iPW=l7HwPhQV^)4g*BCnJ6K3|VDLNIJ$8JdPB`<7mnahqV7 z=o+>yXz0}zoUDH;3HZLky<4_Z?6#sH&_a;%RBep+!wNk(9`yooSOW-?qP8806iKDN zG@cH&iNMV%7?~Y(DK~nZbdO*uYi9$T(D@FJ)(wgYT#I^&*RM}pgSbjyOP4iGC9-Df zP_FV^$ZcEqb<;4Y-m)jcuO@CFMMIh~DZc+sd>m5J#ZiayLlQ{0F6HK`aN8VQy^sDc zDWEtRN3{j6EW6>qOHNUq#NiY_nu}rC6Zl8jRcOScl<=PM*4gh)@qW{9xbw~GSMMKv z`i@V<>DtyeKmK#q?`t!)J;%DA-G1l&ubPj#rw{$|+R^zVhtKc*@LZ#E@RiQr$MauL zd@*VAxx1)=2^v32@d6!;b-nJ);%G$21~PVuE6 zqP&*N10t)C*NvQq4a|kS2WIJfO{A4EoKLJ(OuoA~#Ijz~@ts*a{Ysg20%zC3s=x z){i@BVhIzQI27faluBv=ZIa=_g{a;NZWEE#sYm@JW>`7HhP5CG;##nU>+JJ20a$8H zGmEh)7thN=#L37alhH}Yrs%k`6jE`T#=$~F=*S|Yxj$7CqEbY05=50CsCNrB)uqgr zO8kKt*SCX4{ODD1TE+=22vC9=kOlx$E3$+X1!>yj5=4^JhMIxxI!phC>PUk~QLllr zhOu#iZwR&ta)QXiOs?zUDiuS&D)3nnQ7Nbg5ev-NDJ>SJiN^gn!9Jnm<$}Nz=UmrD zwxT%DQV38Tf`Nfm1z6CrK;FT`G6rlNYEIX_9FT>yu3dYZ*+Z!43bAbf9YY61O6_%- z0?DA%&}GA+7j49NhiglPD64Oy&MtpnKb|h{evDKhx%uN|Ab>beO&t(kwR!<^K z(pf7AByBQk3!T^QCKb84jJDl2YLq$Mrv2KmIB=2%j%cyUs&|9t7Pq1v)WpN?W(_ew};tQkuI}6ialhz9Q9e2BDRNlqp#%I{`b;&xmX!^ z`K>cMdY{gT7xrKhbyQ*s-5hR{z{{>6@m@8{0m^Y9z7w0im7ed)G5 NJ~CN;@6hq*{|0a5ki7r^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_moves_overlay_pp.png b/public/images/ui/legacy/text_images/en/summary/summary_moves_overlay_pp.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_profile_ability.png b/public/images/ui/legacy/text_images/en/summary/summary_profile_ability.png new file mode 100644 index 0000000000000000000000000000000000000000..6600db26802ed202ae0536dd122605998b551fdf GIT binary patch literal 1675 zcmbVNU5MON6iyX&tyH1)rwZydb=&%r|Ln}>vT<2wcHJpvyX=nL?Thx#&CN{MNp4KC zJF`pM2a6BBs1G8t_*j${>{FFiS@b~!6?_mB3Pn`#MPWtggNjm5<|lMz`lBJ4+$7&Q z=ljk%_slD^GtcbU{=jxY5O!3i%X4sl9Im0ETjBS$cLNV@w@1^56G6CRS9Wa^*5BSO z2)CT|tBdKP^DL%3kcrD{Ol}7epao%Uyd4p`#8Omabw9MlUqAX-M80c_3nPx|L?zbn zr`KXOzcy2)YfIE}#qp=mSQ~?bfTaYrgJziEwk>x2VpwOd6%lnH>5?r@WC78lGmA<* zW@tn%NK`X*RJ3HRpjx{5B+^x_sHjCnGbB~RY5^M->K!6Pi(L=Tm8W{K;K>#nX&PZg zX|-B%%aD0oS2WAA6jfJrT>^xZtcEFROJTC7@1e{R8v9Y|^AKeoNsTY3wg^nS5`rjq z8z#LpLBf!-5ac0}baDk`^b#@SoJ3m1~zs&z}dEZ60`_VUEJz+d@V6w6QCgISc_ksTH56ACYId|%J`L6HY zKQ?~ur`zsdIKKCbAD?^ZfO+?kmrp&s>)r?1Z^K`$f3tJ=>lcRCKi}Lueb_&_F?H$n zv74Jym*0GT=ilPSpYN59PF;HI#P`X@>!W*B z?75kBu~_S4R(3cX&TK-uYsazS=19D3dlVguB|FO=*2hW6^nHnS>4F3qMU4vyph9T_1A(CMK;Z?E0|EjGB&tmPVyQRZFwvlPZ`~LD zO0k77^bpUNN~L&7jJtlG7gSZ{0pua%D1r+rPKe8#6RdAo&`6;BmKR#C!$cNw&YcWX zEM>YR!SE`eA9MI5aGEE;Var=;+omgX$$)G+b z2(hD+J}t#k#c|6rkRS+z2ugyJbHw08Q|jP4L~L*%Az(vM1Vsc=W4-3;lTlt9>kYbI zRIq7Cipb?Uu*jJ?DZ#0xkmIm`36!CP6_{wO-|Sm-U*X~v+lh8tR1m1w3TUb-_5HAg zOw>n3i>cKB!g^HODOQh?N({C>ZLJW2%Tusqwp1Y0=ta`K1Pfdmk(( z*vS)mNb>BJOS!x%{C5sk+(-YH6h1l`muiduXW7;MEjvYN5^GcRXpV->o-7EQ z*^SyO{n}}@9X$HDUi|SyenOr-x|oA!f3F^VZS9VI+b7$9KKT5eoqTeprK(l$8-8Ns z?V+1?e)iDetB*hV=ZRAX_CCDrr#YJ)OFme+9n5t~o)V`j6?NImDZGQuSe~S_T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_profile_passive.png b/public/images/ui/legacy/text_images/en/summary/summary_profile_passive.png new file mode 100644 index 0000000000000000000000000000000000000000..66f56ff435e5148fc3c48b19c28e38351538635b GIT binary patch literal 1503 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 Jn~xlO?qB$|S|0!a literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_stats_stats_title.png b/public/images/ui/legacy/text_images/en/summary/summary_stats_stats_title.png new file mode 100644 index 0000000000000000000000000000000000000000..5531819ef665bd054b5eb15d84500a1a4fe9dff9 GIT binary patch literal 1869 zcmb_dO^Dq@9M3AO>&o^}L8TXCsIZrf^eAYlllKwYy4%)bAjxF%o8SNc z`+v;5yt=Y9H@j z!j5jPcw}>(I8-@!K;Az(|j^n7BuIf4v2#{_>86JQr-92Hbv6Li1oCQ3Rb4J|c-K?SrPe&5MxS);F zahOEF)B%oFSkiJyLm(vuF776sp>ax7)?p!wvQ%JUfsNZd<7u03LtXs7!hi^^>lQY) z^d$@n6KS^C6EemD*%F<48!=NGEalyVu*IHmb9b&LM%9Gjj3*xFok^lrCoap?s=W7D z5K-Pw_gw~OHJq`EqHDSZw0WQ#9<-5VB4|IP=}6N?P?yud-?$2Dda#Tvh%Dy{s3;hU zGkjezCCKMVh=trB#4V=AQA?4FAfhVo@I)9E-WfwLTo=`&G{X^L^;$&{ic3L2k=-o& zI(9H%^A-Vi)AWI3YYgZ%(V*?y#4*TZeT|cDp4Z8GD%KOKW4&x?z@fwdCNUvs+FBX- z79%F6Hq>=ES$`x6L|@^~P4nd4mKOwC4pNb-jd4F5WzUR9oj@Me0Kz1%?TSM3q%x|E zr-LmbaAOKawEZ>{q}NFI2$pg`>*Itiv_!P7Q%vf1uBW(nZO0k4Ox=cMP@Xp&VA-Y# znoY|B%=Ue1*u-a06yP?F>l%V4GKxC=?~ad|NgGEkCN@b`xp^r!R)t$i`F9`vUsBY3 zXB^d*dUe?i|6R6=iX;xF#MYb-i!(ud6sHP{M3fS7X1sgqj3Le&(MJp3-fzw~>N}+S zW`2JA;-x+4ZnLwq`yl!B`Ooi~J=FO2*IOTzN`89$yCcoHSARNwV(EY<{qR-quPbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_tabs_2.png b/public/images/ui/legacy/text_images/en/summary/summary_tabs_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/summary/summary_tabs_3.png b/public/images/ui/legacy/text_images/en/summary/summary_tabs_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_dexnb_label_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_dexnb_label_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..a457468d8d0630acdec6da6a17d0174454a9f198 GIT binary patch literal 1618 zcmbVM&5IOA6mNqDKXWnQst8ScF^N6Z-P1EWUD)b4y~z%w*JT}a1qG|CYG#_9?rOVh zcV_n(4-!F;KtN2q1U8TaJmnAwA-N=%`~f-T5hjuH9vadPoEx>Q3p{k&hWt1hH)|2`D>)9Lx@~*wR)aVUG(SGhDfj@0a@J zl1MwqbQ}j67P2fI5PG&6OES>o?C2zd$1|FSi3~-o<`GFCmZhr!(@_agQiP4OahsrF zXh0HVmW;flA&}7mmn^5fVRA+h@9~JoG6SqxV3V$pBI}ARLKmMmB!JfXevxBSE>TpZ z$mGlllre6|rs%A-nsBthGqIdfKC=QekLJ}RxRG)qMcNXgHyPCYgtFRbsK+jZF%$jl zlb7J!Ba*wCWmpy6sOgs7GEHoo*s6VISlBQ|P+zdHy}B8+0u#13Kw)7Rk>rhFMsZuD z5rJ~Uh;%qg;*O>kO~eh+6DcGHcI6=p-^a~3lO(3R>A4zITna;mExT4_HY`f5Vz>2x z*fl)}NLjZ7+qT;dEe8Re_2y20$KP6)SjR%6wm;sjY<@LnhZgg7{->`h|PJG-_+9h#^gGeGR zF9qdtG8zbabymY~FGqXt17rY|XWt~;~4bI3L(yRlj5#wFR3RK@1(nX|iNcIHfH zW^X|uu0AMu0R>Y;O8a1?FX~HMq1a-fQXeD_)+YF3r4RK*qAiHNh-daPwh~(`4$RCs zv)}o?|NGB>{(U1qvwtZ1Sd?Lyq3m>KmcAG1{o;dz^qJmXc!9olIMatbhS~X0a7UOA zJ{)0~ftFcV@E39i03wzE4N}BH({d=9VaCRr4n#}XXN$OO+9_`H+y#y`jTASp<)oaG z#uamV*~N3qGX=D~gmi-&-^Y$M0VS}o580+wwLQ>GaUEVj$H8ZjV>=LkDaB0$g6u*r z&!&lsSxt!ZNLCd#p$l?c(iL?tt4MM}loFyG<0TnLaS+ql-o;Th*C>J6%+ozBI!kdC z-*mGRKBV1Zh$wE)}NH#X3>sav*DaKC}_eW>Oq=ESRPN za8XW{Ak=uQV~vlgD&~twQg~e}Ce^sEp;#RE*JlW-1^e1xZ~Vvg&$uQ%SFn2DJhcA* zcGzc`ppHDcabE9qOu}++R5kYnHiIw?T~#Cvm3U2;3?9m=#wQacorgsQ%7%gCs8k#i zgQGwfvE5OZNW8mZr$E898AQ

CWLJVFYZaCILjjSxa#!C^Bqtz0c--??{)nQNfh- zF6GySd8Fhwpo=HUbocI2++yE;*M;~`gPkPZ)<61i+LVG}*bV6CK)6}pIdov$Nt3P@cgx}2DP_NeVMUudd*`GaKHZc z-Pub=XQLMme0%-YrR3WutWEis#_HHl@biyG(B=7-@M`(`z~!?i&B-4cUnh4xyP~z= z#?{kRZ8Lgt{ruX@&d;8I?c#}Zw;s7t`{I=+ULM@2@7id;pI&=-?^@){qw9aZex$vg zua6#o>FAA*hwFudr&o{74PRS*XWN^Rft77fMUFFhW|SFbqRjs={rzy{kCSawIQaPC Y#qBq4*3RttH2Cw$PR(RKnOtoD1sggu#{d8T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_moves_descriptions_title_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_moves_descriptions_title_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcae31894d0e1ed67909908144200a707e7b342 GIT binary patch literal 2193 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 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_profile_ability_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_profile_ability_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b1a84ddcfaf1fc230884efb39eab064667c9d4 GIT binary patch literal 2059 zcmb_dPmI)57%wrdfV&Wc5Tiz#5|xd1Ui;c}Rp3P2eHl8(}(XsF5kmZ{s*Kvac&W!Ep1PITOm^De=@rvB#99i19*NsQQz+w>y6Q{=jKb-GR-1CH%N;<+MMN*uDY z#uQujL&D~B3Xeq@vZ|I76+wgY6D$-&6$mO2C0-D9LD40RO@AEq7FxDGU3oI~MemAS zBaQ-kRLK0FJXyFVOw8CcBxrG5~5|?;!M6qIq4H|yzM-BfLrnA>8 z9MIGnM&@H67uU^PMDh4M4I@p+Ky*}F2nd)ak>3h28K0*#cP7yUdO0L0_QRU*H~WQ} z>QiRRWp>v=$Fux)G^J?8I;QNTE(^oZt6mf%50h%8 z$kB*%j$`SfVnP*(7H{Q6nU_pi<4sg3@TQGSEI?b+u-e~W@o_7uYk$8*_bZZFK$5EP zf}~nJlx3Mm*i?8^lw}nYRkno8|NhXSeTABLY=`Rqp9uR_N;IN~7A{J=V=td<#ifs(0To$W zMtf%44ML5sBEKFi^6j{dLQ<;J>fJ`%;8xTlG`~7=l$W3_*t8Qc#Jmh;%xhE&yiAZO z5hU8l7c&ifCGn&gl%yF%vEK~;op@>)H;`8+^rH>9I}c@TT`{Nz1N!>^3Z*O0p0>ch zW!HUo(^tK(VLB?3Wj3SeO*Z9-N3#^t8TQekch1uJcdA+`)e2uTb0q-MY4mt%{MmGk12U-JKa` zrrm9MFcOSP;!90UG^nWwF$B@5F-3W>5mOSdMqe5dAsT{FFj}KTq6YEK{-tR7kvPfB z+`03ebH4AKbMJjV)$?HE@;jC@4Aa=vndqhOG`$-dmeOZ-?eQdiEps~`^%>@-Tf_SX z=9N9SG0f7Ztn@%IknBdfQ;1;0$&g5?;8HZhY}{0Gu|7lsHbb(O9pmN?eax|z5###h zBuKh(lCwI;JkmGTlh((Ebj{#4-N$Y$A?lz&0?d{QdD};&7+3a-=s27fIJOK4hGJZM z7?2%Err5aS5mt^Uye>+RRkety01Zm(SqMZ`0IDEHc_1R7ps2=HFOEj@3={Px9;n8m zUokEh1TGSUVzC%0Mk9`w6+}(b1ONpHd5YluQ9HmT-u7E+9umaYJLL7~V}#16CS*~xpB{CI&`W%0*wabJ2&LH)s&P@=BRFup zwBzJ!g-X>Zv++24PrqdwPSL-20h}aoKw=yOQ09TkLoqFCNEQ*4TLDA>RG>-6u*}hg z&^8`QX;DR@fydauASxBdJ<9G$vYkmOxZ=tERspo zW%~iPb<&lHaa3`{vJ36b^8fdTi6h&)ADJlMyuXhnG>H*WFrbX+{PLBa6G+b zx3`1&Z2t9=Uu^j8)c22xz}(e*Mq9xwnV!{WF06j`mfQar_c!N;X1+W)urIZD>&4e5&y2j)bad+RCwg9fa&CP6 zT=(avyh#4Qw+CLBoti(sY-*qW;v<8nj~qMt$=Y}SdUN}Y-?cIqmcZT3=f^+l?hnt_ Nu8y9>+xKtV`8P7%k4pdm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_profile_passive_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_profile_passive_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..885453e3e9874c1a04fb25952324292a7f03692e GIT binary patch literal 1834 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 T=C}LV|AX>q)ml3E%<;bgudBG? literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_stats_stats_title_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_stats_stats_title_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..2233461522c4dfcf2279b5cae51cfff1dcbfc942 GIT binary patch literal 2532 zcmb_eTWl0n7+#{0i=e?00~*3)DnX)WXXea((uI_6u?=h?u(35>!kKf1teO=f52 z%=dr){Xgf8m2J<=nD*GTSS&W9wI#WV-JfUI^eGQSD_ z$aSPva!sC3IW?{UEGdxF&A6nACRCp0peX5rs0)$|M9C60OE$Uck7wF^;#jMaORKur zTY}GoVZjoFVzC%6%5l%{6eQC$1rZ7m0)_xVZ$3mNkPqrd7?L!=zFP=gFV97c$o9I! z1kWt3xR5KE=DeufdtoZg>FAvR!*=$vouHZVZg9b4O_@~p%-Ml zaj0vbZ&AQPn@ZJmjA=_QS5py$%{|PGYCy(B2kG7d6;{!}>-I5i?qO!uN8S{yCZD3v z^V6P}9ZA&65tF&5Chp00H&47`uy7QdCQ(QeJQSe{L<2xMEoqjjSd#XX2rW^pKvN!Z zo!;A^N?Ot_Xjo9X1wguax*d$YAS>d!GP)#1PW0^U^_$yvSS#EgH4-gVuKL10u!oq*(hm6(TSny z1SmSPfhaO*q^b&#Wlh0YL_{*l_|hs;O-P6V3>9lYa}*O8rpXM@Riv9D#t53@OKU`h zng%siT#5lyQz0zCstl+?WfRJhEE8>fX(UJVHUcaFG9WsmKn_L#D>5>5s49jH$Ct)7 zRAq(8KvNV9Y*W#JAsHB$22(D|l7pc%f%ILJ#wh7>^ef2|CeCtsC|E6Sl=a?fwpP=% zwY+iVIbb0i&9?-PqsFF$uP(b|biv(KafP;+p^S8bmao79&k2jjr;VMgW9~3egz-!d zP|w7MQ=%$RlXRdPvI$g{Ct%yE3aI8dMAooFB{qb{F&v7Pq*!uoR{eLwtIRlq@|~1z zlmdV6uH4-u8q<}3&(i7i?8@Ip?W8P;iAs+?s4mcMJ@*pM0o~oBl)p#lK#)hj~YD|9O_sw{z;lCr<4@{@R<{k2wSB z)9LOn4-CD0^@_8ry(9bRLH?uj?%)~Yh`g-b`Dw?{CgHMv;ny2yd%a)M7q%`cZZ=xK ze|y`^;ZH8EJ=P$}bI$E$`#-(<`Eu^O{0eUlzI9?+=J?0&9k_4PyzQw!>Ibw_-@Utc!8aTGUl*RJyS#7b zjP>V#Cp+fMuba8z^sdd9*8iF5ebU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_2_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_2_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_3_es-ES.png b/public/images/ui/legacy/text_images/es-ES/summary/summary_tabs_3_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_dexnb_label_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_dexnb_label_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..a457468d8d0630acdec6da6a17d0174454a9f198 GIT binary patch literal 1618 zcmbVM&5IOA6mNqDKXWnQst8ScF^N6Z-P1EWUD)b4y~z%w*JT}a1qG|CYG#_9?rOVh zcV_n(4-!F;KtN2q1U8TaJmnAwA-N=%`~f-T5hjuH9vadPoEx>Q3p{k&hWt1hH)|2`D>)9Lx@~*wR)aVUG(SGhDfj@0a@J zl1MwqbQ}j67P2fI5PG&6OES>o?C2zd$1|FSi3~-o<`GFCmZhr!(@_agQiP4OahsrF zXh0HVmW;flA&}7mmn^5fVRA+h@9~JoG6SqxV3V$pBI}ARLKmMmB!JfXevxBSE>TpZ z$mGlllre6|rs%A-nsBthGqIdfKC=QekLJ}RxRG)qMcNXgHyPCYgtFRbsK+jZF%$jl zlb7J!Ba*wCWmpy6sOgs7GEHoo*s6VISlBQ|P+zdHy}B8+0u#13Kw)7Rk>rhFMsZuD z5rJ~Uh;%qg;*O>kO~eh+6DcGHcI6=p-^a~3lO(3R>A4zITna;mExT4_HY`f5Vz>2x z*fl)}NLjZ7+qT;dEe8Re_2y20$KP6)SjR%6wm;sjY<@LnhZgg7{->`h|PJG-_+9h#^gGeGR zF9qdtG8zbabymY~FGqXt17rY|XWt~;~4bI3L(yRlj5#wFR3RK@1(nX|iNcIHfH zW^X|uu0AMu0R>Y;O8a1?FX~HMq1a-fQXeD_)+YF3r4RK*qAiHNh-daPwh~(`4$RCs zv)}o?|NGB>{(U1qvwtZ1Sd?Lyq3m>KmcAG1{o;dz^qJmXc!9olIMatbhS~X0a7UOA zJ{)0~ftFcV@E39i03wzE4N}BH({d=9VaCRr4n#}XXN$OO+9_`H+y#y`jTASp<)oaG z#uamV*~N3qGX=D~gmi-&-^Y$M0VS}o580+wwLQ>GaUEVj$H8ZjV>=LkDaB0$g6u*r z&!&lsSxt!ZNLCd#p$l?c(iL?tt4MM}loFyG<0TnLaS+ql-o;Th*C>J6%+ozBI!kdC z-*mGRKBV1Zh$wE)}NH#X3>sav*DaKC}_eW>Oq=ESRPN za8XW{Ak=uQV~vlgD&~twQg~e}Ce^sEp;#RE*JlW-1^e1xZ~Vvg&$uQ%SFn2DJhcA* zcGzc`ppHDcabE9qOu}++R5kYnHiIw?T~#Cvm3U2;3?9m=#wQacorgsQ%7%gCs8k#i zgQGwfvE5OZNW8mZr$E898AQ

CWLJVFYZaCILjjSxa#!C^Bqtz0c--??{)nQNfh- zF6GySd8Fhwpo=HUbocI2++yE;*M;~`gPkPZ)<61i+LVG}*bV6CK)6}pIdov$Nt3P@cgx}2DP_NeVMUudd*`GaKHZc z-Pub=XQLMme0%-YrR3WutWEis#_HHl@biyG(B=7-@M`(`z~!?i&B-4cUnh4xyP~z= z#?{kRZ8Lgt{ruX@&d;8I?c#}Zw;s7t`{I=+ULM@2@7id;pI&=-?^@){qw9aZex$vg zua6#o>FAA*hwFudr&o{74PRS*XWN^Rft77fMUFFhW|SFbqRjs={rzy{kCSawIQaPC Y#qBq4*3RttH2Cw$PR(RKnOtoD1sggu#{d8T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_moves_descriptions_title_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_moves_descriptions_title_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcae31894d0e1ed67909908144200a707e7b342 GIT binary patch literal 2193 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 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_profile_ability_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_profile_ability_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b1a84ddcfaf1fc230884efb39eab064667c9d4 GIT binary patch literal 2059 zcmb_dPmI)57%wrdfV&Wc5Tiz#5|xd1Ui;c}Rp3P2eHl8(}(XsF5kmZ{s*Kvac&W!Ep1PITOm^De=@rvB#99i19*NsQQz+w>y6Q{=jKb-GR-1CH%N;<+MMN*uDY z#uQujL&D~B3Xeq@vZ|I76+wgY6D$-&6$mO2C0-D9LD40RO@AEq7FxDGU3oI~MemAS zBaQ-kRLK0FJXyFVOw8CcBxrG5~5|?;!M6qIq4H|yzM-BfLrnA>8 z9MIGnM&@H67uU^PMDh4M4I@p+Ky*}F2nd)ak>3h28K0*#cP7yUdO0L0_QRU*H~WQ} z>QiRRWp>v=$Fux)G^J?8I;QNTE(^oZt6mf%50h%8 z$kB*%j$`SfVnP*(7H{Q6nU_pi<4sg3@TQGSEI?b+u-e~W@o_7uYk$8*_bZZFK$5EP zf}~nJlx3Mm*i?8^lw}nYRkno8|NhXSeTABLY=`Rqp9uR_N;IN~7A{J=V=td<#ifs(0To$W zMtf%44ML5sBEKFi^6j{dLQ<;J>fJ`%;8xTlG`~7=l$W3_*t8Qc#Jmh;%xhE&yiAZO z5hU8l7c&ifCGn&gl%yF%vEK~;op@>)H;`8+^rH>9I}c@TT`{Nz1N!>^3Z*O0p0>ch zW!HUo(^tK(VLB?3Wj3SeO*Z9-N3#^t8TQekch1uJcdA+`)e2uTb0q-MY4mt%{MmGk12U-JKa` zrrm9MFcOSP;!90UG^nWwF$B@5F-3W>5mOSdMqe5dAsT{FFj}KTq6YEK{-tR7kvPfB z+`03ebH4AKbMJjV)$?HE@;jC@4Aa=vndqhOG`$-dmeOZ-?eQdiEps~`^%>@-Tf_SX z=9N9SG0f7Ztn@%IknBdfQ;1;0$&g5?;8HZhY}{0Gu|7lsHbb(O9pmN?eax|z5###h zBuKh(lCwI;JkmGTlh((Ebj{#4-N$Y$A?lz&0?d{QdD};&7+3a-=s27fIJOK4hGJZM z7?2%Err5aS5mt^Uye>+RRkety01Zm(SqMZ`0IDEHc_1R7ps2=HFOEj@3={Px9;n8m zUokEh1TGSUVzC%0Mk9`w6+}(b1ONpHd5YluQ9HmT-u7E+9umaYJLL7~V}#16CS*~xpB{CI&`W%0*wabJ2&LH)s&P@=BRFup zwBzJ!g-X>Zv++24PrqdwPSL-20h}aoKw=yOQ09TkLoqFCNEQ*4TLDA>RG>-6u*}hg z&^8`QX;DR@fydauASxBdJ<9G$vYkmOxZ=tERspo zW%~iPb<&lHaa3`{vJ36b^8fdTi6h&)ADJlMyuXhnG>H*WFrbX+{PLBa6G+b zx3`1&Z2t9=Uu^j8)c22xz}(e*Mq9xwnV!{WF06j`mfQar_c!N;X1+W)urIZD>&4e5&y2j)bad+RCwg9fa&CP6 zT=(avyh#4Qw+CLBoti(sY-*qW;v<8nj~qMt$=Y}SdUN}Y-?cIqmcZT3=f^+l?hnt_ Nu8y9>+xKtV`8P7%k4pdm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_profile_passive_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_profile_passive_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..885453e3e9874c1a04fb25952324292a7f03692e GIT binary patch literal 1834 zcmbVNOKjXk7&bjLNl{RtLE@o;>mpicZI5Ty>-7*PN_JCXiCv;(%LWjL+41bI$=c)E zPIePo#?Eyh0geoN9fDjT_4l9KtQUyXiw3muY5!WDb=mAuf@jgrnX&SI(dp!Q; z`@jD&|Gc|Ues=u8BL@UQ7`Nw(i~Rirzeh*+^XCWtD_8hyESP^W5`=pXCHFnTCl?Z{6=C(RD1Ts+T}1DA1-m zzY)@DpbsrE$E~k#hvsFNt!M_)0D}43 zpuAul9OJu!9fImC^e}hV^>Bl#f!~nCG>E9cS}f#-xw=eGMX7{rKZ>zWs9m%q?y=&! z4yw_tsX+tEI?U*D#>fI0JNcXp>rgix0the1;rb#Yt4Usm>m9y6qmfL8)*ZQS(zRj<@*Y^{x=V=|GzyPvdnOgBA&QtusddPV=!vDQ;C~< zl{u*@A{w z+IEw2(p}204~tkmZsU;7GUO)m)aMVzG;O%R4Ae%+6qcNnLpb)-PU3t$xZUz zbH4BV|kFhx9TohXr2u zO6w6nus&aL*Oy(3iF+qdu5E*XCQm48HyeIzxAS7ht_|z-wJf3zBw5ajlc__rR9--Z zAmT{R7?P`KDl)B%Vqi)m9>z|i#!fiB9~9E0?j?Cn$RvpoF+k334%sHQ44*_ zs8B%ThdiGJt@yDk;Jio^o)=ZD>JrXMDygW%)-_wP9>=PUaTi(+m{(o92C7vQ(^dhb zUj>DNVKkvP1T)vJ22qoOT(3!MTn_!3hz3El3qd1@z%j5R9Tw%XJ?qB_^<6$&%!{Bn z<9W=s9Ac_jP9-G^)j}N2m7FRj5;2vmX^|??Fz@d#2JT9l*ZzJ6`!&sES;J(KW>QDO zSi=(4bxk6~&|DW&ra+sd@df|;BMy{+P&8;Nt8j1vsun1>{w7n#B`mk+7~{QxNZ}p-wgkqcrT=Go%%HnKW$mO zbtyO36+?6I@4o)Oq;$%&TU+wAW!L$3#b3Q&!!Rn+DGNU zV|7xMwwOV@z^nJi*mSbaCCVN)Wx8{}=0I)GwfXMbxA5ou7FXW(@4j@!^qm*)>84$) kcb|1aAk@X=ZcJp|`~{(bi|uDh0A0u6>FVdQ&MBb@0Md< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)s3v3CbWQM<}x)&#jraiQ%;1Wi#xBkc&HX`IqFu6u#WTt0J-p*_cBCgloOiAuQP zjm^jS$b7Yi=BJVFFeAhCP}?95e4IkM?KgwOXq!y#*C6X`n`P)6l1`gUF$+jfRmSO3 z7-L#4C;;)2K&yIzS2$ge9-;+~S6NPFc@c2D!6}BQ)7=k4qQ#DDOjw7yvB;CjG}1IO zShm$_6pIH`tRMh_0LfgC!Zrw!{XGvBPEhPcsTT%x<`LTAOlmTOX-9$| z_1y+ZH%%mAY#T-_U*IxHInY6UTr?9m^WY9*aTEJENE3qP``D-vreV?uH*np5eO&;O z+DfG#V_h!3-w%6Lwwr9fccWvsNHRoi1BtEkjus97hA1j1-`_k`6Ro zCoWVOsyc@d6!eX)x00e&);Wug2zGO|d2<+JUZ#Go%lZgD*5^;>{a`?p^|{HQtiZ9u zbho{As$nZsd-kmcCQdgg{Z8~Gbki1$aj{M+=LU_%ZbUtSvzrrl97WZ5*99VSMSxsM z2DS}dfOJh4FoGO8!i|ZOMpO+>?lt0nC*DmdYQUh5$-rQlo0qb+j_hz;a|ZwZP5Hm1 zW5$XJMDp$E5h^MZi=seHhlTdyNWMeed^VxmluyeH?d?D7A};3 zsNVY4fpdqJPEP)0RoNL_{M_Dq`oWPs%fEAHFTG|xelL4;Vc$2Ood4z8oi9)yT|B!2 T=C}LV|AX>q)ml3E%<;bgudBG? literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_stats_stats_title_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_stats_stats_title_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..2233461522c4dfcf2279b5cae51cfff1dcbfc942 GIT binary patch literal 2532 zcmb_eTWl0n7+#{0i=e?00~*3)DnX)WXXea((uI_6u?=h?u(35>!kKf1teO=f52 z%=dr){Xgf8m2J<=nD*GTSS&W9wI#WV-JfUI^eGQSD_ z$aSPva!sC3IW?{UEGdxF&A6nACRCp0peX5rs0)$|M9C60OE$Uck7wF^;#jMaORKur zTY}GoVZjoFVzC%6%5l%{6eQC$1rZ7m0)_xVZ$3mNkPqrd7?L!=zFP=gFV97c$o9I! z1kWt3xR5KE=DeufdtoZg>FAvR!*=$vouHZVZg9b4O_@~p%-Ml zaj0vbZ&AQPn@ZJmjA=_QS5py$%{|PGYCy(B2kG7d6;{!}>-I5i?qO!uN8S{yCZD3v z^V6P}9ZA&65tF&5Chp00H&47`uy7QdCQ(QeJQSe{L<2xMEoqjjSd#XX2rW^pKvN!Z zo!;A^N?Ot_Xjo9X1wguax*d$YAS>d!GP)#1PW0^U^_$yvSS#EgH4-gVuKL10u!oq*(hm6(TSny z1SmSPfhaO*q^b&#Wlh0YL_{*l_|hs;O-P6V3>9lYa}*O8rpXM@Riv9D#t53@OKU`h zng%siT#5lyQz0zCstl+?WfRJhEE8>fX(UJVHUcaFG9WsmKn_L#D>5>5s49jH$Ct)7 zRAq(8KvNV9Y*W#JAsHB$22(D|l7pc%f%ILJ#wh7>^ef2|CeCtsC|E6Sl=a?fwpP=% zwY+iVIbb0i&9?-PqsFF$uP(b|biv(KafP;+p^S8bmao79&k2jjr;VMgW9~3egz-!d zP|w7MQ=%$RlXRdPvI$g{Ct%yE3aI8dMAooFB{qb{F&v7Pq*!uoR{eLwtIRlq@|~1z zlmdV6uH4-u8q<}3&(i7i?8@Ip?W8P;iAs+?s4mcMJ@*pM0o~oBl)p#lK#)hj~YD|9O_sw{z;lCr<4@{@R<{k2wSB z)9LOn4-CD0^@_8ry(9bRLH?uj?%)~Yh`g-b`Dw?{CgHMv;ny2yd%a)M7q%`cZZ=xK ze|y`^;ZH8EJ=P$}bI$E$`#-(<`Eu^O{0eUlzI9?+=J?0&9k_4PyzQw!>Ibw_-@Utc!8aTGUl*RJyS#7b zjP>V#Cp+fMuba8z^sdd9*8iF5ebU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_2_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_2_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_3_es-MX.png b/public/images/ui/legacy/text_images/es-MX/summary/summary_tabs_3_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..1640e46caa0df7c7a07d9fcf57efadc1a5e1b7bd GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^2|%31!VDxg>U!n^DgFST5LY1m|Ns953ld(uSn=V* z4HgY?XP^*MNswPK14G&5vlc*JhNp{TNJZS1a|byY6a<(LE)ZS9Y-xSt^?q~RgA964 zECp`n{h24=vLKxAkavJ+WAEf6J_k7*R~i+37oYR(*$g%YfdFVdQ&MBb@05r`ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjmdKI;Vst06>yRlK=n! literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_moves_moves_title_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_moves_moves_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd7d72c3071b472398528df32a2998f7062a603 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMq#0(_Y&kc?OQk(%kA+G=b|4&Fr0Fqbu8KQxL zj3q&S!3+-1ZlnP@rJgR1Ar*10rwzFd2XGuul=fH=ep2%mpRCp1hWv`{lbRTfUkCW# zd^K%lJ>gYlDT|$8Ap(XPNIhA;D>^z3CjsnFvLZC;iJsk30-i z`0f=j#l>)PwpsUPruTAZHvZ<4Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_profile_ability_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_profile_ability_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..3354b40adfe7f980b3cab343b122f815dee8ca47 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5ZC|z|0g6Q0C^BbM!Nky zAcwgm$S)X3|0+8I;`)2KIEGZjxprUVZBP(l?iNmX#A4-?&v0@3f1giEE!*t(K1nJ5 z={TGBkej2Js8Y@Ii5eP#d@hkE^7aVd+<(JDO=(%g^p3gGFM9TtFM0NpA(uhSls_GYzzeZ@B6RXP8Ud$tu(iFfxj@62p3Yi=zy zj;Of%e_v_B!@uYMy|n)q&M5k<`s#6Zp?}-6U%py*cXb0##|LJ+4Iiwyzde(^#_Pbw z93k;y(qHe_@#XLTf6f2<`ah7>9O7QMHtOiotFyMQ$i3PX8q*zCs++~kmCVd%(ZYCf XR^3C#t)4PKKQMT@`njxgN@xNAH1UC+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_profile_passive_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_profile_passive_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d2c98a21c10d38cd64160d9354cba460ec6b5d GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ2x;TbZ#F?JC$lIVG(EPBvpz#r#AHz!S8N2_ce`0T~<9{;A zY}K!gp{h!AZ;QKYO+Rqd|CfJxX+c7}?qz%1&K;XgBPvYRnsi0EF4lT}a?;bw%+FTt YtvV$gJ9o|&L!bo=p00i_>zopr04g~|PXGV_ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_profile_profile_title_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_profile_profile_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..bccba2d87df0c5513bfc60bfeb0944bba564fd77 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^dO*y<#0(^VE2;JaDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdC8tGjv*Cs$sD}B|3B{kd;I_R|8fQlmW8k5_C|ltx~k35{{Eo# zzU4gp3UhWWfB)p4xn0czhD)Dc|F_y1zLsCU$)Zp@?)y<&f!a?ZXA*0^{JPHkv;Mz4 mgJmEOx7gZ<16#AMGBLE>GY@3^_P-Qp9fPNtO^Sm_S)@RUgIF};hpUDV73Xzbe%JCk>qmc_afDKQCqVPE)recV7924LC1-qY+Y`2V3gl;pko<4UHx3vIVCg!09Z$H AjQ{`u literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_stats_expbar_title_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_stats_expbar_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..da999975932c33cd88790ae41711c3d9f5d39f5d GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A#0(_go%nYYNO1=Egt-3y|Nq4ei3>X{6n|cF z0SYpf1o;IsI6S+N2IR+N?c6r_1=8n?Zqz7wk@fRftiOX-dz@)4H=J Z@$Wt=lX5;Y;5X0`22WQ%mvv4FO#qwbJb3^B literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_stats_stats_title_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_stats_stats_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..63fe6a694af0f1f52e4c127f54c4002be2026842 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5ZC|z|0g6QK*;?5BR7HK zOeH~n!3+##lh0ZJdG4Mrjv*CsvWGTuHaPIKUEIIzBv<%p_Ur8KMNIBO-3hhA7TyP> z4?cLDx%2$;wqL)!6;J6^2J}r(ecifL>dO*Ec@gR literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_tabs_1_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_tabs_1_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..379768ea3103c68c25f7ca606aa3ca4999676fff GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^WbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_tabs_2_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_tabs_2_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/summary/summary_tabs_3_fr.png b/public/images/ui/legacy/text_images/fr/summary/summary_tabs_3_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_it.png b/public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_it.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png b/public/images/ui/legacy/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png new file mode 100644 index 0000000000000000000000000000000000000000..1640e46caa0df7c7a07d9fcf57efadc1a5e1b7bd GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^2|%31!VDxg>U!n^DgFST5LY1m|Ns953ld(uSn=V* z4HgY?XP^*MNswPK14G&5vlc*JhNp{TNJZS1a|byY6a<(LE)ZS9Y-xSt^?q~RgA964 zECp`n{h24=vLKxAkavJ+WAEf6J_k7*R~i+37oYR(*$g%YfdFVdQ&MBb@05r`ud*ZefK-pCi(^PdoNs?4=V1dLma9vcO|~#E$zv1PBd+oN_xTX+ z=9MK9^Xvus!jhMtJ#ATV@JZ38L}ODHp(G_0!|R-vu4G*B>r-%9YW$8Xi!n;)?74R; zOheAfE~vgCb!+Jisp`=G?)%w!s?7Y1UgZje`ktNUyPd6OgL=rH-z%p~ hDtqd%&{X>$!zM1vyo}p|d_Z?Gc)I$ztaD0e0ssfqT6zEg literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_moves_effect_title_it.png b/public/images/ui/legacy/text_images/it/summary/summary_moves_effect_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..99f9dfeb2c3524d7d4065580057020a32b9577aa GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^ra;WW#0(@=a^fcdDV_kI5ZC|z|0g6QK*;?5BR7HK zOeH~n!3+##lh0ZJd1;<5jv*Cs$v{<6U$bN-)<(W%c=WIS|NH;d3LoF!XB7CJm3QOn zoeOt1WM4mU=W68auTQDgl6}yyZrU4 pg5Kx<`wxb{{eR6W{_lGRhMS))U7j*dxCFG3!PC{xWt~$(697PhRFVJy literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_moves_moves_title_it.png b/public/images/ui/legacy/text_images/it/summary/summary_moves_moves_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..e56e3f4b336035860bb145fa9ff756ab27a3a8db GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj!#0(_A*@T_|Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@6zJK`I|M#!GgU`P9^Vd@MMl)Xf_9geu)pEszXaBD5|F)ierohpqSGPE=&K6~O YrlWH-WX0jVK=Tz>% literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_moves_overlay_pp_it.png b/public/images/ui/legacy/text_images/it/summary/summary_moves_overlay_pp_it.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_profile_ability_it.png b/public/images/ui/legacy/text_images/it/summary/summary_profile_ability_it.png new file mode 100644 index 0000000000000000000000000000000000000000..bb915da37eef4529c0ab57bd1b7d7a9ef6eec1a4 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRh!VDyzNf8uC$S)X3|0+9j4@f0>x;TbZ#O3xJ7~baC2m&iam%aERgmM2;r&v( lsfu&b)cgmYE_aHy*T3-5o&O>A-&de*44$rjF6*2UngEDYM`>N3cf&b zrjj7PUFR-CjdJCPfh!OGftxK4N*v2jyI)lb44psHthQrvH+- z$TDf6s~IEX+@!AQC#B7Ni&rgAN#6KAL_f7Y!$XRHv(tKmeXUlH_+)M{%!y)~#CPa; ze|y2S8293JZUXOE0`o(TXK|)yZrnQI;g3H%Z)iXHC-F&n+QVChrLj}4{SS-RR!shT TfID6u=pF`7S3j3^P6$owG; zD8yV6!FpF<#OknL|-SI?fLe78FnYNZj^LY#c zzrN|#;@qX}d?ksm)_J;A%g&N*M>j2&GtP}Ke|hKNv9g|hipy4rFMDhE>3xz|#;Prv jyS*D895hk+yO;mqEk)@^lP3xRtzz(W^>bP0l+XkKNrOj& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_profile_profile_title_it.png b/public/images/ui/legacy/text_images/it/summary/summary_profile_profile_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..169b0a7b8e7887c05d286899c7f49e8687751b33 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15(MJE{-7;ak1wvayA$UFkf&EFKDQ;I^ej=ao2wzwXFK8 z7Ud5QZh4%SSSoWbWX5ybSISMs42qY2X})YJ^EL}!vt+Y15yp1E{-7;alZYHyoVKdSk`Xv@RB_6%GmMz@ADznoGU(9 z$)32>{549j=fjE(9PHo!+BUcBP@1>)14~Exvgo5bZd!UDXfp_#e!jpeaLH$_nVO|B zvH!#by*!`!aP=y7--vy_z1gPq<;~Ef50)3-CADo(ZawyY|F>!t)17C6N)kOkvM2PJ ViLBW3o)73222WQ%mvv4FO#uIbUWEVv literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_stats_expbar_title_it.png b/public/images/ui/legacy/text_images/it/summary/summary_stats_expbar_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8eee71613a0472be9573cab8b6bd3c872da55e GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A!VDx6JGfJU6n}tEi0l9V|6kmYxUj-T1W(H;^W(fuf1|lW~44)gOFgGul+|AtF-P}Ey bnVBJ$owfDE%BK^6Iv6}%{an^LB{Ts5?`kOH literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_stats_item_title_it.png b/public/images/ui/legacy/text_images/it/summary/summary_stats_item_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..a93695a48c86a2fdede63fc69dbc7f8add34d60e GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMo#0(@&cm#cb6i`>N3cf&b zrjj7PUFR(X)nJOpZLP7q;F=>#AtJ5&b66rRA#AnMR#wGDfaB zYp<=AD44Bj^wyv?S%^tquI8V?`RTX3MUUpi*RdTb3!3()XU?X>f($ODtgR1|3)Xh1 zoU+y1QD|ZOc9zByi;FJ`l#fi;SjWELSssH!*|L^*LoB#8sYhy!84?Fbhg|sw=#HQzhcFj6$$yjj^7JNJou;nKXcm(S<$cdT8E^= z{qxss;E3Cs&FGxz>Uy=W>%+;1m!q|HSI;hIGkCIp#fl9pHvIpZU-kR{*Y&d-%PMs* oFfgqZT|Hw~SgCGS^j0PYg<`J~t)wnbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_tabs_2_it.png b/public/images/ui/legacy/text_images/it/summary/summary_tabs_2_it.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/summary/summary_tabs_3_it.png b/public/images/ui/legacy/text_images/it/summary/summary_tabs_3_it.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_dexnb_label_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_dexnb_label_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_moves_descriptions_title_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_moves_descriptions_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..d844e8442442e08a97d26f0584fa28bf46b4b892 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq&Ne7LR|m<|6h=i@Z-l1DrEQwnt-IEiU zCY%)$J77@!%*SB%$;*w2XgTe~DWM4f+|xhm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_moves_effect_title_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_moves_effect_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..a75452f1299e379c9a75e6688c54975a29bd8c32 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^%0SG)#0(_)?yR#1Qk(%kA+G=b|1Zc$`0?Y1@!^;U zKtaZmAirP+hi5m^fE*7`7srr_IN8%1IU5`VST80XjA=Q`%d@5X>4paHb@Ss7vtCn( zUb;hnR*FU^OT?qMcNyCzJ%6yB@9gYDcbE(|+*{-qTNqYZE@t#j#0(^r^%`4&6lZ`>i0l9V{|hn_e*E}hd^qL- zP>``C$S;_|;n|HeAZLQ7i(^PdoahNdu0sYQY!B=kIZobdiWZc8qdBknT(02+i`TZV zc;_vgdhF!Vgd(ro`F}RNSpI9CPudBVW9yg_f^_zZnybG|v{N%=FwJ}YvAx;tL{^;@ zlfq^_>3+xLO@9T9#HxBs&nEOPpMr#3@+7r hQ!+#Zxw8DH{nHQBT4Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_profile_ability_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_profile_ability_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..6c82a863a692f86cbbc5894536a18763894df116 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-k#0(^#z819sQk(%kA+G=b|1Zc$`0?Y1@!^;U zKtaZmAirP+hi5m^fE*uB7srr_xa0>32{RTfH~<7Y8%{d9E_G~l)NYxac=Z(L9G+mw z5Q(7R#vV={As(&Z13YGIQyEml*w#+%;f?XOkdbh4mXwKbmXKt4Ka+Q}WlGB%pt%g5 Lu6{1-oD!M<<4ZN% literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_profile_memo_title_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_profile_memo_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5a4536817ffa8149e8c7dc0cbe262149d2124c GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^_CUVlt+ZHchu=vNU4Xv%r0dqJXTQISH z6PfYAH?!yLYdI-q8^bBQo(pO+7R|qq*ZA(JrIbhUl1q>S^WMzj~hR t3i99bdB24EG3oc!wGWp3?p$*!-szvP)s@l2q+>eW-P87JzynLmP=@JWz ngzX+f)-;O+r*us+oG-GUydvx%blcn>Xd8p4tDnm{r-UW|dALXc literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_profile_profile_title_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_profile_profile_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..a05cba4924798c678dbdd6cc4f42657395cf88ec GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHL#0(^lZE$%Bq&Ne7LR|m<|6h=i@Z-l1IefwnEn2}|%pJ!Wp6I5|Iy6(1;mJlLhLZxv7{UVC Z89G`7*75BvHUQee;OXk;vd$@?2>@YnI0FCx literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_stats_exp_title_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_stats_exp_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc237a7e6b327d2f4a74947266238ec7c94d3be GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHL#0(^lZE$%Bq&Ne7LR|m<|6h=i@Z-l1Vd3a&g!6OSz6Pd1Su`Bck>r6^q z7IA=OTYy3T$;pXolP@zZ3+3U6V+qb+p7DH%(8(t+PrhI< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)OjoF#0(_a&G}q`6lZ`>i0l9V{|hn_e*E}hd^qL- zP>``C$S;_|;n|HeAScw*#WAEJPWISF-UbB$)(iD2GybfWar&m9_C-YOmL-?6Kyj-o zYjf4cY7S?0&IIQB6&BJ~+uYlW+urCbzs!-Iw&dH>bSJN1sV}#5XGrCFOw=+BTO)rw WO2E(msoO)K1q`09elF{r5}E+fS~_U} literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_tabs_1_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_tabs_1_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..379768ea3103c68c25f7ca606aa3ca4999676fff GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^WbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_tabs_2_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_tabs_2_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/summary/summary_tabs_3_ja.png b/public/images/ui/legacy/text_images/ja/summary/summary_tabs_3_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_dexnb_label_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_dexnb_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_moves_descriptions_title_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_moves_descriptions_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..350bd607aedfaf5ac40611c9e9f5cec670b5b65d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bP#0(^#H}%a2aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwg?PF+hE&8QbF?-Hh#Wh-e2{&uwYH2wvhei} ztu>BHfiXc}_d6&Z{Qp07?F9y-rm+8?|MQ3a$)9?Em8`ih7JNnMtnk9Q>3MWqtAH%FO W`h{O-@w@_>&*16m=d#Wzp$P!yFhvUh literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_moves_moves_title_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_moves_moves_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..d020d8a77cb2f48681cd86d51010fa0fc0a84f7b GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bP#0(^#H}%a2aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHw1$nwShE&8QbF?-Hq`3Y0U%pUO!R^Yb@`dkR8hRLxm493{U`})(jwlbZ0@%cahB(AluKi}d{YT5s&yM8Of36AIk;{4ON5*~bt+RDK2W4re8 U2Wj_b0!?S|boFyt=akR{0R7KJzyJUM literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_moves_overlay_pp_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_moves_overlay_pp_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_profile_ability_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_profile_ability_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..cdeafaf486e2cb3fb7d2bdbbf880f2999f8086b4 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{U#0(@qERYKWaRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHw1$nwShE&8QJFrHr)_Y+jn{Xkj)-n7wL-W7?4R=c&?yd6vzfLw` z!~go9A09IEtPab)67}}LhyVZE|NiGQNLjmU1LKN?|Lz|RU(IjO(iXq=|9b|8qc2oN UPYHFVdQ&MBb@09K7hT>t<8 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_profile_memo_title_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_profile_memo_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..7af960fe1df5c10d2117ec2c8d1b23d44c2bae20 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^en8B_#0(@ih9tiPaRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwZT56=45^4KJ!i;u$UvmwVS+h3JO85a6Pzv=q6#)t`vp9npl9h+ zwvf+s=K=0GHPwVJbpe+7o!2~T9v}Z-(f?%s=0EMM_gdRGac>HEl*oFGv-Gr0fyW8` zX|sO?2l4;adH643b&dvW(`=T`Ed6~N#d!yGn@rwslDM{-XIJcm)g6Zy_U0)w@f&%c z$m6`;!omO9Zh^mkpu5tvA1S;&{o!{t(sUMe@3=avFUrd=Wyy;#YrcMDt$AJTEb#f* RZJ_fRJYD@<);T3K0RU&dZkYf8 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_profile_passive_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_profile_passive_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..34a13ffe8360d0f19709a9418d45dc273a90235d GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-m#0(_ss=~EEoB*E?*Mx+G|Ns9($kR_0e1YOj zB|(0{3=CzH&sqR^v7RoDAr*1S9IZ?&kN@vpUij#8w6;Xq`evgwzvrDW^#A{#`N)dA z`TMfiolE}*DiGguS#eT`%FzyI|-JTcx9 eGt$;Zu`;yxn)>-`iEaa0#Ng@b=d#Wzp$P!p;zZK` literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_profile_profile_title_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_profile_profile_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..deb57b967152b45dbcbfc73c670e06d7ed084851 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRh#0(@eBaS}?aRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHwMSHq9hE&8QAK={)w)R=n*3_%Fcpc3C|NHyr|Morixsx{M-Q^Ow zev>P;`2T;Vz{49-xyv(7{NFGCplWMaPLQghMR$}|6TpRrXz|YiT%Uc z%k_Uh|F<`|{VM+II@#6XjW<5(UwgTK!-HyuBzN83M^TFy6WRa#SN#9q{VJb;b;VVy zouSroFB)$o{;xmz|NqVg?jwAWTbr`4a< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)g)khTg9Gq16{@7>FVdQ&MBb@0DmoKt^fc4 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_stats_stats_title_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_stats_stats_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..371c2be49768ef6fad56934702c3fa95c914717b GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^VnEEp#0(^*r!Nf!aRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHw`FpxJhE&8QJFwp2<5|5ehavEPd2YgksI942|MBwt`M>|o|E-OV z*;l0m&j0&A|9`x_fx+5c6SihCH-Guh`}M!M!HKoM6r^@FI{x|3dhr53!;D;|-+O~* RTLO({@O1TaS?83{1OOSFM0EfF literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_tabs_1_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_tabs_1_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..379768ea3103c68c25f7ca606aa3ca4999676fff GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^WbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_tabs_2_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_tabs_2_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/summary/summary_tabs_3_ko.png b/public/images/ui/legacy/text_images/ko/summary/summary_tabs_3_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_overlay_shiny_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_overlay_shiny_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..3277a28a59b25e1055d6445dab354ad7f7324e65 GIT binary patch literal 1753 zcmb_dTWB0r7@loSuv^j>qXt17rY|XWt~;~4bI3L(yRlj5#wFR3RK@1(nX|iNcIHfH zW^X|uu0AMu0R>Y;O8a1?FX~HMq1a-fQXeD_)+YF3r4RK*qAiHNh-daPwh~(`4$RCs zv)}o?|NGB>{(U1qvwtZ1Sd?Lyq3m>KmcAG1{o;dz^qJmXc!9olIMatbhS~X0a7UOA zJ{)0~ftFcV@E39i03wzE4N}BH({d=9VaCRr4n#}XXN$OO+9_`H+y#y`jTASp<)oaG z#uamV*~N3qGX=D~gmi-&-^Y$M0VS}o580+wwLQ>GaUEVj$H8ZjV>=LkDaB0$g6u*r z&!&lsSxt!ZNLCd#p$l?c(iL?tt4MM}loFyG<0TnLaS+ql-o;Th*C>J6%+ozBI!kdC z-*mGRKBV1Zh$wE)}NH#X3>sav*DaKC}_eW>Oq=ESRPN za8XW{Ak=uQV~vlgD&~twQg~e}Ce^sEp;#RE*JlW-1^e1xZ~Vvg&$uQ%SFn2DJhcA* zcGzc`ppHDcabE9qOu}++R5kYnHiIw?T~#Cvm3U2;3?9m=#wQacorgsQ%7%gCs8k#i zgQGwfvE5OZNW8mZr$E898AQ

CWLJVFYZaCILjjSxa#!C^Bqtz0c--??{)nQNfh- zF6GySd8Fhwpo=HUbocI2++yE;*M;~`gPkPZ)<61i+LVG}*bV6CK)6}pIdov$Nt3P@cgx}2DP_NeVMUudd*`GaKHZc z-Pub=XQLMme0%-YrR3WutWEis#_HHl@biyG(B=7-@M`(`z~!?i&B-4cUnh4xyP~z= z#?{kRZ8Lgt{ruX@&d;8I?c#}Zw;s7t`{I=+ULM@2@7id;pI&=-?^@){qw9aZex$vg zua6#o>FAA*hwFudr&o{74PRS*XWN^Rft77fMUFFhW|SFbqRjs={rzy{kCSawIQaPC Y#qBq4*3RttH2Cw$PR(RKnOtoD1sggu#{d8T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_dexnb_label_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..8d888143663b43c5b2859bd358be604c67070dc2 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMq!VDx8?k@WUr1%4TLR=FP5`O&n@&EsSAOlFQ z$~dC~lwvLk@(Tvizsio>15#5xT^vIy;%X-Z@*PqTU=9DmU{=L&=NrRp8@+^kyZ_H@ z$-Df5{ZI?f$qn)|{I9!-t*>V?o6{&FG{4L5*RqVR*-Fe!EF5Y(Co30R(iUIb_&BUx z!a99Ht=idd52haaWXkxFp>n6UgyYIf`47JCoiJDI+%9{?zZ@zaIZo}`mop!qVc=j0 rcVTaPD06AO*>ATgQzADU6RcryedieDd@lbl(18q|u6{1-oD!MFVdQ&MBb@0AH9-VE_OC literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2d1657750988e8b1127408057eb281774b5cb8 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Za~bz#0(@Yg%Y`e6i`>N3cf&b zrjj7PUFR)w70NhYTcGA3TzHDEm-$L9_eIYeyB|#VxXQ><{Rg zT;dU4=;8P9o|0qFhx3nuCX3zs@=-9M&cwNqou;_l?^wY|Z4CskNf z92i=ZCeLkciM4XSG}~u}eL3%ucMhNS@JY@yk2MTY_?oO-Uzy*3=YP%o7c0Cj^EZ11 c?#|Bqr@p|=-$Jk30O&3TPgg&ebxsLQ01xO}*#H0l literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..28fbb5a8be9a5b72d300f71e818fff5b46ee42b2 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!VDzCEgOFUDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@l*Bx;TbZ#D(@Yaxxq8Fz;=0X8+N~H(`O`lE3Mz-hB8nTgK>z z10UbMEg=&=7kT|&ytZj6XYl=BXQa2xJ60H3KI!I}o_9;O%-bbVs>;D{H9tzrH)8qm x`kxlkpSRgPolwF2?54p42Zo3rdwbuo?E4yFbb&j%%?M~OgQu&X%Q~loCIF{)P~HFl literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ef7c91fc5b6b2c59d6cf5510c02ec3cec0940c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^AwbN*!VDy*avrS%Qv3lvA+8At3IG592a+Ft`~Wht z|8IQ`lwv9g@(X5QD4TrN0?6z1ba4!+h^w7&k(1ew$9d}P2Q_aQI#00Ob*T71Q!9DL z>u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..11616a7428738a462771e24b71d0e1cf3aac9c59 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf!VDy9I}1XA6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6B7W5QUff)lUBS_L2X< z!~RvD1D`KH6yh1I=X~Ytxi>~zwlp?g(0^yHeP+t#%W+ZPmwj|e^RITkQf}(KKKuN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..d66fa829be12519a0f6ffa7e25051f2f07fbd049 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUF#0(_2F5G+t#0l^TaZN}_`2YVuggpI3!51jb zR1)MD%)n4K`K$$yx6sqYF{C0cx7U{Ikb{6*^6aGCHP@w|Xehe6Y>?o8BwNJ78&=r0 zmO1X2s8a%S^6tEiuX~zUz8HSs?f-ew%=nG^v%K5&ckOPq`v+a@v+JEF`{1fXy2KY1 z#dTUzrW(tXPFbd0*XDi6QT2C@#$~RQbZcvyR`_+{%eGDJoAwDhWZtWn x)fE!`RL<4;44$rjF6*2UngA99Wu5>4 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..e9dfb10e5d62cbd9e2c24bef5d40012719e0a292 GIT binary patch literal 1600 zcmbVMJ#W)M7&fZ-DlmZ%LPE040s`mGcH+b*OjVLXBjHk&0A+&n`I1< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)#wbi{`&Z?m4fjDM)~*y zyUQ6J(jG8d{+z!)zFDNju48ia&lfkX1U`4pi8;}{y)Z%e$&>%KHGjEN4r%GF3*{DD b%fO)aSeJRi^ykq)I~Y7&{an^LB{Ts5t(itv literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9dffc28879008ff0d62a565b7a9a2a508dc942 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^=0MEB#0(@AX7;ZIQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@~S;u978JNk~`}E)Z24xegFTb|360Ot9k}EY%9OMy1Ki}AS9xp z@#~Xk&z{ZYX7okqNuw1^DlOuulCxn;zJ_d&a>IOcW*Yk^VM@*tJbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_overlay_shiny_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_overlay_shiny_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2436738a831b466e701f3ff745c80f0af483c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35#0(^N{5+Qoq<8{+LR^9Lf&~dLUaa`=;l}1w zpPGSu#*!evU(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_dexnb_label_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_moves_overlay_pp_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_moves_overlay_pp_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_profile_ability_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_profile_ability_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_profile_memo_title_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_profile_memo_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_profile_profile_title_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_profile_profile_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_stats_stats_title_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_stats_stats_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-bU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_tabs_2_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_tabs_2_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/summary/summary_tabs_3_ro.png b/public/images/ui/legacy/text_images/ro/summary/summary_tabs_3_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8f6a1246e06e1beafe100f1b0858c7832221f0 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^2|%31!VDxg>U!n^DWL$L5LY0*U_rwF|NnvHix(?C ze7K>zI!hNQ%3KoU7Yw9-l^wYUq|!ZI977^n-=1^iZE)amxv19A;OZngL4-Y+G3G-) zE31li^}phG=d)ANw4aM}o#guUiTShY%2Ql62K334w^{MIS<*N#D*$>Y% jhjFl=ftLNUavy5y=D5nZ)u(*~TFKz)>gTe~DWM4fd80*5 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_dexnb_label_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2e66426cb105d302c91851c1026495a2e18cce GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wKxcmjMvT>t<7p8y6we*9=`yBq)% zXDSKu3kIs1eAWWU)9`e045^4qPIyp%;KPHv%x&@tfBrEZ-W|>@5y$-UxWliDml@hv by_p#bUW=5~`kwRy>S6G7^>bP0l+XkKef=!@ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_moves_descriptions_title_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_moves_descriptions_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..a435d6d845edfd4eb9e6f662789991c9d608ea1c GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b!VDy%)IaV8Qv3lvA+8At2|s@P`2YVukO3rD zWt`CgN->uN`2_>%Uu8$`0jX?H7srr_IM=>LPG?6B=eMPeVpa|l?HeZScf3=-Os(Rn z(}Z^ZBOcFRy;2jmk4Sc z-rnl(e9vOf@H+UNs8>k;|5^Nzg5QfQh4ky6WE1=#0(@8HmA=7aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwWqGQwsm}l3_xr#5Z@rV9zhTaf()IVQ z?v2|2UUA0Z?+@sVuAR)=}6jbM0kz>$HAogw<0TlD<(@1_B5W$<+Mb6Mw<&;$TeHd6Tj literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_moves_overlay_pp_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_moves_overlay_pp_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..4af1f833036041f55757a272bb14a93db2173af7 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=w_yc@GT>t<7f8oLjAkV|Y1ISRF zwt@x7VJ->s3kK4^%8uLvQbwLGjv*Cs$qfu?!mP={Y{Kd6!U`*S)LIpnZ04R(Vv<;3 oR>-zWuu!nfFfkz^p|FIJ;W-ya)J3jc+Cbe5p00i_>zopr07I=QYybcN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_profile_ability_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_profile_ability_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfcc6102dca117fa33b4bb0f4b6c65e75f14c72 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5ZC|z|0g6Q0C^BbM!Nky zAcwgm$S)X3|0+8I;`)2KIEGZj`F1yQ9ySnQ4&CFh*~zLYk5T-seXvf4=Z@zS`BY}l z|9|+#g1S~CCeEyhKNOC!n6CMyQGF}=W@yT!wI}4{)+@>utu{WsX#0uN`2_>%Uu8$`0jVvXE{-7;akl-9xkn6mn5Vihi~N^eaH5()@eA9ff5ua% zM7tkr^eYfZ-ac=YjA-SglV=`?9xuPTro`yjo0_m&MnWfpgRkr;*rRSCJfZPiPkq}` zzphz4kA8f5aOU~(fonkhKJ^F?3#G${0+D3+n=;=opAlJ>*6A& zdv~X--nNkSiG#GU&}oK0JFm9qluAb_xJgf6m)o*Zi1%X6e|DbVYXskPX}@6-kni~W aNL)D8;n!FFHJ(8CGkCiCxvX8uC$S)X3|0+9j4@d=jx;TbZ#JQes15yc|E{-7;alU67IS)8+I0x=rcY%|SeZn&7KX2@V1sBHf zDA;(s>FbT%o-M3%X~Q>xq*;2Ct~eennN)hA$+pGS?#9>2YZX^pO1)z4*}Q$iB} Dk-t5r literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_stats_expbar_title_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_stats_expbar_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..b885633d336a18ee9f5e805ee3ca189dc9bdcb6a GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A!VDx6JGfJU6n}tEi0l9V|6kmYxUj-T1W(1Cq2^>pg=E%rKN=U>wOkrRM X7i78NDDs#GsGPym)z4*}Q$iB}0)r!? literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_stats_item_title_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_stats_item_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..95b01d062abd16b9f72cb899955c2f2057108de1 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?d#0(_;zPWLOH~~H(t_cYV|NsAokf)z0_yWb5 zN`m}?85qhYpS1w;8a-VcLn`8O&nfa9au9G!EMdLVU>v$(S<;SUY=?Oru5Mq%x#os) z!L(RIPRWn!bvtAgCU>dXeBZgfaP=*FyRg02j6J;1zRd1wD$wHROuDDGMK0m^Gu!FY z-LK3`-+b)1u!`+ro$1a@8>8oxg*u-4^KWN%n_5Rn;;g*GpC*6)l`nHvJ}EVMja!S! RB%os$JYD@<);T3K0RX?bS5g1~ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_stats_stats_title_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_stats_stats_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1c5dc944588bfb58f171dd9fd7f260f1c30055 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^wm{6m#0(_Ocgv>$DV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdF`Gqjv*Cs$sP57>i<3dZ>{zJ=KnnQNjyBEyB!jazrVUV{QUio zRi(_%t!=CV5%2S|^6u@eE;J5kSh#4@qC+Yf(Qxt9qbP|K7tDnm{r-UW|m`+^l literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_tabs_1_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_tabs_1_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..379768ea3103c68c25f7ca606aa3ca4999676fff GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^WbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_tabs_2_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_tabs_2_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/summary/summary_tabs_3_ru.png b/public/images/ui/legacy/text_images/ru/summary/summary_tabs_3_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_overlay_shiny_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_overlay_shiny_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2436738a831b466e701f3ff745c80f0af483c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35#0(^N{5+Qoq<8{+LR^9Lf&~dLUaa`=;l}1w zpPGSu#*!evU(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_dexnb_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_moves_overlay_pp_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_moves_overlay_pp_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_profile_ability_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_profile_ability_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_profile_memo_title_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_profile_memo_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_profile_profile_title_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_profile_profile_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_stats_stats_title_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_stats_stats_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-bU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_tabs_2_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_tabs_2_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/summary/summary_tabs_3_tl.png b/public/images/ui/legacy/text_images/tl/summary/summary_tabs_3_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2436738a831b466e701f3ff745c80f0af483c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35#0(^N{5+Qoq<8{+LR^9Lf&~dLUaa`=;l}1w zpPGSu#*!evU(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_dexnb_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_moves_overlay_pp_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_moves_overlay_pp_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_profile_ability_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_profile_ability_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_profile_memo_title_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_profile_memo_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_profile_profile_title_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_profile_profile_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>< zkdPP{KnO7~FfcG6CKwo4;2*HUA7E$Vbv`T#<nL%kbKr%wNr5e}8^&Qyx7&1b|mzYgsOP=Lr*0i3Y;wr9qSc zT2W5T3=+y#xKw@K31e6L^5(6khJmYHsd(5+>bx7yZ>0R<#zKp2tS~3gW=^Z81_THq zE~z?*dT~Yut~TT)u+F!UrVb%;#nonWhw8GosMbZw)k?|MnNc>?s#7v-?3m?~s)>y% z!c}BgIyMNliRGx{O9O9d&?ZZbvtwWIy4QPUl63#;!0s~gylGU^~ zbRICodpzQ?%m8Z?*rY3@$hzVe)Wz>j4j{FjSNPacOB59@GC8*fVT=>9B|2-ZCmb#D zOsuAi&#i&Xqj@w5si&Muk+y{BO$xO*k*wD1>airP|01*#AZduHQlsY zhD|CJV%1JylVCi8dLjth>pwutEyE&Km6)5M&@cg&^pD_xk+w)93gLzk?QoRD9ZfBg zNa~^|Qg96Ftf30eBh5IIG-kZna5ady6ovsYOoLXcc2%d)h`K?`w(bO&=@r9oQ>TXg zT9r=h8-lIob)DD;U{BkeGMkq5nqxS+<>&U;ujqko2ORshNoj3je<2OwT+!Zt^W>*3 zZwN9UW>Bj2@p-t&Z;V&HP#yLFp)BuhS7Uimd7zEA!!0uKcM*(e`&|yCzbW?!mWj6P z)0EG4AX|TECiE-m8D0Cm@V_hFmcoB-zJC`!PATisxWi#cA}tRE<>O>j5cFfMhX1}B zJrg+0vwT?$QuruFF^_>dg+cp#U=YEPbi-Fpe9zoInf78)#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_stats_stats_title_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_stats_stats_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-bU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_tabs_2_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_tabs_2_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/summary/summary_tabs_3_tr.png b/public/images/ui/legacy/text_images/tr/summary/summary_tabs_3_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2436738a831b466e701f3ff745c80f0af483c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35#0(^N{5+Qoq<8{+LR^9Lf&~dLUaa`=;l}1w zpPGSu#*!evU(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..eab90a91c7fc8dd67b9cf24a7e8c37dffd62b2d8 GIT binary patch literal 1612 zcmbVMJB-{!7&Zl`a8XbYLOM~690`G7c4q8-oJaA6WA|WJ!N+k~DTkoQcxJq7-P&X9 zx!b)HH0T;iB4`i=Qc4h_KnRI~K!cEIXsJMHsEFtgO&IUP%Hu8xSh79#eEDonv;6e3Wm#u>-Ojdom+Mofmdx||Kk3)z^;p(@qp+;gPnP#1*2kZ$Sk|Lo#r++< z6TC{fN@`4~P}U|%X3&;({=y_j)PLb!#93o)U%NnH=jFWW@RMMSqdFVAC{FW(+&ol%6w<8f{5)>J+~ z#Pd9a9ppIBAYgHjYBqssac<$EBMY9#nT}NoN{=j5d)l`R(^(2hR=G`!d6`VX(1c}( z)Nq;76exIw%l7ioG`QeMj$|TJT^KB>u-Q;)RSeY$uB+`k0+`YUK^5azE=f{_DD=j@ zNn>7+W6?$bAd_fY7HTi&a%11nJXdCu(RMDGR(W5k(V|gX3(BC~2G3rOQ=!JibGN}| zhiU2C4t5$4uR^EZCxq4sbylCp4#ju|4U~wZgL|P4bqFQS9Z)kcf@$_Zu;4UOdBRM( zal!@?W$C~MRS{`hjZ|&|8+PuLMG(+lT41}Nj@Z2LAZn<@>1+3)z63Orl}GyCyS z8mISZ_Y793NRL@A*9WFr4;UtN67_=Z-=FxyweBS1cMacvCq6GJAF^~HjYuN9Oa+y4 zGHVFByI0e_+oWd!H+ohsDl@!a=xXz8x{`&5RZyAwZ>vh)qDe)!{^m8FZ|;?>X3KJ)mEYu(?j{l5G`@cn0JBl!CAFHe2?%@Yy)d5qWSlJ(`A WfBw`TT)k52eQ#s4^TkV7-uoA*z5f^h literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_descriptions_title_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_descriptions_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2b4d083760bfed09c6fae182fb0a997420f282 GIT binary patch literal 2173 zcmb_eU2NM_6iy{zTeraj0(DeqmisWK;n==$?AU5r+N510HC@*Rtz%o)>+9>pYGS*# z)1-YWAW=YTi%_5FC=!)GeE?|%A*O-WZ5k6oJOE+{_JV{E51UqvfrJ=;*ZCuZt{W4P z9A965=bZ2S-QySf`}S^ce55fD2y9RE#0SW|mt31S-$(ujhj;8Jw=H(hK{pWC`k;R` z1YSAb6bNie8mS>~DA}tZD;I>CrQ%>QXA^WF(Ar+KAsWRVrQ)<@pWfyXGO|9ux!bAeb7NO1ZLC$xn1k_LsXXl-4$+(7CoW(h8dM?58HLRVnJj=~k zw@_VseUkwa+GMh3V_hz}T+M{*b&V4@Dgjv+?WQJd%no4J$~y>mjT4$JzBjfKb1?KQ zCuLdLYNGn9l&M&ZdhCE&RYCN0g- zC+eXQ1_&u$Qo=wHA~!)v!D!Hfw*_lR(JdzjiMvJ)rZH=qX_~49QHfbu%OQpdyHJTm zGN~j?*Mla)iFlMI9tRCWQxH%EK@}s6$V(Cv!2)Jf4G0WUMJa+rBuY@O%Ev8~_w!nn z*N8k3gAgKt(IKxhnk0l6Rg@uvHIWN*9H%3WugdRp4ANIHd)InM{r~M@RZ9o)$R&w$ zE8Wov)0I`$X!G6lX#xWcBDg$|lK^O>70%DzXNl%#uyD{HVc`H4J&wrv~cMy-&7*M5(Rv_{_ zHA*ADM6pI!wvBc2d1v`3t1VrZCZo96?GSmZ%iCZ5iX*V z$^)7j_G1hfHADifM?hEr2=F)ztB%(bFSkNN=Q)#nrTdqe3rg@SMIE* z{+)w$Plf->l~PfbYm5D7*_Gba%>nQNi5_3N{KQ91FVBDV#ZwDEo?wrz9eKC- z$?&JAn|FShSepwzw0iZPeGTugXy3Km*!|(Jk3RkTPOd9`YGhj9^k#2!;p)SC=9bZ7 z=LZYZm*2VAGG)x`uXX3=8v~=q#v9JH77ugR?FTM2b*~J4KeI^P*!Jy_)s<@tQy-5# zcd+GT;IqaPR}N>@`QaI7YV3OC=il0YnwgzFHuv=#=g)SZy)@H&@6xNPmij>)`DW(X p>G98Z%|>6m_Qz5}Ji5HNb?=qecdQ;dzsvtXNObkZ-|ifF<}ZAE%%=bV literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_effect_title_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_effect_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..55fb0efd832da789da351d76a5e3c7eea57b224e GIT binary patch literal 1870 zcmb_dU5MON6pjyFcU!8UAf+ON)CWZ~H@W$nTsE%jWON72y6z5i`{tdSJ2PP?xoMKw z$?l?}PgQGC=#vQc$p^*0iLDA+@j(%!4W&Q^Io}QlK&)~@05`WFa3kOm`*mZYt-zL2A<{m+q zdOm2bW~<(lh_JANeb%CtJd8P75N7A{7?U-ci7na*B1gLL(I=7^_>Q#S@Dwku(QdG? znb4KZ#U|NYBepNiJtEHLh#LrLhQ&PWMJdW1X=oSmaWM@faR|xQ9BICAD6V=-VvQwK zG%BV{R2_--Xu{=6Ut((CO)t~ zhSIpZ>knDAkx*#puAvw zoZ%aSeS+F72{D%>$XN9CakI3?izr9!t1m&Q2S$@I2Ir(hNt0He5&IiYr0jBjOWE z+nhcnRFMr|*X62ZSh8iPW=l7HwPhQV^)4g*BCnJ6K3|VDLNIJ$8JdPB`<7mnahqV7 z=o+>yXz0}zoUDH;3HZLky<4_Z?6#sH&_a;%RBep+!wNk(9`yooSOW-?qP8806iKDN zG@cH&iNMV%7?~Y(DK~nZbdO*uYi9$T(D@FJ)(wgYT#I^&*RM}pgSbjyOP4iGC9-Df zP_FV^$ZcEqb<;4Y-m)jcuO@CFMMIh~DZc+sd>m5J#ZiayLlQ{0F6HK`aN8VQy^sDc zDWEtRN3{j6EW6>qOHNUq#NiY_nu}rC6Zl8jRcOScl<=PM*4gh)@qW{9xbw~GSMMKv z`i@V<>DtyeKmK#q?`t!)J;%DA-G1l&ubPj#rw{$|+R^zVhtKc*@LZ#E@RiQr$MauL zd@*VAxx1)=2^v32@d6!;b-nJ);%G$21~PVuE6 zqP&*N10t)C*NvQq4a|kS2WIJfO{A4EoKLJ(OuoA~#Ijz~@ts*a{Ysg20%zC3s=x z){i@BVhIzQI27faluBv=ZIa=_g{a;NZWEE#sYm@JW>`7HhP5CG;##nU>+JJ20a$8H zGmEh)7thN=#L37alhH}Yrs%k`6jE`T#=$~F=*S|Yxj$7CqEbY05=50CsCNrB)uqgr zO8kKt*SCX4{ODD1TE+=22vC9=kOlx$E3$+X1!>yj5=4^JhMIxxI!phC>PUk~QLllr zhOu#iZwR&ta)QXiOs?zUDiuS&D)3nnQ7Nbg5ev-NDJ>SJiN^gn!9Jnm<$}Nz=UmrD zwxT%DQV38Tf`Nfm1z6CrK;FT`G6rlNYEIX_9FT>yu3dYZ*+Z!43bAbf9YY61O6_%- z0?DA%&}GA+7j49NhiglPD64Oy&MtpnKb|h{evDKhx%uN|Ab>beO&t(kwR!<^K z(pf7AByBQk3!T^QCKb84jJDl2YLq$Mrv2KmIB=2%j%cyUs&|9t7Pq1v)WpN?W(_ew};tQkuI}6ialhz9Q9e2BDRNlqp#%I{`b;&xmX!^ z`K>cMdY{gT7xrKhbyQ*s-5hR{z{{>6@m@8{0m^Y9z7w0im7ed)G5 NJ~CN;@6hq*{|0a5ki7r^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..6600db26802ed202ae0536dd122605998b551fdf GIT binary patch literal 1675 zcmbVNU5MON6iyX&tyH1)rwZydb=&%r|Ln}>vT<2wcHJpvyX=nL?Thx#&CN{MNp4KC zJF`pM2a6BBs1G8t_*j${>{FFiS@b~!6?_mB3Pn`#MPWtggNjm5<|lMz`lBJ4+$7&Q z=ljk%_slD^GtcbU{=jxY5O!3i%X4sl9Im0ETjBS$cLNV@w@1^56G6CRS9Wa^*5BSO z2)CT|tBdKP^DL%3kcrD{Ol}7epao%Uyd4p`#8Omabw9MlUqAX-M80c_3nPx|L?zbn zr`KXOzcy2)YfIE}#qp=mSQ~?bfTaYrgJziEwk>x2VpwOd6%lnH>5?r@WC78lGmA<* zW@tn%NK`X*RJ3HRpjx{5B+^x_sHjCnGbB~RY5^M->K!6Pi(L=Tm8W{K;K>#nX&PZg zX|-B%%aD0oS2WAA6jfJrT>^xZtcEFROJTC7@1e{R8v9Y|^AKeoNsTY3wg^nS5`rjq z8z#LpLBf!-5ac0}baDk`^b#@SoJ3m1~zs&z}dEZ60`_VUEJz+d@V6w6QCgISc_ksTH56ACYId|%J`L6HY zKQ?~ur`zsdIKKCbAD?^ZfO+?kmrp&s>)r?1Z^K`$f3tJ=>lcRCKi}Lueb_&_F?H$n zv74Jym*0GT=ilPSpYN59PF;HI#P`X@>!W*B z?75kBu~_S4R(3cX&TK-uYsazS=19D3dlVguB|FO=*2hW6^nHnS>4F3qMU4vyph9T_1A(CMK;Z?E0|EjGB&tmPVyQRZFwvlPZ`~LD zO0k77^bpUNN~L&7jJtlG7gSZ{0pua%D1r+rPKe8#6RdAo&`6;BmKR#C!$cNw&YcWX zEM>YR!SE`eA9MI5aGEE;Var=;+omgX$$)G+b z2(hD+J}t#k#c|6rkRS+z2ugyJbHw08Q|jP4L~L*%Az(vM1Vsc=W4-3;lTlt9>kYbI zRIq7Cipb?Uu*jJ?DZ#0xkmIm`36!CP6_{wO-|Sm-U*X~v+lh8tR1m1w3TUb-_5HAg zOw>n3i>cKB!g^HODOQh?N({C>ZLJW2%Tusqwp1Y0=ta`K1Pfdmk(( z*vS)mNb>BJOS!x%{C5sk+(-YH6h1l`muiduXW7;MEjvYN5^GcRXpV->o-7EQ z*^SyO{n}}@9X$HDUi|SyenOr-x|oA!f3F^VZS9VI+b7$9KKT5eoqTeprK(l$8-8Ns z?V+1?e)iDetB*hV=ZRAX_CCDrr#YJ)OFme+9n5t~o)V`j6?NImDZGQuSe~S_T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_passive_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_profile_passive_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..66f56ff435e5148fc3c48b19c28e38351538635b GIT binary patch literal 1503 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 Jn~xlO?qB$|S|0!a literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..5531819ef665bd054b5eb15d84500a1a4fe9dff9 GIT binary patch literal 1869 zcmb_dO^Dq@9M3AO>&o^}L8TXCsIZrf^eAYlllKwYy4%)bAjxF%o8SNc z`+v;5yt=Y9H@j z!j5jPcw}>(I8-@!K;Az(|j^n7BuIf4v2#{_>86JQr-92Hbv6Li1oCQ3Rb4J|c-K?SrPe&5MxS);F zahOEF)B%oFSkiJyLm(vuF776sp>ax7)?p!wvQ%JUfsNZd<7u03LtXs7!hi^^>lQY) z^d$@n6KS^C6EemD*%F<48!=NGEalyVu*IHmb9b&LM%9Gjj3*xFok^lrCoap?s=W7D z5K-Pw_gw~OHJq`EqHDSZw0WQ#9<-5VB4|IP=}6N?P?yud-?$2Dda#Tvh%Dy{s3;hU zGkjezCCKMVh=trB#4V=AQA?4FAfhVo@I)9E-WfwLTo=`&G{X^L^;$&{ic3L2k=-o& zI(9H%^A-Vi)AWI3YYgZ%(V*?y#4*TZeT|cDp4Z8GD%KOKW4&x?z@fwdCNUvs+FBX- z79%F6Hq>=ES$`x6L|@^~P4nd4mKOwC4pNb-jd4F5WzUR9oj@Me0Kz1%?TSM3q%x|E zr-LmbaAOKawEZ>{q}NFI2$pg`>*Itiv_!P7Q%vf1uBW(nZO0k4Ox=cMP@Xp&VA-Y# znoY|B%=Ue1*u-a06yP?F>l%V4GKxC=?~ad|NgGEkCN@b`xp^r!R)t$i`F9`vUsBY3 zXB^d*dUe?i|6R6=iX;xF#MYb-i!(ud6sHP{M3fS7X1sgqj3Le&(MJp3-fzw~>N}+S zW`2JA;-x+4ZnLwq`yl!B`Ooi~J=FO2*IOTzN`89$yCcoHSARNwV(EY<{qR-quPbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2436738a831b466e701f3ff745c80f0af483c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^2|%35#0(^N{5+Qoq<8{+LR^9Lf&~dLUaa`=;l}1w zpPGSu#*!evU(%&eSxxzt=vj`UP<&>z1f)kgPFm|u#L0z*@9m{ PV;MYM{an^LB{Ts5e||dm literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..eab90a91c7fc8dd67b9cf24a7e8c37dffd62b2d8 GIT binary patch literal 1612 zcmbVMJB-{!7&Zl`a8XbYLOM~690`G7c4q8-oJaA6WA|WJ!N+k~DTkoQcxJq7-P&X9 zx!b)HH0T;iB4`i=Qc4h_KnRI~K!cEIXsJMHsEFtgO&IUP%Hu8xSh79#eEDonv;6e3Wm#u>-Ojdom+Mofmdx||Kk3)z^;p(@qp+;gPnP#1*2kZ$Sk|Lo#r++< z6TC{fN@`4~P}U|%X3&;({=y_j)PLb!#93o)U%NnH=jFWW@RMMSqdFVAC{FW(+&ol%6w<8f{5)>J+~ z#Pd9a9ppIBAYgHjYBqssac<$EBMY9#nT}NoN{=j5d)l`R(^(2hR=G`!d6`VX(1c}( z)Nq;76exIw%l7ioG`QeMj$|TJT^KB>u-Q;)RSeY$uB+`k0+`YUK^5azE=f{_DD=j@ zNn>7+W6?$bAd_fY7HTi&a%11nJXdCu(RMDGR(W5k(V|gX3(BC~2G3rOQ=!JibGN}| zhiU2C4t5$4uR^EZCxq4sbylCp4#ju|4U~wZgL|P4bqFQS9Z)kcf@$_Zu;4UOdBRM( zal!@?W$C~MRS{`hjZ|&|8+PuLMG(+lT41}Nj@Z2LAZn<@>1+3)z63Orl}GyCyS z8mISZ_Y793NRL@A*9WFr4;UtN67_=Z-=FxyweBS1cMacvCq6GJAF^~HjYuN9Oa+y4 zGHVFByI0e_+oWd!H+ohsDl@!a=xXz8x{`&5RZyAwZ>vh)qDe)!{^m8FZ|;?>X3KJ)mEYu(?j{l5G`@cn0JBl!CAFHe2?%@Yy)d5qWSlJ(`A WfBw`TT)k52eQ#s4^TkV7-uoA*z5f^h literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_descriptions_title_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_descriptions_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2b4d083760bfed09c6fae182fb0a997420f282 GIT binary patch literal 2173 zcmb_eU2NM_6iy{zTeraj0(DeqmisWK;n==$?AU5r+N510HC@*Rtz%o)>+9>pYGS*# z)1-YWAW=YTi%_5FC=!)GeE?|%A*O-WZ5k6oJOE+{_JV{E51UqvfrJ=;*ZCuZt{W4P z9A965=bZ2S-QySf`}S^ce55fD2y9RE#0SW|mt31S-$(ujhj;8Jw=H(hK{pWC`k;R` z1YSAb6bNie8mS>~DA}tZD;I>CrQ%>QXA^WF(Ar+KAsWRVrQ)<@pWfyXGO|9ux!bAeb7NO1ZLC$xn1k_LsXXl-4$+(7CoW(h8dM?58HLRVnJj=~k zw@_VseUkwa+GMh3V_hz}T+M{*b&V4@Dgjv+?WQJd%no4J$~y>mjT4$JzBjfKb1?KQ zCuLdLYNGn9l&M&ZdhCE&RYCN0g- zC+eXQ1_&u$Qo=wHA~!)v!D!Hfw*_lR(JdzjiMvJ)rZH=qX_~49QHfbu%OQpdyHJTm zGN~j?*Mla)iFlMI9tRCWQxH%EK@}s6$V(Cv!2)Jf4G0WUMJa+rBuY@O%Ev8~_w!nn z*N8k3gAgKt(IKxhnk0l6Rg@uvHIWN*9H%3WugdRp4ANIHd)InM{r~M@RZ9o)$R&w$ zE8Wov)0I`$X!G6lX#xWcBDg$|lK^O>70%DzXNl%#uyD{HVc`H4J&wrv~cMy-&7*M5(Rv_{_ zHA*ADM6pI!wvBc2d1v`3t1VrZCZo96?GSmZ%iCZ5iX*V z$^)7j_G1hfHADifM?hEr2=F)ztB%(bFSkNN=Q)#nrTdqe3rg@SMIE* z{+)w$Plf->l~PfbYm5D7*_Gba%>nQNi5_3N{KQ91FVBDV#ZwDEo?wrz9eKC- z$?&JAn|FShSepwzw0iZPeGTugXy3Km*!|(Jk3RkTPOd9`YGhj9^k#2!;p)SC=9bZ7 z=LZYZm*2VAGG)x`uXX3=8v~=q#v9JH77ugR?FTM2b*~J4KeI^P*!Jy_)s<@tQy-5# zcd+GT;IqaPR}N>@`QaI7YV3OC=il0YnwgzFHuv=#=g)SZy)@H&@6xNPmij>)`DW(X p>G98Z%|>6m_Qz5}Ji5HNb?=qecdQ;dzsvtXNObkZ-|ifF<}ZAE%%=bV literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_effect_title_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_effect_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..55fb0efd832da789da351d76a5e3c7eea57b224e GIT binary patch literal 1870 zcmb_dU5MON6pjyFcU!8UAf+ON)CWZ~H@W$nTsE%jWON72y6z5i`{tdSJ2PP?xoMKw z$?l?}PgQGC=#vQc$p^*0iLDA+@j(%!4W&Q^Io}QlK&)~@05`WFa3kOm`*mZYt-zL2A<{m+q zdOm2bW~<(lh_JANeb%CtJd8P75N7A{7?U-ci7na*B1gLL(I=7^_>Q#S@Dwku(QdG? znb4KZ#U|NYBepNiJtEHLh#LrLhQ&PWMJdW1X=oSmaWM@faR|xQ9BICAD6V=-VvQwK zG%BV{R2_--Xu{=6Ut((CO)t~ zhSIpZ>knDAkx*#puAvw zoZ%aSeS+F72{D%>$XN9CakI3?izr9!t1m&Q2S$@I2Ir(hNt0He5&IiYr0jBjOWE z+nhcnRFMr|*X62ZSh8iPW=l7HwPhQV^)4g*BCnJ6K3|VDLNIJ$8JdPB`<7mnahqV7 z=o+>yXz0}zoUDH;3HZLky<4_Z?6#sH&_a;%RBep+!wNk(9`yooSOW-?qP8806iKDN zG@cH&iNMV%7?~Y(DK~nZbdO*uYi9$T(D@FJ)(wgYT#I^&*RM}pgSbjyOP4iGC9-Df zP_FV^$ZcEqb<;4Y-m)jcuO@CFMMIh~DZc+sd>m5J#ZiayLlQ{0F6HK`aN8VQy^sDc zDWEtRN3{j6EW6>qOHNUq#NiY_nu}rC6Zl8jRcOScl<=PM*4gh)@qW{9xbw~GSMMKv z`i@V<>DtyeKmK#q?`t!)J;%DA-G1l&ubPj#rw{$|+R^zVhtKc*@LZ#E@RiQr$MauL zd@*VAxx1)=2^v32@d6!;b-nJ);%G$21~PVuE6 zqP&*N10t)C*NvQq4a|kS2WIJfO{A4EoKLJ(OuoA~#Ijz~@ts*a{Ysg20%zC3s=x z){i@BVhIzQI27faluBv=ZIa=_g{a;NZWEE#sYm@JW>`7HhP5CG;##nU>+JJ20a$8H zGmEh)7thN=#L37alhH}Yrs%k`6jE`T#=$~F=*S|Yxj$7CqEbY05=50CsCNrB)uqgr zO8kKt*SCX4{ODD1TE+=22vC9=kOlx$E3$+X1!>yj5=4^JhMIxxI!phC>PUk~QLllr zhOu#iZwR&ta)QXiOs?zUDiuS&D)3nnQ7Nbg5ev-NDJ>SJiN^gn!9Jnm<$}Nz=UmrD zwxT%DQV38Tf`Nfm1z6CrK;FT`G6rlNYEIX_9FT>yu3dYZ*+Z!43bAbf9YY61O6_%- z0?DA%&}GA+7j49NhiglPD64Oy&MtpnKb|h{evDKhx%uN|Ab>beO&t(kwR!<^K z(pf7AByBQk3!T^QCKb84jJDl2YLq$Mrv2KmIB=2%j%cyUs&|9t7Pq1v)WpN?W(_ew};tQkuI}6ialhz9Q9e2BDRNlqp#%I{`b;&xmX!^ z`K>cMdY{gT7xrKhbyQ*s-5hR{z{{>6@m@8{0m^Y9z7w0im7ed)G5 NJ~CN;@6hq*{|0a5ki7r^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..9babffc0429cdb23586f721d548ae334fd6df7b1 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB_Vp5048MPMmk$VFu(d zmIV0)GdMiEkp|?bdb&74Gf;HelF{r5}E+Z$t4N^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..6600db26802ed202ae0536dd122605998b551fdf GIT binary patch literal 1675 zcmbVNU5MON6iyX&tyH1)rwZydb=&%r|Ln}>vT<2wcHJpvyX=nL?Thx#&CN{MNp4KC zJF`pM2a6BBs1G8t_*j${>{FFiS@b~!6?_mB3Pn`#MPWtggNjm5<|lMz`lBJ4+$7&Q z=ljk%_slD^GtcbU{=jxY5O!3i%X4sl9Im0ETjBS$cLNV@w@1^56G6CRS9Wa^*5BSO z2)CT|tBdKP^DL%3kcrD{Ol}7epao%Uyd4p`#8Omabw9MlUqAX-M80c_3nPx|L?zbn zr`KXOzcy2)YfIE}#qp=mSQ~?bfTaYrgJziEwk>x2VpwOd6%lnH>5?r@WC78lGmA<* zW@tn%NK`X*RJ3HRpjx{5B+^x_sHjCnGbB~RY5^M->K!6Pi(L=Tm8W{K;K>#nX&PZg zX|-B%%aD0oS2WAA6jfJrT>^xZtcEFROJTC7@1e{R8v9Y|^AKeoNsTY3wg^nS5`rjq z8z#LpLBf!-5ac0}baDk`^b#@SoJ3m1~zs&z}dEZ60`_VUEJz+d@V6w6QCgISc_ksTH56ACYId|%J`L6HY zKQ?~ur`zsdIKKCbAD?^ZfO+?kmrp&s>)r?1Z^K`$f3tJ=>lcRCKi}Lueb_&_F?H$n zv74Jym*0GT=ilPSpYN59PF;HI#P`X@>!W*B z?75kBu~_S4R(3cX&TK-uYsazS=19D3dlVguB|FO=*2hW6^nHnS>4F3qMU4vyph9T_1A(CMK;Z?E0|EjGB&tmPVyQRZFwvlPZ`~LD zO0k77^bpUNN~L&7jJtlG7gSZ{0pua%D1r+rPKe8#6RdAo&`6;BmKR#C!$cNw&YcWX zEM>YR!SE`eA9MI5aGEE;Var=;+omgX$$)G+b z2(hD+J}t#k#c|6rkRS+z2ugyJbHw08Q|jP4L~L*%Az(vM1Vsc=W4-3;lTlt9>kYbI zRIq7Cipb?Uu*jJ?DZ#0xkmIm`36!CP6_{wO-|Sm-U*X~v+lh8tR1m1w3TUb-_5HAg zOw>n3i>cKB!g^HODOQh?N({C>ZLJW2%Tusqwp1Y0=ta`K1Pfdmk(( z*vS)mNb>BJOS!x%{C5sk+(-YH6h1l`muiduXW7;MEjvYN5^GcRXpV->o-7EQ z*^SyO{n}}@9X$HDUi|SyenOr-x|oA!f3F^VZS9VI+b7$9KKT5eoqTeprK(l$8-8Ns z?V+1?e)iDetB*hV=ZRAX_CCDrr#YJ)OFme+9n5t~o)V`j6?NImDZGQuSe~S_T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_passive_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_profile_passive_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..66f56ff435e5148fc3c48b19c28e38351538635b GIT binary patch literal 1503 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 Jn~xlO?qB$|S|0!a literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..5531819ef665bd054b5eb15d84500a1a4fe9dff9 GIT binary patch literal 1869 zcmb_dO^Dq@9M3AO>&o^}L8TXCsIZrf^eAYlllKwYy4%)bAjxF%o8SNc z`+v;5yt=Y9H@j z!j5jPcw}>(I8-@!K;Az(|j^n7BuIf4v2#{_>86JQr-92Hbv6Li1oCQ3Rb4J|c-K?SrPe&5MxS);F zahOEF)B%oFSkiJyLm(vuF776sp>ax7)?p!wvQ%JUfsNZd<7u03LtXs7!hi^^>lQY) z^d$@n6KS^C6EemD*%F<48!=NGEalyVu*IHmb9b&LM%9Gjj3*xFok^lrCoap?s=W7D z5K-Pw_gw~OHJq`EqHDSZw0WQ#9<-5VB4|IP=}6N?P?yud-?$2Dda#Tvh%Dy{s3;hU zGkjezCCKMVh=trB#4V=AQA?4FAfhVo@I)9E-WfwLTo=`&G{X^L^;$&{ic3L2k=-o& zI(9H%^A-Vi)AWI3YYgZ%(V*?y#4*TZeT|cDp4Z8GD%KOKW4&x?z@fwdCNUvs+FBX- z79%F6Hq>=ES$`x6L|@^~P4nd4mKOwC4pNb-jd4F5WzUR9oj@Me0Kz1%?TSM3q%x|E zr-LmbaAOKawEZ>{q}NFI2$pg`>*Itiv_!P7Q%vf1uBW(nZO0k4Ox=cMP@Xp&VA-Y# znoY|B%=Ue1*u-a06yP?F>l%V4GKxC=?~ad|NgGEkCN@b`xp^r!R)t$i`F9`vUsBY3 zXB^d*dUe?i|6R6=iX;xF#MYb-i!(ud6sHP{M3fS7X1sgqj3Le&(MJp3-fzw~>N}+S zW`2JA;-x+4ZnLwq`yl!B`Ooi~J=FO2*IOTzN`89$yCcoHSARNwV(EY<{qR-quPbU#Uwjv^v#(E0HFbdmGc$JtpUZBiCs(YjZaIiq85tNfZEegv_2k3N w_Um(h{Bc)^`OvC9twNxMNl`UqK~4@2gRDwqU!!#2d7zyPp00i_>zopr02&}mKL7v# literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04879b32b86878531ec315a9cd5557d7a9b65d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^WlI3WoBmO z07loMA8!u7_N)1)Y!vgMRXxatV-cg`45{Q~22m@Y@GI59H-Yvtc)I$ztaD0e0suEA BOZET& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..ef65774f7443f913fe2544c3f63b7e015f476925 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^We zjgqLSMGFj=LoAt@jdUkXo5mF4F;T|u_lI4=^Z##PG&(FS!M}rH@+2XKTd4{Ma;zqO Q1e(m?>FVdQ&MBb@0K4@(AOHXW literal 0 HcmV?d00001 diff --git a/public/images/ui/pokedex_summary_bg.png b/public/images/ui/pokedex_summary_bg.png index bb55127edf238bcad7fae39a8fa236e5baaa63d7..423bc7528fdd66c5c2061d52b27f486728166bc9 100644 GIT binary patch delta 725 zcmey(c8+a=O1*S|Pl&68goGv#R2N%XdU+k&J7vn0IdkS*xUl2KgAb)Cw~jL~Fun71 zaSW-5J9Bj-Z-W7k%f%jtv;;;aX66k|PdRl`{|io7VbSc-{@y&#e|_P^_t$pD`I^2I zlPu9uHNW}WnEg=7!L##T&fTz-uSWb0Q%g;gnuCYN3m{%m?{Px?1}n!;7T*aI{4Y$L z;2*%OI5$CDWr^^X9}{1)*a}?Y%u>iPX?k2IW^;36vv3Qe0@tFWOPU%Y8eC`c9ogi& z=Zxj_9~15h$uZY_+c$U5^Q+Y#YCpy8d9akX?*RuKos*lx_TR7IDyw+xhmDV#wzG=A ziSOY0rXS+KTJ98GpuU9lxA>|i_Jz6?AsXCnE4b>kOTH(>XNPUzI?JZ)!itVUz#>an zZ@12ye26iveg#*UqL#!$t%%kaay_C{U?MFyvf zQ{NrZIL7I7r=G?8R(wW-V4OyVfa0I#|BqTZ*4uBXY@73Z_lI2zIHOtb9*SV!E|KU{ zz$G+|Yu1L)3oV)lT{(m6o0x^6e942lJ~IU89BPSo`(P5yuFk_8$m5c2py|k~;v%}^ z|01THFR~Ja&W3%EVEL`jy!Q8j`};n#vPb1S_`CbVbBFFI1ML=OT`dF7hYsCbK28=F z7BNj0;M=m|fC^aH-bf}RurX3mCgUz^(ECIC8FjM`t`Xp?hbzF)_vb{x0$0|w)`A7B z?BB{CR!^7^39@1>-wMY=TorsmVGjC2W(STdB{JKnaY{c>No2mGqSG+Dg|%Svhe!r< zPVNU8tsu76hu>?=zvoy(XN`YzVV~OsoIleNg{%Sq`%UM?*l#(%lA= zI=Lfu>{ETKZ*qV`U&N$C;NQXek4`PucB*&BASs8f=S9XG~eZCbWp_PJLiwOvzS* z&NS_cdY-1g(;KhVKFGiSvx!;P?8Cp1f zBtZx)EHBBoWyOIt0(@KEF|90rc)vkxYeE>3JchQq6pIUsm^M3ETxeqcz59c$#|a&f z4Poq|R}>OiZP+=r7l?C8KS-Xqfl+R93va=s4UBn0Vh4N=G41gDq0=zCg|%P{h+QH2 pqxPC~wYc2omZNOu+I!gkFo^!vTkvtw6a@w#@O1TaS?83{1OQBENQVFb diff --git a/public/images/ui/starter_select_bg.png b/public/images/ui/starter_select_bg.png index b11cd12a5e4f7d4aae7d001323c2c89439c82154..14e90dd0f85857bcea9532a00b21be18587a05cc 100644 GIT binary patch delta 753 zcmbQr{)%maO1)fwPl&68goGv#R2N%XdU+k&J7vn0IdkS*xUl2KgAX5m{AkGAY|FsF z%SUy?LJh`of9tukDQU zHGL^2S)!wAe)G36`=OMBXXm|~yJ0C`jrbd;mYOCt2M>)G4)q=yD?Co9-(cnV$>KX< zg8zky6Z`|173U_1t1J=T@?+vl7F&T!oLLGvCQXm)#B6SEY!+@|RNz{4bV*Y~M1$*0 zz9XA__nfhu{$s*jAvxxnZ~Nx%d49F}L+z)yJr9=h_C4T$qjPd|*#7$!TxAuH{jl*- z({@(zH}M@@&foMySj(NF3)Gje{uW==#J*6sB1D7RZ3S1IcFFgI`0TI^TxZ#oU0Bgk z2v}qZ>+RNglMgYb)vw?RQ`C}Js1?!rLarx3bdA%NgB+m;IRdehWk9tL^;zxD+&;*8 z*g(MLV$w3k*>kxrH5Ib9l}vHib+&L_wovtctsgdQ0!*Rp1+stQYqoIw|L45Bep|_% z0{uN68+2ABgjsAmnEsXHILr5}dZA6Mrx$Ux6?lDkA>_xIm+Q1GAu{Bkz&Q@P)xH+W zJHlrdByvyt%6{;OBvI`wO#p_B@WOs9fMGdWP#^qnN2d%Lj*UDG8^F z1+Kh2iZ&M(v9$@vWgKLFz3~9EZdO7V2mh88jgg99>?E9k)`NM9E$mTO4%7=A0x95l zUp4!uSv0#T!x04$7gG~$MrPFo4F4CIMY8_2eN!W{heu|`?H2O`_UV^oZY1)px%un> zUvYx(EN1I7jlbd}9GqS^nP&36xzNCYlE&@*1&N%kqQ>DBY&DFYEH@r`oZDx`00f?{elF{r5}E)u Cmp2Ch delta 796 zcmaFGHkEyXO1(;ePl&68goGv#R2N%XdU+k&n~;z&Wy+K}bLL#Qu;a#q4oy(XN`YzVW2OsoIleNg{%S-~L#9+to@GcpgP zEpOVARKU!3DUfNU(ea(@Jm36X_29FF14oGLq0$faA1^BX`OW|K-_1*fhxdL^I=E>? zQ{=-NZ1b-w%Lw0D?Ri2>r&~+nkmkX~-WIAmwsPKVN)2Rnwov}D#_VCwgSgy7t-2A{ zobj}nS5^y z*k9ErGIFlvzP7}2gEKSRga9T!AU2yAz-Z^<#JXcb3zvZB3Wk|2OcOjcfK)Vt5htrc uNh^?B!S!d^;++47T2)2D&cr;F{J?r<`JTF|A^)c{0D-5gpUXO@geCx_I$&!6 diff --git a/public/images/ui/summary_bg.png b/public/images/ui/summary_bg.png index ebfe87b78b22e83e62f3d082e9a109b25fdfdeb7..4bdb6d0db2235091116f476a06b86702d712be8f 100644 GIT binary patch delta 464 zcmey%c8zUv0JkI73=v$?~ue4XeNzJi6I3h@ZTWb!G+1%pN#KhUjBKzJ+&hhB(2_6>= z6#Ew>06F}6M!gHz#Amu+FnG8?a7x1lKZE&ao8-5b796Tq5O57NIeMdGK}vq`Ek}>- zg<<7y(=47$FWB+n{_m=a=Q#)8AO5{3?Or_BE8bsCtMzugXgc1-{f=AjhMo)S?bcNf zd^5Q3wQNb)9Uv;xvhBf&0I{A4qB5epstdXUMAtZNKFAS>fkMF|nFq@js`E-L)QV_b zk|xEp_|IhyhYSRo10$Rhg_M@CcQ#%QShXO) gT{`6HEFZmuQ5NL{`P?B z^|=lfJL*18dZi@zi$yVJ;Zp}OpB+xK7i>ysad;u5BY%*i@q%iEnJ9=>UJ-BLr0|6! zYdVWEi__!>f!uCtCY*6!**+g>5j!}+iQ|Ki&_Y)M>zM@w97!Mf7y575+s?ZG&b5ua z%?=DKj^fVB9t!oA%dB1;D4P0gaj$2bay;i^-gmXOcPyhn{4SV({mkE`3+^q@-|?!c zTd!ixjtBc5H2rl7*$}^i>t4&Y2fiNM-?&2$I%aV9ait#Qh&&j$@HhK*j?jZzCel3u zqUb09EHXjtjd)d);Hsw34lcJ9TwzR#za~FqR2GYea22&A7HUPbzL4(;5MAT6WwHX3 z$YebxHlfgibx^4l2`#GJXhu4Po_Z-w$82L7A8o>4*Rg6JFZbK-wY^VwB+m<=Ub vO-0lcovJ2CSm?G&X#}`SU%4|mlP8%>V?Ru6{1-oD!M&jO0JU!!W(Dve8 zrSHGwO^e<;>uKD4W~W!(&{>_dc}?^GMg6z<*Gg?H*=~NEg@M6l6)0VEEEAUN|o@ylq*&l-CD&)6r!Gc5yri(mZdyo4{T7*dtP@Ok zP1DMrnVoz1VdR4Jl`HmmXW3tBd%XEUmF3&^b&D5t>+O26s9Ud^b zA%gSb|6i$h6^|{s=qi3*AFK{aSV^C#Ja^OnbB}28n~xXIt}VX%_)=T->g;ITJE`+`*p+bMfqY2l+yR7Bp!5PP1}FG+WC0b)3!dBp8>S1haPh2A=vDAAa$`CYxu}JwW3vmVWSfC{LU9*V4|_LCrk3GkQYZwzuLb*-NjLEpSh1l ixdBBLd0s4LWtg4+{B>mQv=cyE89ZJ6T-G@yGywp8yG8{7 delta 265 zcmV+k0rvja0i*(uB!3}LOjJbx00960|2a8IN=i~vQe$IdV{>a`l$4a5oSg9Z`2YX^ zKvn7;00002bW%=J004HA%{Tx60I*3!K~#8NypJ&sgg^*IEp5GlnaX;-6B^4cVh!{=$qgqC_jOG`LwTx;R)j}B1M+*S0Vk_w`z!oi>`kx=np=z!DwCC?vxm~z5ut<&bqzk>d3)%cke zn4EL*#-fd`$=x%~NGTrTk-qco%?-8$g%-vKX7&uOY7UW_^{@X2FZJUJKhC5srShgK zY4WBB9kK4CNgF}b)!P5{=YO9*vwu$2`Tng*l7UOFNojAr7ICoW#U#PK%F0F0BN2+h sdZyXA&R^tzarukjJ8^JhAf{zAPsvRzopr06PtHFaQ7m delta 505 zcmZ3*G@E6DPQ9h2mzP&iLPA1va`KcZQ|8Q>^Wn#jNp>@;85kHCOM?7@862M7NCUDr zdb&7)T_@4vmHmCU|8kIs@o8-4jUjMB$^J&2nn*)aDCxsfFPN)u3j@cY3kR~;5D1# zdXHKw-4jg21cv@6uiQ7^e#>;*?~8pWddjw3*;CoIGR!n`SIXAAyNu2(s`>#G$jX#a z=@oW&*>bVpEPvjjD5>^=az_Rs(T diff --git a/public/images/ui/summary_profile_ability.png b/public/images/ui/summary_profile_ability.png deleted file mode 100644 index f839a6249f8989ccb05acde563d1d217dd68cac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq&Ne7LR^7#LPElaA3r|3u*?T? z7)yfuf*Bm1-ADs+0zF+ELpWr44=!YEFc4rlXxgFOD7J#Bw@cxX^n!WDg7Umg>xI&8 z^zEKBYyH_19SXlT6nZ)R$f~#}bm+BTss{(Ro0n6>gP&JwPK#}+`xc+gEx*}OMlJ1h RMF-Gu22WQ%mvv4FO#uD>I(+~D diff --git a/public/images/ui/summary_profile_passive.png b/public/images/ui/summary_profile_passive.png deleted file mode 100644 index 1ff9ad8e09a7045f310b1b0327d39fec0d8cc2b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq&Ne7LR^7#LPElaA3r|3u*?T? z7)yfuf*Bm1-ADs+l097Wl%V`F1u zetv$Gl$4g1mYR~9oSdAgsj0fUy72h;^YinWA8x4t0007XQchC<0CtnjH~;_v)Ja4^ zRCr$O*fDCuFc`&g@11f54P83+2Bur@k);QC7)5(;U<}bEx_@Z!0Ybo@g+cEwm0f~E zHaUFXQvdP(<6*RXRqmzV+Rx!omG!+j^HI`svrJLX%_>WAmQkE#6lWR5S*EJZ)?SZ= zRrOJ;Z1rmW2Wz)>3sA8_X21ju%Ml>cU{$O%YFUAE!*GF`m4lVGdbe0(%G2bnG%^jO zh82d9`Q!C$<$tY{pJ%16?Zqv?PiM00thg221)b-$g~nTsSdzB_i8ul9(Mns6bdgKa zR`85;T#CXL^sE5V-7H#Jt057oVqvjvyIMsnN?KvIxLQ`!0_QX=0G?};u;qA{um#=) zVXINH!UNW>mJkL%GmR(XpY^WRdt-OU}W(x=IM+6ZoAn;ER^48aIS!n^+SieDVuG?%jHT9(pj zxIK7f9sjpjEEbCuOWCSfOQ)%!zx<2EVzF5IYix_fVzF3*?(_C}`@DU=o^SzQSh+Dh zEEbE!VnfBJNjjy!#bU8otaG7s14G8HxOXttdIErQyY>xJyLNA-XWAHnc8%IKYS*Y; Y0K6IYK&Lq2ng9R*07*qoM6N<$f-piHLI3~& delta 860 zcmcc4@|KCQtVy$0u3Wim*RBsg zetiD?IUyn8|NsA%mR@t_%<=LHnlfcda&oeK=Q}^3HpY@5zhDN3XE)Lq7?>V;x;TbZ z#GSc#kn6C5Kuh9zCz`=F#2YQwZ{8Oo`Pi}tLV*N1pmyoyNDd~n4 zzgD_V*fpK?o96qaVaiU+#R_fr9sB3M*6qmal-5Ogwg1mCt+@I=Ol^!vO-Z zXQuzx`o3RJf2{%vB=(R21X3OHrPpQkiF0{Rf-{9&`~<9=uXen zb&)9!&S7j*(s|FV$z05=owRD6X(F%EqX5e#2_^}GzXCf0=d&tAS8X&2JsSCdL1nKy zYst?(%d3s1p~sY*%|g;2_S7t2wfVxTQyOO%sd87W7MrGd_R{x+FZGFqNwKkuR8OZy zGR*3j>Y8|M;mbox&ig!)EsR{J-7xAh0Me*6D~m-)8G?)_2bFADdqHQBA?B@@{k_W5SMZ(TCIYzCDZ;H4i*- zbba1>EmvVprrnKu!akfkyNpGlK5*UhJl6MjoTOg*Gwz8#Xgy!5@$LlE_HvdohkN|* z!%7<-COzj1lW1vFXmIj(Jr#i)cvM@x9YDe zzx7Vdkc>Pa*va#G7V8Rbu{FFeZ(f~IUVA=>QJ#-;O+y7I}zE ed(DPJQI7NUk1o?+@e7y%7(8A5T-G@yGywpSo|M%9 diff --git a/public/images/ui/summary_tabs_2.png b/public/images/ui/summary_tabs_2.png deleted file mode 100644 index 250c3ce796009dfb129205805f0abc3993e171e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^WLq!Ry=O zboWL{MO*P6@ts>GdWhF|F4q%3?z`euTmNNcez|-i#K2reM>>k@*)qS@m#o@-K6lxl jx!KQc%hb=zb7N%)c#?6{Q2a_g&@Ki~S3j3^P6e6DA1%j)*a zMOWEw`SQv{z`XR8HHW!Lsn!H*-7jh#zfJ42QnY4Nf33>7RJ;OXk;vd$@?2>_FNLA3w? diff --git a/public/images/ui/text_images/ca/summary/summary_dexnb_label_ca.png b/public/images/ui/text_images/ca/summary/summary_dexnb_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_dexnb_label_overlay_shiny_ca.png b/public/images/ui/text_images/ca/summary/summary_dexnb_label_overlay_shiny_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0c3799a042384cf5c22a30b165e87491aaa9c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iLGm!kTLZbvo@dWsUxB}__|Nk#oknrNgisHF< z!+?CIk|4ie28Oc9XDxs{eNPw1kczluj^6qMA0FIgZj)E|^N;cH?r?62ID6iN3Z5hV m4HXA3F|=K{z<6x21jGIFMb8#x7KH<~GI+ZBxvX15y(_T^vIy;(B{8avnAiaMpjz#QT(0$Y!eGdA6u=n)zmeut1lk-r~R?X`o>F- zdrwSm&wc(bqWx(J$NuJ+JfTAq4|xA9&8l3VvZd0V@%-X!Dafg$Tw+CJ_ey z8!v3wP{L67@236#@Ph$~{~6Yt$@;mftAT4Zt3c|TU|nr39p(ee-X{Ft|IfA6_QaMA jq1rdXN_8(>h+<^0`mP_KvUSIKpj`}}u6{1-oD!M`>N3cf&b zrjj7PUG+WDefm$*bQ_{{5e?XWoAXt|RZOzxw6f{Z+gE+V{25 z+xeC}y4ze{R8#YQ-lx5fA9FKsuBrav=hv5i_kZQ@Cp#RY9{rHpcTe>A@$Xsl=FO3a z=)QCLxb>qyPv-slc=F`2M%HioRh%1L`+kcDD0F$RPCU3OG{)h`(Jf32Q+;e-dGBje Q1iFO5)78&qol`;+0Ni3={Qv*} literal 0 HcmV?d00001 diff --git a/public/images/ui/summary_moves_overlay_pp.png b/public/images/ui/text_images/ca/summary/summary_moves_overlay_pp_ca.png similarity index 100% rename from public/images/ui/summary_moves_overlay_pp.png rename to public/images/ui/text_images/ca/summary/summary_moves_overlay_pp_ca.png diff --git a/public/images/ui/text_images/ca/summary/summary_profile_ability_ca.png b/public/images/ui/text_images/ca/summary/summary_profile_ability_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9e8ac317d97a38569a3148d5098eab4b7008c8 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^W$E6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6oPWN_Xbw7OOHIv8Ti}T`pberbimYv~oOJecMrw1fmEZq(M?z~d= nHF%A>MUbD~%q8ne_kCh$Ytm-?$ocIM&^iWBS3j3^P6u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_profile_passive_ca.png b/public/images/ui/text_images/ca/summary/summary_profile_passive_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a072b663d25480604ae4295c11b872248eed64c1 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf!VDy9I}1XA6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6!FpF<#OknL|-SI?fLe78FnYNZj^LY#c zzrN|#;@qX}d?ksm)_J;A%g&N*M>j2&GtP}Ke|hKNv9g|hipy4rFMDhE>3xz|#;Prv jyS*D895hk+yO;mqEk)@^lP3xRtzz(W^>bP0l+XkKNrOj& literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_profile_profile_title_ca.png b/public/images/ui/text_images/ca/summary/summary_profile_profile_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ed0e3e169c949060a541c9c23dc8ec4a704b32 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_stats_exp_title_ca.png b/public/images/ui/text_images/ca/summary/summary_stats_exp_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ac7268b54b4d78d893f8cb3fe573397fc7dfd8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUF#0(_2F5G+t#0l^TaZN}_`2YVuggpI3!51jb zR1)MD%)n4K`K$$yx4_fIF{C0cx7U{Ikb{8Rb+ek5f}DxV{Caxd?;6#~XCIsMb5%k2LY^G|cnulcsKb0^TP44$rjF6*2UngA!+Xlwug literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_stats_expbar_title_ca.png b/public/images/ui/text_images/ca/summary/summary_stats_expbar_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..4889b64eca8c7eabfb33cb19dd3e5e538547e7bf GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A$P6S`X0(U`DYgKg5ZC|z|9|-Lqn~x7DNuy5 zB*-tA!Qt7BG$2RJ)5S5QA}+b&Ys129#>2u2HxGPR#mHc>o?SQO=$8VZ3I5+SkUI=008Js=Z@JSf(ihgL#Zo=eLQvyMRt$@O1Ta JS?83{1OW5_U#$QD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_stats_stats_title_ca.png b/public/images/ui/text_images/ca/summary/summary_stats_stats_title_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..426848af866727b303ff3acd2e512232b96c0c4c GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yb#0(_krg2;caRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwZS!<-45^4q=5S@>KiDH6a_~cIz`c`x@_pjdF)%D6buEGfqv@{odd+_1gx2p~ZFP-B0c=B^un7`@T zgcbk4uHU=2^8f4quj9jR{QtFA?nK4G30spygM%-xa$UVkEF)uW#8uWLgO;Qwfi+DG YrX3Y#zqT000DZvV>FVdQ&MBb@03eTsGynhq literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_tabs_1_ca.png b/public/images/ui/text_images/ca/summary/summary_tabs_1_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1ad63672e878ef869c2cf92bff8cd2486d3906 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^`amqe#0(^Vr=D{MQak}ZA+G=b|Cf-E&?wB*IJ|1E zkm+2YIAckWUoeBivm0qZPOPVkV@O3@GKXt}K-+(g5A3dNb3fa^N&kDj_G5kHoD)}8 zKiv3m;dSTr%lr~O=2n^7h@9#4Nt_|}%lu7x#f$$JRwoKNoVyw@!AO98jgHtd9V5{U jsWS{d-kiI6B^elwMn}K#cx_tDnm{r-UW|ND@Pa literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_tabs_2_ca.png b/public/images/ui/text_images/ca/summary/summary_tabs_2_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..bf794e82d2097bf5dd73acd727f5e70b06accd01 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d1!VDyZ>W^;#Q2{<7uK)l4mynRqD9qG2yh^h; zTl3gjwqEZ%pe$oakY6x^!?PP{K+bwk7srr_xTBK-xeht-xP0e2zl2?5oL@U&it$$m3r@Nf4Ey+y0qnSIiqel{89ZJ6T-G@yGywpAlWDd9 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/summary/summary_tabs_3_ca.png b/public/images/ui/text_images/ca/summary/summary_tabs_3_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0109997b213a6f66d5e34d112e6e3dbb7a6473 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^-ayRH!VDziR_ZSXaRPioT>t<7FCihJQJAT5Xr;#C zRa0W+)&r#&OM?7@862M7NCR>@JzX3_D&p2&Jjlsx$m0??eM7ttElT282RoRRo!U>@+qs5_*M^?u8N5342lq#kcL zWl(F(uzmGTMkCp6#cYDzZ$l*@({^I`fVC%KN2kDKLHGW{P@w>b~ykj z&QucQ7tFv=HumdKI;Vst0EOKxivR!s literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png b/public/images/ui/text_images/da/summary/summary_dexnb_label_overlay_shiny_da.png new file mode 100644 index 0000000000000000000000000000000000000000..2c66a714e0c0b9e44dc85c1aaecf3a4364da8c71 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^Aa*7TGm!jPv%U&Q@dx;Xxc>kDAIMy=AOVP8yjY>H z^il)JXD$iy3kK4^%8uLvQpTPxjv*CsZ;u!XGAIZzAB;HBz$D{PQ1Cupn3pf(W>V|M q(9e8KT1kh6WZNU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_moves_descriptions_title_da.png b/public/images/ui/text_images/da/summary/summary_moves_descriptions_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..79b16227bfe298a787406530b12d21c088bcb1b0 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD!VDxA7O*4%DgFST5Z8o+gdabC{Qv(S$N-Y7 zGS27#rI<^C{DOh>ud*ZefYcOE7srr_IN!cT-a`gFEQ_bGYDp|Gl0EQfGsB2+4but-I-Lc5= q(!^(6XO}W^CKyYnNtdp<@Q3NWnnjUIa-25MeGHzielF{r5}E)Wn_^!8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_moves_effect_title_da.png b/public/images/ui/text_images/da/summary/summary_moves_effect_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ac04e62c4b9c0861c03041e2c80c04131b2628 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^)~It5e%NL KelF{r5}E))yj)EH literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_moves_moves_title_da.png b/public/images/ui/text_images/da/summary/summary_moves_moves_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..f1732e3e2c0827b8f2ba16b129249c982203b69d GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^VL;5m#0(_m_B?nDq<8{+LR=FP68``H45Zt(n&1YTAAAl3ww<6PZfe zRaDrdcy9imv-pzkDvr>Otm{U}4+Iwn`sk=-tP=dGy3~E0zhbePu>4N3?aMAH-)2uN zI;2utd`r4@w!M+(_uQrPQ)bNmeP?6+ru7G-xVK9&go$quX#C44{yVo>QR@yT(BTZ8 Lu6{1-oD!M05SsK@UsGi zm`j5Ef`Rm}vLp9^l!2#JsE_&kaaKAkSFy{`J2!iNQZ kr7Tkgzj<7l_4zU5aTfObE|tqgfqEG{UHx3vIVCg!0FSUPegFUf literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_profile_ability_da.png b/public/images/ui/text_images/da/summary/summary_profile_ability_da.png new file mode 100644 index 0000000000000000000000000000000000000000..206b65c6cdddaccd56fed2f0320d692645cae1a5 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^5eyXA3~mfqTmY@ zXDSKu3ua&_n|#&+$aC~`aSY**P5$%$-U9=9`^T%5S-0ssYWV%)xqhgTe~DWM4f D=Hfi9 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_profile_memo_title_da.png b/public/images/ui/text_images/da/summary/summary_profile_memo_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..48886d25e3944ae0c3893668616182ea74ddbd53 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>b!VDzmJW6E&Qv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15!<%E{-7;aiRTtb(WA zZbh9oF76c*6+Zj=?z!Om@N`IC{)U8`T`ON6Te;zC!UH!4Yc_`6>IU2VCiv(~xSab_ zGVFx8hghdqjDxRfE89utBVHnpjy2pldr;vOi#^l4`0u6NsRcO&Q=b0ao)^CKT(tei X!&Vjt>h=l&UBlq%>gTe~DWM4fakX9f literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_profile_passive_da.png b/public/images/ui/text_images/da/summary/summary_profile_passive_da.png new file mode 100644 index 0000000000000000000000000000000000000000..681ae3f1b5e0ed33043de0119dc848d319405e5c GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ1x;TbZ#JQe+$a%nkqa|=*q=S*8vE!4N1$W-s2m5Ad?6a>c zP&-@ZvE(v`-0L!_m^-H){9S%UCw`K`#^jY#IF*|oJWgFYEztSCvq-1-;Rk%~?jj6d Z_s{N-{&Db><58du44$rjF6*2UngBilL-POt literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_profile_profile_title_da.png b/public/images/ui/text_images/da/summary/summary_profile_profile_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8a1d5e99c698d40925b475801eb0acec196a3 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWq&7srr_xYTovoDBv%E*BfLEgX8dS>C#0K zb_;D3t}I%vb@krtu0kL69ZVg^CExhmZvOXuRZX?%lsP{vChiH+lYIBO@8gru3Fq~F h+a-CVH_0dGX`EEtu>Q!xH$Y1mJYD@<);T3K0RTdlN-h8Z literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_stats_exp_title_da.png b/public/images/ui/text_images/da/summary/summary_stats_exp_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..feae0c9cb90d2e9a3e13b3bcce149aaf7a8a2eea GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b#0(^_rnATbDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdDWgSjv*Cs$sD}B|G)45A7A^w|Nr|ZucRCP>%k5!Sva{P)&M($*<$uMmf5$JE7Z%n0ma}Sj68|Vf6vgSVmZ4>y}d{Ml~t^(CB)V|irU)cy_%81McZ}HwW#oDpfeae MUHx3vIVCg!09u$^?f?J) literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_stats_expbar_title_da.png b/public/images/ui/text_images/da/summary/summary_stats_expbar_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..566dd844aa621d404ac3affbc2aef1c755c63709 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A#0(_go%nYYNO1=Egt-3y|Np~}A3)SK>HBS< zAX7<@UoZnh+2pepK%TUxi(^PdTyn(5Bv$9cJ#1~FvfL6<(->aPlx2u)<2V=mqpl06 OjKR~@&t;ucLK6UMJ|=De literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_stats_item_title_da.png b/public/images/ui/text_images/da/summary/summary_stats_item_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbce6c3dcfc15dc6256dfcd2fda418474df0d03 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMo#0(@&cm#cb6i`>N3cf&b zrjj7PUFR(X)ztha3dl9=;M?eW9AcrQeBTq2q)C1{U`P34*t^ zuS_see!+Vy_`&j|GadW4IhNe0{bam;#j49m9HpDD8AfbY+flQnf7YzUO-2?UCp1YW zyfMzv;d?xp^{|P)DCPJMp&Nt!XlQ aU+_16_0MJ4%FhmT6oaR$pUXO@geCwde_7}N literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/summary/summary_stats_stats_title_da.png b/public/images/ui/text_images/da/summary/summary_stats_stats_title_da.png new file mode 100644 index 0000000000000000000000000000000000000000..ff97416c7ed4d40694e981613f0693ca9f82e93b GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^=0MEB#0(@AX7;ZIQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc^6ETY978JNk~`}E)cvx`?m<+bm$bU>fkzQ9<+6WEQfB3zu~0C6-|Fs%tK9rq{2GI4P#EB<^iO{a0VUws^v2oN-KXS>U&vIOWK%O`C+j{5z8E zq$tw2oynzeoBY|or!M-hi2m@U_wft>IQUZv+Od;F&M%GJI9ug{O{R?m1G VUF|pLzYoyi44$rjF6*2UngIIDa1a0h literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_dexnb_label_de.png b/public/images/ui/text_images/de/summary/summary_dexnb_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ef081f493f3fec8a6b9f06500e85053c5109f6be GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`@dWsUxc>kDKLHGW{P@w>b~ykj z&QucQ7tFv=HumdKI;Vst0EOKxivR!s literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png b/public/images/ui/text_images/de/summary/summary_dexnb_label_overlay_shiny_de.png new file mode 100644 index 0000000000000000000000000000000000000000..2c66a714e0c0b9e44dc85c1aaecf3a4364da8c71 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^Aa*7TGm!jPv%U&Q@dx;Xxc>kDAIMy=AOVP8yjY>H z^il)JXD$iy3kK4^%8uLvQpTPxjv*CsZ;u!XGAIZzAB;HBz$D{PQ1Cupn3pf(W>V|M q(9e8KT1kh6WZNU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_moves_descriptions_title_de.png b/public/images/ui/text_images/de/summary/summary_moves_descriptions_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4827c081d53e533ccf57438b73f22a19b8a43a GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^Ak4wS3?yfWZ?yzc`~f~8t_cYVKYsl9|NlRb0VG#t zoY4VFF_#4S1q10{Wk>D-sX3l5jv*CszI}{bhYfg`_kLrRzRlcqn|+3cyu_#f_f0G_ z6Wk=cJ7Ugc8!1no&(kTrT$amfYK-J&&j|-^O!epPJ2G?aq}?yQ`1bX*?ee{r@~qjk z%{8B?bmJM8rQ+p_?|xbL@1uMF_HU0pSFlAc_q8hj6jh@A>$|JhuIdw3{8sPz=fsq7 y+!79Yy8DH*_QiR=3Jh;JIN36N=VWX;RUfz1-m+uSDt(|k89ZJ6T-G@yGywo(m1Vd9 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_moves_effect_title_de.png b/public/images/ui/text_images/de/summary/summary_moves_effect_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..951e92818397e4ae618c7e34224f5487d65649ca GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^ra;WW#0(@=a^fcdDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJc?F&>jv*Cs$sD}A`S<_-p6^=vyYEyzPr|!bS67$s%e$YxcNgQ4 zT(+jW-M7o%=P?!EzCC;S`|P~?Uw4bHsrdfoS^e(Wx69wmd82rR+Rz5YHdjM!RgQu&X%Q~loCIGXZ BS`z>O literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_moves_moves_title_de.png b/public/images/ui/text_images/de/summary/summary_moves_moves_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e28d3dfe7ebb8640dfa880dc37e098d2fe9606 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b#0(^_rnATbDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdBvVCjv*Csx@Q!*8Vp1l9!lzPZ=PX0`Jkf2v%ns+^B)XO9y<3$ z#O20=$o53574i@(K%Wv);J+!@E-X zkUsOND%0M+UaYHWZu;Zv#TV<|{x6?n+)&B5mQk+rj(hRM%u9QK)-!mz`njxgN@xNA D-lAmuG8AZicv18zn=L~V^MjAsTzTuA1SF0WwLUu0 zaq;zzQzF|MdopxaIUA-Ne!uU@)5iO~|H9eps^`G6qjqKbLh*2~7aawO`}_ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_profile_memo_title_de.png b/public/images/ui/text_images/de/summary/summary_profile_memo_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..089668218faa27e9ff599ccc5c85959ed1b783ca GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>b!VDzmJW6E&Qv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15)jtE{-7;ak>2$IS(5MIP0HdTgWW3oms{*U*WBNu&VSV zhOK8GbKdJ;{Ck4J=c7{=B%Xa6p;b3iTjz(Lh<|6UwZ)pr5sAm8Wvj$IOho;7jsLYW zr<~%L@WJYD@<);T3K0RWL-T`~Xw literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_profile_passive_de.png b/public/images/ui/text_images/de/summary/summary_profile_passive_de.png new file mode 100644 index 0000000000000000000000000000000000000000..681ae3f1b5e0ed33043de0119dc848d319405e5c GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ1x;TbZ#JQe+$a%nkqa|=*q=S*8vE!4N1$W-s2m5Ad?6a>c zP&-@ZvE(v`-0L!_m^-H){9S%UCw`K`#^jY#IF*|oJWgFYEztSCvq-1-;Rk%~?jj6d Z_s{N-{&Db><58du44$rjF6*2UngBilL-POt literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_profile_profile_title_de.png b/public/images/ui/text_images/de/summary/summary_profile_profile_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8a1d5e99c698d40925b475801eb0acec196a3 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^dO*yuN`2_>%Uu8$`0jWq&7srr_xYTovoDBv%E*BfLEgX8dS>C#0K zb_;D3t}I%vb@krtu0kL69ZVg^CExhmZvOXuRZX?%lsP{vChiH+lYIBO@8gru3Fq~F h+a-CVH_0dGX`EEtu>Q!xH$Y1mJYD@<);T3K0RTdlN-h8Z literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_stats_exp_title_de.png b/public/images/ui/text_images/de/summary/summary_stats_exp_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..fa702b4c223ac628a44ad8a6d1a37e42dbdfc281 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMo#0(@&cm#cb6i`>N3cf&b zrjj7PUFR*C%#|K^2n9dtYVR<;lE1d++VjqkDAjdl@d}b@6b0_sFQ($CyQ;YUw)bOl_CK zcbyrQQkzmWE6NH(-ak( Lu6{1-oD!MHBS< zAX7<@UoZnh+2pepK%TUxi(^PdTyn(5Bv$9cJ#1~FvfL6<(->aPlx2u)<2V=mqpl06 OjKR~@&t;ucLK6UMJ|=De literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_stats_item_title_de.png b/public/images/ui/text_images/de/summary/summary_stats_item_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..42e08b3e52ab951e4b91a20c99ab0efafe20c7f4 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj!#0(_A*@T_|Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@*+H4978JNk~w&L|9}7gcYpi&dWM;S>#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_stats_stats_title_de.png b/public/images/ui/text_images/de/summary/summary_stats_stats_title_de.png new file mode 100644 index 0000000000000000000000000000000000000000..87438a5bd4ffc7d3d9430b0f6440a4ec9e3ca6ce GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^szA)a#0(^v58bN(Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@*+K5978JNk~`}E)cPU>-vEQTOF7=c8IM> aVqnNHQEyxGH8BBb34^DrpUXO@geCwqV?dz* literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_tabs_1_de.png b/public/images/ui/text_images/de/summary/summary_tabs_1_de.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3e6c795b4b767f55dcea3c4d937c58f9283678 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^aX>7<#0(@Ky;FDyq<8{+LR|m<|1TjSp;4Hrad_2S zA=9})amJD$zhDN3XE)M-oGG3zjv*CsYcJ^XF&PT5K9DOsd-`e1 pAMcF!bEv-bqM>;@(JiZ22WQ%mvv4FO#lUjT;Koz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_tabs_2_de.png b/public/images/ui/text_images/de/summary/summary_tabs_2_de.png new file mode 100644 index 0000000000000000000000000000000000000000..750c407b075ff46befde77f6d52c2f01b7a3499a GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^W%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/summary/summary_tabs_3_de.png b/public/images/ui/text_images/de/summary/summary_tabs_3_de.png new file mode 100644 index 0000000000000000000000000000000000000000..297df98c111899d2ff2322110cb901836fe563ba GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^Za^%+#0(^_O@H_oNbv;tgt-3y|6f8vLZdKK9wSoI>_y6esrSUh;-?;N* z{nDil3r}2my)gW+^ZNGV$MSl4*Xqs{J21gYR7*sv+|+E#Dw9&C!&@%=S6KM};lhu> zkJnF|?xx1jny@Nq{;{@cxvX3VO^+Q512XGavsxtiw-}10JT}RBr*yx61_Q%(*Y@R+ Twv+vUPGRtL^>bP0l+XkKZkD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_moves_descriptions_title.png b/public/images/ui/text_images/en/summary/summary_moves_descriptions_title.png new file mode 100644 index 0000000000000000000000000000000000000000..e83e8cafbfcc09a3761b9d915f3c0f0205109579 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD!VDxA7O*4%DgFST5Z8o+gdabC{Qv(S$N-Y7 zGS27#rI<^C{DOh>ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_moves_overlay_pp.png b/public/images/ui/text_images/en/summary/summary_moves_overlay_pp.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_profile_ability.png b/public/images/ui/text_images/en/summary/summary_profile_ability.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_profile_memo_title.png b/public/images/ui/text_images/en/summary/summary_profile_memo_title.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_profile_profile_title.png b/public/images/ui/text_images/en/summary/summary_profile_profile_title.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_stats_stats_title.png b/public/images/ui/text_images/en/summary/summary_stats_stats_title.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_tabs_2.png b/public/images/ui/text_images/en/summary/summary_tabs_2.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/summary/summary_tabs_3.png b/public/images/ui/text_images/en/summary/summary_tabs_3.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_dexnb_label_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_dexnb_label_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_dexnb_label_overlay_shiny_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_dexnb_label_overlay_shiny_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0c3799a042384cf5c22a30b165e87491aaa9c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iLGm!kTLZbvo@dWsUxB}__|Nk#oknrNgisHF< z!+?CIk|4ie28Oc9XDxs{eNPw1kczluj^6qMA0FIgZj)E|^N;cH?r?62ID6iN3Z5hV m4HXA3F|=K{z<6x21jGIFMb8#x7KH<~GI+ZBxvX9=eqPDgFST5Z8o+gdabC{Qv(S$N-Y7 zGS27#rI<^C{DOh>ud*ZefYdZk7srr_xZeJYoQDkrob}H#@xEo~yv^8mid!V}|4gkS zlV$NMb&ojP81$8u&3kEe-NHmu_1;v!!qVP78%&y5?o53w_TuYRsheSX2OD-4t}T;L zX;(`PH%b!Uc8O=s2|E*|e1+w!S+d_PJZs;-PyEu$%*KLzHvQw`Djsi|4zr)lNnCr( rnOW#SPlPP4rCTolSy{`#aNUp3WKFdx(1i@1u6{1-oD!M7F&@YjO~1P0a54$X3k2=d7`0qeOqx#*LqOq_sDx zC1>kA&@!H7TG;9At>d7uE&ks8?OI%iKD8`-A7oGXNR|Ogi?{3$+bxyZ&TRD@$3OUCwTenEeGe0$9Q!fjreAF7t{r~qn&N^Mb nDRlFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_profile_ability_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_profile_ability_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..71bffe95cfe435a20c5e9a7bf68b33d52dac7664 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^W$E6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6{qTSD+f-A(MMwCP ij<|+;NLAfWIbv=rs5>X=QOXXWT@0SCelF{r5}E)ZuSSso literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_profile_memo_title_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_profile_memo_title_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ef7c91fc5b6b2c59d6cf5510c02ec3cec0940c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^AwbN*!VDy*avrS%Qv3lvA+8At3IG592a+Ft`~Wht z|8IQ`lwv9g@(X5QD4TrN0?6z1ba4!+h^w7&k(1ew$9d}P2Q_aQI#00Ob*T71Q!9DL z>u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_profile_passive_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_profile_passive_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..a50e3cacf580d1ed549af7117013779fdb86ae85 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@kv%x;TbZ#F_S76l8Mbar&Id{N`rEa@H6XQI5aYpQ!aQ%jYL3 zym|fX_0ug&m+~rR*+lU!3{G}uN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_stats_exp_title_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_stats_exp_title_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8a80f06273c360a64bcf298e1cb706deee6502 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD#0(_$3_czLQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@+Nt@IEGZj$@UuZ9Wvl?J$y@1=gd3aswu0ScN@%TE@+oy)LQmH z(O78uLXXg;Ax5iDP7wH<`ZC)8{=YN{zs!Fg*E~OKRZcxLVctFVc$Y(2r*@@n>DGNU zV|7xMwwOV@z^nJi*mSbaCCVN)Wx8{}=0I)GwfXMbxA5ou7FXW(@4j@!^qm*)>84$) kcb|1aAk@X=ZcJp|`~{(bi|uDh0A0u6>FVdQ&MBb@0Md2u2HxGPR#mHc>o?SQO=$8VZ3I7Lri*KT&%iU~BbPJq4zws|g#j#5;C3FLc^n*DpIOEKiJDl2{dY9AP{y->stDxz`!!KL$@%KbLh*2~7aR C+K%)9 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_tabs_1_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_tabs_1_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..99f187c396ff13a95bcf5c2fb24905efa82f2ef4 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Wgvm%B=@VF_r}R1v5B2yO9RuWO}+dhE&9Dy%5NC$UvawVa!AM?@Y{bDXH)3)s}7) zn|N&bId3L;>l`DC^Cv39itBY93svvPhy1Zx7HJ~l>v+BFwX~RXh17jD8y%0uGn!J& z*PNC5Q6g7X@-1KeTJ`zN-}A10s-6Dlxsv~}c)g$V3|lV)EoJa@^>bP0l+XkK|H(_m literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_tabs_2_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_tabs_2_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..c841de2c12c602084c7404c1ad1a19b4bacf889e GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^X+SK%!VDzEy2N{dlu&?Ai0l9V|0RGxQc|NZQ{&J| zjl-+g>U@vItzw>Xk zhqFd#)ugxx8d{p|8-jQ&-v+Xe_IC%C|M|y8q?C;u#LV zzkkV_|D8ojgCm@ylX)pi) literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/summary/summary_tabs_3_es-ES.png b/public/images/ui/text_images/es-ES/summary/summary_tabs_3_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..805fec323ddb2670eaba25f14b04be2617f68d00 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^VL;5!!VDyPeyaWkaRPioT>t<7FCihJQJAT5Xr;#C zRa0W+)&r#&OM?7@862M7NCR@ZJzX3_D&n?YI>>uOfrrH*D&oFbf{XH;JN3TXB~moM zd&wC}KRIrrGg<8W>W6i<+pkE*`zU>RI+s^jC&u!cZ&}*|uFdgsQ~ou~;1bJbn=ZR} z&9CI@$f+@tr<+b&`czh-|E}>4+3uFT&7}^~x1Bt*KWv&K-o2voJI|-B?4S4Bo|tE= i^X*#no^SRxE9Bc`U5;(}ps*e2ECx?kKbLh*2~7Zvqg+7% literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_dexnb_label_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_dexnb_label_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_dexnb_label_overlay_shiny_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_dexnb_label_overlay_shiny_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0c3799a042384cf5c22a30b165e87491aaa9c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iLGm!kTLZbvo@dWsUxB}__|Nk#oknrNgisHF< z!+?CIk|4ie28Oc9XDxs{eNPw1kczluj^6qMA0FIgZj)E|^N;cH?r?62ID6iN3Z5hV m4HXA3F|=K{z<6x21jGIFMb8#x7KH<~GI+ZBxvX9=eqPDgFST5Z8o+gdabC{Qv(S$N-Y7 zGS27#rI<^C{DOh>ud*ZefYdZk7srr_xZeJYoQDkrob}H#@xEo~yv^8mid!V}|4gkS zlV$NMb&ojP81$8u&3kEe-NHmu_1;v!!qVP78%&y5?o53w_TuYRsheSX2OD-4t}T;L zX;(`PH%b!Uc8O=s2|E*|e1+w!S+d_PJZs;-PyEu$%*KLzHvQw`Djsi|4zr)lNnCr( rnOW#SPlPP4rCTolSy{`#aNUp3WKFdx(1i@1u6{1-oD!M7F&@YjO~1P0a54$X3k2=d7`0qeOqx#*LqOq_sDx zC1>kA&@!H7TG;9At>d7uE&ks8?OI%iKD8`-A7oGXNR|Ogi?{3$+bxyZ&TRD@$3OUCwTenEeGe0$9Q!fjreAF7t{r~qn&N^Mb nDRlFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_profile_ability_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_profile_ability_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..71bffe95cfe435a20c5e9a7bf68b33d52dac7664 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^W$E6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6{qTSD+f-A(MMwCP ij<|+;NLAfWIbv=rs5>X=QOXXWT@0SCelF{r5}E)ZuSSso literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_profile_memo_title_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_profile_memo_title_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ef7c91fc5b6b2c59d6cf5510c02ec3cec0940c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^AwbN*!VDy*avrS%Qv3lvA+8At3IG592a+Ft`~Wht z|8IQ`lwv9g@(X5QD4TrN0?6z1ba4!+h^w7&k(1ew$9d}P2Q_aQI#00Ob*T71Q!9DL z>u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_profile_passive_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_profile_passive_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..a50e3cacf580d1ed549af7117013779fdb86ae85 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@kv%x;TbZ#F_S76l8Mbar&Id{N`rEa@H6XQI5aYpQ!aQ%jYL3 zym|fX_0ug&m+~rR*+lU!3{G}uN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_stats_exp_title_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_stats_exp_title_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8a80f06273c360a64bcf298e1cb706deee6502 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD#0(_$3_czLQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@+Nt@IEGZj$@UuZ9Wvl?J$y@1=gd3aswu0ScN@%TE@+oy)LQmH z(O78uLXXg;Ax5iDP7wH<`ZC)8{=YN{zs!Fg*E~OKRZcxLVctFVc$Y(2r*@@n>DGNU zV|7xMwwOV@z^nJi*mSbaCCVN)Wx8{}=0I)GwfXMbxA5ou7FXW(@4j@!^qm*)>84$) kcb|1aAk@X=ZcJp|`~{(bi|uDh0A0u6>FVdQ&MBb@0Md2u2HxGPR#mHc>o?SQO=$8VZ3I7Lri*KT&%iU~BbPJq4zws|g#j#5;C3FLc^n*DpIOEKiJDl2{dY9AP{y->stDxz`!!KL$@%KbLh*2~7aR C+K%)9 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_tabs_1_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_tabs_1_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..99f187c396ff13a95bcf5c2fb24905efa82f2ef4 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Wgvm%B=@VF_r}R1v5B2yO9RuWO}+dhE&9Dy%5NC$UvawVa!AM?@Y{bDXH)3)s}7) zn|N&bId3L;>l`DC^Cv39itBY93svvPhy1Zx7HJ~l>v+BFwX~RXh17jD8y%0uGn!J& z*PNC5Q6g7X@-1KeTJ`zN-}A10s-6Dlxsv~}c)g$V3|lV)EoJa@^>bP0l+XkK|H(_m literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_tabs_2_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_tabs_2_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..c841de2c12c602084c7404c1ad1a19b4bacf889e GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^X+SK%!VDzEy2N{dlu&?Ai0l9V|0RGxQc|NZQ{&J| zjl-+g>U@vItzw>Xk zhqFd#)ugxx8d{p|8-jQ&-v+Xe_IC%C|M|y8q?C;u#LV zzkkV_|D8ojgCm@ylX)pi) literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/summary/summary_tabs_3_es-MX.png b/public/images/ui/text_images/es-MX/summary/summary_tabs_3_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..805fec323ddb2670eaba25f14b04be2617f68d00 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^VL;5!!VDyPeyaWkaRPioT>t<7FCihJQJAT5Xr;#C zRa0W+)&r#&OM?7@862M7NCR@ZJzX3_D&n?YI>>uOfrrH*D&oFbf{XH;JN3TXB~moM zd&wC}KRIrrGg<8W>W6i<+pkE*`zU>RI+s^jC&u!cZ&}*|uFdgsQ~ou~;1bJbn=ZR} z&9CI@$f+@tr<+b&`czh-|E}>4+3uFT&7}^~x1Bt*KWv&K-o2voJI|-B?4S4Bo|tE= i^X*#no^SRxE9Bc`U5;(}ps*e2ECx?kKbLh*2~7Zvqg+7% literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_dexnb_label_fr.png b/public/images/ui/text_images/fr/summary/summary_dexnb_label_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png b/public/images/ui/text_images/fr/summary/summary_dexnb_label_overlay_shiny_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0c3799a042384cf5c22a30b165e87491aaa9c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iLGm!kTLZbvo@dWsUxB}__|Nk#oknrNgisHF< z!+?CIk|4ie28Oc9XDxs{eNPw1kczluj^6qMA0FIgZj)E|^N;cH?r?62ID6iN3Z5hV m4HXA3F|=K{z<6x21jGIFMb8#x7KH<~GI+ZBxvXud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjmdKI;Vst06>yRlK=n! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_moves_moves_title_fr.png b/public/images/ui/text_images/fr/summary/summary_moves_moves_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd7d72c3071b472398528df32a2998f7062a603 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMq#0(_Y&kc?OQk(%kA+G=b|4&Fr0Fqbu8KQxL zj3q&S!3+-1ZlnP@rJgR1Ar*10rwzFd2XGuul=fH=ep2%mpRCp1hWv`{lbRTfUkCW# zd^K%lJ>gYlDT|$8Ap(XPNIhA;D>^z3CjsnFvLZC;iJsk30-i z`0f=j#l>)PwpsUPruTAZHvZ<hSls_GYzzeZ@B6RXP8Ud$tu(iFfxj@62p3Yi=zy zj;Of%e_v_B!@uYMy|n)q&M5k<`s#6Zp?}-6U%py*cXb0##|LJ+4Iiwyzde(^#_Pbw z93k;y(qHe_@#XLTf6f2<`ah7>9O7QMHtOiotFyMQ$i3PX8q*zCs++~kmCVd%(ZYCf XR^3C#t)4PKKQMT@`njxgN@xNAH1UC+ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_profile_passive_fr.png b/public/images/ui/text_images/fr/summary/summary_profile_passive_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d2c98a21c10d38cd64160d9354cba460ec6b5d GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@iZ2x;TbZ#F?JC$lIVG(EPBvpz#r#AHz!S8N2_ce`0T~<9{;A zY}K!gp{h!AZ;QKYO+Rqd|CfJxX+c7}?qz%1&K;XgBPvYRnsi0EF4lT}a?;bw%+FTt YtvV$gJ9o|&L!bo=p00i_>zopr04g~|PXGV_ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_profile_profile_title_fr.png b/public/images/ui/text_images/fr/summary/summary_profile_profile_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..bccba2d87df0c5513bfc60bfeb0944bba564fd77 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^dO*y<#0(^VE2;JaDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdC8tGjv*Cs$sD}B|3B{kd;I_R|8fQlmW8k5_C|ltx~k35{{Eo# zzU4gp3UhWWfB)p4xn0czhD)Dc|F_y1zLsCU$)Zp@?)y<&f!a?ZXA*0^{JPHkv;Mz4 mgJmEOx7gZ<16#AMGBLE>GY@3^_P-Qp9fPNtO^Sm_S)@RUgIF};hpUDV73Xzbe%JCk>qmc_afDKQCqVPE)recV7924LC1-qY+Y`2V3gl;pko<4UHx3vIVCg!09Z$H AjQ{`u literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_stats_expbar_title_fr.png b/public/images/ui/text_images/fr/summary/summary_stats_expbar_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..4889b64eca8c7eabfb33cb19dd3e5e538547e7bf GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A$P6S`X0(U`DYgKg5ZC|z|9|-Lqn~x7DNuy5 zB*-tA!Qt7BG$2RJ)5S5QA}+b&Ys129#>2u2HxGPR#mHc>o?SQO=$8VZ3I+N?c6r_1=8n?Zqz7wk@fRftiOX-dz@)4H=J Z@$Wt=lX5;Y;5X0`22WQ%mvv4FO#qwbJb3^B literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_stats_stats_title_fr.png b/public/images/ui/text_images/fr/summary/summary_stats_stats_title_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..63fe6a694af0f1f52e4c127f54c4002be2026842 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5ZC|z|0g6QK*;?5BR7HK zOeH~n!3+##lh0ZJdG4Mrjv*CsvWGTuHaPIKUEIIzBv<%p_Ur8KMNIBO-3hhA7TyP> z4?cLDx%2$;wqL)!6;J6^2J}r(ecifL>dO*Ec@gR literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_tabs_1_fr.png b/public/images/ui/text_images/fr/summary/summary_tabs_1_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..dd918e773e9fff7cf110a6ab98314266a820ef9c GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^mOw1P#0(@aUbTM#q<8{+LR|m<|1TjSp;?@*d2DS; zSQ!&goUtUxFPOpM*^M+Hr_9sEF{C1H>N#Jo1_c4ug#Kr$ZWA+JZi?a6eJxZqPtTCU z@id=cf|(S{&ew14p0%q#5Z3&po^8EePEKRhzL2UnUA?{Uw;2UR$X~rF>v7XsehJ5f zlKae;{5;AM^Q}J4vE6)nAKQV>UV&5ltL!($8f<#|d3XI}>08Rh1;;_!@plkDl@7*Y|J%;DO=(Dt9>1EVY3+|Bx5vNAF>X9&-%l07w3 z?7#%8uUS8?|5;hTc>XfKgc)o>VO3jA%uI|JPjIpqFPhI}xiYx1>eTvaZPS>hx-NUi peRo#5srj#$CLz@wrP4+W42Nz<`B=-=d;?m?;OXk;vd$@?2>?SOLqq@o literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/summary/summary_tabs_3_fr.png b/public/images/ui/text_images/fr/summary/summary_tabs_3_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c353084a363dd75957625271cb6abbf95db09a GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^9zZO>#0(@)#9j0QQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@p)9C5q7*Y{8_q-xslOYf5gV;^kQkNEF&5R0Y34XJmbKCZc zo1Ar>E(;bIFey5JJaT0E^<~~Bs&|+D$*2uJrclo)d}{KMU%S6BY)s+(xhvAU_?h>f z$V*NMSEDY@3}B41YgwRdb0X?_^R>Sjg2xxkc>cNU?!lRU8@+SxEd9Ll*KzshcNkeU W+K-qq641=eupUXO@geCyVky^I^ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_dexnb_label_it.png b/public/images/ui/text_images/it/summary/summary_dexnb_label_it.png new file mode 100644 index 0000000000000000000000000000000000000000..5477e3385a8c5fe552c6e601a21330829e7e4f13 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wLa1o(uw{{R0!AtB+%j~@)FqPu{C zj3q&S!3+-1ZlnP@8lEnWAr*0=hc|LEC!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png b/public/images/ui/text_images/it/summary/summary_dexnb_label_overlay_shiny_it.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0c3799a042384cf5c22a30b165e87491aaa9c GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iLGm!kTLZbvo@dWsUxB}__|Nk#oknrNgisHF< z!+?CIk|4ie28Oc9XDxs{eNPw1kczluj^6qMA0FIgZj)E|^N;cH?r?62ID6iN3Z5hV m4HXA3F|=K{z<6x21jGIFMb8#x7KH<~GI+ZBxvXud*ZefK-pCi(^PdoNs?4=V1dLma9vcO|~#E$zv1PBd+oN_xTX+ z=9MK9^Xvus!jhMtJ#ATV@JZ38L}ODHp(G_0!|R-vu4G*B>r-%9YW$8Xi!n;)?74R; zOheAfE~vgCb!+Jisp`=G?)%w!s?7Y1UgZje`ktNUyPd6OgL=rH-z%p~ hDtqd%&{X>$!zM1vyo}p|d_Z?Gc)I$ztaD0e0ssfqT6zEg literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_moves_effect_title_it.png b/public/images/ui/text_images/it/summary/summary_moves_effect_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..99f9dfeb2c3524d7d4065580057020a32b9577aa GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^ra;WW#0(@=a^fcdDV_kI5ZC|z|0g6QK*;?5BR7HK zOeH~n!3+##lh0ZJd1;<5jv*Cs$v{<6U$bN-)<(W%c=WIS|NH;d3LoF!XB7CJm3QOn zoeOt1WM4mU=W68auTQDgl6}yyZrU4 pg5Kx<`wxb{{eR6W{_lGRhMS))U7j*dxCFG3!PC{xWt~$(697PhRFVJy literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_moves_moves_title_it.png b/public/images/ui/text_images/it/summary/summary_moves_moves_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..e56e3f4b336035860bb145fa9ff756ab27a3a8db GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj!#0(_A*@T_|Qak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@6zJK`I|M#!GgU`P9^Vd@MMl)Xf_9geu)pEszXaBD5|F)ierohpqSGPE=&K6~O YrlWH-WX0jVK=Tz>% literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_moves_overlay_pp_it.png b/public/images/ui/text_images/it/summary/summary_moves_overlay_pp_it.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_profile_ability_it.png b/public/images/ui/text_images/it/summary/summary_profile_ability_it.png new file mode 100644 index 0000000000000000000000000000000000000000..bb915da37eef4529c0ab57bd1b7d7a9ef6eec1a4 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRh!VDyzNf8uC$S)X3|0+9j4@f0>x;TbZ#O3xJ7~baC2m&iam%aERgmM2;r&v( lsfu&b)cgmYE_aHy*T3-5o&O>A-&de*44$rjF6*2UngEDYM`>N3cf&b zrjj7PUFR-CjdJCPfh!OGftxK4N*v2jyI)lb44psHthQrvH+- z$TDf6s~IEX+@!AQC#B7Ni&rgAN#6KAL_f7Y!$XRHv(tKmeXUlH_+)M{%!y)~#CPa; ze|y2S8293JZUXOE0`o(TXK|)yZrnQI;g3H%Z)iXHC-F&n+QVChrLj}4{SS-RR!shT TfID6u=pF`7S3j3^P6$owG; zD8yV6!FpF<#OknL|-SI?fLe78FnYNZj^LY#c zzrN|#;@qX}d?ksm)_J;A%g&N*M>j2&GtP}Ke|hKNv9g|hipy4rFMDhE>3xz|#;Prv jyS*D895hk+yO;mqEk)@^lP3xRtzz(W^>bP0l+XkKNrOj& literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_profile_profile_title_it.png b/public/images/ui/text_images/it/summary/summary_profile_profile_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..169b0a7b8e7887c05d286899c7f49e8687751b33 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15(MJE{-7;ak1wvayA$UFkf&EFKDQ;I^ej=ao2wzwXFK8 z7Ud5QZh4%SSSoWbWX5ybSISMs42qY2X})YJ^EL}!vt+Y15yp1E{-7;alZYHyoVKdSk`Xv@RB_6%GmMz@ADznoGU(9 z$)32>{549j=fjE(9PHo!+BUcBP@1>)14~Exvgo5bZd!UDXfp_#e!jpeaLH$_nVO|B zvH!#by*!`!aP=y7--vy_z1gPq<;~Ef50)3-CADo(ZawyY|F>!t)17C6N)kOkvM2PJ ViLBW3o)73222WQ%mvv4FO#uIbUWEVv literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_stats_expbar_title_it.png b/public/images/ui/text_images/it/summary/summary_stats_expbar_title_it.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cd930c1c2f3d68b12ca7d3b9087a6f95c890ba GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A#0(_go%nYYNO1=Egt-3y|Np~}A3)SK>HBS< zAX7<@UoZnh+2pepK%SVVi(^PdTyn(5B39?aSNJ$&Z!#>AW{BL!u`ABS@HtQggQu&X J%Q~loCIGnOB`>N3cf&b zrjj7PUFR(X)nJOpZLP7q;F=>#AtJ5&b66rRA#AnMR#wGDfaB zYp<=AD44Bj^wyv?S%^tquI8V?`RTX3MUUpi*RdTb3!3()XU?X>f($ODtgR1|3)Xh1 zoU+y1QD|ZOc9zByi;FJ`l#fi;SjWELSssH!*|L^*LoB#8sYhy!84?Fbhg|sw=#HQzhcFj6$$yjj^7JNJou;nKXcm(S<$cdT8E^= z{qxss;E3Cs&FGxz>Uy=W>%+;1m!q|HSI;hIGkCIp#fl9pHvIpZU-kR{*Y&d-%PMs* oFfgqZT|Hw~SgCGS^j0PYg<`J~t)wn>Hbo z9_4(KtJBNW*|}nB_`W->{R@nOWKyq%KjvPun}KsmT7d5y#yGCG5(^LC(_vGvb zG>b}OSarVOj)MP$1Y^NRE}5^LS{KgLXxe{2@zUo{=i}#DGOlQ^)=gdOcpB&e22WQ% Jmvv4FO#s=UO+5er literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_tabs_2_it.png b/public/images/ui/text_images/it/summary/summary_tabs_2_it.png new file mode 100644 index 0000000000000000000000000000000000000000..07c73fbdb906538e7e8a8aea73fffef063089be9 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^VL&Xv#0(@qS|*4BDV_kI5ZC|z|4T?nXcT5@99}h7 z$aF4HoUtUxFPOpM*^M+Hr`OZPF{C1H=>sh=k15p4?cHB5xOYe-m@m%R|>ry-xTw@yc>aI>md}g~_6rmr=J0j_9me44>gTe~DWM4f%tBy= literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/summary/summary_tabs_3_it.png b/public/images/ui/text_images/it/summary/summary_tabs_3_it.png new file mode 100644 index 0000000000000000000000000000000000000000..57e8b176be127291595a8897ac568a50fb18d836 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^W~%!gX|`eK6yDhLgq%M`^1jT7CSJ( z%Jg0Cm&<=v{ytRKw#+YKhM1JK`L-=4U$QE4GE$g2q@|;|rttpfezeT5x3`zov#q^J p#C_SZV~4)@Id7kCV!oJ(;Xy{yFCG2sOhD@xJYD@<);T3K0RYk>LQwz! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_dexnb_label_ja.png b/public/images/ui/text_images/ja/summary/summary_dexnb_label_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_moves_descriptions_title_ja.png b/public/images/ui/text_images/ja/summary/summary_moves_descriptions_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..d844e8442442e08a97d26f0584fa28bf46b4b892 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq&Ne7LR|m<|6h=i@Z-l1DrEQwnt-IEiU zCY%)$J77@!%*SB%$;*w2XgTe~DWM4f+|xhm literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_moves_effect_title_ja.png b/public/images/ui/text_images/ja/summary/summary_moves_effect_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..a75452f1299e379c9a75e6688c54975a29bd8c32 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^%0SG)#0(_)?yR#1Qk(%kA+G=b|1Zc$`0?Y1@!^;U zKtaZmAirP+hi5m^fE*7`7srr_IN8%1IU5`VST80XjA=Q`%d@5X>4paHb@Ss7vtCn( zUb;hnR*FU^OT?qMcNyCzJ%6yB@9gYDcbE(|+*{-qTNqYZE@t#j#0(^r^%`4&6lZ`>i0l9V{|hn_e*E}hd^qL- zP>``C$S;_|;n|HeAZLQ7i(^PdoahNdu0sYQY!B=kIZobdiWZc8qdBknT(02+i`TZV zc;_vgdhF!Vgd(ro`F}RNSpI9CPudBVW9yg_f^_zZnybG|v{N%=FwJ}YvAx;tL{^;@ zlfq^_>3+xLO@9T9#HxBs&nEOPpMr#3@+7r hQ!+#Zxw8DH{nHQBTlFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_profile_ability_ja.png b/public/images/ui/text_images/ja/summary/summary_profile_ability_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..6c82a863a692f86cbbc5894536a18763894df116 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-k#0(^#z819sQk(%kA+G=b|1Zc$`0?Y1@!^;U zKtaZmAirP+hi5m^fE*uB7srr_xa0>32{RTfH~<7Y8%{d9E_G~l)NYxac=Z(L9G+mw z5Q(7R#vV={As(&Z13YGIQyEml*w#+%;f?XOkdbh4mXwKbmXKt4Ka+Q}WlGB%pt%g5 Lu6{1-oD!M<<4ZN% literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_profile_memo_title_ja.png b/public/images/ui/text_images/ja/summary/summary_profile_memo_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5a4536817ffa8149e8c7dc0cbe262149d2124c GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^_CUVlt+ZHchu=vNU4Xv%r0dqJXTQISH z6PfYAH?!yLYdI-q8^bBQo(pO+7R|qq*ZA(JrIbhUl1q>S^WMzj~hR t3i99bdB24EG3oc!wGWp3?p$*!-szvP)s@l2q+>eW-P87JzynLmP=@JWz ngzX+f)-;O+r*us+oG-GUydvx%blcn>Xd8p4tDnm{r-UW|dALXc literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_profile_profile_title_ja.png b/public/images/ui/text_images/ja/summary/summary_profile_profile_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..a05cba4924798c678dbdd6cc4f42657395cf88ec GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHL#0(^lZE$%Bq&Ne7LR|m<|6h=i@Z-l1IefwnEn2}|%pJ!Wp6I5|Iy6(1;mJlLhLZxv7{UVC Z89G`7*75BvHUQee;OXk;vd$@?2>@YnI0FCx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_stats_exp_title_ja.png b/public/images/ui/text_images/ja/summary/summary_stats_exp_title_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc237a7e6b327d2f4a74947266238ec7c94d3be GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^MnKHL#0(^lZE$%Bq&Ne7LR|m<|6h=i@Z-l1Vd3a&g!6OSz6Pd1Su`Bck>r6^q z7IA=OTYy3T$;pXolP@zZ3+3U6V+qb+p7DH%(8(t+PrhI2u2HxGPR#mHc>o?SQO=$8VZ3IOjoF#0(_a&G}q`6lZ`>i0l9V{|hn_e*E}hd^qL- zP>``C$S;_|;n|HeAScw*#WAEJPWISF-UbB$)(iD2GybfWar&m9_C-YOmL-?6Kyj-o zYjf4cY7S?0&IIQB6&BJ~+uYlW+urCbzs!-Iw&dH>bSJN1sV}#5XGrCFOw=+BTO)rw WO2E(msoO)K1q`09elF{r5}E+fS~_U} literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_tabs_1_ja.png b/public/images/ui/text_images/ja/summary/summary_tabs_1_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..90f454dae75f44508b18bc256934a992f3a403b6 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^hCnR9#0(@4G1bceDV_kI5ZC|z|4T?nXcT5@99}h7 z$aF4HoUtUxFPOpM*^M+HC)Lx%F{C0cnZuQdkLUly1B@Y-d-j~T@_*rfXXnTJ|M7R1 zBzVk~lH+38x%A<}%Q6znTHRXz@Bg=bkBOGaR>l+EtcNaaSieyr?$wnd0sSwTmL91o rudc4P2Wnm(w^yt)jhXYE3nRm_`7tFg<0qX2TFBt(>gTe~DWM4fuH8rq literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_tabs_2_ja.png b/public/images/ui/text_images/ja/summary/summary_tabs_2_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..006c33f23b1c1b0129b7bacb30b490d79da5159b GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&?wB*IJ|1E zkm+2YIAckWUoeBivm0qZPO7JiV@O3@GKXseL)(9j4~(vC{OU%g|FdcUHx3vIVCg!015m_yZ`_I literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/summary/summary_tabs_3_ja.png b/public/images/ui/text_images/ja/summary/summary_tabs_3_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..3306d0aba62f08afea256bb718982bfb8100cf1a GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^c0eq^#0(^jIaMYCDV_kI5ZC|z|4T?nXcT5@99}h7 z$aF4HoUtUxFPOpM*^M+Hr`FTOF{C0cnZuQpk>`KlL3SQd7M6WXtV+S&&fd<+-jCNa zom_vJNg`SS1(*zy)b(JG&^3_tWKZ3|GxgZ{%NIy^ZaY=euqogE$bZF8D51|H~y-h R_XFq<22WQ%mvv4FO#ptlQj`Dy literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_dexnb_label_ko.png b/public/images/ui/text_images/ko/summary/summary_dexnb_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_moves_descriptions_title_ko.png b/public/images/ui/text_images/ko/summary/summary_moves_descriptions_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..350bd607aedfaf5ac40611c9e9f5cec670b5b65d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bP#0(^#H}%a2aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwg?PF+hE&8QbF?-Hh#Wh-e2{&uwYH2wvhei} ztu>BHfiXc}_d6&Z{Qp07?F9y-rm+8?|MQ3a$)9?Em8`ih7JNnMtnk9Q>3MWqtAH%FO W`h{O-@w@_>&*16m=d#Wzp$P!yFhvUh literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_moves_moves_title_ko.png b/public/images/ui/text_images/ko/summary/summary_moves_moves_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..d020d8a77cb2f48681cd86d51010fa0fc0a84f7b GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bP#0(^#H}%a2aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHw1$nwShE&8QbF?-Hq`3Y0U%pUO!R^Yb@`dkR8hRLxm493{U`})(jwlbZ0@%cahB(AluKi}d{YT5s&yM8Of36AIk;{4ON5*~bt+RDK2W4re8 U2Wj_b0!?S|boFyt=akR{0R7KJzyJUM literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_moves_overlay_pp_ko.png b/public/images/ui/text_images/ko/summary/summary_moves_overlay_pp_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_profile_ability_ko.png b/public/images/ui/text_images/ko/summary/summary_profile_ability_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..cdeafaf486e2cb3fb7d2bdbbf880f2999f8086b4 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{U#0(@qERYKWaRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHw1$nwShE&8QJFrHr)_Y+jn{Xkj)-n7wL-W7?4R=c&?yd6vzfLw` z!~go9A09IEtPab)67}}LhyVZE|NiGQNLjmU1LKN?|Lz|RU(IjO(iXq=|9b|8qc2oN UPYHFVdQ&MBb@09K7hT>t<8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_profile_memo_title_ko.png b/public/images/ui/text_images/ko/summary/summary_profile_memo_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..7af960fe1df5c10d2117ec2c8d1b23d44c2bae20 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^en8B_#0(@ih9tiPaRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwZT56=45^4KJ!i;u$UvmwVS+h3JO85a6Pzv=q6#)t`vp9npl9h+ zwvf+s=K=0GHPwVJbpe+7o!2~T9v}Z-(f?%s=0EMM_gdRGac>HEl*oFGv-Gr0fyW8` zX|sO?2l4;adH643b&dvW(`=T`Ed6~N#d!yGn@rwslDM{-XIJcm)g6Zy_U0)w@f&%c z$m6`;!omO9Zh^mkpu5tvA1S;&{o!{t(sUMe@3=avFUrd=Wyy;#YrcMDt$AJTEb#f* RZJ_fRJYD@<);T3K0RU&dZkYf8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_profile_passive_ko.png b/public/images/ui/text_images/ko/summary/summary_profile_passive_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..34a13ffe8360d0f19709a9418d45dc273a90235d GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-m#0(_ss=~EEoB*E?*Mx+G|Ns9($kR_0e1YOj zB|(0{3=CzH&sqR^v7RoDAr*1S9IZ?&kN@vpUij#8w6;Xq`evgwzvrDW^#A{#`N)dA z`TMfiolE}*DiGguS#eT`%FzyI|-JTcx9 eGt$;Zu`;yxn)>-`iEaa0#Ng@b=d#Wzp$P!p;zZK` literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_profile_profile_title_ko.png b/public/images/ui/text_images/ko/summary/summary_profile_profile_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..deb57b967152b45dbcbfc73c670e06d7ed084851 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRh#0(@eBaS}?aRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHwMSHq9hE&8QAK={)w)R=n*3_%Fcpc3C|NHyr|Morixsx{M-Q^Ow zev>P;`2T;Vz{49-xyv(7{NFGCplWMaPLQghMR$}|6TpRrXz|YiT%Uc z%k_Uh|F<`|{VM+II@#6XjW<5(UwgTK!-HyuBzN83M^TFy6WRa#SN#9q{VJb;b;VVy zouSroFB)$o{;xmz|NqVg?jwAWTbr`4a2u2HxGPR#mHc>o?SQO=$8VZ3Ig)khTg9Gq16{@7>FVdQ&MBb@0DmoKt^fc4 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_stats_stats_title_ko.png b/public/images/ui/text_images/ko/summary/summary_stats_stats_title_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..371c2be49768ef6fad56934702c3fa95c914717b GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^VnEEp#0(^*r!Nf!aRPioT>t<7pOBCMA@lo>+ysg< zl?3?(Gcc4*K5GHw`FpxJhE&8QJFwp2<5|5ehavEPd2YgksI942|MBwt`M>|o|E-OV z*;l0m&j0&A|9`x_fx+5c6SihCH-Guh`}M!M!HKoM6r^@FI{x|3dhr53!;D;|-+O~* RTLO({@O1TaS?83{1OOSFM0EfF literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_tabs_1_ko.png b/public/images/ui/text_images/ko/summary/summary_tabs_1_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..487d4a628cab424d9e92297d1d9177fbea706897 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT�(_a3!e4@DV_kI5ZC|z|4T?nXcT5@99}h7 z$aF4HoUtUxFPOpM*^M+HC(P5uF{C0cnWMFlq3yrH2gXPf6B8R7lP`L6c8Z_r@#)=N z_x07?3z>{OD}%jHJOBU3>pS;=0q+u44XK$7DQ^Fp4H~(U9B(;rDFrt!T9}Z_q0OAU*NYn$UPund0Zx3S>-UDr7@O1TaS?83{1OPazNd*7^ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/summary/summary_tabs_3_ko.png b/public/images/ui/text_images/ko/summary/summary_tabs_3_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..832acf4d5ba5c19aa07fe41a3d107beb5bb0e006 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^c0eq^#0(^jIaMYCDV_kI5ZC|z|4T?nXcT5@99}h7 z$aF4HoUtUxFPOpM*^M+Hr_0mDF{C1HZoeWQlc9iX^%2v2_0|bTdz}0Oq}MgPyw{+- zKw!?Il}<_qEWyr9t$9rm1vWoF{h!~H?DhE6l-v1C2W|-o?CQ6eDPZ3DcPH2S{EJh4 zCVfiCnA7&{R`Qlk))&`!PaJ$A`ON9&!|9=GdPCo|My_*Wo)Hu9&@OCGU%K)k!|Q>| fO#c7*be21-y+UQ(6y*e!19zF>?UP4j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_moves_descriptions_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..8d888143663b43c5b2859bd358be604c67070dc2 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4nWMq!VDx8?k@WUr1%4TLR=FP5`O&n@&EsSAOlFQ z$~dC~lwvLk@(Tvizsio>15#5xT^vIy;%X-Z@*PqTU=9DmU{=L&=NrRp8@+^kyZ_H@ z$-Df5{ZI?f$qn)|{I9!-t*>V?o6{&FG{4L5*RqVR*-Fe!EF5Y(Co30R(iUIb_&BUx z!a99Ht=idd52haaWXkxFp>n6UgyYIf`47JCoiJDI+%9{?zZ@zaIZo}`mop!qVc=j0 rcVTaPD06AO*>ATgQzADU6RcryedieDd@lbl(18q|u6{1-oD!MFVdQ&MBb@0AH9-VE_OC literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_moves_moves_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2d1657750988e8b1127408057eb281774b5cb8 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Za~bz#0(@Yg%Y`e6i`>N3cf&b zrjj7PUFR)w70NhYTcGA3TzHDEm-$L9_eIYeyB|#VxXQ><{Rg zT;dU4=;8P9o|0qFhx3nuCX3zs@=-9M&cwNqou;_l?^wY|Z4CskNf z92i=ZCeLkciM4XSG}~u}eL3%ucMhNS@JY@yk2MTY_?oO-Uzy*3=YP%o7c0Cj^EZ11 c?#|Bqr@p|=-$Jk30O&3TPgg&ebxsLQ01xO}*#H0l literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_moves_overlay_pp_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_profile_ability_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..28fbb5a8be9a5b72d300f71e818fff5b46ee42b2 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!VDzCEgOFUDgFST5LY0bkdW~I|9=R%k@-Uy zP>8uC$S)X3|0+9j4@l*Bx;TbZ#D(@Yaxxq8Fz;=0X8+N~H(`O`lE3Mz-hB8nTgK>z z10UbMEg=&=7kT|&ytZj6XYl=BXQa2xJ60H3KI!I}o_9;O%-bbVs>;D{H9tzrH)8qm x`kxlkpSRgPolwF2?54p42Zo3rdwbuo?E4yFbb&j%%?M~OgQu&X%Q~loCIF{)P~HFl literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_profile_memo_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ef7c91fc5b6b2c59d6cf5510c02ec3cec0940c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^AwbN*!VDy*avrS%Qv3lvA+8At3IG592a+Ft`~Wht z|8IQ`lwv9g@(X5QD4TrN0?6z1ba4!+h^w7&k(1ew$9d}P2Q_aQI#00Ob*T71Q!9DL z>u^~?&kqV}9kYBipZuP?de_-glUOYG*sTui+Np9Y^zOA)&F8XAN=^wczo5~z;nxmdKI;Vst0DtFV$N&HU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_profile_passive_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..11616a7428738a462771e24b71d0e1cf3aac9c59 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf!VDy9I}1XA6n}tEh%1mzNJ#kq|38G>$owG; zD8yV6B7W5QUff)lUBS_L2X< z!~RvD1D`KH6yh1I=X~Ytxi>~zwlp?g(0^yHeP+t#%W+ZPmwj|e^RITkQf}(KKKuN`2_>%Uu8$`0jWSw7srr_xY%_s$NrC_X literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_stats_exp_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..d66fa829be12519a0f6ffa7e25051f2f07fbd049 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUF#0(_2F5G+t#0l^TaZN}_`2YVuggpI3!51jb zR1)MD%)n4K`K$$yx6sqYF{C0cx7U{Ikb{6*^6aGCHP@w|Xehe6Y>?o8BwNJ78&=r0 zmO1X2s8a%S^6tEiuX~zUz8HSs?f-ew%=nG^v%K5&ckOPq`v+a@v+JEF`{1fXy2KY1 z#dTUzrW(tXPFbd0*XDi6QT2C@#$~RQbZcvyR`_+{%eGDJoAwDhWZtWn x)fE!`RL<4;44$rjF6*2UngA99Wu5>4 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_stats_expbar_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..4889b64eca8c7eabfb33cb19dd3e5e538547e7bf GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A$P6S`X0(U`DYgKg5ZC|z|9|-Lqn~x7DNuy5 zB*-tA!Qt7BG$2RJ)5S5QA}+b&Ys129#>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&Z?m4fjDM)~*y zyUQ6J(jG8d{+z!)zFDNju48ia&lfkX1U`4pi8;}{y)Z%e$&>%KHGjEN4r%GF3*{DD b%fO)aSeJRi^ykq)I~Y7&{an^LB{Ts5t(itv literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_stats_stats_title_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9dffc28879008ff0d62a565b7a9a2a508dc942 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^=0MEB#0(@AX7;ZIQak}ZA+8At3IG59hmfbADEI=! znM#8Ef*BafCZDwc@~S;u978JNk~`}E)Z24xegFTb|360Ot9k}EY%9OMy1Ki}AS9xp z@#~Xk&z{ZYX7okqNuw1^DlOuulCxn;zJ_d&a>IOcW*Yk^VM@*tJgvm%B=@VF_r}R1v5B2yO9Ruq3}HYEMm``^aYM=POt5%6bRf;k@m4Jm+_k81vZ+2EN8;n7f7Idi>R5#8Lu$oQn+B yY)WXzSHE`Ka=+i2@bk@U=Uw}|um1mMCI4gbdOthoM7{@F$>8bg=d#Wzp$P!Z_D<&j literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_tabs_2_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..29cad435f2d8e12b544a46988341d65124236ff8 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^&Oj`{!VDz$|GO^T&*_y}Jnszi;0u?Zp1o;IsI6S+N2IRDOx;TbZ#O4LYXJUMl3(q?Tl49>T_oO>`;bmNyZC+7A{tb4NXa;p1k0duy- ztOZIf0x?@}8|*RPx}M{~wb{}=A`Q0|G;swA99ub|$g+ON2GLL29v!!Tmu4?I{Mj!+ iSaRPdz5l-#?~K#tv0HarR%##6Jq(_%elF{r5}E)FS6vkV literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png b/public/images/ui/text_images/pt-BR/summary/summary_tabs_3_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..f4eebe1eb11834459c6f9471f39b0c1f31f9f89a GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^fk4d9!VDzyRPCBToB*E?*Z=?jOGrp)6lQ81TB&h( z)s$Gd^*|}ck|4ie28U-i(tw;^PZ!6Kiny&85Aq&S;Bg7`IZvH+g!}H*_ko}%_zpr^a(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_dexnb_label_ro.png b/public/images/ui/text_images/ro/summary/summary_dexnb_label_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_moves_overlay_pp_ro.png b/public/images/ui/text_images/ro/summary/summary_moves_overlay_pp_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_profile_ability_ro.png b/public/images/ui/text_images/ro/summary/summary_profile_ability_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_profile_memo_title_ro.png b/public/images/ui/text_images/ro/summary/summary_profile_memo_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_profile_profile_title_ro.png b/public/images/ui/text_images/ro/summary/summary_profile_profile_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_stats_stats_title_ro.png b/public/images/ui/text_images/ro/summary/summary_stats_stats_title_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_tabs_2_ro.png b/public/images/ui/text_images/ro/summary/summary_tabs_2_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/summary/summary_tabs_3_ro.png b/public/images/ui/text_images/ro/summary/summary_tabs_3_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png b/public/images/ui/text_images/ru/summary/summary_dexnb_label_overlay_shiny_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba0191881d17edefa37ef1f1b02889ead734306 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)iDGmtEQarX+4;t%i%aRt%~79{-t{~t)cc(Ec- zj6D}9#9R{O7Yw9-l^wYUq)a_s978JNk^_Q*iVD*hoYK?T#F;f-GCh-)Hny1Ea8oD2 sZ1d&?3eASih7&@V7`;ve7ENJcID6c)=xOIFFQ5Sop00i_>zopr0M1Y^ivR!s literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_dexnb_label_ru.png b/public/images/ui/text_images/ru/summary/summary_dexnb_label_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2e66426cb105d302c91851c1026495a2e18cce GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^AT}oxGmtDh5!wKxcmjMvT>t<7p8y6we*9=`yBq)% zXDSKu3kIs1eAWWU)9`e045^4qPIyp%;KPHv%x&@tfBrEZ-W|>@5y$-UxWliDml@hv by_p#bUW=5~`kwRy>S6G7^>bP0l+XkKef=!@ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_moves_descriptions_title_ru.png b/public/images/ui/text_images/ru/summary/summary_moves_descriptions_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..a435d6d845edfd4eb9e6f662789991c9d608ea1c GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?b!VDy%)IaV8Qv3lvA+8At2|s@P`2YVukO3rD zWt`CgN->uN`2_>%Uu8$`0jX?H7srr_IM=>LPG?6B=eMPeVpa|l?HeZScf3=-Os(Rn z(}Z^ZBOcFRy;2jmk4Sc z-rnl(e9vOf@H+UNs8>k;|5^Nzg5QfQh4ky6WE1=#0(@8HmA=7aRPioToV!!{{R0EAx}S1@CAx9 zl?3?(Gcc4*K5GHwWqGQwsm}l3_xr#5Z@rV9zhTaf()IVQ z?v2|2UUA0Z?+@sVuAR)=}6jbM0kz>$HAogw<0TlD<(@1_B5W$<+Mb6Mw<&;$TeHd6Tj literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_moves_overlay_pp_ru.png b/public/images/ui/text_images/ru/summary/summary_moves_overlay_pp_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdc227512952bfd9dd56155534014a3243f20f1 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=w_yc@GT>t<7pB+^U^6`2_>%Uu8$`0Vz{Y7srr_IMri}oD2#AEC-o$7cjCY?_i93_d8vvv@!9kc28?T q!;JIabk6j$O7%bk7(8A5T-G@yGywoCzcHWy literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_profile_ability_ru.png b/public/images/ui/text_images/ru/summary/summary_profile_ability_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfcc6102dca117fa33b4bb0f4b6c65e75f14c72 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!VDyn9UPtkDgFST5ZC|z|0g6Q0C^BbM!Nky zAcwgm$S)X3|0+8I;`)2KIEGZj`F1yQ9ySnQ4&CFh*~zLYk5T-seXvf4=Z@zS`BY}l z|9|+#g1S~CCeEyhKNOC!n6CMyQGF}=W@yT!wI}4{)+@>utu{WsX#0uN`2_>%Uu8$`0jVvXE{-7;akl-9xkn6mn5Vihi~N^eaH5()@eA9ff5ua% zM7tkr^eYfZ-ac=YjA-SglV=`?9xuPTro`yjo0_m&MnWfpgRkr;*rRSCJfZPiPkq}` zzphz4kA8f5aOU~(fonkhKJ^F?3#G${0+D3+n=;=opAlJ>*6A& zdv~X--nNkSiG#GU&}oK0JFm9qluAb_xJgf6m)o*Zi1%X6e|DbVYXskPX}@6-kni~W aNL)D8;n!FFHJ(8CGkCiCxvX8uC$S)X3|0+9j4@d=jx;TbZ#JQes15yc|E{-7;alU67IS)8+I0x=rcY%|SeZn&7KX2@V1sBHf zDA;(s>FbT%o-M3%X~Q>xq*;2Ct~eennN)hA$+pGS?#9>2YZX^pO1)z4*}Q$iB} Dk-t5r literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_stats_expbar_title_ru.png b/public/images/ui/text_images/ru/summary/summary_stats_expbar_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..424a5378f7ec973031710493245519774238c6b6 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^+(69A#0(_go%nYYNO1=Egt-3y|Np~}A3)SK>HBS< zAX7<@UoZnh+2pepK%TUxi(^PdTyn(5Bv$9=JgjZ!{1oP`JhY)`85e`E5xWH2nQ3Z3 OWelFKelF{r5}E*p*(Rs} literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_stats_item_title_ru.png b/public/images/ui/text_images/ru/summary/summary_stats_item_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..95b01d062abd16b9f72cb899955c2f2057108de1 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?d#0(_;zPWLOH~~H(t_cYV|NsAokf)z0_yWb5 zN`m}?85qhYpS1w;8a-VcLn`8O&nfa9au9G!EMdLVU>v$(S<;SUY=?Oru5Mq%x#os) z!L(RIPRWn!bvtAgCU>dXeBZgfaP=*FyRg02j6J;1zRd1wD$wHROuDDGMK0m^Gu!FY z-LK3`-+b)1u!`+ro$1a@8>8oxg*u-4^KWN%n_5Rn;;g*GpC*6)l`nHvJ}EVMja!S! RB%os$JYD@<);T3K0RX?bS5g1~ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_stats_stats_title_ru.png b/public/images/ui/text_images/ru/summary/summary_stats_stats_title_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1c5dc944588bfb58f171dd9fd7f260f1c30055 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^wm{6m#0(_Ocgv>$DV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJdF`Gqjv*Cs$sP57>i<3dZ>{zJ=KnnQNjyBEyB!jazrVUV{QUio zRi(_%t!=CV5%2S|^6u@eE;J5kSh#4@qC+Yf(Qxt9qbP|K7tDnm{r-UW|m`+^l literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_tabs_1_ru.png b/public/images/ui/text_images/ru/summary/summary_tabs_1_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..1fef6034ad7d3b8dd5100e3e8459ac44ff7e8eec GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^WlMrXDkWw3ubV5b|VeQ$@X+{45^4q=5S?Wyq8xmU09ot_v*@P zfp?cLt#&v%apms=cYdt=8N7VqZSPsL0~s0C&dxp~n>$?}Xf1=MtDnm{r-UW|iH1|ocv=&~e*8{oFcG$x+2G9H z5%PY&m##-(mGW|_!peUwIh{vJROhdgUVm@tdh>Vg-=gjqzTs&R(7yO$OIjZj`_fpS zGPWdl{_NfW&EV#kmzS#qa$L20*}M<#zhb@BQFY5jsVg;0-)_=vwrkxI@WLdxKK-ub x=2-%_B@`-jY8JN5ZTuyfZ5aFiKlA6WjBgr37zC%ktpz%f!PC{xWt~$(699QTVF~~M literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/summary/summary_tabs_3_ru.png b/public/images/ui/text_images/ru/summary/summary_tabs_3_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..1395ac840afcbcf152dc16f573f58fd8c8abf688 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^W(cH9OPsQ9 z%*+0VwH)Z;+HL;)*TlpVk1SUA7ngm{J+%Ltuf1ncghYQ}W2(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_dexnb_label_tl.png b/public/images/ui/text_images/tl/summary/summary_dexnb_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_moves_overlay_pp_tl.png b/public/images/ui/text_images/tl/summary/summary_moves_overlay_pp_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_profile_ability_tl.png b/public/images/ui/text_images/tl/summary/summary_profile_ability_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_profile_memo_title_tl.png b/public/images/ui/text_images/tl/summary/summary_profile_memo_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_profile_profile_title_tl.png b/public/images/ui/text_images/tl/summary/summary_profile_profile_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_stats_stats_title_tl.png b/public/images/ui/text_images/tl/summary/summary_stats_stats_title_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_tabs_2_tl.png b/public/images/ui/text_images/tl/summary/summary_tabs_2_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/summary/summary_tabs_3_tl.png b/public/images/ui/text_images/tl/summary/summary_tabs_3_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png b/public/images/ui/text_images/tr/summary/summary_dexnb_label_overlay_shiny_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..f35e327c29a80c9b5c3a912ff12a298331fd1f25 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Aa*7bGmxyaiMj=(cmjMvT!Hle|Nj>(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_dexnb_label_tr.png b/public/images/ui/text_images/tr/summary/summary_dexnb_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_moves_overlay_pp_tr.png b/public/images/ui/text_images/tr/summary/summary_moves_overlay_pp_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_profile_ability_tr.png b/public/images/ui/text_images/tr/summary/summary_profile_ability_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_profile_memo_title_tr.png b/public/images/ui/text_images/tr/summary/summary_profile_memo_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_profile_profile_title_tr.png b/public/images/ui/text_images/tr/summary/summary_profile_profile_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_stats_stats_title_tr.png b/public/images/ui/text_images/tr/summary/summary_stats_stats_title_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_tabs_2_tr.png b/public/images/ui/text_images/tr/summary/summary_tabs_2_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/summary/summary_tabs_3_tr.png b/public/images/ui/text_images/tr/summary/summary_tabs_3_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_overlay_shiny_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..f35e327c29a80c9b5c3a912ff12a298331fd1f25 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Aa*7bGmxyaiMj=(cmjMvT!Hle|Nj>(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_dexnb_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_moves_overlay_pp_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_profile_ability_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_profile_memo_title_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_profile_memo_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_profile_profile_title_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_profile_profile_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_stats_stats_title_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_tabs_2_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png b/public/images/ui/text_images/zh-CN/summary/summary_tabs_3_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_overlay_shiny_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..f35e327c29a80c9b5c3a912ff12a298331fd1f25 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Aa*7bGmxyaiMj=(cmjMvT!Hle|Nj>(NOkoW*cbB>Cy2Brd4td6(++n&2 g9K5^|5jI_nKXw(~uGa0H2-L;k>FVdQ&MBb@0CP7iJpcdz literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_dexnb_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..bf568c486aac5e8af4e95a237819caf922a9e50c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xc>kD|HqFX2?+^z=3P?) z3Nn@i`2{mLJiCzw>gqT( UH}5KG0xD+kboFyt=akR{09ud*ZefK-R4i(^PdTxfqI=V1dLmaA!vZDkEtVjaG0cG!8pe%YxG zwGg{`+bsN^xa?D!0ejBkv+L{SsCZdn!9^)hvtWz z+-clzmbZP<+i@pnYFK5~>HCZ4i+0(1J4Bw-(LOGobMsBuL2hZcDc4RrPY$}YNJnIr eu;AvE=J7L{E$8#R;=K)Y6N9I#pUXO@geCyjhqq&-wpf;{OYGFo%higqpv&rD%|T_4b0*QLn?BEzkV_&lbP+ e|L^-hxfr=PvSzrSj|GyL_nMwk1x73$xo z=rbIN`Tk+wdYoq81+uA*kSLVyi*jaz^^#Aqsj57mcqIkK(bfXy= YdK+{ESKps$477m3)78&qol`;+09KqvxBvhE literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_moves_overlay_pp_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..a2bcd0bd0211023f9c248f46510197e33987db7e GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dRGmzXnrA-w`aR&H=xB}_ysN(lFzsfbICSo!pTfo>_&;U!Zzd9*h(Ni17sW#AK#$ncm!kd0x! WDTkk~0aqqa1B0ilpUXO@geCz0;3B&K literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_profile_ability_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c22b7d47b527d91b0406ae0ffcbfcb21882aa GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^T0qRf#0(@qooxLIq<8{+LR^9L|Ns9J5)y!9QtLfl zAfKru$S;_Ip=|P53m`Ad)5S5QA})Eu`~M&R$Da8A{lA<|LdDm-ySqviUx)2w+BAP( zclT%R&f?ll)r^NPf45i2*~`}U|NS+`8#O!*UkeS)0?z6$Q2al?=>~V$+6Yz_Zm|MG a28PuMrujjZy~02n7(8A5T-G@yGywpd6GZ0# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_profile_memo_title_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_profile_memo_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69c20e57f33f369e6424f04f23a7fe15e85c42 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!VDz6-1jE}DgFST5Z8o+gbzP{{Qv(S$N-XS zQg&SeN->uN`2_>%Uu8$`0jYjZ7srr_xZM6m&chBo%=SO!6`4iMnP*HlpYUz|%5TfJ zv|KZDYC3%5>?#$nx)Z8J&qcQ%K0o1*zxZv|rmNlyJQv+53t)7~{J|$owG; zD8yV6t_v!dB&(%eLb{|DqxEK#&HSTB?Vw2r~k)z4*}Q$iB}RkKQi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_profile_profile_title_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_profile_profile_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..4170dccf682a71bf64c7b3129738865842cd72c2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CP2)=!VDx`-W}uvQv3lvA+8At2_Js^`2YVukO3su zr0lu`lwvLk@(Tvizsio>15$~eE{-7;ak1wvavm_?UbgBSY;&{G15&k~E{-7;akl3hIaw5WTrMu?t=PoMv9WpnzwBN8<#`hx zGBP(C?u}&aU8S1m^w{!W>4`hmo-Hd~bf^3%Pb(2?G*EYDaOv8;wdt74jLH28&MiBl zvoEa*no-6gdrP1^+on2FAm_L9oXjJ4n_4oO&i!5=`}3dn-VaCR?>U}V-M1{>2u2HxGPR#mHc>o?SQO=$8VZ3I#wbi{`&i_m4fjDM)~*y zyUQ6J(jG8d{+z!)u34nTu48ia&j&ZH1U`4pi8*n2dtrj`lPCXeYyNVl9MaNT7s@TR amVrS%M3*IDWu_6(4hBzGKbLh*2~7Z~$wgBD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_stats_stats_title_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..f602a43c39d509720f1cfb19ab25d4aeaf676ed3 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^@<7bN#0(^BgwJ#WDV_kI5Z8o+g#Z8lL&(!l6nuf= zOeH~n!3+##lh0ZJd0w6_jv*Cs$sP57>g@z<6IR?}WwVyhlGSNAaH&!8zoToaYwJJe zwiU9XU+uLPl^IM43ki9hiTc36#K49Bn+|3-vI!LEGBBw5D7@-%(fC;D89nN qs8oK2^k0+uS0*LZp2fym3=AHOS^q5@zxV)cWbkzLb6Mw<&;$VLbU|nU literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_tabs_2_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1db1f34cda08cfc95c1f7c6237645a2d6151c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@pli=y%7*Y|J%;DO=(Dt9>1EVY3+|By`^8bDLf6>2j&WS6p z7lwPUpLT4TA9sSs+$zySoW64p80eP7zqtBq_0o&}%EAqE3O4v;Xik`HCAy4#g^p3F m{0!m0B~q(wkL===WMH^9DMtO^3ddleT@0SCelF{r5}E)~6GM{# literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png b/public/images/ui/text_images/zh-TW/summary/summary_tabs_3_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..24676712fb95cf266145d57d1b0229aa117ec315 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^dO$3|#0(@wmM^UYQak}ZA+G=b|Cf-E&@9f@JhnC^ ztc(dL&R7!U7tG-B>_!@plj`Z>7*Y|J%;DO=(Dt9>1EVY3+~Tjd&R=?6|9Lr+<;0cu z*B_r2$FIBBO1D9=^p!P-x=AV1;VlkN^Mx literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 0a42fc3fa7d..e1b658f578a 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -138,19 +138,13 @@ export class LoadingScene extends SceneBase { this.loadImage("summary_profile", "ui"); this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt - this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' - this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' this.loadImage("summary_status", "ui"); this.loadImage("summary_stats", "ui"); this.loadImage("summary_stats_overlay_exp", "ui"); this.loadImage("summary_moves", "ui"); this.loadImage("summary_moves_effect", "ui"); this.loadImage("summary_moves_overlay_row", "ui"); - this.loadImage("summary_moves_overlay_pp", "ui"); this.loadAtlas("summary_moves_cursor", "ui"); - for (let t = 1; t <= 3; t++) { - this.loadImage(`summary_tabs_${t}`, "ui"); - } this.loadImage("scroll_bar", "ui"); this.loadImage("scroll_bar_handle", "ui"); @@ -230,23 +224,91 @@ export class LoadingScene extends SceneBase { this.loadAtlas("pb", ""); this.loadAtlas("items", ""); - this.loadAtlas("types", ""); // Get current lang and load the types atlas for it. English will only load types while all other languages will load types and types_ - const lang = i18next.resolvedLanguage; - if (lang !== "en") { - if (hasAllLocalizedSprites(lang)) { - this.loadAtlas(`statuses_${lang}`, ""); - this.loadAtlas(`types_${lang}`, ""); - } else { - // Fallback to English - this.loadAtlas("statuses", ""); - this.loadAtlas("types", ""); - } - } else { - this.loadAtlas("statuses", ""); - this.loadAtlas("types", ""); + const lang = i18next.resolvedLanguage ?? "en"; + const keySuffix = lang !== "en" && hasAllLocalizedSprites(lang) ? `_${lang}` : ""; + + this.loadAtlas(`statuses${keySuffix}`, ""); + this.loadAtlas(`types${keySuffix}`, ""); + for (let t = 1; t <= 3; t++) { + this.loadImage( + `summary_tabs_${t}${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_tabs_${t}${keySuffix}.png`, + ); } + this.loadImage( + `summary_dexnb_label${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_dexnb_label${keySuffix}.png`, + ); // Pixel text 'No' + this.loadImage( + `summary_dexnb_label_overlay_shiny${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_dexnb_label_overlay_shiny${keySuffix}.png`, + ); // Pixel text 'No' shiny + this.loadImage( + `summary_profile_profile_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_profile_profile_title${keySuffix}.png`, + ); // Pixel text 'PROFILE' + this.loadImage( + `summary_profile_ability${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_profile_ability${keySuffix}.png`, + ); // Pixel text 'ABILITY' + this.loadImage( + `summary_profile_passive${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_profile_passive${keySuffix}.png`, + ); // Pixel text 'PASSIVE' + this.loadImage( + `summary_profile_memo_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_profile_memo_title${keySuffix}.png`, + ); // Pixel text 'TRAINER MEMO' + this.loadImage( + `summary_stats_item_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_stats_item_title${keySuffix}.png`, + ); // Pixel text 'ITEM' + this.loadImage( + `summary_stats_stats_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_stats_stats_title${keySuffix}.png`, + ); // Pixel text 'STATS' + this.loadImage( + `summary_stats_exp_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_stats_exp_title${keySuffix}.png`, + ); // Pixel text 'EXP.' + this.loadImage( + `summary_stats_expbar_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_stats_expbar_title${keySuffix}.png`, + ); // Pixel mini text 'EXP' + this.loadImage( + `summary_moves_moves_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_moves_moves_title${keySuffix}.png`, + ); // Pixel text 'MOVES' + this.loadImage( + `summary_moves_descriptions_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_moves_descriptions_title${keySuffix}.png`, + ); // Pixel text 'DESCRIPTIONS' + this.loadImage( + `summary_moves_overlay_pp${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_moves_overlay_pp${keySuffix}.png`, + ); // Pixel text 'PP' + this.loadImage( + `summary_moves_effect_title${keySuffix}`, + "ui", + `text_images/${lang}/summary/summary_moves_effect_title${keySuffix}.png`, + ); // Pixel text 'EFFECT' + if (timedEventManager.activeEventHasBanner()) { const availableLangs = timedEventManager.getEventBannerLangs(); if (lang && availableLangs.includes(lang)) { @@ -256,7 +318,6 @@ export class LoadingScene extends SceneBase { } } - this.loadAtlas("statuses", ""); this.loadAtlas("categories", ""); this.loadAtlas("egg", "egg"); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 706f139b8bb..50d86209165 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -175,6 +175,7 @@ enum MenuOptions { export class PokedexPageUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; private shinyOverlay: Phaser.GameObjects.Image; + private starterDexNoLabel: Phaser.GameObjects.Image; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -324,8 +325,12 @@ export class PokedexPageUiHandler extends MessageUiHandler { }); this.starterSelectContainer.add(this.pokemonSprite); - this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny"); - this.shinyOverlay.setOrigin(0, 0); + this.starterDexNoLabel = globalScene.add.image(6, 14, getLocalizedSpriteKey("summary_dexnb_label")); // Pixel text 'No' + this.starterDexNoLabel.setOrigin(0, 1); + this.starterSelectContainer.add(this.starterDexNoLabel); + + this.shinyOverlay = globalScene.add.image(6, 111, getLocalizedSpriteKey("summary_dexnb_label_overlay_shiny")); // Pixel text 'No' shiny + this.shinyOverlay.setOrigin(0, 1); this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index c3214fa5420..8fce287c897 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -432,8 +432,15 @@ export class StarterSelectUiHandler extends MessageUiHandler { const bgColor = globalScene.add.rectangle(0, 0, sWidth, sHeight, 0x006860).setOrigin(0); + const starterDexNoLabel = globalScene.add + .image(6, 14, getLocalizedSpriteKey("summary_dexnb_label")) + .setOrigin(0, 1); // Pixel text 'No' + const starterSelectBg = globalScene.add.image(0, 0, "starter_select_bg").setOrigin(0); - this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny").setOrigin(0).setVisible(false); + this.shinyOverlay = globalScene.add + .image(6, 111, getLocalizedSpriteKey("summary_dexnb_label_overlay_shiny")) + .setOrigin(0, 1) + .setVisible(false); // Pixel text 'No' shiny const starterContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); const starterContainerBg = globalScene.add @@ -1070,6 +1077,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add([ bgColor, starterSelectBg, + starterDexNoLabel, this.shinyOverlay, starterContainerBg, addWindow( diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index dfa70d1dc76..63111ee540a 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -68,6 +68,7 @@ export class SummaryUiHandler extends UiHandler { private summaryUiMode: SummaryUiMode; private summaryContainer: Phaser.GameObjects.Container; + private summaryContainerDexNoLabel: Phaser.GameObjects.Image; private tabSprite: Phaser.GameObjects.Sprite; private shinyOverlay: Phaser.GameObjects.Image; private numberText: Phaser.GameObjects.Text; @@ -94,12 +95,15 @@ export class SummaryUiHandler extends UiHandler { private passiveContainer: abilityContainer; private summaryPageContainer: Phaser.GameObjects.Container; private movesContainer: Phaser.GameObjects.Container; + private movesContainerMovesTitle: Phaser.GameObjects.Image; + private movesContainerDescriptionsTitle: Phaser.GameObjects.Image; private moveDescriptionText: Phaser.GameObjects.Text; private moveCursorObj: Phaser.GameObjects.Sprite | null; private selectedMoveCursorObj: Phaser.GameObjects.Sprite | null; private moveRowsContainer: Phaser.GameObjects.Container; private extraMoveRowContainer: Phaser.GameObjects.Container; private moveEffectContainer: Phaser.GameObjects.Container; + private moveEffectContainerTitle: Phaser.GameObjects.Image; private movePowerText: Phaser.GameObjects.Text; private moveAccuracyText: Phaser.GameObjects.Text; private moveCategoryIcon: Phaser.GameObjects.Sprite; @@ -111,6 +115,10 @@ export class SummaryUiHandler extends UiHandler { private permStatsContainer: Phaser.GameObjects.Container; private ivContainer: Phaser.GameObjects.Container; private statsContainer: Phaser.GameObjects.Container; + private statsContainerItemTitle: Phaser.GameObjects.Image; + private statsContainerStatsTitle: Phaser.GameObjects.Image; + private statsContainerExpTitle: Phaser.GameObjects.Image; + private statsContainerExpBarTitle: Phaser.GameObjects.Image; private descriptionScrollTween: Phaser.Tweens.Tween | null; private moveCursorBlinkTimer: Phaser.Time.TimerEvent | null; @@ -144,15 +152,19 @@ export class SummaryUiHandler extends UiHandler { summaryBg.setOrigin(0, 1); this.summaryContainer.add(summaryBg); - this.tabSprite = globalScene.add.sprite(134, -summaryBg.displayHeight + 16, "summary_tabs_1"); - this.tabSprite.setOrigin(1, 1); + this.tabSprite = globalScene.add.sprite(81, -summaryBg.displayHeight + 16, getLocalizedSpriteKey("summary_tabs_1")); // Pixel text 'STATUS' tab + this.tabSprite.setOrigin(0, 1); this.summaryContainer.add(this.tabSprite); const summaryLabel = addTextObject(4, -165, i18next.t("pokemonSummary:pokemonInfo"), TextStyle.SUMMARY_HEADER); summaryLabel.setOrigin(0, 1); this.summaryContainer.add(summaryLabel); - this.shinyOverlay = globalScene.add.image(6, -54, "summary_overlay_shiny"); + this.summaryContainerDexNoLabel = globalScene.add.image(6, -151, getLocalizedSpriteKey("summary_dexnb_label")); // Pixel text 'No' + this.summaryContainerDexNoLabel.setOrigin(0, 1); + this.summaryContainer.add(this.summaryContainerDexNoLabel); + + this.shinyOverlay = globalScene.add.image(6, -54, getLocalizedSpriteKey("summary_dexnb_label_overlay_shiny")); // Pixel text 'No' shiny this.shinyOverlay.setOrigin(0, 1); this.shinyOverlay.setVisible(false); this.summaryContainer.add(this.shinyOverlay); @@ -281,6 +293,10 @@ export class SummaryUiHandler extends UiHandler { moveEffectBg.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectBg); + this.moveEffectContainerTitle = globalScene.add.image(7, 7, getLocalizedSpriteKey("summary_moves_effect_title")); // Pixel text 'EFFECT' + this.moveEffectContainerTitle.setOrigin(0, 0.5); + this.moveEffectContainer.add(this.moveEffectContainerTitle); + const moveEffectLabels = addTextObject(8, 12, i18next.t("pokemonSummary:powerAccuracyCategory"), TextStyle.SUMMARY); moveEffectLabels.setLineSpacing(9); moveEffectLabels.setOrigin(0, 0); @@ -738,7 +754,7 @@ export class SummaryUiHandler extends UiHandler { const forward = this.cursor < cursor; this.cursor = cursor; - this.tabSprite.setTexture(`summary_tabs_${this.cursor + 1}`); + this.tabSprite.setTexture(getLocalizedSpriteKey(`summary_tabs_${this.cursor + 1}`)); // Pixel text 'STATUS' and "MOVES" tabs this.getUi().hideTooltip(); @@ -812,6 +828,14 @@ export class SummaryUiHandler extends UiHandler { ? i18next.t("trainerNames:playerF") : i18next.t("trainerNames:playerM"); + const profileContainerProfilTitle = globalScene.add.image( + 7, + 4, + getLocalizedSpriteKey("summary_profile_profile_title"), // Pixel text 'PROFIL' + ); + profileContainerProfilTitle.setOrigin(0, 0.5); + profileContainer.add(profileContainerProfilTitle); + // TODO: should add field for original trainer name to Pokemon object, to support gift/traded Pokemon from MEs const trainerText = addBBCodeTextObject( 7, @@ -886,7 +910,7 @@ export class SummaryUiHandler extends UiHandler { } this.abilityContainer = { - labelImage: globalScene.add.image(0, 0, "summary_profile_ability"), + labelImage: globalScene.add.image(0, 0, getLocalizedSpriteKey("summary_profile_ability")), // Pixel text 'ABILITY' ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? nameText: null, descriptionText: null, @@ -896,7 +920,7 @@ export class SummaryUiHandler extends UiHandler { // Only add to the array and set up displaying a passive if it's unlocked if (this.pokemon?.hasPassive()) { this.passiveContainer = { - labelImage: globalScene.add.image(0, 0, "summary_profile_passive"), + labelImage: globalScene.add.image(0, 0, getLocalizedSpriteKey("summary_profile_passive")), // Pixel text 'PASSIVE' ability: this.pokemon.getPassiveAbility(), nameText: null, descriptionText: null, @@ -916,9 +940,9 @@ export class SummaryUiHandler extends UiHandler { } allAbilityInfo.forEach(abilityInfo => { - abilityInfo.labelImage.setPosition(17, 43); + abilityInfo.labelImage.setPosition(17, 47); abilityInfo.labelImage.setVisible(true); - abilityInfo.labelImage.setOrigin(0, 0); + abilityInfo.labelImage.setOrigin(0, 0.5); profileContainer.add(abilityInfo.labelImage); abilityInfo.nameText = addTextObject(7, 68, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? @@ -966,6 +990,14 @@ export class SummaryUiHandler extends UiHandler { const rawNature = toCamelCase(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? const nature = `${getBBCodeFrag(toTitleCase(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? + const profileContainerMemoTitle = globalScene.add.image( + 7, + 107, + getLocalizedSpriteKey("summary_profile_memo_title"), // Pixel text 'TRAINER MEMO' + ); + profileContainerMemoTitle.setOrigin(0, 0.5); + profileContainer.add(profileContainerMemoTitle); + const memoString = i18next.t("pokemonSummary:memoString", { metFragment: i18next.t( `pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, @@ -992,6 +1024,30 @@ export class SummaryUiHandler extends UiHandler { this.statsContainer.add(this.ivContainer); this.statsContainer.setVisible(true); + this.statsContainerItemTitle = globalScene.add.image(7, 4, getLocalizedSpriteKey("summary_stats_item_title")); // Pixel text 'ITEM' + this.statsContainerItemTitle.setOrigin(0, 0.5); + this.statsContainer.add(this.statsContainerItemTitle); + + this.statsContainerStatsTitle = globalScene.add.image( + 16, + 51, + getLocalizedSpriteKey("summary_stats_stats_title"), // Pixel text 'STATS' + ); + this.statsContainerStatsTitle.setOrigin(0, 0.5); + this.statsContainer.add(this.statsContainerStatsTitle); + + this.statsContainerExpTitle = globalScene.add.image(7, 107, getLocalizedSpriteKey("summary_stats_exp_title")); // Pixel text 'EXP.' + this.statsContainerExpTitle.setOrigin(0, 0.5); + this.statsContainer.add(this.statsContainerExpTitle); + + this.statsContainerExpBarTitle = globalScene.add.image( + 126, + 144, + getLocalizedSpriteKey("summary_stats_expbar_title"), // Pixel mini text 'EXP' + ); + this.statsContainerExpBarTitle.setOrigin(0, 0); + this.statsContainer.add(this.statsContainerExpBarTitle); + PERMANENT_STATS.forEach((stat, s) => { const statName = i18next.t(getStatKey(stat)); const rowIndex = s % 3; @@ -1107,6 +1163,22 @@ export class SummaryUiHandler extends UiHandler { this.movesContainer = globalScene.add.container(5, -pageBg.height + 26); pageContainer.add(this.movesContainer); + this.movesContainerMovesTitle = globalScene.add.image( + 2, + -22, + getLocalizedSpriteKey("summary_moves_moves_title"), + ); // Pixel text 'MOVES' + this.movesContainerMovesTitle.setOrigin(0, 0.5); + this.movesContainer.add(this.movesContainerMovesTitle); + + this.movesContainerDescriptionsTitle = globalScene.add.image( + 2, + 78, + getLocalizedSpriteKey("summary_moves_descriptions_title"), + ); // Pixel text 'DESCRIPTIONS' + this.movesContainerDescriptionsTitle.setOrigin(0, 0.5); + this.movesContainer.add(this.movesContainerDescriptionsTitle); + this.extraMoveRowContainer = globalScene.add.container(0, 64); this.extraMoveRowContainer.setVisible(false); this.movesContainer.add(this.extraMoveRowContainer); @@ -1136,8 +1208,8 @@ export class SummaryUiHandler extends UiHandler { newMoveTypeIcon.setOrigin(0, 1); this.extraMoveRowContainer.add(newMoveTypeIcon); } - const ppOverlay = globalScene.add.image(163, -1, "summary_moves_overlay_pp"); - ppOverlay.setOrigin(0, 1); + const ppOverlay = globalScene.add.image(172, -5, getLocalizedSpriteKey("summary_moves_overlay_pp")); // Pixel text 'PP' + ppOverlay.setOrigin(1, 0.5); this.extraMoveRowContainer.add(ppOverlay); const pp = padInt(this.newMove?.pp!, 2, " "); // TODO: is this bang correct? @@ -1167,8 +1239,8 @@ export class SummaryUiHandler extends UiHandler { moveText.setOrigin(0, 1); moveRowContainer.add(moveText); - const ppOverlay = globalScene.add.image(163, -1, "summary_moves_overlay_pp"); - ppOverlay.setOrigin(0, 1); + const ppOverlay = globalScene.add.image(172, -5, getLocalizedSpriteKey("summary_moves_overlay_pp")); // Pixel text 'PP' + ppOverlay.setOrigin(1, 0.5); moveRowContainer.add(ppOverlay); const ppText = addTextObject(173, 1, "--/--", TextStyle.WINDOW); From 848c1f01e0fb3d241fae33e8974a82efb3f7b924 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 2 Sep 2025 11:14:55 -0500 Subject: [PATCH 075/134] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 574beb80466..b7aebd879d2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.10.6", + "version": "1.10.7", "type": "module", "scripts": { "start": "vite", From 9fc31350f895a497559a5b1bbfe800156e73386f Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Wed, 3 Sep 2025 04:07:40 +0200 Subject: [PATCH 076/134] [Bug] Fix monotype selector image (#6471) --- src/data/challenge.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index cea8661e78c..11adec79203 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -764,7 +764,7 @@ export class SingleTypeChallenge extends Challenge { } getValue(overrideValue: number = this.value): string { - return i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[overrideValue - 1])}`); + return PokemonType[overrideValue - 1].toLowerCase(); } getDescription(overrideValue: number = this.value): string { From 4a2877392985a84496fcab1b217494750f61fe18 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 2 Sep 2025 21:44:43 -0500 Subject: [PATCH 077/134] [Bug] [Move] Fix poltergeist crash when no remaining enemies (#6473) * fix: poltergeist crash with no target * fix: adjust move phase history --- src/data/moves/move.ts | 3 ++ src/phases/move-phase.ts | 39 ++++++++++++++++---------- test/moves/poltergeist.test.ts | 50 ++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 test/moves/poltergeist.test.ts diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 5a22b352e73..1c64b28fa75 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -8164,6 +8164,9 @@ const failIfGhostTypeCondition: MoveConditionFunc = (user: Pokemon, target: Poke const failIfNoTargetHeldItemsCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.getHeldItems().filter(i => i.isTransferable)?.length > 0; const attackedByItemMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { + if (isNullOrUndefined(target)) { // Fix bug when used against targets that have both fainted + return ""; + } const heldItems = target.getHeldItems().filter(i => i.isTransferable); if (heldItems.length === 0) { return ""; diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 9a8e509e302..dd73227a4a8 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -24,6 +24,7 @@ import { applyMoveAttrs } from "#moves/apply-attrs"; import { frenzyMissFunc } from "#moves/move-utils"; import type { PokemonMove } from "#moves/pokemon-move"; import { BattlePhase } from "#phases/battle-phase"; +import type { TurnMove } from "#types/turn-move"; import { NumberHolder } from "#utils/common"; import { enumValueToKey } from "#utils/enums"; import i18next from "i18next"; @@ -41,6 +42,13 @@ export class MovePhase extends BattlePhase { /** Whether the current move should fail and retain PP. */ protected cancelled = false; + /** The move history entry object that is pushed to the pokemon's move history + * + * @remarks + * Can be edited _after_ being pushed to the history to adjust the result, targets, etc, for this move phase. + */ + protected moveHistoryEntry: TurnMove; + public get pokemon(): Pokemon { return this._pokemon; } @@ -82,6 +90,11 @@ export class MovePhase extends BattlePhase { this.move = move; this.useMode = useMode; this.forcedLast = forcedLast; + this.moveHistoryEntry = { + move: MoveId.NONE, + targets, + useMode, + }; } /** @@ -410,13 +423,9 @@ export class MovePhase extends BattlePhase { if (showText) { this.showMoveText(); } - - this.pokemon.pushMoveHistory({ - move: this.move.moveId, - targets: this.targets, - result: MoveResult.FAIL, - useMode: this.useMode, - }); + const moveHistoryEntry = this.moveHistoryEntry; + moveHistoryEntry.result = MoveResult.FAIL; + this.pokemon.pushMoveHistory(moveHistoryEntry); // Use move-specific failure messages if present before checking terrain/weather blockage // and falling back to the classic "But it failed!". @@ -630,12 +639,9 @@ export class MovePhase extends BattlePhase { frenzyMissFunc(this.pokemon, this.move.getMove()); } - this.pokemon.pushMoveHistory({ - move: MoveId.NONE, - result: MoveResult.FAIL, - targets: this.targets, - useMode: this.useMode, - }); + const moveHistoryEntry = this.moveHistoryEntry; + moveHistoryEntry.result = MoveResult.FAIL; + this.pokemon.pushMoveHistory(moveHistoryEntry); this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); this.pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); @@ -649,13 +655,16 @@ export class MovePhase extends BattlePhase { * Displays the move's usage text to the player as applicable for the move being used. */ public showMoveText(): void { + const moveId = this.move.moveId; if ( - this.move.moveId === MoveId.NONE || + moveId === MoveId.NONE || this.pokemon.getTag(BattlerTagType.RECHARGING) || this.pokemon.getTag(BattlerTagType.INTERRUPTED) ) { return; } + // Showing move text always adjusts the move history entry's move id + this.moveHistoryEntry.move = moveId; // TODO: This should be done by the move... globalScene.phaseManager.queueMessage( @@ -668,7 +677,7 @@ export class MovePhase extends BattlePhase { // Moves with pre-use messages (Magnitude, Chilly Reception, Fickle Beam, etc.) always display their messages even on failure // TODO: This assumes single target for message funcs - is this sustainable? - applyMoveAttrs("PreMoveMessageAttr", this.pokemon, this.pokemon.getOpponents(false)[0], this.move.getMove()); + applyMoveAttrs("PreMoveMessageAttr", this.pokemon, this.getActiveTargetPokemon()[0], this.move.getMove()); } /** diff --git a/test/moves/poltergeist.test.ts b/test/moves/poltergeist.test.ts new file mode 100644 index 00000000000..3e603702416 --- /dev/null +++ b/test/moves/poltergeist.test.ts @@ -0,0 +1,50 @@ +import { AbilityId } from "#enums/ability-id"; +import { BattlerIndex } from "#enums/battler-index"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Move - Poltergeist", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(AbilityId.BALL_FETCH) + .battleStyle("single") + .criticalHits(false) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should not crash when used after both opponents have fainted", async () => { + game.override.battleStyle("double").enemyLevel(5); + await game.classicMode.startBattle([SpeciesId.STARYU, SpeciesId.SLOWPOKE]); + + game.move.use(MoveId.DAZZLING_GLEAM); + game.move.use(MoveId.POLTERGEIST, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); + const [_, poltergeistUser] = game.scene.getPlayerField(); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.toEndOfTurn(); + // Expect poltergeist to have failed + expect(poltergeistUser).toHaveUsedMove({ move: MoveId.POLTERGEIST, result: MoveResult.FAIL }); + // If the test makes it to the end of turn, no crash occurred. Nothing to assert + }); +}); From 317e45ec7554e6f5e4a1313845d8368980a91fcd Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 2 Sep 2025 19:49:45 -0700 Subject: [PATCH 078/134] [Dev] Simplify `isLocal` and add `start:prod`/`start:beta` (#6470) - The constant `isLocal` now checks to see if `import.meta.env.MODE` is `"development"` (which it is when running via `pnpm start:dev`) instead of checking what URL is being used to access the client (e.g. `"localhost"` or an IP address) - Remove `start` from `package.json` and replace it with `start:prod` (which runs `vite --mode production`) and `start:beta` (which runs `vite --mode beta`) `start:prod` -> `isBeta` and `isLocal` are both `false` `start:beta` -> `isBeta` is `true` and `isLocal` is `false` `start:dev` -> `isBeta` is `false` and `isLocal` is `true` - Remove obsolete/unused `localServerUrl` and `apiUrl` constants --- package.json | 3 ++- src/utils/common.ts | 22 ++++------------------ src/utils/utility-vars.ts | 5 ++++- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 574beb80466..38386c3d964 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "version": "1.10.6", "type": "module", "scripts": { - "start": "vite", + "start:prod": "vite --mode production", + "start:beta": "vite --mode beta", "start:dev": "vite --mode development", "build": "vite build", "build:beta": "vite build --mode beta", diff --git a/src/utils/common.ts b/src/utils/common.ts index aac1ef359e6..c8e28545046 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -276,25 +276,11 @@ export function executeIf(condition: boolean, promiseFunc: () => Promise): } export const sessionIdKey = "pokerogue_sessionId"; -// Check if the current hostname is 'localhost' or an IP address, and ensure a port is specified -export const isLocal = - ((window.location.hostname === "localhost" || /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(window.location.hostname)) && - window.location.port !== "") || - window.location.hostname === ""; -/** - * @deprecated Refer to [pokerogue-api.ts](./plugins/api/pokerogue-api.ts) instead - */ -export const localServerUrl = - import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port + 1}`; +/** `true` when run via `pnpm start:dev` (which runs `vite --mode development`) */ +export const isLocal = import.meta.env.MODE === "development"; -/** - * Set the server URL based on whether it's local or not - * - * @deprecated Refer to [pokerogue-api.ts](./plugins/api/pokerogue-api.ts) instead - */ -export const apiUrl = localServerUrl ?? "https://api.pokerogue.net"; -// used to disable api calls when isLocal is true and a server is not found +/** Used to disable api calls when isLocal is true and a server is not found */ export let isLocalServerConnected = true; /** @@ -302,7 +288,7 @@ export let isLocalServerConnected = true; * with a GET request to verify if a server is running, * sets isLocalServerConnected based on results */ -export async function localPing() { +export async function localPing(): Promise { if (isLocal) { const titleStats = await pokerogueApi.getGameTitleStats(); isLocalServerConnected = !!titleStats; diff --git a/src/utils/utility-vars.ts b/src/utils/utility-vars.ts index 081f70164c8..1f8eca00650 100644 --- a/src/utils/utility-vars.ts +++ b/src/utils/utility-vars.ts @@ -1 +1,4 @@ -export const isBeta = import.meta.env.MODE === "beta"; // this checks to see if the env mode is development. Technically this gives the same value for beta AND for dev envs +// TODO: move this (and other global constants) to `src/constants/*-constants.ts` + +/** `true` if running on `beta.pokerogue.net` or via `pnpm start:beta` (which runs `vite --mode beta`) */ +export const isBeta = import.meta.env.MODE === "beta"; From 1a06010820f57ccb88f4ded8d0939b5582788a98 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 3 Sep 2025 19:17:19 +0200 Subject: [PATCH 079/134] [UI/UX][Refactor] Remove redundant references to globalScene.uiTheme (#6472) Removed most references to globalScene.uiTheme --- .../encounters/training-session-encounter.ts | 2 +- .../utils/encounter-dialogue-utils.ts | 5 +- src/data/nature.ts | 4 +- src/phases/scan-ivs-phase.ts | 5 +- src/ui/abstract-option-select-ui-handler.ts | 10 ++-- src/ui/admin-ui-handler.ts | 9 ++-- src/ui/ball-ui-handler.ts | 2 +- src/ui/battle-info/battle-info.ts | 3 +- src/ui/battle-info/enemy-battle-info.ts | 7 +-- src/ui/battle-message-ui-handler.ts | 5 +- src/ui/egg-gacha-ui-handler.ts | 2 +- src/ui/fight-ui-handler.ts | 4 +- src/ui/filter-bar.ts | 4 +- src/ui/filter-text.ts | 4 +- src/ui/form-modal-ui-handler.ts | 6 +-- src/ui/menu-ui-handler.ts | 2 +- src/ui/modifier-select-ui-handler.ts | 14 +++--- src/ui/pokedex-page-ui-handler.ts | 24 ++++------ src/ui/pokedex-ui-handler.ts | 9 ++-- src/ui/pokemon-info-container.ts | 42 ++++++++--------- src/ui/run-info-ui-handler.ts | 2 +- .../settings/abstract-binding-ui-handler.ts | 18 +++---- .../abstract-control-settings-ui-handler.ts | 10 ++-- .../settings/abstract-settings-ui-handler.ts | 10 ++-- src/ui/starter-select-ui-handler.ts | 37 +++++++-------- src/ui/stats-container.ts | 4 +- src/ui/summary-ui-handler.ts | 6 +-- src/ui/text.ts | 47 +++++-------------- src/ui/ui-handler.ts | 6 --- src/ui/ui-theme.ts | 20 ++++++-- 30 files changed, 148 insertions(+), 175 deletions(-) diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index b8173aa5fed..02e7a5c5575 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -188,7 +188,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde // Return the options for nature selection return getEnumValues(Nature).map((nature: Nature) => { const option: OptionSelectItem = { - label: getNatureName(nature, true, true, true, globalScene.uiTheme), + label: getNatureName(nature, true, true, true), handler: () => { // Pokemon and second option selected encounter.setDialogueToken("nature", getNatureName(nature)); diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index 54179ee2604..1a9b008f9e9 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -1,6 +1,5 @@ import { globalScene } from "#app/global-scene"; import type { TextStyle } from "#enums/text-style"; -import { UiTheme } from "#enums/ui-theme"; import { getTextWithColors } from "#ui/text"; import { isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; @@ -16,14 +15,12 @@ export function getEncounterText(keyOrString?: string, primaryStyle?: TextStyle) return null; } - const uiTheme = globalScene.uiTheme ?? UiTheme.DEFAULT; - let textString: string | null = getTextWithDialogueTokens(keyOrString); // Can only color the text if a Primary Style is defined // primaryStyle is applied to all text that does not have its own specified style if (primaryStyle && textString) { - textString = getTextWithColors(textString, primaryStyle, uiTheme, true); + textString = getTextWithColors(textString, primaryStyle, true); } return textString; diff --git a/src/data/nature.ts b/src/data/nature.ts index 65e401cd288..116732d60b3 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -1,7 +1,6 @@ import { Nature } from "#enums/nature"; import { EFFECTIVE_STATS, getShortenedStatKey, Stat } from "#enums/stat"; import { TextStyle } from "#enums/text-style"; -import { UiTheme } from "#enums/ui-theme"; import { getBBCodeFrag } from "#ui/text"; import { toCamelCase } from "#utils/strings"; import i18next from "i18next"; @@ -11,7 +10,6 @@ export function getNatureName( includeStatEffects = false, forStarterSelect = false, ignoreBBCode = false, - uiTheme: UiTheme = UiTheme.DEFAULT, ): string { let ret = toCamelCase(Nature[nature]); //Translating nature @@ -31,7 +29,7 @@ export function getNatureName( } const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW; const getTextFrag = !ignoreBBCode - ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) + ? (text: string, style: TextStyle) => getBBCodeFrag(text, style) : (text: string, _style: TextStyle) => text; if (increasedStat && decreasedStat) { ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`; diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index eebee28bfbb..38b39b310e1 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -24,7 +24,6 @@ export class ScanIvsPhase extends PokemonPhase { let statsContainer: Phaser.GameObjects.Sprite[] = []; let statsContainerLabels: Phaser.GameObjects.Sprite[] = []; const enemyField = globalScene.getEnemyField(); - const uiTheme = globalScene.uiTheme; // Assuming uiTheme is accessible for (let e = 0; e < enemyField.length; e++) { enemyIvs = enemyField[e].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists @@ -36,8 +35,8 @@ export class ScanIvsPhase extends PokemonPhase { if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) { const hexColour = enemyIvs[ivStat] === 31 - ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) - : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); + ? getTextColor(TextStyle.PERFECT_IV, false) + : getTextColor(TextStyle.SUMMARY_GREEN, false); const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; statsContainerLabels[s].setTint(hexTextColour); } diff --git a/src/ui/abstract-option-select-ui-handler.ts b/src/ui/abstract-option-select-ui-handler.ts index b7279bc2d30..914dfca6ef3 100644 --- a/src/ui/abstract-option-select-ui-handler.ts +++ b/src/ui/abstract-option-select-ui-handler.ts @@ -81,7 +81,7 @@ export abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectIcons = []; - this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW).scale; this.setCursor(0); } @@ -124,8 +124,8 @@ export abstract class AbstractOptionSelectUiHandler extends UiHandler { optionsForWidth .map(o => o.item - ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` - : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]`, + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false)}]${o.label}[/color][/shadow]`, ) .join("\n"), TextStyle.WINDOW, @@ -149,8 +149,8 @@ export abstract class AbstractOptionSelectUiHandler extends UiHandler { 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]`, + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false)}]${o.label}[/color][/shadow]`, ) .join("\n"); this.optionSelectText.setText(this.textContent); diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index e577368363d..3af34f14e2d 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -7,6 +7,7 @@ import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; import { toTitleCase } from "#utils/strings"; +import { getTextColor } from "./text"; type AdminUiHandlerService = "discord" | "google"; type AdminUiHandlerServiceMode = "Link" | "Unlink"; @@ -129,11 +130,11 @@ export class AdminUiHandler extends FormModalUiHandler { this.errorMessage.setPosition(10, (hasTitle ? 31 : 5) + 20 * (fields.length - 1) + 16 + this.getButtonTopMargin()); // sets the position of the message dynamically if (isMessageError) { - this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); - this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); + this.errorMessage.setColor(getTextColor(TextStyle.SUMMARY_PINK)); + this.errorMessage.setShadowColor(getTextColor(TextStyle.SUMMARY_PINK, true)); } else { - this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_GREEN)); - this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_GREEN, true)); + this.errorMessage.setColor(getTextColor(TextStyle.SUMMARY_GREEN)); + this.errorMessage.setShadowColor(getTextColor(TextStyle.SUMMARY_GREEN, true)); } if (super.show(args)) { diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 99dabd893df..3d8efca96b8 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -26,7 +26,7 @@ export class BallUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW).scale; let optionsTextContent = ""; diff --git a/src/ui/battle-info/battle-info.ts b/src/ui/battle-info/battle-info.ts index 1641585a603..4d2cf597ed2 100644 --- a/src/ui/battle-info/battle-info.ts +++ b/src/ui/battle-info/battle-info.ts @@ -5,6 +5,7 @@ import { PokemonType } from "#enums/pokemon-type"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import { TextStyle } from "#enums/text-style"; +import { UiTheme } from "#enums/ui-theme"; import type { Pokemon } from "#field/pokemon"; import { getVariantTint } from "#sprites/variant"; import { addTextObject } from "#ui/text"; @@ -265,7 +266,7 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { this.add(this.hpBar); this.levelNumbersContainer = globalScene.add - .container(9.5, globalScene.uiTheme ? 0 : -0.5) + .container(9.5, globalScene.uiTheme === UiTheme.LEGACY ? 0 : -0.5) .setName("container_level"); this.levelContainer.add(this.levelNumbersContainer); diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 7a2af017219..0feb314a2e7 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import { Stat } from "#enums/stat"; import { TextStyle } from "#enums/text-style"; +import { UiTheme } from "#enums/ui-theme"; import type { EnemyPokemon } from "#field/pokemon"; import { BattleFlyout } from "#ui/battle-flyout"; import type { BattleInfoParamList } from "#ui/battle-info"; @@ -203,7 +204,7 @@ export class EnemyBattleInfo extends BattleInfo { } if (this.boss && this.bossSegments > 1) { - const uiTheme = globalScene.uiTheme; + const isLegacyUiTheme = globalScene.uiTheme === UiTheme.LEGACY; const maxHp = pokemon.getMaxHp(); for (let s = 1; s < this.bossSegments; s++) { const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; @@ -211,14 +212,14 @@ export class EnemyBattleInfo extends BattleInfo { 0, 0, 1, - this.hpBar.height - (uiTheme ? 0 : 1), + this.hpBar.height - (isLegacyUiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xffffff : 0x404040, ); divider.setOrigin(0.5, 0).setName("hpBar_divider_" + s.toString()); this.add(divider); this.moveBelow(divider as Phaser.GameObjects.GameObject, this.statsContainer); - divider.setPositionRelative(this.hpBar, dividerX, uiTheme ? 0 : 1); + divider.setPositionRelative(this.hpBar, dividerX, isLegacyUiTheme ? 0 : 1); this.hpBarSegmentDividers.push(divider); } } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 2ecca06172b..bf4360b37bf 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -245,7 +245,6 @@ export class BattleMessageUiHandler extends MessageUiHandler { getIvDescriptor(value: number, typeIv: number, pokemonId: number): string { const starterSpecies = globalScene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists const starterIvs: number[] = globalScene.gameData.dexData[starterSpecies].ivs; - const uiTheme = globalScene.uiTheme; // Assuming uiTheme is accessible // Function to wrap text in color based on comparison const coloredText = (text: string, isBetter: boolean, ivValue) => { @@ -259,8 +258,8 @@ export class BattleMessageUiHandler extends MessageUiHandler { } else { textStyle = TextStyle.WINDOW; } - const color = getTextColor(textStyle, false, uiTheme); - return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; + const color = getTextColor(textStyle, false); + return `[color=${color}][shadow=${getTextColor(textStyle, true)}]${text}[/shadow][/color]`; }; if (value > 30) { diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index e54ee445aee..d94ddcd6ee5 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -170,7 +170,7 @@ export class EggGachaUiHandler extends MessageUiHandler { setup() { this.gachaCursor = 0; - this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW).scale; const ui = this.getUi(); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 1d856079939..d1b85a29b14 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -13,7 +13,7 @@ import type { EnemyPokemon, Pokemon } from "#field/pokemon"; import type { PokemonMove } from "#moves/pokemon-move"; import type { CommandPhase } from "#phases/command-phase"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; -import { addTextObject } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { fixedInt, getLocalizedSpriteKey, padInt } from "#utils/common"; import i18next from "i18next"; @@ -284,7 +284,7 @@ export class FightUiHandler extends UiHandler implements InfoToggle { const ppColorStyle = FightUiHandler.ppRatioToColor(pp / maxPP); // Changes the text color and shadow according to the determined TextStyle - this.ppText.setColor(this.getTextColor(ppColorStyle, false)).setShadowColor(this.getTextColor(ppColorStyle, true)); + this.ppText.setColor(getTextColor(ppColorStyle, false)).setShadowColor(getTextColor(ppColorStyle, true)); this.moveInfoOverlay.show(pokemonMove.getMove()); pokemon.getOpponents().forEach(opponent => { diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index ea227655a97..f33c2902295 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -97,9 +97,9 @@ export class FilterBar extends Phaser.GameObjects.Container { updateFilterLabels(): void { for (let i = 0; i < this.numFilters; i++) { if (this.dropDowns[i].hasDefaultValues()) { - this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false)); } else { - this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false)); } } } diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index d5809292c25..c9849469d5d 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -167,9 +167,9 @@ export class FilterText extends Phaser.GameObjects.Container { updateFilterLabels(): void { for (let i = 0; i < this.numFilters; i++) { if (this.selections[i].text === this.defaultText) { - this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false)); } else { - this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false)); } } } diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 5c547465de9..092a0c85bb2 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -4,7 +4,7 @@ import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import type { ModalConfig } from "#ui/modal-ui-handler"; import { ModalUiHandler } from "#ui/modal-ui-handler"; -import { addTextInputObject, addTextObject } from "#ui/text"; +import { addTextInputObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { fixedInt } from "#utils/common"; import type InputText from "phaser3-rex-plugins/plugins/inputtext"; @@ -78,8 +78,8 @@ export abstract class FormModalUiHandler extends ModalUiHandler { wordWrap: { width: 850 }, }, ); - this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); - this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); + this.errorMessage.setColor(getTextColor(TextStyle.SUMMARY_PINK)); + this.errorMessage.setShadowColor(getTextColor(TextStyle.SUMMARY_PINK, true)); this.errorMessage.setVisible(false); this.modalContainer.add(this.errorMessage); } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 4f6d6ede488..bed7e573161 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -145,7 +145,7 @@ export class MenuUiHandler extends MessageUiHandler { ); this.optionSelectText.setLineSpacing(12); - this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW).scale; this.menuBg = addWindow( globalScene.scaledCanvas.width - (this.optionSelectText.displayWidth + 25), 0, diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index a070b522050..9ddc892add6 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -65,7 +65,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); - const styleOptions = getTextStyleOptions(TextStyle.PARTY, globalScene.uiTheme).styleOptions; + const styleOptions = getTextStyleOptions(TextStyle.PARTY).styleOptions; if (context) { context.font = styleOptions.fontSize + "px " + styleOptions.fontFamily; @@ -686,14 +686,14 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { const formattedMoney = formatMoney(globalScene.moneyFormat, this.rerollCost); this.rerollCostText.setText(i18next.t("modifierSelectUiHandler:rerollCost", { formattedMoney })); - this.rerollCostText.setColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED)); - this.rerollCostText.setShadowColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED, true)); + this.rerollCostText.setColor(getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED)); + this.rerollCostText.setShadowColor(getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED, true)); } updateLockRaritiesText(): void { const textStyle = globalScene.lockModifierTiers ? TextStyle.SUMMARY_BLUE : TextStyle.PARTY; - this.lockRarityButtonText.setColor(this.getTextColor(textStyle)); - this.lockRarityButtonText.setShadowColor(this.getTextColor(textStyle, true)); + this.lockRarityButtonText.setColor(getTextColor(textStyle)); + this.lockRarityButtonText.setShadowColor(getTextColor(textStyle, true)); } clear() { @@ -1042,7 +1042,7 @@ class ModifierOption extends Phaser.GameObjects.Container { const formattedMoney = formatMoney(globalScene.moneyFormat, cost); this.itemCostText.setText(i18next.t("modifierSelectUiHandler:itemCost", { formattedMoney })); - this.itemCostText.setColor(getTextColor(textStyle, false, globalScene.uiTheme)); - this.itemCostText.setShadowColor(getTextColor(textStyle, true, globalScene.uiTheme)); + this.itemCostText.setColor(getTextColor(textStyle, false)); + this.itemCostText.setShadowColor(getTextColor(textStyle, true)); } } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 50d86209165..64b0e9c456e 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -662,7 +662,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { i18next.t("pokedexUiHandler:showEvolutions"), ]; - this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW).scale; this.menuBg = addWindow( globalScene.scaledCanvas.width - 83, 0, @@ -767,16 +767,8 @@ export class PokedexPageUiHandler extends MessageUiHandler { !isSeen || (!isStarterCaught && (o === MenuOptions.TOGGLE_IVS || o === MenuOptions.NATURES)) || (this.tmMoves.length < 1 && o === MenuOptions.TM_MOVES); - const color = getTextColor( - isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, - false, - globalScene.uiTheme, - ); - const shadow = getTextColor( - isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, - true, - globalScene.uiTheme, - ); + const color = getTextColor(isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, false); + const shadow = getTextColor(isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, true); return `[shadow=${shadow}][color=${color}]${label}[/color][/shadow]`; }) .join("\n"); @@ -1789,7 +1781,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { options: natures .map((n: Nature, _i: number) => { const option: OptionSelectItem = { - label: getNatureName(n, true, true, true, globalScene.uiTheme), + label: getNatureName(n, true, true, true), handler: () => { return false; }, @@ -2517,10 +2509,10 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor( - this.getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, false), + getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, false), ); this.pokemonNumberText.setShadowColor( - this.getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, true), + getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, true), ); const assetLoadCancelled = new BooleanHolder(false); @@ -2728,8 +2720,8 @@ export class PokedexPageUiHandler extends MessageUiHandler { } } else { this.shinyOverlay.setVisible(false); - this.pokemonNumberText.setColor(this.getTextColor(TextStyle.SUMMARY)); - this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); + this.pokemonNumberText.setColor(getTextColor(TextStyle.SUMMARY)); + this.pokemonNumberText.setShadowColor(getTextColor(TextStyle.SUMMARY, true)); this.pokemonGenderText.setText(""); this.setTypeIcons(null, null); } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 01046bfef9c..046ca564709 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -28,6 +28,7 @@ import { PokemonType } from "#enums/pokemon-type"; import type { SpeciesId } from "#enums/species-id"; import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; +import { UiTheme } from "#enums/ui-theme"; import type { Variant } from "#sprites/variant"; import { getVariantIcon, getVariantTint } from "#sprites/variant"; import type { DexAttrProps, StarterAttributes } from "#system/game-data"; @@ -41,7 +42,7 @@ import { MessageUiHandler } from "#ui/message-ui-handler"; import { PokedexMonContainer } from "#ui/pokedex-mon-container"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; @@ -470,7 +471,7 @@ export class PokedexUiHandler extends MessageUiHandler { // Offset the generation filter dropdown to avoid covering the filtered pokemon this.filterBar.offsetHybridFilters(); - if (!globalScene.uiTheme) { + if (globalScene.uiTheme === UiTheme.DEFAULT) { pokemonContainerWindow.setVisible(false); } @@ -2314,8 +2315,8 @@ export class PokedexUiHandler extends MessageUiHandler { break; } if (baseStarterValue - starterValue > 0) { - starter.label.setColor(this.getTextColor(textStyle)); - starter.label.setShadowColor(this.getTextColor(textStyle, true)); + starter.label.setColor(getTextColor(textStyle)); + starter.label.setShadowColor(getTextColor(textStyle, true)); } } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 3b2349348a8..d232100ffaa 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -274,8 +274,8 @@ export class PokemonInfoContainer extends Phaser.GameObjects.Container { const newGender = BigInt(1 << pokemon.gender) * DexAttr.MALE; this.pokemonGenderNewText.setText("(+)"); - this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); this.pokemonGenderNewText.setVisible((newGender & caughtAttr) === BigInt(0)); } else { this.pokemonGenderNewText.setVisible(false); @@ -290,11 +290,11 @@ export class PokemonInfoContainer extends Phaser.GameObjects.Container { const newForm = BigInt(1 << pokemon.formIndex) * DexAttr.DEFAULT_FORM; if ((newForm & caughtAttr) === BigInt(0)) { - this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); } else { - this.pokemonFormLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); - this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.WINDOW, false)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true)); } this.pokemonFormText.setText( @@ -320,31 +320,31 @@ export class PokemonInfoContainer extends Phaser.GameObjects.Container { const abilityTextStyle = pokemon.abilityIndex === 2 ? TextStyle.MONEY : TextStyle.WINDOW; this.pokemonAbilityText.setText(pokemon.getAbility(true).name); - this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, globalScene.uiTheme)); - this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, globalScene.uiTheme)); + this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false)); + this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true)); // Check if the player owns ability for the root form const playerOwnsThisAbility = pokemon.checkIfPlayerHasAbilityOfStarter(starterEntry.abilityAttr); if (!playerOwnsThisAbility) { - this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); } else { - this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); - this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.WINDOW, false)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true)); } - this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, globalScene.uiTheme)); + this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false)); const dexNatures = dexEntry.natureAttr; const newNature = 1 << (pokemon.nature + 1); if (!(dexNatures & newNature)) { - this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); } else { - this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); - this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.WINDOW, false)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true)); } const isFusion = pokemon.isFusion(); @@ -373,16 +373,16 @@ export class PokemonInfoContainer extends Phaser.GameObjects.Container { const newVariant = BigInt(1 << (pokemon.variant + 4)); this.pokemonShinyNewIcon.setText("(+)"); - this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); const newShinyOrVariant = (newShiny & caughtAttr) === BigInt(0) || (newVariant & caughtAttr) === BigInt(0); this.pokemonShinyNewIcon.setVisible(!!newShinyOrVariant); } else if ((caughtAttr & DexAttr.NON_SHINY) === BigInt(0) && (caughtAttr & DexAttr.SHINY) === DexAttr.SHINY) { //If the player has *only* caught any shiny variant of this species, not a non-shiny this.pokemonShinyNewIcon.setVisible(true); this.pokemonShinyNewIcon.setText("(+)"); - this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); - this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); + this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true)); } else { this.pokemonShinyNewIcon.setVisible(false); } diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 5fc0f37c72d..8b2190c3b4a 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -618,7 +618,7 @@ export class RunInfoUiHandler extends UiHandler { const runTime = getPlayTimeString(this.runInfo.playTime); runInfoText.appendText(`${i18next.t("runHistory:runLength")}: ${runTime}`, false); const runMoney = formatMoney(globalScene.moneyFormat, this.runInfo.money); - const moneyTextColor = getTextColor(TextStyle.MONEY_WINDOW, false, globalScene.uiTheme); + const moneyTextColor = getTextColor(TextStyle.MONEY_WINDOW, false); runInfoText.appendText( `[color=${moneyTextColor}]${i18next.t("battleScene:moneyOwned", { formattedMoney: runMoney })}[/color]`, ); diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 2c8d0eb63ba..6b747a10d2b 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -3,7 +3,7 @@ import { Button } from "#enums/buttons"; import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { NavigationManager } from "#ui/navigation-menu"; -import { addTextObject } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; @@ -222,16 +222,16 @@ export abstract class AbstractBindingUiHandler extends UiHandler { setCursor(cursor: number): boolean { this.cursor = cursor; if (cursor === 1) { - this.actionLabel.setColor(this.getTextColor(TextStyle.SETTINGS_SELECTED)); - this.actionLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); - this.cancelLabel.setColor(this.getTextColor(TextStyle.WINDOW)); - this.cancelLabel.setShadowColor(this.getTextColor(TextStyle.WINDOW, true)); + this.actionLabel.setColor(getTextColor(TextStyle.SETTINGS_SELECTED)); + this.actionLabel.setShadowColor(getTextColor(TextStyle.SETTINGS_SELECTED, true)); + this.cancelLabel.setColor(getTextColor(TextStyle.WINDOW)); + this.cancelLabel.setShadowColor(getTextColor(TextStyle.WINDOW, true)); return true; } - this.actionLabel.setColor(this.getTextColor(TextStyle.WINDOW)); - this.actionLabel.setShadowColor(this.getTextColor(TextStyle.WINDOW, true)); - this.cancelLabel.setColor(this.getTextColor(TextStyle.SETTINGS_SELECTED)); - this.cancelLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); + this.actionLabel.setColor(getTextColor(TextStyle.WINDOW)); + this.actionLabel.setShadowColor(getTextColor(TextStyle.WINDOW, true)); + this.cancelLabel.setColor(getTextColor(TextStyle.SETTINGS_SELECTED)); + this.cancelLabel.setShadowColor(getTextColor(TextStyle.SETTINGS_SELECTED, true)); return true; } diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index b40676fc97c..c08f1570b75 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -7,7 +7,7 @@ import type { UiMode } from "#enums/ui-mode"; import { getIconWithSettingName } from "#inputs/config-handler"; import { NavigationManager, NavigationMenu } from "#ui/navigation-menu"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import { toCamelCase } from "#utils/strings"; @@ -653,16 +653,16 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { if (!this.bindingSettings.includes(setting) && !setting.includes("BUTTON_")) { // Get the label of the last selected option and revert its color to the default. const lastValueLabel = this.optionValueLabels[settingIndex][lastCursor]; - lastValueLabel.setColor(this.getTextColor(TextStyle.WINDOW)); - lastValueLabel.setShadowColor(this.getTextColor(TextStyle.WINDOW, true)); + lastValueLabel.setColor(getTextColor(TextStyle.WINDOW)); + lastValueLabel.setShadowColor(getTextColor(TextStyle.WINDOW, true)); // Update the cursor for the setting to the new position. this.optionCursors[settingIndex] = cursor; // Change the color of the new selected option to indicate it's selected. const newValueLabel = this.optionValueLabels[settingIndex][cursor]; - newValueLabel.setColor(this.getTextColor(TextStyle.SETTINGS_SELECTED)); - newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); + newValueLabel.setColor(getTextColor(TextStyle.SETTINGS_SELECTED)); + newValueLabel.setShadowColor(getTextColor(TextStyle.SETTINGS_SELECTED, true)); } // If the save flag is set, save the setting to local storage diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 91d5aec984a..ae1bb40dbeb 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -8,7 +8,7 @@ import type { InputsIcons } from "#ui/abstract-control-settings-ui-handler"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { NavigationManager, NavigationMenu } from "#ui/navigation-menu"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; @@ -403,14 +403,14 @@ export class AbstractSettingsUiHandler extends MessageUiHandler { const lastCursor = this.optionCursors[settingIndex]; const lastValueLabel = this.optionValueLabels[settingIndex][lastCursor]; - lastValueLabel.setColor(this.getTextColor(TextStyle.SETTINGS_VALUE)); - lastValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_VALUE, true)); + lastValueLabel.setColor(getTextColor(TextStyle.SETTINGS_VALUE)); + lastValueLabel.setShadowColor(getTextColor(TextStyle.SETTINGS_VALUE, true)); this.optionCursors[settingIndex] = cursor; const newValueLabel = this.optionValueLabels[settingIndex][cursor]; - newValueLabel.setColor(this.getTextColor(TextStyle.SETTINGS_SELECTED)); - newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); + newValueLabel.setColor(getTextColor(TextStyle.SETTINGS_SELECTED)); + newValueLabel.setShadowColor(getTextColor(TextStyle.SETTINGS_SELECTED, true)); if (save) { const saveSetting = () => { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 8fce287c897..b27cc0af709 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -40,6 +40,7 @@ import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; +import { UiTheme } from "#enums/ui-theme"; import type { CandyUpgradeNotificationChangedEvent } from "#events/battle-scene"; import { BattleSceneEventType } from "#events/battle-scene"; import type { Variant } from "#sprites/variant"; @@ -58,7 +59,7 @@ import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-an import { ScrollBar } from "#ui/scroll-bar"; import { StarterContainer } from "#ui/starter-container"; import { StatsContainer } from "#ui/stats-container"; -import { addBBCodeTextObject, addTextObject } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { applyChallenges, checkStarterValidForChallenge } from "#utils/challenge-utils"; import { @@ -599,7 +600,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { // Offset the generation filter dropdown to avoid covering the filtered pokemon this.filterBar.offsetHybridFilters(); - if (!globalScene.uiTheme) { + if (globalScene.uiTheme === UiTheme.DEFAULT) { starterContainerWindow.setVisible(false); } @@ -2065,7 +2066,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { options: natures .map((n: Nature, _i: number) => { const option: OptionSelectItem = { - label: getNatureName(n, true, true, true, globalScene.uiTheme), + label: getNatureName(n, true, true, true), handler: () => { starterAttributes.nature = n; originalStarterAttributes.nature = starterAttributes.nature; @@ -3909,10 +3910,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor( - this.getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, false), + getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, false), ); this.pokemonNumberText.setShadowColor( - this.getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, true), + getTextColor(shiny ? TextStyle.SUMMARY_DEX_NUM_GOLD : TextStyle.SUMMARY_DEX_NUM, true), ); if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { @@ -4021,8 +4022,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); this.pokemonAbilityText .setText(ability.name) - .setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)) - .setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true)); + .setColor(getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)) + .setShadowColor(getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true)); const passiveAttr = starterDataEntry.passiveAttr; const passiveAbility = allAbilities[this.lastSpecies.getPassiveAbility(formIndex)]; @@ -4051,14 +4052,14 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveLabelText .setVisible(!isFreshStartChallenge) - .setColor(this.getTextColor(TextStyle.SUMMARY_ALT)) - .setShadowColor(this.getTextColor(TextStyle.SUMMARY_ALT, true)); + .setColor(getTextColor(TextStyle.SUMMARY_ALT)) + .setShadowColor(getTextColor(TextStyle.SUMMARY_ALT, true)); this.pokemonPassiveText .setVisible(!isFreshStartChallenge) .setText(passiveAbility.name) - .setColor(this.getTextColor(textStyle)) + .setColor(getTextColor(textStyle)) .setAlpha(textAlpha) - .setShadowColor(this.getTextColor(textStyle, true)); + .setShadowColor(getTextColor(textStyle, true)); if (this.activeTooltip === "PASSIVE") { globalScene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`); @@ -4090,9 +4091,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.ui.hideTooltip(); } - this.pokemonNatureText.setText( - getNatureName(natureIndex as unknown as Nature, true, true, false, globalScene.uiTheme), - ); + this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false)); let levelMoves: LevelMoves; if ( @@ -4159,8 +4158,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { } else { this.shinyOverlay.setVisible(false); this.pokemonNumberText - .setColor(this.getTextColor(TextStyle.SUMMARY)) - .setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); + .setColor(getTextColor(TextStyle.SUMMARY)) + .setShadowColor(getTextColor(TextStyle.SUMMARY, true)); this.pokemonGenderText.setText(""); this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); @@ -4302,7 +4301,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { textStyle = TextStyle.SUMMARY_GOLD; break; } - starter.label.setColor(this.getTextColor(textStyle)).setShadowColor(this.getTextColor(textStyle, true)); + starter.label.setColor(getTextColor(textStyle)).setShadowColor(getTextColor(textStyle, true)); } tryUpdateValue(add?: number, addingToParty?: boolean): boolean { @@ -4322,8 +4321,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { } this.valueLimitLabel .setText(`${newValueStr}/${valueLimit}`) - .setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)) - .setShadowColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); + .setColor(getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)) + .setShadowColor(getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); if (overLimit) { globalScene.time.delayedCall(fixedInt(500), () => this.tryUpdateValue()); return false; diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index e9af5eed3e3..f5221d38991 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -113,7 +113,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1], ]); const lastIvChartData = this.statsIvsCache || defaultIvChartData; - const perfectIVColor: string = getTextColor(TextStyle.SUMMARY_GOLD, false, globalScene.uiTheme); + const perfectIVColor: string = getTextColor(TextStyle.SUMMARY_GOLD, false); this.statsIvsCache = ivChartData.slice(0); this.ivStatValueTexts.map((t: BBCodeText, i: number) => { @@ -127,7 +127,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { } if (this.showDiff && originalIvs) { if (originalIvs[i] < ivs[i]) { - label += ` ([color=${getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)}][shadow=${getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)}]+${ivs[i] - originalIvs[i]}[/shadow][/color])`; + label += ` ([color=${getTextColor(TextStyle.SUMMARY_BLUE, false)}][shadow=${getTextColor(TextStyle.SUMMARY_BLUE, true)}]+${ivs[i] - originalIvs[i]}[/shadow][/color])`; } else { label += " (-)"; } diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 63111ee540a..f737411896e 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -25,7 +25,7 @@ import type { PokemonMove } from "#moves/pokemon-move"; import type { Variant } from "#sprites/variant"; import { getVariantTint } from "#sprites/variant"; import { achvs } from "#system/achv"; -import { addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getBBCodeFrag, getTextColor } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { fixedInt, @@ -361,9 +361,9 @@ export class SummaryUiHandler extends UiHandler { this.candyOverlay.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); this.numberText.setText(padInt(this.pokemon.species.speciesId, 4)); - this.numberText.setColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD)); + this.numberText.setColor(getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD)); this.numberText.setShadowColor( - this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true), + getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true), ); const spriteKey = this.pokemon.getSpriteKey(true); try { diff --git a/src/ui/text.ts b/src/ui/text.ts index bac53f81ba6..927f9f08bb2 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -16,11 +16,7 @@ export function addTextObject( style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, ): Phaser.GameObjects.Text { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( - style, - globalScene.uiTheme, - extraStyleOptions, - ); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, extraStyleOptions); const ret = globalScene.add .text(x, y, content, styleOptions) @@ -38,11 +34,7 @@ export function setTextStyle( style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, ) { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( - style, - globalScene.uiTheme, - extraStyleOptions, - ); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, extraStyleOptions); obj.setScale(scale).setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { obj.setLineSpacing(scale * 30); @@ -60,11 +52,7 @@ export function addBBCodeTextObject( style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, ): BBCodeText { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( - style, - globalScene.uiTheme, - extraStyleOptions, - ); + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, extraStyleOptions); const ret = new BBCodeText(globalScene, x, y, content, styleOptions as BBCodeText.TextStyle); globalScene.add.existing(ret); @@ -84,7 +72,7 @@ export function addTextInputObject( style: TextStyle, extraStyleOptions?: InputText.IConfig, ): InputText { - const { scale, styleOptions } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); + const { scale, styleOptions } = getTextStyleOptions(style, extraStyleOptions); const ret = globalScene.add.rexInputText(x, y, width, height, styleOptions as InputText.IConfig); ret.setScale(scale); @@ -94,7 +82,6 @@ export function addTextInputObject( export function getTextStyleOptions( style: TextStyle, - uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, ): TextStyleOptions { const lang = i18next.resolvedLanguage; @@ -106,7 +93,7 @@ export function getTextStyleOptions( let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { fontFamily: "emerald", fontSize: 96, - color: getTextColor(style, false, uiTheme), + color: getTextColor(style, false), padding: { bottom: 6, }, @@ -465,7 +452,7 @@ export function getTextStyleOptions( break; } - const shadowColor = getTextColor(style, true, uiTheme); + const shadowColor = getTextColor(style, true); if (extraStyleOptions) { if (extraStyleOptions.fontSize) { @@ -480,8 +467,8 @@ export function getTextStyleOptions( return { scale, styleOptions, shadowColor, shadowXpos, shadowYpos }; } -export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { - return `[color=${getTextColor(textStyle, false, uiTheme)}][shadow=${getTextColor(textStyle, true, uiTheme)}]${content}`; +export function getBBCodeFrag(content: string, textStyle: TextStyle): string { + return `[color=${getTextColor(textStyle, false)}][shadow=${getTextColor(textStyle, true)}]${content}`; } /** @@ -500,14 +487,9 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui * @param forWindow set to `true` if the text is to be displayed in a window ({@linkcode BattleScene.addWindow}) * it will replace all instances of the default MONEY TextStyle by {@linkcode TextStyle.MONEY_WINDOW} */ -export function getTextWithColors( - content: string, - primaryStyle: TextStyle, - uiTheme: UiTheme, - forWindow?: boolean, -): string { +export function getTextWithColors(content: string, primaryStyle: TextStyle, forWindow?: boolean): string { // Apply primary styling before anything else - let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; + let text = getBBCodeFrag(content, primaryStyle) + "[/color][/shadow]"; const primaryStyleString = [...text.match(new RegExp(/\[color=[^[]*\]\[shadow=[^[]*\]/i))!][0]; /* For money text displayed in game windows, we can't use the default {@linkcode TextStyle.MONEY} @@ -520,10 +502,7 @@ export function getTextWithColors( // Set custom colors text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (_substring, textStyle: string, textToColor: string) => { return ( - "[/color][/shadow]" + - getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + - "[/color][/shadow]" + - primaryStyleString + "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle]) + "[/color][/shadow]" + primaryStyleString ); }); @@ -532,8 +511,8 @@ export function getTextWithColors( } // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This is a giant switch which is the best option. -export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { - const isLegacyTheme = uiTheme === UiTheme.LEGACY; +export function getTextColor(textStyle: TextStyle, shadow?: boolean): string { + const isLegacyTheme = globalScene.uiTheme === UiTheme.LEGACY; switch (textStyle) { case TextStyle.MESSAGE: return !shadow ? "#f8f8f8" : "#6b5a73"; diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index 7dde6b22dcd..558cb08f252 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -1,8 +1,6 @@ import { globalScene } from "#app/global-scene"; import type { Button } from "#enums/buttons"; -import type { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; -import { getTextColor } from "#ui/text"; /** * A basic abstract class to act as a holder and processor for UI elements. @@ -33,10 +31,6 @@ export abstract class UiHandler { return globalScene.ui; } - getTextColor(style: TextStyle, shadow = false): string { - return getTextColor(style, shadow, globalScene.uiTheme); - } - getCursor(): number { return this.cursor; } diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index f2d434c024a..9e130417b43 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -51,7 +51,7 @@ export function addWindow( windowVariant = WindowVariant.NORMAL; } - const borderSize = globalScene.uiTheme ? 6 : 8; + const borderSize = globalScene.uiTheme === UiTheme.LEGACY ? 6 : 8; const window = globalScene.add.nineslice( x, @@ -153,7 +153,11 @@ export function addUiThemeOverrides(): void { frame?: string | number, ): Phaser.GameObjects.Image { let legacy = false; - if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { + if ( + typeof texture === "string" && + globalScene.uiTheme === UiTheme.LEGACY && + legacyCompatibleImages.includes(texture) + ) { legacy = true; texture += "_legacy"; } @@ -176,7 +180,11 @@ export function addUiThemeOverrides(): void { frame?: string | number, ): Phaser.GameObjects.Sprite { let legacy = false; - if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { + if ( + typeof texture === "string" && + globalScene.uiTheme === UiTheme.LEGACY && + legacyCompatibleImages.includes(texture) + ) { legacy = true; texture += "_legacy"; } @@ -205,7 +213,11 @@ export function addUiThemeOverrides(): void { bottomHeight?: number, ): Phaser.GameObjects.NineSlice { let legacy = false; - if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { + if ( + typeof texture === "string" && + globalScene.uiTheme === UiTheme.LEGACY && + legacyCompatibleImages.includes(texture) + ) { legacy = true; texture += "_legacy"; } From 669ed76daf07214b0254a5a1dc69780871143df7 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Thu, 4 Sep 2025 05:01:24 -0400 Subject: [PATCH 080/134] [Misc] Cleaned up implementation of `ChargeMove` mixin (#6466) Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/data/moves/move.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 5a22b352e73..36cef4d5e4e 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -93,6 +93,7 @@ import { getEnumValues } from "#utils/enums"; import { toCamelCase, toTitleCase } from "#utils/strings"; import i18next from "i18next"; import { applyChallenges } from "#utils/challenge-utils"; +import type { AbstractConstructor } from "#types/type-helpers"; /** * A function used to conditionally determine execution of a given {@linkcode MoveAttr}. @@ -1055,16 +1056,11 @@ export class SelfStatusMove extends Move { } } -// TODO: Figure out how to improve the signature of this so that -// the `ChargeMove` function knows that the argument `Base` is a specific subclass of move that cannot -// be abstract. -// Right now, I only know how to do this by using the type conjunction (the & operators) -type SubMove = new (...args: any[]) => Move & { - is(moveKind: K): this is MoveClassMap[K]; -}; +type SubMove = AbstractConstructor function ChargeMove(Base: TBase, nameAppend: string) { - return class extends Base { + // NB: This cannot be made into a oneline return + abstract class Charging extends Base { /** The animation to play during the move's charging phase */ public readonly chargeAnim: ChargeAnim = ChargeAnim[`${MoveId[this.id]}_CHARGING`]; /** The message to show during the move's charging phase */ @@ -1141,6 +1137,7 @@ function ChargeMove(Base: TBase, nameAppend: string) { return this; } }; + return Charging; } export class ChargingAttackMove extends ChargeMove(AttackMove, "ChargingAttackMove") {} From e477c505bc0f26b0d2e340220b879ed9b5efa849 Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:03:55 +0200 Subject: [PATCH 081/134] [UI/UX] Show correct able text when transferring all items (#6444) * Check if items are able to transfer for `ALL` option * show amount of transferable items in `ALL` option * Show number of transferable items in the 'ALL' option * Apply suggestions --- src/ui/party-ui-handler.ts | 60 ++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index a7c7a134488..eb9dddf600c 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -562,6 +562,9 @@ export class PartyUiHandler extends MessageUiHandler { private processModifierTransferModeInput(pokemon: PlayerPokemon) { const ui = this.getUi(); const option = this.options[this.optionsCursor]; + const allItems = this.getTransferrableItemsFromPokemon(pokemon); + // get the index of the "All" option. + const allCursorIndex = allItems.length; if (this.transferMode && option === PartyOption.TRANSFER) { return this.processTransferOption(); @@ -573,31 +576,56 @@ export class PartyUiHandler extends MessageUiHandler { let ableToTransferText: string; for (let p = 0; p < globalScene.getPlayerParty().length; p++) { - // this for look goes through each of the party pokemon + // this for loop goes through each of the party pokemon const newPokemon = globalScene.getPlayerParty()[p]; // this next bit checks to see if the the selected item from the original transfer pokemon exists on the new pokemon `p` // this returns `undefined` if the new pokemon doesn't have the item at all, otherwise it returns the `pokemonHeldItemModifier` for that item - const matchingModifier = globalScene.findModifier( - m => - m.is("PokemonHeldItemModifier") && - m.pokemonId === newPokemon.id && - m.matchType(this.getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor]), - ) as PokemonHeldItemModifier; + const matchingModifiers: (PokemonHeldItemModifier | undefined)[] = []; + if (this.transferOptionCursor === allCursorIndex) { + // if "All" is selected, check all items + for (const item of allItems) { + matchingModifiers.push( + globalScene.findModifier( + m => m.is("PokemonHeldItemModifier") && m.pokemonId === newPokemon.id && m.matchType(item), + ) as PokemonHeldItemModifier | undefined, + ); + } + } else { + // otherwise only check the selected item + matchingModifiers.push( + globalScene.findModifier( + m => + m.is("PokemonHeldItemModifier") && + m.pokemonId === newPokemon.id && + m.matchType(allItems[this.transferOptionCursor]), + ) as PokemonHeldItemModifier | undefined, + ); + } + const hasMatchingModifier = matchingModifiers.some(m => m !== undefined); // checks if any items match const partySlot = this.partySlots.filter(m => m.getPokemon() === newPokemon)[0]; // this gets pokemon [p] for us if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer - if (matchingModifier) { + if (hasMatchingModifier) { // if matchingModifier exists then the item exists on the new pokemon - if (matchingModifier.getMaxStackCount() === matchingModifier.stackCount) { - // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" - ableToTransferText = i18next.t("partyUiHandler:notAble"); - } else { - // if the pokemon isn't at max stack, make the label "Able" - ableToTransferText = i18next.t("partyUiHandler:able"); + ableToTransferText = i18next.t("partyUiHandler:notAble"); // start with not able + /** + * The amount of items that can be transferred in the `All` option + */ + let ableAmount = 0; + for (const modifier of matchingModifiers) { + if (!modifier || modifier.getCountUnderMax() > 0) { + // if the modifier doesn't exist, or the stack count isn't at max, then we can transfer at least 1 stack + ableToTransferText = i18next.t("partyUiHandler:able"); + ableAmount++; + } } + // only show the amount if an item can be transferred and there are multiple items + ableToTransferText += ableAmount && matchingModifiers.length > 1 ? ` (${ableAmount})` : ""; } else { - // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" + // if no item matches, that means the pokemon doesn't have any of the item, and we need to show "Able" ableToTransferText = i18next.t("partyUiHandler:able"); + // only show the amount if there are multiple items + ableToTransferText += matchingModifiers.length > 1 ? ` (${matchingModifiers.length})` : ""; } } else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text @@ -1645,6 +1673,8 @@ export class PartyUiHandler extends MessageUiHandler { .find(plm => plm[1] === move); } else if (option === PartyOption.ALL) { optionName = i18next.t("partyUiHandler:all"); + // add the number of items to the `all` option + optionName += ` (${this.getTransferrableItemsFromPokemon(pokemon).length})`; } else { const itemModifiers = this.getItemModifiers(pokemon); const itemModifier = itemModifiers[option]; From ddde977a0a485f327a041bedb0d7b249df4770bf Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:31:52 +0200 Subject: [PATCH 082/134] [UI/UX] Auto focus first input field (#6413) --- src/ui/form-modal-ui-handler.ts | 5 +++++ src/ui/pokedex-scan-ui-handler.ts | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 5c547465de9..c6ef8705aa8 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -136,6 +136,11 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.submitAction = config.buttonActions.length ? config.buttonActions[0] : null; this.cancelAction = config.buttonActions[1] ?? null; + // Auto focus the first input field after a short delay, to prevent accidental inputs + setTimeout(() => { + this.inputs[0].setFocus(); + }, 50); + // #region: Override button pointerDown // Override the pointerDown event for the buttonBgs to call the `submitAction` and `cancelAction` // properties that we set above, allowing their behavior to change after this method terminates diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index 4f606cbcbb0..9be7a903dec 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -106,10 +106,6 @@ export class PokedexScanUiHandler extends FormModalUiHandler { this.reduceKeys(); - setTimeout(() => { - input.setFocus(); // Focus after a short delay to avoid unwanted input - }, 50); - input.on("keydown", (inputObject, evt: KeyboardEvent) => { if ( ["escape", "space"].some(v => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && From fce317a87a9eb48185437a4e086d47227dd5f342 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 5 Sep 2025 18:21:28 +0200 Subject: [PATCH 083/134] [Documentation][Move] Add edge case to helping hand (#6340) --- src/data/moves/move.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 36cef4d5e4e..1bb9a3f6e92 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -9430,7 +9430,9 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY) - .condition(failIfSingleBattle), + .condition(failIfSingleBattle) + // should stack multiplicatively if used multiple times in 1 turn + .edgeCase(), new StatusMove(MoveId.TRICK, PokemonType.PSYCHIC, 100, 10, -1, 0, 3) .unimplemented(), new StatusMove(MoveId.ROLE_PLAY, PokemonType.PSYCHIC, -1, 10, -1, 0, 3) From d5e6670456acf3af98fac5bf7a20dc6cb3854c98 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 12:28:35 -0400 Subject: [PATCH 084/134] [Refactor] Remove `null` from `PhaseManager.currentPhase` signature https://github.com/pagefaultgames/pokerogue/pull/6243 * Added `toBeAtPhase` + removed `null` from phase manager current phase signature * Removed bangs from various calls to phase manager * Update phase-manager.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * ran biome * Fix missing bang * Simplify TSDoc --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/battle-scene.ts | 6 +-- src/data/arena-tag.ts | 2 +- src/data/battler-tags.ts | 29 ++++++------ src/field/pokemon.ts | 4 +- src/phase-manager.ts | 27 +++++++---- src/ui/challenges-select-ui-handler.ts | 4 +- src/ui/egg-hatch-scene-handler.ts | 2 +- src/ui/egg-summary-ui-handler.ts | 2 +- src/ui/menu-ui-handler.ts | 2 +- src/ui/party-ui-handler.ts | 4 +- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/starter-select-ui-handler.ts | 4 +- test/@types/vitest.d.ts | 10 ++++- test/abilities/disguise.test.ts | 2 +- test/battle/special-battle.test.ts | 18 ++++---- test/matchers.setup.ts | 2 + test/moves/transform-imposter.test.ts | 4 +- .../a-trainers-test-encounter.test.ts | 7 ++- .../absolute-avarice-encounter.test.ts | 5 +-- .../berries-abound-encounter.test.ts | 12 ++--- .../bug-type-superfan-encounter.test.ts | 36 +++++++-------- .../clowning-around-encounter.test.ts | 10 +---- .../dancing-lessons-encounter.test.ts | 8 ++-- .../encounters/delibirdy-encounter.test.ts | 6 +-- .../department-store-sale-encounter.test.ts | 9 ++-- .../fiery-fallout-encounter.test.ts | 9 ++-- .../fight-or-flight-encounter.test.ts | 11 +++-- .../fun-and-games-encounter.test.ts | 25 +++++------ .../global-trade-system-encounter.test.ts | 3 +- .../encounters/lost-at-sea-encounter.test.ts | 4 +- .../mysterious-challengers-encounter.test.ts | 15 +++---- .../encounters/part-timer-encounter.test.ts | 2 +- .../encounters/safari-zone.test.ts | 2 +- .../teleporting-hijinks-encounter.test.ts | 12 +++-- .../the-expert-breeder-encounter.test.ts | 20 ++++----- .../the-pokemon-salesman-encounter.test.ts | 2 +- .../the-strong-stuff-encounter.test.ts | 6 +-- .../the-winstrate-challenge-encounter.test.ts | 8 ++-- .../trash-to-treasure-encounter.test.ts | 10 ++--- .../uncommon-breed-encounter.test.ts | 9 ++-- .../encounters/weird-dream-encounter.test.ts | 12 +++-- .../mystery-encounter.test.ts | 2 +- test/phases/mystery-encounter-phase.test.ts | 4 +- test/test-utils/game-manager.ts | 8 ++-- test/test-utils/matchers/to-be-at-phase.ts | 45 +++++++++++++++++++ test/test-utils/phase-interceptor.ts | 2 +- 46 files changed, 229 insertions(+), 199 deletions(-) create mode 100644 test/test-utils/matchers/to-be-at-phase.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 8bf9ec88fed..9bb76b6fd23 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1561,9 +1561,9 @@ export class BattleScene extends SceneBase { return 0; } - const isEggPhase: boolean = ["EggLapsePhase", "EggHatchPhase"].includes( - this.phaseManager.getCurrentPhase()?.phaseName ?? "", - ); + const isEggPhase = + this.phaseManager.getCurrentPhase().is("EggLapsePhase") || + this.phaseManager.getCurrentPhase().is("EggHatchPhase"); if ( // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index cd02455af0f..1952db7867b 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -471,7 +471,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => { const move = allMoves[moveId]; const effectPhase = globalScene.phaseManager.getCurrentPhase(); - if (effectPhase?.is("MoveEffectPhase")) { + if (effectPhase.is("MoveEffectPhase")) { const attacker = effectPhase.getUserPokemon(); if (attacker) { return move.getPriority(attacker) > 0; diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 3dbbf747c5c..24e1e6f12cd 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -228,26 +228,27 @@ interface GenericSerializableBattlerTag extends Serial * Descendants can override {@linkcode isMoveRestricted} to restrict moves that * match a condition. A restricted move gets cancelled before it is used. * Players and enemies should not be allowed to select restricted moves. + * @todo Require descendant subclasses to inherit a `PRE_MOVE` lapse type */ export abstract class MoveRestrictionBattlerTag extends SerializableBattlerTag { public declare readonly tagType: MoveRestrictionBattlerTagType; override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - if (lapseType === BattlerTagLapseType.PRE_MOVE) { - // Cancel the affected pokemon's selected move - const phase = globalScene.phaseManager.getCurrentPhase() as MovePhase; - const move = phase.move; - - if (this.isMoveRestricted(move.moveId, pokemon)) { - if (this.interruptedText(pokemon, move.moveId)) { - globalScene.phaseManager.queueMessage(this.interruptedText(pokemon, move.moveId)); - } - phase.cancel(); - } - - return true; + if (lapseType !== BattlerTagLapseType.PRE_MOVE) { + return super.lapse(pokemon, lapseType); } - return super.lapse(pokemon, lapseType); + // Cancel the affected pokemon's selected move + const phase = globalScene.phaseManager.getCurrentPhase() as MovePhase; + const move = phase.move; + + if (this.isMoveRestricted(move.moveId, pokemon)) { + if (this.interruptedText(pokemon, move.moveId)) { + globalScene.phaseManager.queueMessage(this.interruptedText(pokemon, move.moveId)); + } + phase.cancel(); + } + + return true; } /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 6d441ef991c..7cd0b9fecf8 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1252,7 +1252,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } // During the Pokemon's MoveEffect phase, the offset is removed to put the Pokemon "in focus" const currentPhase = globalScene.phaseManager.getCurrentPhase(); - return !(currentPhase?.is("MoveEffectPhase") && currentPhase.getPokemon() === this); + return !(currentPhase.is("MoveEffectPhase") && currentPhase.getPokemon() === this); } /** If this Pokemon has a Substitute on the field, removes its sprite from the field. */ @@ -4969,7 +4969,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { */ if (effect === StatusEffect.SLEEP || effect === StatusEffect.FREEZE) { const currentPhase = globalScene.phaseManager.getCurrentPhase(); - if (currentPhase?.is("MoveEffectPhase") && currentPhase.getUserPokemon() === this) { + if (currentPhase.is("MoveEffectPhase") && currentPhase.getUserPokemon() === this) { this.turnData.hitCount = 1; this.turnData.hitsLeft = 1; } diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 8a31689f7b2..281ac8bd671 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -236,7 +236,7 @@ export class PhaseManager { /** Parallel array to {@linkcode dynamicPhaseQueues} - matches phase types to their queues */ private dynamicPhaseTypes: Constructor[]; - private currentPhase: Phase | null = null; + private currentPhase: Phase; private standbyPhase: Phase | null = null; constructor() { @@ -260,7 +260,9 @@ export class PhaseManager { } /* Phase Functions */ - getCurrentPhase(): Phase | null { + + /** @returns The currently running {@linkcode Phase}. */ + getCurrentPhase(): Phase { return this.currentPhase; } @@ -370,20 +372,28 @@ export class PhaseManager { unactivatedConditionalPhases.push([condition, phase]); } } + this.conditionalQueue = unactivatedConditionalPhases; + // If no phases are left, unshift phases to start a new turn. if (!this.phaseQueue.length) { this.populatePhaseQueue(); // Clear the conditionalQueue if there are no phases left in the phaseQueue this.conditionalQueue = []; } - this.currentPhase = this.phaseQueue.shift() ?? null; + // Bang is justified as `populatePhaseQueue` ensures we always have _something_ in the queue at all times + this.currentPhase = this.phaseQueue.shift()!; - if (this.currentPhase) { - console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;"); - this.currentPhase.start(); - } + this.startCurrentPhase(); + } + + /** + * Helper method to start and log the current phase. + */ + private startCurrentPhase(): void { + console.log(`%cStart Phase ${this.currentPhase.phaseName}`, "color:green;"); + this.currentPhase.start(); } overridePhase(phase: Phase): boolean { @@ -393,8 +403,7 @@ export class PhaseManager { this.standbyPhase = this.currentPhase; this.currentPhase = phase; - console.log(`%cStart Phase ${phase.constructor.name}`, "color:green;"); - phase.start(); + this.startCurrentPhase(); return true; } diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index b37ddcc6a5f..68559b92439 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -383,14 +383,14 @@ export class GameChallengesUiHandler extends UiHandler { this.updateChallengeArrows(this.startCursor.visible); } else { globalScene.phaseManager.toTitleScreen(); - globalScene.phaseManager.getCurrentPhase()?.end(); + globalScene.phaseManager.getCurrentPhase().end(); } success = true; } else if (button === Button.SUBMIT || button === Button.ACTION) { if (this.hasSelectedChallenge) { if (this.startCursor.visible) { globalScene.phaseManager.unshiftNew("SelectStarterPhase"); - globalScene.phaseManager.getCurrentPhase()?.end(); + globalScene.phaseManager.getCurrentPhase().end(); } else { this.startCursor.setVisible(true); this.cursorObj?.setVisible(false); diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 6536ef2af80..1733b64144b 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -45,7 +45,7 @@ export class EggHatchSceneHandler extends UiHandler { processInput(button: Button): boolean { if (button === Button.ACTION || button === Button.CANCEL) { const phase = globalScene.phaseManager.getCurrentPhase(); - if (phase?.is("EggHatchPhase") && phase.trySkip()) { + if (phase.is("EggHatchPhase") && phase.trySkip()) { return true; } } diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts index c66075dd910..db357b849c3 100644 --- a/src/ui/egg-summary-ui-handler.ts +++ b/src/ui/egg-summary-ui-handler.ts @@ -222,7 +222,7 @@ export class EggSummaryUiHandler extends MessageUiHandler { if (button === Button.CANCEL) { if (!this.blockExit) { const phase = globalScene.phaseManager.getCurrentPhase(); - if (phase?.is("EggSummaryPhase")) { + if (phase.is("EggSummaryPhase")) { phase.end(); } success = true; diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index bed7e573161..66465f76445 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -126,7 +126,7 @@ export class MenuUiHandler extends MessageUiHandler { const ui = this.getUi(); this.excludedMenus = () => [ { - condition: !!globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase"), + condition: globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase"), options: [MenuOptions.EGG_GACHA], }, { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }, diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index eb9dddf600c..b77710d8140 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -862,7 +862,7 @@ export class PartyUiHandler extends MessageUiHandler { // TODO: This risks hitting the other options (.MOVE_i and ALL) so does it? Do we need an extra check? if ( option >= PartyOption.FORM_CHANGE_ITEM && - globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase") && + globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase") && this.partyUiMode === PartyUiMode.CHECK ) { const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); @@ -1556,7 +1556,7 @@ export class PartyUiHandler extends MessageUiHandler { break; case PartyUiMode.CHECK: this.addCommonOptions(pokemon); - if (globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase")) { + if (globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase")) { const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); for (let i = 0; i < formChangeItemModifiers.length; i++) { this.options.push(PartyOption.FORM_CHANGE_ITEM + i); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 64b0e9c456e..672968bd953 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -710,7 +710,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { show(args: any[]): boolean { // Allow the use of candies if we are in one of the whitelisted phases this.canUseCandies = ["TitlePhase", "SelectStarterPhase", "CommandPhase"].includes( - globalScene.phaseManager.getCurrentPhase()?.phaseName ?? "", + globalScene.phaseManager.getCurrentPhase().phaseName, ); if (args.length >= 1 && args[0] === "refresh") { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index b27cc0af709..049f33af5d7 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -340,7 +340,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { private teraLabel: Phaser.GameObjects.Text; private goFilterLabel: Phaser.GameObjects.Text; /** Group holding the UI elements appearing in the instructionsContainer */ - /* TODO: Uncomment this once our testing infra supports mocks of `Phaser.GameObject.Group` + /* TODO: Uncomment this once our testing infra supports mocks of `Phaser.GameObject.Group` private instructionElemGroup: Phaser.GameObjects.Group; */ @@ -4419,7 +4419,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.phaseManager.pushNew("EncounterPhase"); } this.clearText(); - globalScene.phaseManager.getCurrentPhase()?.end(); + globalScene.phaseManager.getCurrentPhase().end(); }, cancel, null, diff --git a/test/@types/vitest.d.ts b/test/@types/vitest.d.ts index 2ed0512538a..aa7666c0880 100644 --- a/test/@types/vitest.d.ts +++ b/test/@types/vitest.d.ts @@ -1,8 +1,9 @@ import "vitest"; -import type { TerrainType } from "#app/data/terrain"; +import type { Phase } from "#app/phase"; import type Overrides from "#app/overrides"; import type { ArenaTag } from "#data/arena-tag"; +import type { TerrainType } from "#data/terrain"; import type { PositionalTag } from "#data/positional-tags/positional-tag"; import type { AbilityId } from "#enums/ability-id"; import type { ArenaTagSide } from "#enums/arena-tag-side"; @@ -22,6 +23,7 @@ import type { toHaveEffectiveStatOptions } from "#test/test-utils/matchers/to-ha import type { toHavePositionalTagOptions } from "#test/test-utils/matchers/to-have-positional-tag"; import type { expectedStatusType } from "#test/test-utils/matchers/to-have-status-effect"; import type { toHaveTypesOptions } from "#test/test-utils/matchers/to-have-types"; +import type { PhaseString } from "#types/phase-types"; import type { TurnMove } from "#types/turn-move"; import type { AtLeastOne } from "#types/type-helpers"; import type { toDmgValue } from "utils/common"; @@ -40,6 +42,12 @@ declare module "vitest" { */ toEqualArrayUnsorted(expected: T[]): void; + /** + * Check if the currently-running {@linkcode Phase} is of the given type. + * @param expectedPhase - The expected {@linkcode PhaseString} + */ + toBeAtPhase(expectedPhase: PhaseString): void; + // #region Arena Matchers /** diff --git a/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts index f36501cb647..8a7e9a05ddb 100644 --- a/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -196,7 +196,7 @@ describe("Abilities - Disguise", () => { game.move.select(MoveId.SHADOW_SNEAK); await game.toNextWave(); - expect(game.scene.phaseManager.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); expect(game.scene.currentBattle.waveIndex).toBe(2); }); diff --git a/test/battle/special-battle.test.ts b/test/battle/special-battle.test.ts index d22931bfea5..4fb859a2a40 100644 --- a/test/battle/special-battle.test.ts +++ b/test/battle/special-battle.test.ts @@ -36,62 +36,62 @@ describe("Test Battle Phase", () => { game.override.battleStyle("single").startingWave(10); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs2 boss", async () => { game.override.battleStyle("double").startingWave(10); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs2 trainer", async () => { game.override.battleStyle("double").startingWave(5); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs1 trainer", async () => { game.override.battleStyle("single").startingWave(5); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs1 rival", async () => { game.override.battleStyle("single").startingWave(8); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs2 rival", async () => { game.override.battleStyle("double").startingWave(8); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 1vs1 trainer", async () => { game.override.battleStyle("single").startingWave(5); await game.classicMode.startBattle([SpeciesId.BLASTOISE]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 2vs2 trainer", async () => { game.override.battleStyle("double").startingWave(5); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); it("startBattle 4vs2 trainer", async () => { game.override.battleStyle("double").startingWave(5); await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD, SpeciesId.DARKRAI, SpeciesId.GABITE]); expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); }); }); diff --git a/test/matchers.setup.ts b/test/matchers.setup.ts index f76a9423ab3..fe2135f4db4 100644 --- a/test/matchers.setup.ts +++ b/test/matchers.setup.ts @@ -1,3 +1,4 @@ +import { toBeAtPhase } from "#test/test-utils/matchers/to-be-at-phase"; import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-unsorted"; import { toHaveAbilityApplied } from "#test/test-utils/matchers/to-have-ability-applied"; import { toHaveArenaTag } from "#test/test-utils/matchers/to-have-arena-tag"; @@ -24,6 +25,7 @@ import { expect } from "vitest"; expect.extend({ toEqualArrayUnsorted, + toBeAtPhase, toHaveWeather, toHaveTerrain, toHaveArenaTag, diff --git a/test/moves/transform-imposter.test.ts b/test/moves/transform-imposter.test.ts index b1631130154..1b38a4bce9c 100644 --- a/test/moves/transform-imposter.test.ts +++ b/test/moves/transform-imposter.test.ts @@ -212,7 +212,7 @@ describe("Transforming Effects", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextWave(); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); expect(game.scene.currentBattle.waveIndex).toBe(2); await game.reload.reloadSession(); @@ -242,7 +242,7 @@ describe("Transforming Effects", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextWave(); - expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase"); + expect(game).toBeAtPhase("CommandPhase"); expect(game.scene.currentBattle.waveIndex).toBe(2); expect(player.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId); diff --git a/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 93cf4537c53..b4bd74d44d6 100644 --- a/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -9,7 +9,6 @@ import { ATrainersTestEncounter } from "#mystery-encounters/a-trainers-test-enco import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { PartyHealPhase } from "#phases/party-heal-phase"; import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { @@ -106,7 +105,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(scene.currentBattle.trainer).toBeDefined(); expect( @@ -131,7 +130,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); const eggsAfter = scene.gameData.eggs; expect(eggsAfter).toBeDefined(); @@ -179,7 +178,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); const eggsAfter = scene.gameData.eggs; expect(eggsAfter).toBeDefined(); diff --git a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 562482dd520..d269e40db0f 100644 --- a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -10,7 +10,6 @@ import { BerryModifier, PokemonHeldItemModifier } from "#modifiers/modifier"; import { AbsoluteAvariceEncounter } from "#mystery-encounters/absolute-avarice-encounter"; import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { @@ -132,7 +131,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(SpeciesId.GREEDENT); const moveset = enemyField[0].moveset.map(m => m.moveId); @@ -148,7 +147,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); for (const partyPokemon of scene.getPlayerParty()) { const pokemonId = partyPokemon.id; diff --git a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts index 12c5a6515bc..5e9dffa1332 100644 --- a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -11,8 +11,6 @@ import { BerriesAboundEncounter } from "#mystery-encounters/berries-abound-encou import * as EncounterDialogueUtils from "#mystery-encounters/encounter-dialogue-utils"; import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -114,7 +112,7 @@ describe("Berries Abound - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); }); @@ -135,7 +133,7 @@ describe("Berries Abound - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; const berriesAfterCount = berriesAfter.reduce((a, b) => a + b.stackCount, 0); @@ -186,7 +184,7 @@ describe("Berries Abound - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); @@ -210,7 +208,7 @@ describe("Berries Abound - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); @@ -230,8 +228,6 @@ describe("Berries Abound - Mystery Encounter", () => { }); await runMysteryEncounterToEnd(game, 2); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 13d3c030c63..723516174fb 100644 --- a/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -12,9 +12,7 @@ import { PokemonMove } from "#moves/pokemon-move"; import { BugTypeSuperfanEncounter } from "#mystery-encounters/bug-type-superfan-encounter"; import * as encounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; -import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; +import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, @@ -231,7 +229,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(2); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -244,7 +242,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(3); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -258,7 +256,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(4); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -273,7 +271,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(5); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -289,7 +287,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(5); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -307,7 +305,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(5); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -325,7 +323,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(5); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -343,7 +341,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyParty = scene.getEnemyParty(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyParty.length).toBe(5); expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL); @@ -365,7 +363,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterRewardsPhase.name); + expect(game).toBeAtPhase("MysteryEncounterRewardsPhase"); game.phaseInterceptor["prompts"] = []; // Clear out prompt handlers game.onNextPrompt("MysteryEncounterRewardsPhase", UiMode.OPTION_SELECT, () => { game.endPhase(); @@ -406,7 +404,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -416,7 +414,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -435,7 +433,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { ]); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -457,7 +455,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { ]); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -481,7 +479,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { ]); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -542,7 +540,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -557,7 +555,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f02a5c623af..e7ec6e43392 100644 --- a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -22,10 +22,7 @@ import { ClowningAroundEncounter } from "#mystery-encounters/clowning-around-enc import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import { generateModifierType } from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; -import { PostMysteryEncounterPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -171,7 +168,7 @@ describe("Clowning Around - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(SpeciesId.MR_MIME); expect(enemyField[0].moveset).toEqual([ @@ -199,9 +196,6 @@ describe("Clowning Around - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - await game.phaseInterceptor.to("SelectModifierPhase"); const abilityToTrain = scene.currentBattle.mysteryEncounter?.misc.ability; game.onNextPrompt("PostMysteryEncounterPhase", UiMode.MESSAGE, () => { @@ -215,7 +209,7 @@ describe("Clowning Around - Mystery Encounter", () => { vi.spyOn(partyUiHandler, "show"); game.endPhase(); await game.phaseInterceptor.to("PostMysteryEncounterPhase"); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(PostMysteryEncounterPhase.name); + expect(game).toBeAtPhase("PostMysteryEncounterPhase"); // Wait for Yes/No confirmation to appear await vi.waitFor(() => expect(optionSelectUiHandler.show).toHaveBeenCalled()); diff --git a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index de47b074089..81a2fc7463c 100644 --- a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -9,11 +9,9 @@ import { UiMode } from "#enums/ui-mode"; import { DancingLessonsEncounter } from "#mystery-encounters/dancing-lessons-encounter"; import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { LearnMovePhase } from "#phases/learn-move-phase"; import { MovePhase } from "#phases/move-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, @@ -105,7 +103,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(SpeciesId.ORICORIO); expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]); @@ -126,7 +124,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -226,7 +224,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); const partyCountAfter = scene.getPlayerParty().length; - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 7398b639f1c..fe17f091d0e 100644 --- a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -161,7 +161,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -316,7 +316,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -449,7 +449,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index 3c19d458049..812d6d661ef 100644 --- a/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -9,7 +9,6 @@ import { DepartmentStoreSaleEncounter } from "#mystery-encounters/department-sto import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#mystery-encounters/mystery-encounters"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import { GameManager } from "#test/test-utils/game-manager"; import { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; @@ -93,7 +92,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only TMs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -130,7 +129,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Vitamins", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -170,7 +169,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only X Items", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -210,7 +209,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Pokeballs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 4); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 54f790ca207..91a32c025d5 100644 --- a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -16,7 +16,6 @@ import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#modifiers/m import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import { FieryFalloutEncounter } from "#mystery-encounters/fiery-fallout-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; import { SelectModifierPhase } from "#phases/select-modifier-phase"; @@ -161,7 +160,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(SpeciesId.VOLCARONA); expect(enemyField[1].species.speciesId).toBe(SpeciesId.VOLCARONA); @@ -177,7 +176,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); const leadPokemonId = scene.getPlayerParty()?.[0].id; const leadPokemonItems = scene.findModifiers( @@ -266,7 +265,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runMysteryEncounterToEnd(game, 3); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); const leadPokemonItems = scene.getPlayerParty()[0].getHeldItems() as PokemonHeldItemModifier[]; const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); @@ -292,7 +291,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(continueEncounterSpy).not.toHaveBeenCalled(); }); }); diff --git a/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index 8650b42ce4d..81dbad16e01 100644 --- a/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -9,9 +9,7 @@ import { UiMode } from "#enums/ui-mode"; import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import { FightOrFlightEncounter } from "#mystery-encounters/fight-or-flight-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, @@ -109,7 +107,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); }); @@ -122,8 +120,9 @@ describe("Fight or Flight - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); + expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); const modifierSelectHandler = scene.ui.handlers.find( @@ -165,7 +164,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -182,7 +181,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index 7bfaaac1141..bc1a2893627 100644 --- a/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -14,9 +14,8 @@ import { FunAndGamesEncounter } from "#mystery-encounters/fun-and-games-encounte import { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; +import type { CommandPhase } from "#phases/command-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, @@ -131,7 +130,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -143,7 +142,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(game.field.getEnemyPokemon().species.speciesId).toBe(SpeciesId.WOBBUFFET); expect(game.field.getEnemyPokemon().ivs).toEqual([0, 0, 0, 0, 0, 0]); expect(game.field.getEnemyPokemon().nature).toBe(Nature.MILD); @@ -165,7 +164,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.to("SelectModifierPhase", false); // Rewards - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); }); it("should have no items in rewards if Wubboffet doesn't take enough damage", async () => { @@ -173,7 +172,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => { game.endPhase(); }); @@ -184,7 +183,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.to("SelectModifierPhase", false); // Rewards - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -200,7 +199,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => { game.endPhase(); }); @@ -213,7 +212,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.to("SelectModifierPhase", false); // Rewards - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -230,7 +229,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => { game.endPhase(); }); @@ -243,7 +242,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.to("SelectModifierPhase", false); // Rewards - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -260,7 +259,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => { game.endPhase(); }); @@ -273,7 +272,7 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.to("SelectModifierPhase", false); // Rewards - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index bb56505ac48..c8e934168bc 100644 --- a/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -13,7 +13,6 @@ import { generateModifierType } from "#mystery-encounters/encounter-phase-utils" import { GlobalTradeSystemEncounter } from "#mystery-encounters/global-trade-system-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#mystery-encounters/mystery-encounters"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import { GameManager } from "#test/test-utils/game-manager"; import { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; @@ -226,7 +225,7 @@ describe("Global Trade System - Mystery Encounter", () => { await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 73134381553..ed0ca02720c 100644 --- a/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -147,7 +147,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -212,7 +212,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 0c4e3044bbd..b937fdcfcf5 100644 --- a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -12,8 +12,6 @@ import { MysteriousChallengersEncounter } from "#mystery-encounters/mysterious-c import { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters"; -import { CommandPhase } from "#phases/command-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -152,7 +150,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); @@ -162,7 +160,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -196,7 +194,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); await runMysteryEncounterToEnd(game, 2, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); @@ -206,7 +204,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -253,7 +251,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); await runMysteryEncounterToEnd(game, 3, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); @@ -262,8 +260,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); await runMysteryEncounterToEnd(game, 3, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts index 36a92b2b6bf..1826c75381a 100644 --- a/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -246,7 +246,7 @@ describe("Part-Timer - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts index ec43dcfb69b..dd41d08df38 100644 --- a/test/mystery-encounter/encounters/safari-zone.test.ts +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -119,7 +119,7 @@ describe("Safari Zone - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index 4d006abc636..c88d77a8cf5 100644 --- a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -8,9 +8,7 @@ import { SpeciesId } from "#enums/species-id"; import { UiMode } from "#enums/ui-mode"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { TeleportingHijinksEncounter } from "#mystery-encounters/teleporting-hijinks-encounter"; -import { CommandPhase } from "#phases/command-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, @@ -157,7 +155,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -167,7 +165,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); }); it("should transport to a new area", async () => { @@ -229,7 +227,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -239,7 +237,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [SpeciesId.METAGROSS]); await runMysteryEncounterToEnd(game, 2, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); }); it("should transport to a new area", async () => { @@ -300,7 +298,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index ade98bfa99f..ae4eb0647ce 100644 --- a/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -12,8 +12,6 @@ import { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters"; import { TheExpertPokemonBreederEncounter } from "#mystery-encounters/the-expert-pokemon-breeder-encounter"; -import { CommandPhase } from "#phases/command-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -157,7 +155,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(successfullyLoaded).toBe(true); // Check usual battle stuff - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); expect(scene.getPlayerParty().length).toBe(1); @@ -175,8 +173,8 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); + await game.phaseInterceptor.to("SelectModifierPhase"); const eggsAfter = scene.gameData.eggs; const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon1CommonEggs; @@ -242,7 +240,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(successfullyLoaded).toBe(true); // Check usual battle stuff - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); expect(scene.getPlayerParty().length).toBe(1); @@ -260,8 +258,8 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); + await game.phaseInterceptor.to("SelectModifierPhase"); const eggsAfter = scene.gameData.eggs; const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon2CommonEggs; @@ -324,7 +322,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(successfullyLoaded).toBe(true); // Check usual battle stuff - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); expect(scene.getPlayerParty().length).toBe(1); @@ -342,8 +340,8 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); + await game.phaseInterceptor.to("SelectModifierPhase"); const eggsAfter = scene.gameData.eggs; const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon3CommonEggs; diff --git a/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 3880c07c312..4011a850a08 100644 --- a/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -182,7 +182,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 3592e2dc774..06c4c3c1cee 100644 --- a/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -17,9 +17,7 @@ import { PokemonMove } from "#moves/pokemon-move"; import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { TheStrongStuffEncounter } from "#mystery-encounters/the-strong-stuff-encounter"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -192,7 +190,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(SpeciesId.SHUCKLE); expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 0, 0, 0]); @@ -230,7 +228,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index cf0ff7a94bd..814e2ee07fb 100644 --- a/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -15,9 +15,7 @@ import { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters"; import { TheWinstrateChallengeEncounter } from "#mystery-encounters/the-winstrate-challenge-encounter"; -import { CommandPhase } from "#phases/command-phase"; import { PartyHealPhase } from "#phases/party-heal-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { VictoryPhase } from "#phases/victory-phase"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import { GameManager } from "#test/test-utils/game-manager"; @@ -262,7 +260,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICTOR); expect(scene.currentBattle.mysteryEncounter?.enemyPartyConfigs.length).toBe(4); @@ -295,7 +293,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { // Should have Macho Brace in the rewards await skipBattleToNextBattle(game, true); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -337,7 +335,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { it("should have a Rarer Candy in the rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); await runMysteryEncounterToEnd(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 7cc9a69b32d..fe0139be3a7 100644 --- a/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -20,9 +20,7 @@ import { } from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { TrashToTreasureEncounter } from "#mystery-encounters/trash-to-treasure-encounter"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -172,8 +170,8 @@ describe("Trash to Treasure - Mystery Encounter", () => { it("should give 1 Leftovers, 1 Shell Bell, and Black Sludge", async () => { await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); await runMysteryEncounterToEnd(game, 1); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); + await game.phaseInterceptor.to("SelectModifierPhase"); const leftovers = scene.findModifier(m => m instanceof TurnHealModifier) as TurnHealModifier; expect(leftovers).toBeDefined(); @@ -221,7 +219,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(SpeciesId.GARBODOR); expect(enemyField[0].moveset).toEqual([ @@ -243,7 +241,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 5aadaf5c29a..e5b086ceba9 100644 --- a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -15,7 +15,6 @@ import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils" import { generateModifierType } from "#mystery-encounters/encounter-phase-utils"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { UncommonBreedEncounter } from "#mystery-encounters/uncommon-breed-encounter"; -import { CommandPhase } from "#phases/command-phase"; import { MovePhase } from "#phases/move-phase"; import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; import { StatStageChangePhase } from "#phases/stat-stage-change-phase"; @@ -120,7 +119,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); @@ -147,7 +146,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); @@ -199,7 +198,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); @@ -259,7 +258,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); diff --git a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index e2ec7ae514a..9f03b113d27 100644 --- a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -10,8 +10,6 @@ import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils" import * as EncounterTransformationSequence from "#mystery-encounters/encounter-transformation-sequence"; import * as MysteryEncounters from "#mystery-encounters/mystery-encounters"; import { WeirdDreamEncounter } from "#mystery-encounters/weird-dream-encounter"; -import { CommandPhase } from "#phases/command-phase"; -import { SelectModifierPhase } from "#phases/select-modifier-phase"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase, @@ -116,8 +114,8 @@ describe("Weird Dream - Mystery Encounter", () => { const bstsPrior = pokemonPrior.map(species => species.getSpeciesForm().getBaseStatTotal()); await runMysteryEncounterToEnd(game, 1); - await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); + await game.phaseInterceptor.to("SelectModifierPhase"); const pokemonAfter = scene.getPlayerParty(); const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal()); @@ -140,7 +138,7 @@ describe("Weird Dream - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); @@ -187,7 +185,7 @@ describe("Weird Dream - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(game).toBeAtPhase("CommandPhase"); expect(enemyField.length).toBe(1); expect(scene.getEnemyParty().length).toBe(scene.getPlayerParty().length); }); @@ -197,7 +195,7 @@ describe("Weird Dream - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to("SelectModifierPhase", false); - expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + expect(game).toBeAtPhase("SelectModifierPhase"); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); diff --git a/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts index ec27f7c6a48..d44e3dd2905 100644 --- a/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -34,7 +34,7 @@ describe("Mystery Encounters", () => { ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); - expect(game.scene.phaseManager.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); }); it("Encounters should not run on X1 waves", async () => { diff --git a/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts index a3dc779b02c..30ab977dbc6 100644 --- a/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -3,7 +3,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { SpeciesId } from "#enums/species-id"; import { UiMode } from "#enums/ui-mode"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; +import { MysteryEncounterOptionSelectedPhase } from "#phases/mystery-encounter-phases"; import { GameManager } from "#test/test-utils/game-manager"; import type { MessageUiHandler } from "#ui/message-ui-handler"; import type { MysteryEncounterUiHandler } from "#ui/mystery-encounter-ui-handler"; @@ -38,7 +38,7 @@ describe("Mystery Encounter Phases", () => { ]); await game.phaseInterceptor.to("MysteryEncounterPhase", false); - expect(game.scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(game).toBeAtPhase("MysteryEncounterPhase"); }); it("Runs MysteryEncounterPhase", async () => { diff --git a/test/test-utils/game-manager.ts b/test/test-utils/game-manager.ts index 57badd866b1..5f56832a6d2 100644 --- a/test/test-utils/game-manager.ts +++ b/test/test-utils/game-manager.ts @@ -44,6 +44,7 @@ import type { InputsHandler } from "#test/test-utils/inputs-handler"; import { MockFetch } from "#test/test-utils/mocks/mock-fetch"; import { PhaseInterceptor } from "#test/test-utils/phase-interceptor"; import { TextInterceptor } from "#test/test-utils/text-interceptor"; +import type { PhaseClass, PhaseString } from "#types/phase-types"; import type { BallUiHandler } from "#ui/ball-ui-handler"; import type { BattleMessageUiHandler } from "#ui/battle-message-ui-handler"; import type { CommandUiHandler } from "#ui/command-ui-handler"; @@ -160,7 +161,7 @@ export class GameManager { * End the currently running phase immediately. */ endPhase() { - this.scene.phaseManager.getCurrentPhase()?.end(); + this.scene.phaseManager.getCurrentPhase().end(); } /** @@ -412,10 +413,11 @@ export class GameManager { * Checks if the current phase matches the target phase. * @param phaseTarget - The target phase. * @returns Whether the current phase matches the target phase + * @todo Remove `phaseClass` from signature */ - isCurrentPhase(phaseTarget) { + isCurrentPhase(phaseTarget: PhaseClass | PhaseString) { const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name; - return this.scene.phaseManager.getCurrentPhase()?.constructor.name === targetName; + return this.scene.phaseManager.getCurrentPhase().phaseName === targetName; } /** diff --git a/test/test-utils/matchers/to-be-at-phase.ts b/test/test-utils/matchers/to-be-at-phase.ts new file mode 100644 index 00000000000..7ff76fa0365 --- /dev/null +++ b/test/test-utils/matchers/to-be-at-phase.ts @@ -0,0 +1,45 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { Phase } from "#app/phase"; +import type { GameManager } from "#test/test-utils/game-manager"; +// biome-ignore-end lint/correctness/noUnusedImports: TSDoc + +import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { PhaseString } from "#types/phase-types"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if the current {@linkcode Phase} is of the given type. + * @param received - The object to check. Should be the current {@linkcode GameManager} + * @param expectedPhase - The expected {@linkcode PhaseString} + * @returns The result of the matching + */ +export function toBeAtPhase(this: MatcherState, received: unknown, expectedPhase: PhaseString): SyncExpectationResult { + if (!isGameManagerInstance(received)) { + return { + pass: this.isNot, + message: () => `Expected to receive a GameManager, but got ${receivedStr(received)}!`, + }; + } + + if (!received.scene?.phaseManager) { + return { + pass: this.isNot, + message: () => `Expected GameManager.${received.scene ? "scene.phaseManager" : "scene"} to be defined!`, + }; + } + + const currPhase = received.scene.phaseManager.getCurrentPhase(); + const pass = currPhase.is(expectedPhase); + + const actual = currPhase.phaseName; + + return { + pass, + message: () => + pass + ? `Expected the current phase to NOT be ${expectedPhase}, but it was!` + : `Expected the current phase to be ${expectedPhase}, but got ${actual} instead!`, + expected: expectedPhase, + actual, + }; +} diff --git a/test/test-utils/phase-interceptor.ts b/test/test-utils/phase-interceptor.ts index 996f00806c6..cc8d9b8e32a 100644 --- a/test/test-utils/phase-interceptor.ts +++ b/test/test-utils/phase-interceptor.ts @@ -384,7 +384,7 @@ export class PhaseInterceptor { const actionForNextPrompt = this.prompts[0]; const expireFn = actionForNextPrompt.expireFn?.(); const currentMode = this.scene.ui.getMode(); - const currentPhase = this.scene.phaseManager.getCurrentPhase()?.constructor.name; + const currentPhase = this.scene.phaseManager.getCurrentPhase().phaseName; const currentHandler = this.scene.ui.getHandler(); if (expireFn) { this.prompts.shift(); From 850fa6f6ded9662a5fcc4abd59f7199c171bd3d2 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:34:22 -0400 Subject: [PATCH 085/134] [Dev] Added Typedoc plugins + README badges (#6400) * Add copyright in footer * Customized typedoc configuration + added coverage SVG * Finally figured out how to slap the SVG onto the docs' readme per branch * Fixed up config, made final tweaks to SVG length and renamed script * Added missing closing bracket to type config declaration * Fixed title + added GitHub navigation link * Fixed name typo * Update README.md * Moved badges on same line --- .github/workflows/github-pages.yml | 24 ++++----- README.md | 7 ++- global.d.ts | 11 ++++ package.json | 5 +- pnpm-lock.yaml | 38 +++++++++++++ typedoc-plugins/typedoc-plugin-rename-svg.js | 34 ++++++++++++ typedoc.config.js | 56 ++++++++++++++++++++ typedoc.json | 7 --- 8 files changed, 161 insertions(+), 21 deletions(-) create mode 100644 typedoc-plugins/typedoc-plugin-rename-svg.js create mode 100644 typedoc.config.js delete mode 100644 typedoc.json diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 46957c02e56..07a20594996 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -23,7 +23,9 @@ jobs: timeout-minutes: 10 runs-on: ubuntu-latest env: - api-dir: ./ + docs-dir: ./pokerogue_docs + # Only push docs when running on pushes to main/beta + DRY_RUN: ${{github.event_name == 'push' && (github.ref_name == 'beta' || github.ref_name == 'main')}} strategy: fail-fast: false @@ -58,19 +60,18 @@ jobs: ref: gh-pages - name: Install Node.js dependencies - working-directory: ${{env.api-dir}} - run: | - cd pokerogue_docs - pnpm i + working-directory: ${{env.docs-dir}} + run: pnpm i - name: Generate Typedoc docs - working-directory: ${{env.api-dir}} - run: | - cd pokerogue_docs - pnpm exec typedoc --out /tmp/docs --githubPages false --entryPoints ./src/ + working-directory: ${{env.docs-dir}} + env: + REF_NAME: ${{github.ref_name}} + DRY_RUN: ${{env.DRY_RUN}} + run: pnpm typedoc - name: Commit & Push docs - if: github.event_name == 'push' && (github.ref_name == 'beta' || github.ref_name == 'main') + if: ${{!env.DRY_RUN}} run: | cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" @@ -78,6 +79,5 @@ jobs: mkdir -p $GITHUB_REF_NAME rm -rf $GITHUB_REF_NAME/* cp -r /tmp/docs/. $GITHUB_REF_NAME - git add $GITHUB_REF_NAME - git commit --allow-empty -m "[skip ci] Deploy docs" + git commit --allow-empty -am "[skip ci] Deploy docs" git push \ No newline at end of file diff --git a/README.md b/README.md index 1bb8c7772f3..cf70b5d9335 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ PokéRogue +![Discord Static Badge](https://img.shields.io/badge/Community_Discord-blurple?style=flat&logo=discord&logoSize=auto&labelColor=white&color=5865F2&link=https://discord.gg/pokerogue) +[![Docs Coverage Static Badge](https://pagefaultgames.github.io/pokerogue/beta/coverage.svg)](https://pagefaultgames.github.io/pokerogue/beta) +[![Testing Badge](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml/badge.svg)](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml) +[![License: GNU AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) + PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! # Contributing @@ -7,7 +12,7 @@ PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite See [CONTRIBUTING.md](./CONTRIBUTING.md), this includes instructions on how to set up the game locally. # 📝 Credits -> + > If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue). Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md). diff --git a/global.d.ts b/global.d.ts index 8b79d966e3c..92a883f40c9 100644 --- a/global.d.ts +++ b/global.d.ts @@ -18,3 +18,14 @@ declare global { call(this: T, thisArg: ThisParameterType, ...argArray: Parameters): ReturnType; } } + +// Global augments for `typedoc` to prevent TS from erroring when editing the config JS file +declare module "typedoc" { + export interface TypeDocOptionMap { + coverageLabel: string; + coverageColor: string; + coverageOutputPath: string; + coverageOutputType: "svg" | "json" | "all"; + coverageSvgWidth: number; + } +} diff --git a/package.json b/package.json index 38386c3d964..0620cf6a88c 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "typecheck": "tsc --noEmit", "biome": "biome check --write --changed --no-errors-on-unmatched --diagnostic-level=error", "biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched", - "docs": "typedoc", + "typedoc": "typedoc", "depcruise": "depcruise src test", "postinstall": "lefthook install; git submodule update --init --recursive", "update-version:patch": "pnpm version patch --force --no-git-tag-version", @@ -42,6 +42,9 @@ "msw": "^2.10.4", "phaser3spectorjs": "^0.0.8", "typedoc": "^0.28.8", + "typedoc-github-theme": "^0.3.1", + "typedoc-plugin-coverage": "^4.0.1", + "typedoc-plugin-mdn-links": "^5.0.9", "typescript": "^5.8.3", "vite": "^7.0.6", "vite-tsconfig-paths": "^5.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3b58a60f48..089689818ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,15 @@ importers: typedoc: specifier: ^0.28.8 version: 0.28.8(typescript@5.8.3) + typedoc-github-theme: + specifier: ^0.3.1 + version: 0.3.1(typedoc@0.28.8(typescript@5.8.3)) + typedoc-plugin-coverage: + specifier: ^4.0.1 + version: 4.0.1(typedoc@0.28.8(typescript@5.8.3)) + typedoc-plugin-mdn-links: + specifier: ^5.0.9 + version: 5.0.9(typedoc@0.28.8(typescript@5.8.3)) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -1789,6 +1798,23 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typedoc-github-theme@0.3.1: + resolution: {integrity: sha512-j6PmkAGmf/MGCzYjQcUH6jS9djPsNl/IoTXooxC+MoeMkBhbmPyKJlpR6Lw12BLoe2OYpYA2J1KMktUJXp/8Sw==} + engines: {node: '>=18.0.0'} + peerDependencies: + typedoc: ~0.28.0 + + typedoc-plugin-coverage@4.0.1: + resolution: {integrity: sha512-P1QBR5GJSfW3fDrpz4Vkd8z8lzWaBYjaHebRLk0u2Uga0oSFlPaqrCyiHzItBXxZX28aMlNlZwrUnsLgUgqA7g==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-plugin-mdn-links@5.0.9: + resolution: {integrity: sha512-kXssRKBhUd0JeHzFmxWVsGWVFR9WXafe70Y8Ed+MYH2Nu2647cqfGQN1OBKgvXpmAT8MTpACmUIQ7GnQnh1/iw==} + peerDependencies: + typedoc: 0.27.x || 0.28.x + typedoc@0.28.8: resolution: {integrity: sha512-16GfLopc8icHfdvqZDqdGBoS2AieIRP2rpf9mU+MgN+gGLyEQvAO0QgOa6NJ5QNmQi0LFrDY9in4F2fUNKgJKA==} engines: {node: '>= 18', pnpm: '>= 10'} @@ -3634,6 +3660,18 @@ snapshots: type-fest@4.41.0: {} + typedoc-github-theme@0.3.1(typedoc@0.28.8(typescript@5.8.3)): + dependencies: + typedoc: 0.28.8(typescript@5.8.3) + + typedoc-plugin-coverage@4.0.1(typedoc@0.28.8(typescript@5.8.3)): + dependencies: + typedoc: 0.28.8(typescript@5.8.3) + + typedoc-plugin-mdn-links@5.0.9(typedoc@0.28.8(typescript@5.8.3)): + dependencies: + typedoc: 0.28.8(typescript@5.8.3) + typedoc@0.28.8(typescript@5.8.3): dependencies: '@gerrit0/mini-shiki': 3.8.1 diff --git a/typedoc-plugins/typedoc-plugin-rename-svg.js b/typedoc-plugins/typedoc-plugin-rename-svg.js new file mode 100644 index 00000000000..5fda4ee3c6d --- /dev/null +++ b/typedoc-plugins/typedoc-plugin-rename-svg.js @@ -0,0 +1,34 @@ +// @ts-check + +import { PageKind, Renderer } from "typedoc"; + +/** + * @module + * Typedoc plugin to run post-processing on the `index.html` file and replace the coverage SVG + * for Beta with the newly generated file for the current branch. + */ + +/** + * @param {import('typedoc').Application} app + */ +export function load(app) { + // Don't do anything if no REF_NAME was specified (likely indicating a local docs run) + if (!process.env.REF_NAME) { + return; + } + app.renderer.on(Renderer.EVENT_END_PAGE, page => { + if (page.pageKind === PageKind.Index && page.contents) { + page.contents = page.contents + // Replace links to the beta documentation site with the current ref name + .replace( + /href="(.*pagefaultgames.github.io\/pokerogue\/).*?"/, // formatting + `href="$1/${process.env.REF_NAME}"`, + ) + // Replace the link to Beta's coverage SVG with the SVG file for the branch in question. + .replace( + /img src=".*?coverage.svg/, // formatting + `img src="coverage.svg"`, + ); + } + }); +} diff --git a/typedoc.config.js b/typedoc.config.js new file mode 100644 index 00000000000..72c58ee8350 --- /dev/null +++ b/typedoc.config.js @@ -0,0 +1,56 @@ +import { globSync } from "node:fs"; + +/** + * @type {Partial} + */ +const config = { + entryPoints: ["./src", "./test/test-utils"], + entryPointStrategy: "expand", + exclude: ["**/*+.test.ts", "src/polyfills.ts", "src/vite.env.d.ts"], + excludeReferences: true, // prevent documenting re-exports + requiredToBeDocumented: [ + "Enum", + "EnumMember", + "Variable", + "Function", + "Class", + "Interface", + "Property", + "Method", + "Accessor", + "TypeAlias", + ], + highlightLanguages: ["javascript", "json", "jsonc", "json5", "tsx", "typescript", "markdown"], + plugin: [ + "typedoc-github-theme", + "typedoc-plugin-coverage", + "typedoc-plugin-mdn-links", + ...globSync("./typedoc-plugins/**/*.js").map(plugin => "./" + plugin), + ], + // Avoid emitting docs for branches other than main/beta + emit: process.env.DRY_RUN ? "none" : "docs", + out: process.env.CI ? "/tmp/docs" : "./typedoc", + name: "PokéRogue", + readme: "./README.md", + coverageLabel: "Documented", + coverageSvgWidth: 120, // Increased from 104 baseline due to adding 2 extra letters + favicon: "./public/images/logo.png", + theme: "typedoc-github-theme", + customFooterHtml: "

Copyright Pagefault Games 2025

", + customFooterHtmlDisableWrapper: true, + navigationLinks: { + GitHub: "https://github.com/pagefaultgames/pokerogue", + }, +}; + +// If generating docs for main/beta, check the ref name and add an appropriate navigation header +if (!process.env.DRY_RUN && process.env.REF_NAME) { + const otherRefName = process.env.REF_NAME === "main" ? "beta" : "main"; + config.navigationLinks = { + ...config.navigationLinks, + // This will be "Switch to Beta" when on main, and vice versa + [`Switch to ${otherRefName.charAt(0).toUpperCase() + otherRefName.slice(1).toLowerCase()}`]: `https://pagefaultgames.github.io/pokerogue/${otherRefName}`, + }; +} + +export default config; diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index c34e6190c1a..00000000000 --- a/typedoc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "entryPoints": ["./src"], - "entryPointStrategy": "expand", - "exclude": ["**/*+.test.ts"], - "out": "typedoc", - "highlightLanguages": ["javascript", "json", "jsonc", "json5", "tsx", "typescript", "markdown"] -} From 309e31e196f005911b65eecc3fba8828e3e73b47 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:38:01 -0400 Subject: [PATCH 086/134] [Bug] Future Sight no longer crashes after catching the user (#6479) --- src/battle-scene.ts | 2 + src/data/battle-anims.ts | 2 +- src/data/positional-tags/positional-tag.ts | 4 +- test/moves/delayed-attack.test.ts | 69 ++++++++++++++++------ test/test-utils/phase-interceptor.ts | 2 + 5 files changed, 58 insertions(+), 21 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 9ac6e385220..3a1de1bcc43 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -863,6 +863,8 @@ export class BattleScene extends SceneBase { * @param pokemonId - The ID whose Pokemon will be retrieved. * @returns The {@linkcode Pokemon} associated with the given id. * Returns `null` if the ID is `undefined` or not present in either party. + * @todo Change the `null` to `undefined` and update callers' signatures - + * this is weird and causes a lot of random jank */ getPokemonById(pokemonId: number | undefined): Pokemon | null { if (isNullOrUndefined(pokemonId)) { diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 5ff4472d148..85b15c934be 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -835,7 +835,7 @@ export abstract class BattleAnim { // biome-ignore lint/complexity/noBannedTypes: callback is used liberally play(onSubstitute?: boolean, callback?: Function) { const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? + const user = !isOppAnim ? this.user! : this.target!; // TODO: These bangs are LITERALLY not correct at all const target = !isOppAnim ? this.target! : this.user!; if (!target?.isOnField() && !this.playRegardlessOfIssues) { diff --git a/src/data/positional-tags/positional-tag.ts b/src/data/positional-tags/positional-tag.ts index 77ca6f0e9eb..a877b45b045 100644 --- a/src/data/positional-tags/positional-tag.ts +++ b/src/data/positional-tags/positional-tag.ts @@ -126,7 +126,9 @@ export class DelayedAttackTag extends PositionalTag implements DelayedAttackArgs // Silently disappear if either source or target are missing or happen to be the same pokemon // (i.e. targeting oneself) // We also need to check for fainted targets as they don't technically leave the field until _after_ the turn ends - return !!source && !!target && source !== target && !target.isFainted(); + // TODO: Figure out a way to store the target's offensive stat if they faint to allow pending attacks to persist + // TODO: Remove the `?.scene` checks once battle anims are cleaned up - needed to avoid catch+release crash + return !!source?.scene && !!target?.scene && source !== target && !target.isFainted(); } } diff --git a/test/moves/delayed-attack.test.ts b/test/moves/delayed-attack.test.ts index e8cf2871626..420ef6d1f00 100644 --- a/test/moves/delayed-attack.test.ts +++ b/test/moves/delayed-attack.test.ts @@ -4,12 +4,15 @@ import { allMoves } from "#data/data-lists"; import { AbilityId } from "#enums/ability-id"; import { BattleType } from "#enums/battle-type"; import { BattlerIndex } from "#enums/battler-index"; +import { Button } from "#enums/buttons"; import { MoveId } from "#enums/move-id"; import { MoveResult } from "#enums/move-result"; +import { PokeballType } from "#enums/pokeball"; import { PokemonType } from "#enums/pokemon-type"; import { PositionalTagType } from "#enums/positional-tag-type"; import { SpeciesId } from "#enums/species-id"; import { Stat } from "#enums/stat"; +import { UiMode } from "#enums/ui-mode"; import { GameManager } from "#test/test-utils/game-manager"; import i18next from "i18next"; import Phaser from "phaser"; @@ -95,7 +98,7 @@ describe("Moves - Delayed Attacks", () => { expectFutureSightActive(0); const enemy = game.field.getEnemyPokemon(); - expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + expect(enemy).not.toHaveFullHp(); expect(game.textInterceptor.logs).toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(enemy), @@ -130,12 +133,12 @@ describe("Moves - Delayed Attacks", () => { expectFutureSightActive(); const enemy = game.field.getEnemyPokemon(); - expect(enemy.hp).toBe(enemy.getMaxHp()); + expect(enemy).toHaveFullHp(); await passTurns(2); expectFutureSightActive(0); - expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + expect(enemy).not.toHaveFullHp(); }); it("should work when used against different targets in doubles", async () => { @@ -149,15 +152,15 @@ describe("Moves - Delayed Attacks", () => { await game.toEndOfTurn(); expectFutureSightActive(2); - expect(enemy1.hp).toBe(enemy1.getMaxHp()); - expect(enemy2.hp).toBe(enemy2.getMaxHp()); + expect(enemy1).toHaveFullHp(); + expect(enemy2).toHaveFullHp(); expect(karp.getLastXMoves()[0].result).toBe(MoveResult.OTHER); expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.OTHER); await passTurns(2); - expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); - expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp()); + expect(enemy1).not.toHaveFullHp(); + expect(enemy2).not.toHaveFullHp(); }); it("should trigger multiple pending attacks in order of creation, even if that order changes later on", async () => { @@ -222,8 +225,8 @@ describe("Moves - Delayed Attacks", () => { expect(game.scene.getPlayerParty()).toEqual([milotic, karp, feebas]); - expect(karp.hp).toBe(karp.getMaxHp()); - expect(feebas.hp).toBe(feebas.getMaxHp()); + expect(karp).toHaveFullHp(); + expect(feebas).toHaveFullHp(); expect(game.textInterceptor.logs).not.toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(karp), @@ -245,15 +248,14 @@ describe("Moves - Delayed Attacks", () => { expect(enemy2.isFainted()).toBe(true); expectFutureSightActive(); - const attack = game.scene.arena.positionalTagManager.tags.find( - t => t.tagType === PositionalTagType.DELAYED_ATTACK, - )!; - expect(attack).toBeDefined(); - expect(attack.targetIndex).toBe(enemy1.getBattlerIndex()); + expect(game).toHavePositionalTag({ + tagType: PositionalTagType.DELAYED_ATTACK, + targetIndex: enemy1.getBattlerIndex(), + }); await passTurns(2); - expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); + expect(enemy1).not.toHaveFullHp(); expect(game.textInterceptor.logs).toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(enemy1), @@ -281,7 +283,7 @@ describe("Moves - Delayed Attacks", () => { await game.toNextTurn(); expectFutureSightActive(0); - expect(enemy1.hp).toBe(enemy1.getMaxHp()); + expect(enemy1).toHaveFullHp(); expect(game.textInterceptor.logs).not.toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(enemy1), @@ -317,8 +319,8 @@ describe("Moves - Delayed Attacks", () => { await game.toEndOfTurn(); - expect(enemy1.hp).toBe(enemy1.getMaxHp()); - expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp()); + expect(enemy1).toHaveFullHp(); + expect(enemy2).not.toHaveFullHp(); expect(game.textInterceptor.logs).toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(enemy2), @@ -351,7 +353,7 @@ describe("Moves - Delayed Attacks", () => { // Player Normalize was not applied due to being off field const enemy = game.field.getEnemyPokemon(); - expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + expect(enemy).not.toHaveFullHp(); expect(game.textInterceptor.logs).toContain( i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(enemy), @@ -384,6 +386,35 @@ describe("Moves - Delayed Attacks", () => { expect(typeBoostSpy).not.toHaveBeenCalled(); }); + it("should not crash when catching & releasing a Pokemon on the same turn its delayed attack expires", async () => { + game.override.startingModifier([{ name: "MASTER_BALL", count: 1 }]); + await game.classicMode.startBattle([ + SpeciesId.FEEBAS, + SpeciesId.FEEBAS, + SpeciesId.FEEBAS, + SpeciesId.FEEBAS, + SpeciesId.FEEBAS, + SpeciesId.FEEBAS, + ]); + + game.move.use(MoveId.SPLASH); + await game.move.forceEnemyMove(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + expectFutureSightActive(1); + + await passTurns(1); + + // Throw master ball and release the enemy + game.doThrowPokeball(PokeballType.MASTER_BALL); + game.onNextPrompt("AttemptCapturePhase", UiMode.CONFIRM, () => { + game.scene.ui.processInput(Button.CANCEL); + }); + await game.toEndOfTurn(); + + expectFutureSightActive(0); + }); + // TODO: Implement and move to a power spot's test file it.todo("Should activate ally's power spot when switched in during single battles"); }); diff --git a/test/test-utils/phase-interceptor.ts b/test/test-utils/phase-interceptor.ts index 996f00806c6..f2f11db9d12 100644 --- a/test/test-utils/phase-interceptor.ts +++ b/test/test-utils/phase-interceptor.ts @@ -1,6 +1,7 @@ import type { BattleScene } from "#app/battle-scene"; import { Phase } from "#app/phase"; import { UiMode } from "#enums/ui-mode"; +import { AttemptCapturePhase } from "#phases/attempt-capture-phase"; import { AttemptRunPhase } from "#phases/attempt-run-phase"; import { BattleEndPhase } from "#phases/battle-end-phase"; import { BerryPhase } from "#phases/berry-phase"; @@ -183,6 +184,7 @@ export class PhaseInterceptor { PostGameOverPhase, RevivalBlessingPhase, PokemonHealPhase, + AttemptCapturePhase, ]; private endBySetMode = [ From db8458fdb72d73538fd217b2229cc85f43a4dfc8 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 5 Sep 2025 19:23:32 -0700 Subject: [PATCH 087/134] [GitHub] Fix Typedoc workflow (#6490) * [GitHub] Fix Typedoc workflow * Remove `--allow-empty` --- .github/workflows/github-pages.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 07a20594996..95b73782f8e 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -25,7 +25,7 @@ jobs: env: docs-dir: ./pokerogue_docs # Only push docs when running on pushes to main/beta - DRY_RUN: ${{github.event_name == 'push' && (github.ref_name == 'beta' || github.ref_name == 'main')}} + DRY_RUN: ${{github.event_name != 'push' || (github.ref_name != 'beta' && github.ref_name != 'main')}} strategy: fail-fast: false @@ -47,7 +47,7 @@ jobs: with: version: 10 - - name: Setup Node 22.14.1 + - name: Setup Node uses: actions/setup-node@v4 with: node-version-file: "pokerogue_docs/.nvmrc" @@ -79,5 +79,6 @@ jobs: mkdir -p $GITHUB_REF_NAME rm -rf $GITHUB_REF_NAME/* cp -r /tmp/docs/. $GITHUB_REF_NAME - git commit --allow-empty -am "[skip ci] Deploy docs" - git push \ No newline at end of file + git add $GITHUB_REF_NAME + git commit -m "[skip ci] Deploy docs" + git push From 02bfaf9ad3629d91298725efe9c4b7d66ec0fe7e Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 22:42:44 -0400 Subject: [PATCH 088/134] [Test] Added/cleaned up tests for Pastel/Sweet Veil (#6374) * [Test] Added/cleaned up tests for Pastel/Sweet Veil * Fixed extra import + tests * Fixed type import * Update move.ts * reverted abstract constructor stuff --- test/abilities/pastel-veil.test.ts | 50 +++++-------- test/abilities/sweet-veil.test.ts | 109 +++++++++++++++++++++-------- 2 files changed, 96 insertions(+), 63 deletions(-) diff --git a/test/abilities/pastel-veil.test.ts b/test/abilities/pastel-veil.test.ts index c4b368c94d0..cc414fa6f87 100644 --- a/test/abilities/pastel-veil.test.ts +++ b/test/abilities/pastel-veil.test.ts @@ -3,7 +3,6 @@ import { BattlerIndex } from "#enums/battler-index"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; import { StatusEffect } from "#enums/status-effect"; -import { TurnEndPhase } from "#phases/turn-end-phase"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,48 +23,35 @@ describe("Abilities - Pastel Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .battleStyle("double") - .moveset([MoveId.TOXIC_THREAD, MoveId.SPLASH]) - .enemyAbility(AbilityId.BALL_FETCH) - .enemySpecies(SpeciesId.SUNKERN) - .enemyMoveset(MoveId.SPLASH); + game.override.battleStyle("double").enemyAbility(AbilityId.BALL_FETCH).enemySpecies(SpeciesId.TOXAPEX); }); - it("prevents the user and its allies from being afflicted by poison", async () => { + it("should prevent the user and its allies from being poisoned", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.GALAR_PONYTA]); - const ponyta = game.scene.getPlayerField()[1]; - const magikarp = game.scene.getPlayerField()[0]; - ponyta.abilityIndex = 1; + const [magikarp, ponyta] = game.scene.getPlayerField(); + game.field.mockAbility(ponyta, AbilityId.PASTEL_VEIL); - expect(ponyta.hasAbility(AbilityId.PASTEL_VEIL)).toBe(true); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.TOXIC, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.TOXIC, BattlerIndex.PLAYER_2); + await game.toEndOfTurn(); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.TOXIC_THREAD, 1, BattlerIndex.PLAYER); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(magikarp.status?.effect).toBeUndefined(); + expect(magikarp).toHaveStatusEffect(StatusEffect.NONE); + expect(ponyta).toHaveStatusEffect(StatusEffect.NONE); }); - it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { + it("should cure allies' poison if user is sent out into battle", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS, SpeciesId.GALAR_PONYTA]); - const ponyta = game.scene.getPlayerParty()[2]; - const magikarp = game.scene.getPlayerField()[0]; - ponyta.abilityIndex = 1; + const [magikarp, , ponyta] = game.scene.getPlayerParty(); + game.field.mockAbility(ponyta, AbilityId.PASTEL_VEIL); - expect(ponyta.hasAbility(AbilityId.PASTEL_VEIL)).toBe(true); + magikarp.doSetStatus(StatusEffect.POISON); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.TOXIC_THREAD, 1, BattlerIndex.PLAYER); - - await game.phaseInterceptor.to(TurnEndPhase); - expect(magikarp.status?.effect).toBe(StatusEffect.POISON); - - game.move.select(MoveId.SPLASH); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); game.doSwitchPokemon(2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.toEndOfTurn(); - expect(magikarp.status?.effect).toBeUndefined(); + expect(magikarp).toHaveStatusEffect(StatusEffect.NONE); }); }); diff --git a/test/abilities/sweet-veil.test.ts b/test/abilities/sweet-veil.test.ts index 12eeae9f9c5..d08c3eb04f8 100644 --- a/test/abilities/sweet-veil.test.ts +++ b/test/abilities/sweet-veil.test.ts @@ -2,8 +2,9 @@ import { AbilityId } from "#enums/ability-id"; import { BattlerIndex } from "#enums/battler-index"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; import { SpeciesId } from "#enums/species-id"; -import { TurnEndPhase } from "#phases/turn-end-phase"; +import { StatusEffect } from "#enums/status-effect"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -26,62 +27,108 @@ describe("Abilities - Sweet Veil", () => { game = new GameManager(phaserGame); game.override .battleStyle("double") - .moveset([MoveId.SPLASH, MoveId.REST, MoveId.YAWN]) + .ability(AbilityId.BALL_FETCH) .enemySpecies(SpeciesId.MAGIKARP) .enemyAbility(AbilityId.BALL_FETCH) - .enemyMoveset(MoveId.POWDER); + .enemyMoveset(MoveId.SPLASH); }); - it("prevents the user and its allies from falling asleep", async () => { + function expectNoStatus() { + game.scene.getPlayerField().forEach(p => { + expect.soft(p).toHaveStatusEffect(StatusEffect.NONE); + }); + } + + it("should prevent the user and its allies from falling asleep", async () => { await game.classicMode.startBattle([SpeciesId.SWIRLIX, SpeciesId.MAGIKARP]); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.SPLASH, 1); + game.field.mockAbility(game.field.getPlayerPokemon(), AbilityId.SWEET_VEIL); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.SPORE, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.SPORE, BattlerIndex.PLAYER_2); + await game.toEndOfTurn(); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + expectNoStatus(); }); - it("causes Rest to fail when used by the user or its allies", async () => { - game.override.enemyMoveset(MoveId.SPLASH); + it("should cause Rest to fail when used by the user or its allies", async () => { await game.classicMode.startBattle([SpeciesId.SWIRLIX, SpeciesId.MAGIKARP]); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.REST, 1); + const [swirlix, magikarp] = game.scene.getPlayerField(); + game.field.mockAbility(swirlix, AbilityId.SWEET_VEIL); + swirlix.hp = 1; + magikarp.hp = 1; - await game.phaseInterceptor.to(TurnEndPhase); + game.move.use(MoveId.REST, BattlerIndex.PLAYER); + game.move.use(MoveId.REST, BattlerIndex.PLAYER_2); + await game.toEndOfTurn(); - expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + expectNoStatus(); + expect(swirlix).toHaveUsedMove({ move: MoveId.REST, result: MoveResult.FAIL }); + expect(magikarp).toHaveUsedMove({ move: MoveId.REST, result: MoveResult.FAIL }); }); - it("causes Yawn to fail if used on the user or its allies", async () => { - game.override.enemyMoveset(MoveId.YAWN); + it("should cause Yawn to fail if used on the user or its allies", async () => { await game.classicMode.startBattle([SpeciesId.SWIRLIX, SpeciesId.MAGIKARP]); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.SPLASH, 1); + const [shuckle, swirlix] = game.scene.getPlayerField(); + game.field.mockAbility(swirlix, AbilityId.SWEET_VEIL); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.YAWN, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.YAWN, BattlerIndex.PLAYER_2); + await game.toEndOfTurn(); - expect(game.scene.getPlayerField().every(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(false); + expect(shuckle).not.toHaveBattlerTag(BattlerTagType.DROWSY); + expect(swirlix).not.toHaveBattlerTag(BattlerTagType.DROWSY); + // TODO: This dooesn't work ATM + /* + const [karp1, karp2] = game.scene.getEnemyField(); + expect(karp1).toHaveUsedMove({move: MoveId.YAWN, result: MoveResult.FAIL}); + expect(karp2).toHaveUsedMove({move: MoveId.YAWN, result: MoveResult.FAIL}); + */ }); - it("prevents the user and its allies already drowsy due to Yawn from falling asleep.", async () => { - game.override.enemySpecies(SpeciesId.PIKACHU).enemyLevel(5).startingLevel(5).enemyMoveset(MoveId.SPLASH); + it("should NOT cure allies' sleep status if user is sent out into battle", async () => { + await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS, SpeciesId.SWIRLIX]); - await game.classicMode.startBattle([SpeciesId.SHUCKLE, SpeciesId.SHUCKLE, SpeciesId.SWIRLIX]); + const [magikarp, , swirlix] = game.scene.getPlayerParty(); + game.field.mockAbility(swirlix, AbilityId.PASTEL_VEIL); - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.YAWN, 1, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH); + game.move.use(MoveId.SPORE, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); + await game.toNextTurn(); - await game.phaseInterceptor.to("BerryPhase"); + expect(magikarp).toHaveStatusEffect(StatusEffect.SLEEP); - expect(game.scene.getPlayerField().some(p => !!p.getTag(BattlerTagType.DROWSY))).toBe(true); - - game.move.select(MoveId.SPLASH); + game.move.use(MoveId.SPLASH); game.doSwitchPokemon(2); + await game.toEndOfTurn(); - expect(game.scene.getPlayerField().every(p => p.status?.effect)).toBe(false); + expect(magikarp).toHaveStatusEffect(StatusEffect.SLEEP); + }); + + it("should prevent an already-drowsy user or ally from falling asleep", async () => { + await game.classicMode.startBattle([SpeciesId.SHUCKLE, SpeciesId.SWIRLIX]); + + // Add yawn before granting ability + const [shuckle, swirlix] = game.scene.getPlayerField(); + shuckle.addTag(BattlerTagType.DROWSY, 1); + swirlix.addTag(BattlerTagType.DROWSY, 1); + + game.field.mockAbility(shuckle, AbilityId.SWEET_VEIL); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(shuckle).not.toHaveBattlerTag(BattlerTagType.DROWSY); + expect(swirlix).not.toHaveBattlerTag(BattlerTagType.DROWSY); + expectNoStatus(); }); }); From d630c106e0440d9eaa406a0989fe5b3a1577c7dc Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 22:50:37 -0400 Subject: [PATCH 089/134] [Test] Improved typing on `BattlerTagData` and `ArenaTagData`; improved test matchers (#6338) * Improved typing on `BattlerTagData` and `ArenaTagData` * Added dragon cheer/focus energy tests * Cleaned up descs --- src/@types/arena-tags.ts | 27 +++-- src/@types/battler-tags.ts | 42 +++++--- src/@types/helpers/type-helpers.ts | 13 ++- src/data/arena-tag.ts | 4 +- src/data/battler-tags.ts | 4 +- src/data/moves/move.ts | 6 +- src/system/arena-data.ts | 6 +- test/@types/vitest.d.ts | 13 ++- test/moves/dragon-cheer.test.ts | 99 ++++++++++--------- test/moves/focus-energy.test.ts | 69 +++++++++++++ test/test-utils/matchers/to-have-arena-tag.ts | 20 +++- .../matchers/to-have-battler-tag.ts | 68 ++++++++++--- test/test-utils/string-utils.ts | 2 +- 13 files changed, 270 insertions(+), 103 deletions(-) create mode 100644 test/moves/focus-energy.test.ts diff --git a/src/@types/arena-tags.ts b/src/@types/arena-tags.ts index 4ac7abf6f3d..390d95a7daa 100644 --- a/src/@types/arena-tags.ts +++ b/src/@types/arena-tags.ts @@ -2,6 +2,7 @@ import type { ArenaTagTypeMap } from "#data/arena-tag"; import type { ArenaTagType } from "#enums/arena-tag-type"; // biome-ignore lint/correctness/noUnusedImports: TSDocs import type { SessionSaveData } from "#system/game-data"; +import type { ObjectValues } from "#types/type-helpers"; /** Subset of {@linkcode ArenaTagType}s that apply some negative effect to pokemon that switch in ({@link https://bulbapedia.bulbagarden.net/wiki/List_of_moves_that_cause_entry_hazards#List_of_traps | entry hazards} and Imprison. */ export type EntryHazardTagType = @@ -24,22 +25,32 @@ export type TurnProtectArenaTagType = /** Subset of {@linkcode ArenaTagType}s that create Trick Room-like effects which are removed upon overlap. */ export type RoomArenaTagType = ArenaTagType.TRICK_ROOM; -/** Subset of {@linkcode ArenaTagType}s that cannot persist across turns, and thus should not be serialized in {@linkcode SessionSaveData}. */ +/** Subset of {@linkcode ArenaTagType}s that are **not** able to persist across turns, and should therefore not be serialized in {@linkcode SessionSaveData}. */ export type NonSerializableArenaTagType = ArenaTagType.NONE | TurnProtectArenaTagType | ArenaTagType.ION_DELUGE; /** Subset of {@linkcode ArenaTagType}s that may persist across turns, and thus must be serialized in {@linkcode SessionSaveData}. */ export type SerializableArenaTagType = Exclude; /** - * Type-safe representation of an arbitrary, serialized Arena Tag + * Utility type containing all entries of {@linkcode ArenaTagTypeMap} corresponding to serializable tags. */ -export type ArenaTagTypeData = Parameters< - ArenaTagTypeMap[keyof { - [K in keyof ArenaTagTypeMap as K extends SerializableArenaTagType ? K : never]: ArenaTagTypeMap[K]; - }]["loadTag"] ->[0]; +type SerializableArenaTagTypeMap = Pick; -/** Dummy, typescript-only declaration to ensure that +/** + * Type mapping all `ArenaTag`s to type-safe representations of their serialized forms. + * @interface + */ +export type ArenaTagDataMap = { + [k in keyof SerializableArenaTagTypeMap]: Parameters[0]; +}; + +/** + * Type-safe representation of an arbitrary, serialized `ArenaTag`. + */ +export type ArenaTagData = ObjectValues; + +/** + * Dummy, typescript-only declaration to ensure that * {@linkcode ArenaTagTypeMap} has a map for all ArenaTagTypes. * * If an arena tag is missing from the map, typescript will throw an error on this statement. diff --git a/src/@types/battler-tags.ts b/src/@types/battler-tags.ts index 211eb25113d..8e34108958e 100644 --- a/src/@types/battler-tags.ts +++ b/src/@types/battler-tags.ts @@ -1,8 +1,11 @@ // biome-ignore-start lint/correctness/noUnusedImports: Used in a TSDoc comment import type { AbilityBattlerTag, BattlerTagTypeMap, SerializableBattlerTag, TypeBoostTag } from "#data/battler-tags"; import type { AbilityId } from "#enums/ability-id"; -// biome-ignore-end lint/correctness/noUnusedImports: end +import type { SessionSaveData } from "#system/game-data"; +// biome-ignore-end lint/correctness/noUnusedImports: Used in a TSDoc comment + import type { BattlerTagType } from "#enums/battler-tag-type"; +import type { InferKeys, ObjectValues } from "#types/type-helpers"; /** * Subset of {@linkcode BattlerTagType}s that restrict the use of moves. @@ -103,28 +106,35 @@ export type RemovedTypeTagType = BattlerTagType.DOUBLE_SHOCKED | BattlerTagType. export type HighestStatBoostTagType = | BattlerTagType.QUARK_DRIVE // formatting | BattlerTagType.PROTOSYNTHESIS; -/** - * Subset of {@linkcode BattlerTagType}s that are able to persist between turns and should therefore be serialized - */ -export type SerializableBattlerTagType = keyof { - [K in keyof BattlerTagTypeMap as BattlerTagTypeMap[K] extends SerializableBattlerTag - ? K - : never]: BattlerTagTypeMap[K]; -}; /** - * Subset of {@linkcode BattlerTagType}s that are not able to persist across waves and should therefore not be serialized + * Subset of {@linkcode BattlerTagType}s that are able to persist between turns, and should therefore be serialized. + */ +export type SerializableBattlerTagType = InferKeys; + +/** + * Subset of {@linkcode BattlerTagType}s that are **not** able to persist between turns, + * and should therefore not be serialized in {@linkcode SessionSaveData}. */ export type NonSerializableBattlerTagType = Exclude; /** - * Type-safe representation of an arbitrary, serialized Battler Tag + * Utility type containing all entries of {@linkcode BattlerTagTypeMap} corresponding to serializable tags. */ -export type BattlerTagTypeData = Parameters< - BattlerTagTypeMap[keyof { - [K in keyof BattlerTagTypeMap as K extends SerializableBattlerTagType ? K : never]: BattlerTagTypeMap[K]; - }]["loadTag"] ->[0]; +type SerializableBattlerTagTypeMap = Pick; + +/** + * Type mapping all `BattlerTag`s to type-safe representations of their serialized forms. + * @interface + */ +export type BattlerTagDataMap = { + [k in keyof SerializableBattlerTagTypeMap]: Parameters[0]; +}; + +/** + * Type-safe representation of an arbitrary, serialized `BattlerTag`. + */ +export type BattlerTagData = ObjectValues; /** * Dummy, typescript-only declaration to ensure that diff --git a/src/@types/helpers/type-helpers.ts b/src/@types/helpers/type-helpers.ts index 0be391aa3c4..048a86ab489 100644 --- a/src/@types/helpers/type-helpers.ts +++ b/src/@types/helpers/type-helpers.ts @@ -36,15 +36,18 @@ export type Mutable = { /** * Type helper to obtain the keys associated with a given value inside an object. + * Acts similar to {@linkcode Pick}, except checking the object's values instead of its keys. * @typeParam O - The type of the object - * @typeParam V - The type of one of O's values + * @typeParam V - The type of one of O's values. */ -export type InferKeys> = { - [K in keyof O]: O[K] extends V ? K : never; -}[keyof O]; +export type InferKeys = V extends ObjectValues + ? { + [K in keyof O]: O[K] extends V ? K : never; + }[keyof O] + : never; /** - * Utility type to obtain the values of a given object. \ + * Utility type to obtain a union of the values of a given object. \ * Functions similar to `keyof E`, except producing the values instead of the keys. * @remarks * This can be used to convert an `enum` interface produced by `typeof Enum` into the union type representing its members. diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 1952db7867b..70e8697179e 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -23,7 +23,7 @@ import type { Arena } from "#field/arena"; import type { Pokemon } from "#field/pokemon"; import type { ArenaScreenTagType, - ArenaTagTypeData, + ArenaTagData, EntryHazardTagType, RoomArenaTagType, SerializableArenaTagType, @@ -1663,7 +1663,7 @@ export function getArenaTag( * @param source - An arena tag * @returns The valid arena tag */ -export function loadArenaTag(source: ArenaTag | ArenaTagTypeData | { tagType: ArenaTagType.NONE }): ArenaTag { +export function loadArenaTag(source: ArenaTag | ArenaTagData | { tagType: ArenaTagType.NONE }): ArenaTag { if (source.tagType === ArenaTagType.NONE) { return new NoneTag(); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 24e1e6f12cd..5484eba7271 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -34,7 +34,7 @@ import type { StatStageChangeCallback } from "#phases/stat-stage-change-phase"; import i18next from "#plugins/i18n"; import type { AbilityBattlerTagType, - BattlerTagTypeData, + BattlerTagData, ContactSetStatusProtectedTagType, ContactStatStageChangeProtectedTagType, CritStageBoostTagType, @@ -3843,7 +3843,7 @@ export function getBattlerTag( * @param source - An object containing the data necessary to reconstruct the BattlerTag. * @returns The valid battler tag */ -export function loadBattlerTag(source: BattlerTag | BattlerTagTypeData): BattlerTag { +export function loadBattlerTag(source: BattlerTag | BattlerTagData): BattlerTag { // TODO: Remove this bang by fixing the signature of `getBattlerTag` // to allow undefined sourceIds and sourceMoves (with appropriate fallback for tags that require it) const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove!, source.sourceId!); diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 1bb9a3f6e92..266362a468b 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -8903,7 +8903,9 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true) .target(MoveTarget.USER_SIDE), new SelfStatusMove(MoveId.FOCUS_ENERGY, PokemonType.NORMAL, -1, 30, -1, 0, 1) - .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, true, true), + .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, true, true) + // TODO: Remove once dragon cheer & focus energy are merged into 1 tag + .condition((_user, target) => !target.getTag(BattlerTagType.DRAGON_CHEER)), new AttackMove(MoveId.BIDE, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 10, -1, 1, 1) .target(MoveTarget.USER) .unimplemented(), @@ -11601,6 +11603,8 @@ export function initMoves() { .attr(OpponentHighHpPowerAttr, 100), new StatusMove(MoveId.DRAGON_CHEER, PokemonType.DRAGON, -1, 15, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.DRAGON_CHEER, false, true) + // TODO: Remove once dragon cheer & focus energy are merged into 1 tag + .condition((_user, target) => !target.getTag(BattlerTagType.CRIT_BOOST)) .target(MoveTarget.NEAR_ALLY), new AttackMove(MoveId.ALLURING_VOICE, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(AddBattlerTagIfBoostedAttr, BattlerTagType.CONFUSED) diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index b2a04f96a55..18620e15223 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -5,14 +5,14 @@ import { Terrain } from "#data/terrain"; import { Weather } from "#data/weather"; import type { BiomeId } from "#enums/biome-id"; import { Arena } from "#field/arena"; -import type { ArenaTagTypeData } from "#types/arena-tags"; +import type { ArenaTagData } from "#types/arena-tags"; import type { NonFunctionProperties } from "#types/type-helpers"; export interface SerializedArenaData { biome: BiomeId; weather: NonFunctionProperties | null; terrain: NonFunctionProperties | null; - tags?: ArenaTagTypeData[]; + tags?: ArenaTagData[]; positionalTags: SerializedPositionalTag[]; playerTerasUsed?: number; } @@ -31,7 +31,7 @@ export class ArenaData { // is not yet an instance of `ArenaTag` this.tags = source.tags - ?.map((t: ArenaTag | ArenaTagTypeData) => loadArenaTag(t)) + ?.map((t: ArenaTag | ArenaTagData) => loadArenaTag(t)) ?.filter((tag): tag is SerializableArenaTag => tag instanceof SerializableArenaTag) ?? []; this.playerTerasUsed = source.playerTerasUsed ?? 0; diff --git a/test/@types/vitest.d.ts b/test/@types/vitest.d.ts index aa7666c0880..f0bbdf37932 100644 --- a/test/@types/vitest.d.ts +++ b/test/@types/vitest.d.ts @@ -4,6 +4,7 @@ import type { Phase } from "#app/phase"; import type Overrides from "#app/overrides"; import type { ArenaTag } from "#data/arena-tag"; import type { TerrainType } from "#data/terrain"; +import type { BattlerTag } from "#data/battler-tags"; import type { PositionalTag } from "#data/positional-tags/positional-tag"; import type { AbilityId } from "#enums/ability-id"; import type { ArenaTagSide } from "#enums/arena-tag-side"; @@ -28,6 +29,7 @@ import type { TurnMove } from "#types/turn-move"; import type { AtLeastOne } from "#types/type-helpers"; import type { toDmgValue } from "utils/common"; import type { expect } from "vitest"; +import { toHaveBattlerTagOptions } from "#test/test-utils/matchers/to-have-battler-tag"; declare module "vitest" { interface Assertion { @@ -133,10 +135,15 @@ declare module "vitest" { toHaveStatStage(stat: BattleStat, expectedStage: number): void; /** - * Check whether a {@linkcode Pokemon} has a specific {@linkcode BattlerTagType}. - * @param expectedBattlerTagType - The expected {@linkcode BattlerTagType} + * Check whether a {@linkcode Pokemon} has the given {@linkcode BattlerTag}. + * @param expectedTag - A partially-filled {@linkcode BattlerTag} containing the desired properties */ - toHaveBattlerTag(expectedBattlerTagType: BattlerTagType): void; + toHaveBattlerTag(expectedTag: toHaveBattlerTagOptions): void; + /** + * Check whether a {@linkcode Pokemon} has the given {@linkcode BattlerTag}. + * @param expectedType - The expected {@linkcode BattlerTagType} + */ + toHaveBattlerTag(expectedType: BattlerTagType): void; /** * Check whether a {@linkcode Pokemon} has applied a specific {@linkcode AbilityId}. diff --git a/test/moves/dragon-cheer.test.ts b/test/moves/dragon-cheer.test.ts index 614dd9ab6ab..50880e067d9 100644 --- a/test/moves/dragon-cheer.test.ts +++ b/test/moves/dragon-cheer.test.ts @@ -1,15 +1,18 @@ import { AbilityId } from "#enums/ability-id"; import { BattlerIndex } from "#enums/battler-index"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -describe("Moves - Dragon Cheer", () => { +describe("Move - Dragon Cheer", () => { let phaserGame: Phaser.Game; let game: GameManager; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -24,75 +27,81 @@ describe("Moves - Dragon Cheer", () => { game = new GameManager(phaserGame); game.override .battleStyle("double") + .ability(AbilityId.BALL_FETCH) .enemyAbility(AbilityId.BALL_FETCH) .enemyMoveset(MoveId.SPLASH) - .enemyLevel(20) - .moveset([MoveId.DRAGON_CHEER, MoveId.TACKLE, MoveId.SPLASH]); + .enemyLevel(20); }); - it("increases the user's allies' critical hit ratio by one stage", async () => { + it("should increase non-Dragon type allies' crit ratios by 1 stage", async () => { await game.classicMode.startBattle([SpeciesId.DRAGONAIR, SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyField()[0]; - + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getCritStage"); - game.move.select(MoveId.DRAGON_CHEER, 0); - game.move.select(MoveId.TACKLE, 1, BattlerIndex.ENEMY); - + game.move.use(MoveId.DRAGON_CHEER, BattlerIndex.PLAYER); + game.move.use(MoveId.TACKLE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.toEndOfTurn(); - // After Tackle - await game.phaseInterceptor.to("TurnEndPhase"); + const [dragonair, magikarp] = game.scene.getPlayerField(); + expect(dragonair).not.toHaveBattlerTag(BattlerTagType.DRAGON_CHEER); + expect(magikarp).toHaveBattlerTag({ tagType: BattlerTagType.DRAGON_CHEER, critStages: 1 }); expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender }); - it("increases the user's Dragon-type allies' critical hit ratio by two stages", async () => { + it("should increase Dragon-type allies' crit ratios by 2 stages", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.DRAGONAIR]); - const enemy = game.scene.getEnemyField()[0]; - + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getCritStage"); - game.move.select(MoveId.DRAGON_CHEER, 0); - game.move.select(MoveId.TACKLE, 1, BattlerIndex.ENEMY); - + game.move.use(MoveId.DRAGON_CHEER, BattlerIndex.PLAYER); + game.move.use(MoveId.TACKLE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.toEndOfTurn(); - // After Tackle - await game.phaseInterceptor.to("TurnEndPhase"); + const [magikarp, dragonair] = game.scene.getPlayerField(); + expect(magikarp).not.toHaveBattlerTag(BattlerTagType.DRAGON_CHEER); + expect(dragonair).toHaveBattlerTag({ tagType: BattlerTagType.DRAGON_CHEER, critStages: 2 }); expect(enemy.getCritStage).toHaveReturnedWith(2); // getCritStage is called on defender }); - it("applies the effect based on the allies' type upon use of the move, and do not change if the allies' type changes later in battle", async () => { + it("should maintain crit boost amount even if user's type is changed", async () => { await game.classicMode.startBattle([SpeciesId.DRAGONAIR, SpeciesId.MAGIKARP]); - const magikarp = game.scene.getPlayerField()[1]; - const enemy = game.scene.getEnemyField()[0]; - - vi.spyOn(enemy, "getCritStage"); - - game.move.select(MoveId.DRAGON_CHEER, 0); - game.move.select(MoveId.TACKLE, 1, BattlerIndex.ENEMY); - + // Use Reflect Type to become Dragon-type mid-turn + game.move.use(MoveId.DRAGON_CHEER, BattlerIndex.PLAYER); + game.move.use(MoveId.REFLECT_TYPE, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); - - // After Tackle - await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender - - await game.toNextTurn(); - - // Change Magikarp's type to Dragon - vi.spyOn(magikarp, "getTypes").mockReturnValue([PokemonType.DRAGON]); - expect(magikarp.getTypes()).toEqual([PokemonType.DRAGON]); - - game.move.select(MoveId.SPLASH, 0); - game.move.select(MoveId.TACKLE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); - await game.phaseInterceptor.to("MoveEndPhase"); - expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender + + // Dragon cheer added +1 stages + const magikarp = game.scene.getPlayerField()[1]; + expect(magikarp).toHaveBattlerTag({ tagType: BattlerTagType.DRAGON_CHEER, critStages: 1 }); + expect(magikarp).toHaveTypes([PokemonType.WATER]); + + await game.toEndOfTurn(); + + // Should be dragon type, but still with a +1 stage boost + expect(magikarp).toHaveTypes([PokemonType.DRAGON]); + expect(magikarp).toHaveBattlerTag({ tagType: BattlerTagType.DRAGON_CHEER, critStages: 1 }); + }); + + it.each([ + { name: "Focus Energy", tagType: BattlerTagType.CRIT_BOOST }, + { name: "Dragon Cheer", tagType: BattlerTagType.DRAGON_CHEER }, + ])("should fail if $name is already present", async ({ tagType }) => { + await game.classicMode.startBattle([SpeciesId.DRAGONAIR, SpeciesId.MAGIKARP]); + + const [dragonair, magikarp] = game.scene.getPlayerField(); + magikarp.addTag(tagType); + + game.move.use(MoveId.DRAGON_CHEER, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.toEndOfTurn(); + + expect(dragonair).toHaveUsedMove({ move: MoveId.DRAGON_CHEER, result: MoveResult.FAIL }); + expect(magikarp).toHaveBattlerTag(tagType); }); }); diff --git a/test/moves/focus-energy.test.ts b/test/moves/focus-energy.test.ts new file mode 100644 index 00000000000..3c2882f5bf3 --- /dev/null +++ b/test/moves/focus-energy.test.ts @@ -0,0 +1,69 @@ +import { AbilityId } from "#enums/ability-id"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Move - Focus Energy", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(AbilityId.BALL_FETCH) + .battleStyle("single") + .criticalHits(false) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should increase the user's crit ratio by 2 stages", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + game.move.use(MoveId.FOCUS_ENERGY); + await game.toNextTurn(); + + const feebas = game.field.getPlayerPokemon(); + expect(feebas).toHaveBattlerTag({ tagType: BattlerTagType.CRIT_BOOST, critStages: 2 }); + + const enemy = game.field.getEnemyPokemon(); + vi.spyOn(enemy, "getCritStage"); + + game.move.use(MoveId.TACKLE); + await game.toEndOfTurn(); + + expect(enemy.getCritStage).toHaveReturnedWith(2); + }); + + it.each([ + { name: "Focus Energy", tagType: BattlerTagType.CRIT_BOOST }, + { name: "Dragon Cheer", tagType: BattlerTagType.DRAGON_CHEER }, + ])("should fail if $name is already present", async ({ tagType }) => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const feebas = game.field.getPlayerPokemon(); + feebas.addTag(tagType); + + game.move.use(MoveId.FOCUS_ENERGY); + await game.toEndOfTurn(); + + expect(feebas).toHaveUsedMove({ move: MoveId.FOCUS_ENERGY, result: MoveResult.FAIL }); + }); +}); diff --git a/test/test-utils/matchers/to-have-arena-tag.ts b/test/test-utils/matchers/to-have-arena-tag.ts index e2a4a71ffd5..a9d619686d1 100644 --- a/test/test-utils/matchers/to-have-arena-tag.ts +++ b/test/test-utils/matchers/to-have-arena-tag.ts @@ -6,11 +6,21 @@ import type { OneOther } from "#test/@types/test-helpers"; import type { GameManager } from "#test/test-utils/game-manager"; import { getOnelineDiffStr } from "#test/test-utils/string-utils"; import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { ArenaTagDataMap, SerializableArenaTagType } from "#types/arena-tags"; import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; -// intersection required to preserve T for inferences -export type toHaveArenaTagOptions = OneOther & { - tagType: T; +/** + * Options type for {@linkcode toHaveArenaTag}. + * @typeParam A - The {@linkcode ArenaTagType} being checked + * @remarks + * If A corresponds to a serializable `ArenaTag`, only properties allowed to be serialized + * (i.e. can change across instances) will be present and able to be checked. + */ +export type toHaveArenaTagOptions = OneOther< + A extends SerializableArenaTagType ? ArenaTagDataMap[A] : ArenaTagTypeMap[A], + "tagType" | "side" +> & { + tagType: A; }; /** @@ -22,10 +32,10 @@ export type toHaveArenaTagOptions = OneOther( +export function toHaveArenaTag( this: MatcherState, received: unknown, - expectedTag: T | toHaveArenaTagOptions, + expectedTag: A | toHaveArenaTagOptions, side: ArenaTagSide = ArenaTagSide.BOTH, ): SyncExpectationResult { if (!isGameManagerInstance(received)) { diff --git a/test/test-utils/matchers/to-have-battler-tag.ts b/test/test-utils/matchers/to-have-battler-tag.ts index af405d7da39..ba6679b2af4 100644 --- a/test/test-utils/matchers/to-have-battler-tag.ts +++ b/test/test-utils/matchers/to-have-battler-tag.ts @@ -3,21 +3,39 @@ import type { Pokemon } from "#field/pokemon"; /* biome-ignore-end lint/correctness/noUnusedImports: tsdoc imports */ import { getPokemonNameWithAffix } from "#app/messages"; +import type { BattlerTagTypeMap } from "#data/battler-tags"; import { BattlerTagType } from "#enums/battler-tag-type"; -import { getEnumStr } from "#test/test-utils/string-utils"; +import type { OneOther } from "#test/@types/test-helpers"; +import { getEnumStr, getOnelineDiffStr } from "#test/test-utils/string-utils"; import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { BattlerTagDataMap, SerializableBattlerTagType } from "#types/battler-tags"; import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; +// intersection required to preserve T for inferences /** - * Matcher that checks if a {@linkcode Pokemon} has a specific {@linkcode BattlerTagType}. + * Options type for {@linkcode toHaveBattlerTag}. + * @typeParam B - The {@linkcode BattlerTagType} being checked + * @remarks + * If B corresponds to a serializable `BattlerTag`, only properties allowed to be serialized + * (i.e. can change across instances) will be present and able to be checked. + */ +export type toHaveBattlerTagOptions = (B extends SerializableBattlerTagType + ? OneOther + : OneOther) & { + tagType: B; +}; + +/** + * Matcher that checks if a {@linkcode Pokemon} has a specific {@linkcode BattlerTag}. * @param received - The object to check. Should be a {@linkcode Pokemon} - * @param expectedBattlerTagType - The {@linkcode BattlerTagType} to check for + * @param expectedTag - The `BattlerTagType` of the desired tag, or a partially-filled object + * containing the desired properties * @returns Whether the matcher passed */ -export function toHaveBattlerTag( +export function toHaveBattlerTag( this: MatcherState, received: unknown, - expectedBattlerTagType: BattlerTagType, + expectedTag: B | toHaveBattlerTagOptions, ): SyncExpectationResult { if (!isPokemonInstance(received)) { return { @@ -26,18 +44,44 @@ export function toHaveBattlerTag( }; } - const pass = !!received.getTag(expectedBattlerTagType); const pkmName = getPokemonNameWithAffix(received); - // "BattlerTagType.SEEDED (=1)" - const expectedTagStr = getEnumStr(BattlerTagType, expectedBattlerTagType, { prefix: "BattlerTagType." }); + // Coerce lone `tagType`s into objects + const etag = typeof expectedTag === "object" ? expectedTag : { tagType: expectedTag }; + const gotTag = received.getTag(etag.tagType); + + // If checking exclusively tag type OR no tags were found, break out early. + if (typeof expectedTag !== "object" || !gotTag) { + const pass = !!gotTag; + // "BattlerTagType.SEEDED (=1)" + const expectedTagStr = getEnumStr(BattlerTagType, etag.tagType, { prefix: "BattlerTagType." }); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have a tag of type ${expectedTagStr}, but it did!` + : `Expected ${pkmName} to have a tag of type ${expectedTagStr}, but it didn't!`, + expected: expectedTag, + actual: received.summonData.tags.map(t => t.tagType), + }; + } + + // Check for equality with the provided tag + const pass = this.equals(gotTag, etag, [ + ...this.customTesters, + this.utils.subsetEquality, + this.utils.iterableEquality, + ]); + + const expectedStr = getOnelineDiffStr.call(this, expectedTag); return { pass, message: () => pass - ? `Expected ${pkmName} to NOT have ${expectedTagStr}, but it did!` - : `Expected ${pkmName} to have ${expectedTagStr}, but it didn't!`, - expected: expectedBattlerTagType, - actual: received.summonData.tags.map(t => t.tagType), + ? `Expected ${pkmName} to NOT have a tag matching ${expectedStr}, but it did!` + : `Expected ${pkmName} to have a tag matching ${expectedStr}, but it didn't!`, + expected: expectedTag, + actual: gotTag, }; } diff --git a/test/test-utils/string-utils.ts b/test/test-utils/string-utils.ts index 6c29c04c107..e19224f4571 100644 --- a/test/test-utils/string-utils.ts +++ b/test/test-utils/string-utils.ts @@ -183,5 +183,5 @@ export function getOnelineDiffStr(this: MatcherState, obj: unknown): string { return this.utils .stringify(obj, undefined, { maxLength: 35, indent: 0, printBasicPrototype: false }) .replace(/\n/g, " ") // Replace newlines with spaces - .replace(/,(\s*)}$/g, "$1}"); // Trim trailing commas + .replace(/,(\s*)\}$/g, "$1}"); // Trim trailing commas } From 9ddd6fe0268f145efe89dca9d861098bd690464f Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 22:54:48 -0400 Subject: [PATCH 090/134] [Dev] Fix GH pages workflow to push docs correctly (#6493) --- .github/workflows/github-pages.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 95b73782f8e..51a6b71bbe3 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -71,7 +71,8 @@ jobs: run: pnpm typedoc - name: Commit & Push docs - if: ${{!env.DRY_RUN}} + # env vars are stored as strings instead of booleans (hence why an explicit check is required) + if: ${{ env.DRY_RUN == 'false'}} run: | cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" From e94417940f19d25afa2d71f73c109c902b03879a Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:14:38 -0400 Subject: [PATCH 091/134] [Dev] Fix extra dot in github-pages.yml (#6494) --- .github/workflows/github-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 51a6b71bbe3..b7b1aad5ae7 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -79,7 +79,7 @@ jobs: git config user.name "github-actions[bot]" mkdir -p $GITHUB_REF_NAME rm -rf $GITHUB_REF_NAME/* - cp -r /tmp/docs/. $GITHUB_REF_NAME + cp -r /tmp/docs $GITHUB_REF_NAME git add $GITHUB_REF_NAME git commit -m "[skip ci] Deploy docs" git push From 2d037fca96ecf2d4f2e1d12f871d157def461ae5 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:27:21 -0400 Subject: [PATCH 092/134] [Dev] Fix typedoc.config.js (#6495) --- typedoc.config.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/typedoc.config.js b/typedoc.config.js index 72c58ee8350..5c49a643a91 100644 --- a/typedoc.config.js +++ b/typedoc.config.js @@ -1,5 +1,7 @@ import { globSync } from "node:fs"; +const dryRun = !!process.env.DRY_RUN.match(/true/gi); + /** * @type {Partial} */ @@ -28,7 +30,7 @@ const config = { ...globSync("./typedoc-plugins/**/*.js").map(plugin => "./" + plugin), ], // Avoid emitting docs for branches other than main/beta - emit: process.env.DRY_RUN ? "none" : "docs", + emit: dryRun ? "none" : "docs", out: process.env.CI ? "/tmp/docs" : "./typedoc", name: "PokéRogue", readme: "./README.md", @@ -44,7 +46,7 @@ const config = { }; // If generating docs for main/beta, check the ref name and add an appropriate navigation header -if (!process.env.DRY_RUN && process.env.REF_NAME) { +if (!dryRun && process.env.REF_NAME) { const otherRefName = process.env.REF_NAME === "main" ? "beta" : "main"; config.navigationLinks = { ...config.navigationLinks, From 4b86dffcf97b69391f7eff3b65e2d92952a10ede Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 5 Sep 2025 22:38:16 -0500 Subject: [PATCH 093/134] [GitHub] [Bug] Add nullish operator to dryRun check (#6496) --- typedoc.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typedoc.config.js b/typedoc.config.js index 5c49a643a91..1f944cd544e 100644 --- a/typedoc.config.js +++ b/typedoc.config.js @@ -1,6 +1,6 @@ import { globSync } from "node:fs"; -const dryRun = !!process.env.DRY_RUN.match(/true/gi); +const dryRun = !!process.env.DRY_RUN?.match(/true/gi); /** * @type {Partial} From 3765f843db5e10b2ad6d08d9d993c29012196963 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Sat, 6 Sep 2025 16:12:32 +1000 Subject: [PATCH 094/134] [Refactor] Remove randSeedWeightedItem utils function. (#6492) Remove randSeedWeightedItem utils function. --- src/field/trainer.ts | 6 ++---- src/utils/common.ts | 4 ---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/field/trainer.ts b/src/field/trainer.ts index acbc8031dbc..6d427585a87 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -17,7 +17,7 @@ import { getIsInitialized, initI18n } from "#plugins/i18n"; import type { TrainerConfig } from "#trainers/trainer-config"; import { trainerConfigs } from "#trainers/trainer-config"; import { TrainerPartyCompoundTemplate, type TrainerPartyTemplate } from "#trainers/trainer-party-template"; -import { randSeedInt, randSeedItem, randSeedWeightedItem } from "#utils/common"; +import { randSeedInt, randSeedItem } from "#utils/common"; import { getRandomLocaleEntry } from "#utils/i18n"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import { toCamelCase } from "#utils/strings"; @@ -61,9 +61,7 @@ export class Trainer extends Phaser.GameObjects.Container { this.variant = variant; this.partyTemplateIndex = Math.min( - partyTemplateIndex !== undefined - ? partyTemplateIndex - : randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), + partyTemplateIndex !== undefined ? partyTemplateIndex : randSeedItem(this.config.partyTemplates.map((_, i) => i)), this.config.partyTemplates.length - 1, ); // TODO: Rework this and add actual error handling for missing names diff --git a/src/utils/common.ts b/src/utils/common.ts index c8e28545046..97e61b902d8 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -133,10 +133,6 @@ export function randSeedItem(items: T[]): T { return items.length === 1 ? items[0] : Phaser.Math.RND.pick(items); } -export function randSeedWeightedItem(items: T[]): T { - return items.length === 1 ? items[0] : Phaser.Math.RND.weightedPick(items); -} - /** * Shuffle a list using the seeded rng. Utilises the Fisher-Yates algorithm. * @param {Array} items An array of items. From ddc04a7a87baca23bdaaeb4466412cd7af132141 Mon Sep 17 00:00:00 2001 From: HeeMyung Kim Date: Sat, 6 Sep 2025 15:40:38 +0900 Subject: [PATCH 095/134] [Bug] [UI/UX] Fix random button activation bug (#6464) --- src/ui/starter-select-ui-handler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 049f33af5d7..3b4b2716369 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1619,6 +1619,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (!this.filterMode) { this.startCursorObj.setVisible(false); this.starterIconsCursorObj.setVisible(false); + this.randomCursorObj.setVisible(false); this.setSpecies(null); this.filterBarCursor = 0; this.setFilterMode(true); From ad61a28e88f045ebfb555df2b526e6bc0ae7ada8 Mon Sep 17 00:00:00 2001 From: Anthony <53468745+PistaCream@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:46:13 -0700 Subject: [PATCH 096/134] [Bug] Moody Can't Lower Stats at +6 (#6481) --- src/data/abilities/ability.ts | 2 +- test/abilities/moody.test.ts | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 66d00d950d2..adcf93f7adf 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -4813,7 +4813,7 @@ export class MoodyAbAttr extends PostTurnAbAttr { if (!simulated) { if (canRaise.length > 0) { const raisedStat = canRaise[pokemon.randBattleSeedInt(canRaise.length)]; - canLower = canRaise.filter(s => s !== raisedStat); + canLower = canLower.filter(s => s !== raisedStat); globalScene.phaseManager.unshiftNew("StatStageChangePhase", pokemon.getBattlerIndex(), true, [raisedStat], 2); } if (canLower.length > 0) { diff --git a/test/abilities/moody.test.ts b/test/abilities/moody.test.ts index d1f8aa2e351..b7882c15ced 100644 --- a/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -84,4 +84,40 @@ describe("Abilities - Moody", () => { expect(decreasedStat).toBeTruthy(); expect(decreasedStat.length).toBe(1); }); + + it("should only try to increase a stat stage by 1 if the stat stage is not at 6", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.field.getPlayerPokemon(); + + // Set all stat stages to 6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); + + // Set one of the stat stages to -6 + const raisedStat = EFFECTIVE_STATS[playerPokemon.randBattleSeedInt(EFFECTIVE_STATS.length)]; + playerPokemon.setStatStage(raisedStat, -6); + + game.move.select(MoveId.SPLASH); + await game.toNextTurn(); + + expect(playerPokemon.getStatStage(raisedStat), "should increase only the stat that is not at stage 6").toBe(-4); + }); + + it("should only try to decrease a stat stage by 1 if the stat stage is not at -6", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.field.getPlayerPokemon(); + + // Set all stat stages to -6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); + + // Set one of the stat stages to 6 + const raisedStat = EFFECTIVE_STATS[playerPokemon.randBattleSeedInt(EFFECTIVE_STATS.length)]; + playerPokemon.setStatStage(raisedStat, 6); + + game.move.select(MoveId.SPLASH); + await game.toNextTurn(); + + expect(playerPokemon.getStatStage(raisedStat), "should decrease only the stat that is not at stage -6").toBe(5); + }); }); From 39760a8514fc0db644e9232cd3cab3ce94f149d6 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sat, 6 Sep 2025 11:08:33 +0200 Subject: [PATCH 097/134] [UI/UX] [Localization] Battle & Party UI translation (#6482) --- public/images/ui/legacy/numbers_alt.png | Bin 237 -> 0 bytes public/images/ui/legacy/numbers_red_alt.png | Bin 237 -> 0 bytes public/images/ui/legacy/overlay_lv.png | Bin 114 -> 0 bytes public/images/ui/legacy/overlay_lv_alt.png | Bin 129 -> 0 bytes public/images/ui/legacy/party_slot_hp_bar.png | Bin 169 -> 140 bytes .../ui/legacy/party_slot_overlay_lv_alt.png | Bin 124 -> 0 bytes public/images/ui/legacy/pbinfo_enemy_boss.png | Bin 331 -> 299 bytes public/images/ui/legacy/pbinfo_enemy_mini.png | Bin 308 -> 274 bytes public/images/ui/legacy/pbinfo_player.png | Bin 355 -> 318 bytes .../images/ui/legacy/pbinfo_player_mini.png | Bin 309 -> 292 bytes public/images/ui/legacy/pbinfo_stat.png | Bin 232 -> 0 bytes .../ca/battle_ui/overlay_exp_label_ca.png | Bin 0 -> 116 bytes .../ca/battle_ui/overlay_hp_label_boss_ca.png | Bin 0 -> 169 bytes .../ca/battle_ui/overlay_hp_label_ca.png | Bin 0 -> 149 bytes .../ca/battle_ui/overlay_lv_ca.png | Bin 0 -> 124 bytes .../ca/battle_ui/pbinfo_stat_ca.json | 209 ++++++++++++++++++ .../ca/battle_ui/pbinfo_stat_ca.png | Bin 0 -> 288 bytes .../ca/party_ui/party_slot_overlay_hp_ca.png | Bin 0 -> 146 bytes .../ca/party_ui/party_slot_overlay_lv_ca.png | Bin 0 -> 125 bytes .../da/battle_ui/overlay_exp_label_da.png | Bin 0 -> 120 bytes .../da/battle_ui/overlay_hp_label_boss_da.png | Bin 0 -> 169 bytes .../da/battle_ui/overlay_hp_label_da.png | Bin 0 -> 146 bytes .../da/battle_ui/overlay_lv_da.png | Bin 0 -> 111 bytes .../da/battle_ui/pbinfo_stat_da.json | 209 ++++++++++++++++++ .../da/battle_ui/pbinfo_stat_da.png | Bin 0 -> 236 bytes .../da/party_ui/party_slot_overlay_hp_da.png | Bin 0 -> 144 bytes .../da/party_ui/party_slot_overlay_lv_da.png} | Bin .../de/battle_ui/overlay_exp_label_de.png | Bin 0 -> 120 bytes .../de/battle_ui/overlay_hp_label_boss_de.png | Bin 0 -> 169 bytes .../de/battle_ui/overlay_hp_label_de.png | Bin 0 -> 149 bytes .../de/battle_ui/overlay_lv_de.png | Bin 0 -> 111 bytes .../de/battle_ui/pbinfo_stat_de.json | 209 ++++++++++++++++++ .../de/battle_ui/pbinfo_stat_de.png | Bin 0 -> 240 bytes .../de/party_ui/party_slot_overlay_hp_de.png | Bin 0 -> 145 bytes .../de/party_ui/party_slot_overlay_lv_de.png | Bin 0 -> 112 bytes .../en/battle_ui/overlay_exp_label.png | Bin 0 -> 1401 bytes .../en/battle_ui/overlay_hp_label.png | Bin 0 -> 146 bytes .../en/battle_ui/overlay_hp_label_boss.png | Bin 0 -> 169 bytes .../text_images/en/battle_ui/overlay_lv.png | Bin 0 -> 111 bytes .../en/battle_ui}/pbinfo_stat.json | 0 .../text_images/en/battle_ui/pbinfo_stat.png | Bin 0 -> 236 bytes .../en/party_ui/party_slot_overlay_hp.png | Bin 0 -> 144 bytes .../en/party_ui/party_slot_overlay_lv.png | Bin 0 -> 112 bytes .../battle_ui/overlay_exp_label_es-ES.png | Bin 0 -> 116 bytes .../battle_ui/overlay_hp_label_boss_es-ES.png | Bin 0 -> 159 bytes .../battle_ui/overlay_hp_label_es-ES.png | Bin 0 -> 149 bytes .../es-ES/battle_ui/overlay_lv_es-ES.png | Bin 0 -> 124 bytes .../es-ES/battle_ui/pbinfo_stat_es_ES.json | 209 ++++++++++++++++++ .../es-ES/battle_ui/pbinfo_stat_es_ES.png | Bin 0 -> 285 bytes .../party_ui/party_slot_overlay_hp_es-ES.png | Bin 0 -> 146 bytes .../party_ui/party_slot_overlay_lv_es-ES.png | Bin 0 -> 125 bytes .../battle_ui/overlay_exp_label_es-MX.png | Bin 0 -> 116 bytes .../battle_ui/overlay_hp_label_boss_es-MX.png | Bin 0 -> 159 bytes .../battle_ui/overlay_hp_label_es-MX.png | Bin 0 -> 149 bytes .../es-MX/battle_ui/overlay_lv_es-MX.png | Bin 0 -> 124 bytes .../es-MX/battle_ui/pbinfo_stat_es_MX.json | 209 ++++++++++++++++++ .../es-MX/battle_ui/pbinfo_stat_es_MX.png | Bin 0 -> 285 bytes .../party_ui/party_slot_overlay_hp_es-MX.png | Bin 0 -> 146 bytes .../party_ui/party_slot_overlay_lv_es-MX.png | Bin 0 -> 125 bytes .../fr/battle_ui/overlay_exp_label_fr.png | Bin 0 -> 1401 bytes .../fr/battle_ui/overlay_hp_label_boss_fr.png | Bin 0 -> 169 bytes .../fr/battle_ui/overlay_hp_label_fr.png | Bin 0 -> 147 bytes .../fr/battle_ui/overlay_lv_fr.png | Bin 0 -> 124 bytes .../fr/battle_ui/pbinfo_stat_fr.json | 209 ++++++++++++++++++ .../fr/battle_ui/pbinfo_stat_fr.png | Bin 0 -> 273 bytes .../fr/party_ui/party_slot_overlay_hp_fr.png | Bin 0 -> 148 bytes .../fr/party_ui/party_slot_overlay_lv_fr.png | Bin 0 -> 119 bytes .../it/battle_ui/overlay_exp_label_it.png | Bin 0 -> 120 bytes .../it/battle_ui/overlay_hp_label_boss_it.png | Bin 0 -> 169 bytes .../it/battle_ui/overlay_hp_label_it.png | Bin 0 -> 149 bytes .../it/battle_ui/overlay_lv_it.png | Bin 0 -> 117 bytes .../it/battle_ui/pbinfo_stat_it.json | 209 ++++++++++++++++++ .../it/battle_ui/pbinfo_stat_it.png | Bin 0 -> 267 bytes .../it/party_ui/party_slot_overlay_hp_it.png | Bin 0 -> 146 bytes .../it/party_ui/party_slot_overlay_lv_it.png | Bin 0 -> 111 bytes .../ja/battle_ui/overlay_exp_label_ja.png | Bin 0 -> 1401 bytes .../ja/battle_ui/overlay_hp_label_boss_ja.png | Bin 0 -> 169 bytes .../ja/battle_ui/overlay_hp_label_ja.png | Bin 0 -> 146 bytes .../ja/battle_ui/overlay_lv_ja.png | Bin 0 -> 111 bytes .../ja/battle_ui/pbinfo_stat_ja.json | 209 ++++++++++++++++++ .../ja/battle_ui/pbinfo_stat_ja.png | Bin 0 -> 236 bytes .../ja/party_ui/party_slot_overlay_hp_ja.png | Bin 0 -> 144 bytes .../ja/party_ui/party_slot_overlay_lv_ja.png | Bin 0 -> 112 bytes .../ko/battle_ui/overlay_exp_label_ko.png | Bin 0 -> 1401 bytes .../ko/battle_ui/overlay_hp_label_boss_ko.png | Bin 0 -> 169 bytes .../ko/battle_ui/overlay_hp_label_ko.png | Bin 0 -> 146 bytes .../ko/battle_ui/overlay_lv_ko.png | Bin 0 -> 111 bytes .../ko/battle_ui/pbinfo_stat_ko.json | 209 ++++++++++++++++++ .../ko/battle_ui/pbinfo_stat_ko.png | Bin 0 -> 236 bytes .../ko/party_ui/party_slot_overlay_hp_ko.png | Bin 0 -> 144 bytes .../ko/party_ui/party_slot_overlay_lv_ko.png | Bin 0 -> 112 bytes .../battle_ui/overlay_exp_label_pt-BR.png | Bin 0 -> 116 bytes .../battle_ui/overlay_hp_label_boss_pt-BR.png | Bin 0 -> 169 bytes .../battle_ui/overlay_hp_label_pt-BR.png | Bin 0 -> 149 bytes .../pt-BR/battle_ui/overlay_lv_pt-BR.png | Bin 0 -> 124 bytes .../pt-BR/battle_ui/pbinfo_stat_pt-BR.json | 209 ++++++++++++++++++ .../pt-BR/battle_ui/pbinfo_stat_pt-BR.png | Bin 0 -> 282 bytes .../party_ui/party_slot_overlay_hp_pt-BR.png | Bin 0 -> 146 bytes .../party_ui/party_slot_overlay_lv_pt-BR.png | Bin 0 -> 125 bytes .../ro/battle_ui/overlay_exp_label_ro.png | Bin 0 -> 1401 bytes .../ro/battle_ui/overlay_hp_label_boss_ro.png | Bin 0 -> 169 bytes .../ro/battle_ui/overlay_hp_label_ro.png | Bin 0 -> 146 bytes .../ro/battle_ui/overlay_lv_ro.png | Bin 0 -> 111 bytes .../ro/battle_ui/pbinfo_stat_ro.json | 209 ++++++++++++++++++ .../ro/battle_ui/pbinfo_stat_ro.png | Bin 0 -> 236 bytes .../ro/party_ui/party_slot_overlay_hp_ro.png | Bin 0 -> 144 bytes .../ro/party_ui/party_slot_overlay_lv_ro.png | Bin 0 -> 112 bytes .../ru/battle_ui/overlay_exp_label_ru.png | Bin 0 -> 129 bytes .../ru/battle_ui/overlay_hp_label_boss_ru.png | Bin 0 -> 170 bytes .../ru/battle_ui/overlay_hp_label_ru.png | Bin 0 -> 150 bytes .../ru/battle_ui/overlay_lv_ru.png | Bin 0 -> 138 bytes .../ru/battle_ui/pbinfo_stat_ru.json | 209 ++++++++++++++++++ .../ru/battle_ui/pbinfo_stat_ru.png | Bin 0 -> 286 bytes .../ru/party_ui/party_slot_overlay_hp_ru.png | Bin 0 -> 145 bytes .../ru/party_ui/party_slot_overlay_lv_ru.png | Bin 0 -> 137 bytes .../tl/battle_ui/overlay_exp_label_tl.png | Bin 0 -> 1401 bytes .../tl/battle_ui/overlay_hp_label_boss_tl.png | Bin 0 -> 169 bytes .../tl/battle_ui/overlay_hp_label_tl.png | Bin 0 -> 146 bytes .../tl/battle_ui/overlay_lv_tl.png | Bin 0 -> 111 bytes .../tl/battle_ui/pbinfo_stat_tl.json | 209 ++++++++++++++++++ .../tl/battle_ui/pbinfo_stat_tl.png | Bin 0 -> 236 bytes .../tl/party_ui/party_slot_overlay_hp_tl.png | Bin 0 -> 144 bytes .../tl/party_ui/party_slot_overlay_lv_tl.png | Bin 0 -> 112 bytes .../tr/battle_ui/overlay_exp_label_tr.png | Bin 0 -> 129 bytes .../tr/battle_ui/overlay_hp_label_boss_tr.png | Bin 0 -> 169 bytes .../tr/battle_ui/overlay_hp_label_tr.png | Bin 0 -> 147 bytes .../tr/battle_ui/overlay_lv_tr.png | Bin 0 -> 137 bytes .../tr/battle_ui/pbinfo_stat_tr.json | 209 ++++++++++++++++++ .../tr/battle_ui/pbinfo_stat_tr.png | Bin 0 -> 236 bytes .../tr/party_ui/party_slot_overlay_hp_tr.png | Bin 0 -> 147 bytes .../tr/party_ui/party_slot_overlay_lv_tr.png | Bin 0 -> 146 bytes .../battle_ui/overlay_exp_label_zh-CN.png | Bin 0 -> 1401 bytes .../battle_ui/overlay_hp_label_boss_zh-CN.png | Bin 0 -> 169 bytes .../battle_ui/overlay_hp_label_zh-CN.png | Bin 0 -> 146 bytes .../zh-CN/battle_ui/overlay_lv_zh-CN.png | Bin 0 -> 111 bytes .../zh-CN/battle_ui/pbinfo_stat_zh-CN.json | 209 ++++++++++++++++++ .../zh-CN/battle_ui/pbinfo_stat_zh-CN.png | Bin 0 -> 236 bytes .../party_ui/party_slot_overlay_hp_zh-CN.png | Bin 0 -> 144 bytes .../party_ui/party_slot_overlay_lv_zh-CN.png | Bin 0 -> 112 bytes .../battle_ui/overlay_exp_label_zh-TW.png | Bin 0 -> 1401 bytes .../battle_ui/overlay_hp_label_boss_zh-TW.png | Bin 0 -> 169 bytes .../battle_ui/overlay_hp_label_zh-TW.png | Bin 0 -> 146 bytes .../zh-TW/battle_ui/overlay_lv_zh-TW.png | Bin 0 -> 111 bytes .../zh-TW/battle_ui/pbinfo_stat_zh-TW.json | 209 ++++++++++++++++++ .../zh-TW/battle_ui/pbinfo_stat_zh-TW.png | Bin 0 -> 236 bytes .../party_ui/party_slot_overlay_hp_zh-TW.png | Bin 0 -> 144 bytes .../party_ui/party_slot_overlay_lv_zh-TW.png | Bin 0 -> 112 bytes public/images/ui/overlay_lv.png | Bin 129 -> 0 bytes public/images/ui/party_slot_hp_bar.png | Bin 160 -> 139 bytes public/images/ui/pbinfo_enemy_boss.png | Bin 290 -> 252 bytes public/images/ui/pbinfo_enemy_mini.png | Bin 275 -> 251 bytes public/images/ui/pbinfo_player.png | Bin 344 -> 285 bytes public/images/ui/pbinfo_player_mini.png | Bin 276 -> 253 bytes public/images/ui/pbinfo_stat.png | Bin 277 -> 0 bytes .../ca/battle_ui/overlay_exp_label_ca.png | Bin 0 -> 126 bytes .../ca/battle_ui/overlay_hp_label_boss_ca.png | Bin 0 -> 148 bytes .../ca/battle_ui/overlay_hp_label_ca.png | Bin 0 -> 147 bytes .../ca/battle_ui/overlay_lv_ca.png | Bin 0 -> 124 bytes .../ca/battle_ui/pbinfo_stat_ca.json | 209 ++++++++++++++++++ .../ca/battle_ui/pbinfo_stat_ca.png | Bin 0 -> 298 bytes .../ca/party_ui/party_slot_overlay_hp_ca.png | Bin 0 -> 131 bytes .../ca/party_ui/party_slot_overlay_lv_ca.png | Bin 0 -> 127 bytes .../da/battle_ui/overlay_exp_label_da.png | Bin 0 -> 125 bytes .../da/battle_ui/overlay_hp_label_boss_da.png | Bin 0 -> 148 bytes .../da/battle_ui/overlay_hp_label_da.png | Bin 0 -> 127 bytes .../da/battle_ui/overlay_lv_da.png | Bin 0 -> 123 bytes .../da/battle_ui/pbinfo_stat_da.json | 209 ++++++++++++++++++ .../da/battle_ui/pbinfo_stat_da.png | Bin 0 -> 278 bytes .../da/party_ui/party_slot_overlay_hp_da.png | Bin 0 -> 127 bytes .../da/party_ui/party_slot_overlay_lv_da.png} | Bin .../de/battle_ui/overlay_exp_label_de.png | Bin 0 -> 125 bytes .../de/battle_ui/overlay_hp_label_boss_de.png | Bin 0 -> 148 bytes .../de/battle_ui/overlay_hp_label_de.png | Bin 0 -> 150 bytes .../de/battle_ui/overlay_lv_de.png | Bin 0 -> 123 bytes .../de/battle_ui/pbinfo_stat_de.json | 209 ++++++++++++++++++ .../de/battle_ui/pbinfo_stat_de.png | Bin 0 -> 269 bytes .../de/party_ui/party_slot_overlay_hp_de.png | Bin 0 -> 128 bytes .../de/party_ui/party_slot_overlay_lv_de.png | Bin 0 -> 124 bytes .../en/battle_ui/overlay_exp_label.png | Bin 0 -> 126 bytes .../en/battle_ui/overlay_hp_label.png | Bin 0 -> 127 bytes .../en/battle_ui/overlay_hp_label_boss.png | Bin 0 -> 148 bytes .../text_images/en/battle_ui/overlay_lv.png | Bin 0 -> 123 bytes .../en/battle_ui}/pbinfo_stat.json | 0 .../text_images/en/battle_ui/pbinfo_stat.png | Bin 0 -> 278 bytes .../en/party_ui/party_slot_overlay_hp.png | Bin 0 -> 127 bytes .../en/party_ui/party_slot_overlay_lv.png | Bin 0 -> 124 bytes .../battle_ui/overlay_exp_label_es-ES.png | Bin 0 -> 126 bytes .../battle_ui/overlay_hp_label_boss_es-ES.png | Bin 0 -> 171 bytes .../battle_ui/overlay_hp_label_es-ES.png | Bin 0 -> 147 bytes .../es-ES/battle_ui/overlay_lv_es-ES.png | Bin 0 -> 124 bytes .../es-ES/battle_ui/pbinfo_stat_es-ES.json | 209 ++++++++++++++++++ .../es-ES/battle_ui/pbinfo_stat_es-ES.png | Bin 0 -> 295 bytes .../party_ui/party_slot_overlay_hp_es-ES.png | Bin 0 -> 131 bytes .../party_ui/party_slot_overlay_lv_es-ES.png | Bin 0 -> 127 bytes .../battle_ui/overlay_exp_label_es-MX.png | Bin 0 -> 126 bytes .../battle_ui/overlay_hp_label_boss_es-MX.png | Bin 0 -> 171 bytes .../battle_ui/overlay_hp_label_es-MX.png | Bin 0 -> 147 bytes .../es-MX/battle_ui/overlay_lv_es-MX.png | Bin 0 -> 124 bytes .../es-MX/battle_ui/pbinfo_stat_es-MX.json | 209 ++++++++++++++++++ .../es-MX/battle_ui/pbinfo_stat_es-MX.png | Bin 0 -> 295 bytes .../party_ui/party_slot_overlay_hp_es-MX.png | Bin 0 -> 131 bytes .../party_ui/party_slot_overlay_lv_es-MX.png | Bin 0 -> 127 bytes .../fr/battle_ui/overlay_exp_label_fr.png | Bin 0 -> 126 bytes .../fr/battle_ui/overlay_hp_label_boss_fr.png | Bin 0 -> 148 bytes .../fr/battle_ui/overlay_hp_label_fr.png | Bin 0 -> 130 bytes .../fr/battle_ui/overlay_lv_fr.png | Bin 0 -> 133 bytes .../fr/battle_ui/pbinfo_stat_fr.json | 209 ++++++++++++++++++ .../fr/battle_ui/pbinfo_stat_fr.png | Bin 0 -> 304 bytes .../fr/party_ui/party_slot_overlay_hp_fr.png | Bin 0 -> 130 bytes .../fr/party_ui/party_slot_overlay_lv_fr.png | Bin 0 -> 134 bytes .../it/battle_ui/overlay_exp_label_it.png | Bin 0 -> 128 bytes .../it/battle_ui/overlay_hp_label_boss_it.png | Bin 0 -> 148 bytes .../it/battle_ui/overlay_hp_label_it.png | Bin 0 -> 147 bytes .../it/battle_ui/overlay_lv_it.png | Bin 0 -> 113 bytes .../it/battle_ui/pbinfo_stat_it.json | 209 ++++++++++++++++++ .../it/battle_ui/pbinfo_stat_it.png | Bin 0 -> 287 bytes .../it/party_ui/party_slot_overlay_hp_it.png | Bin 0 -> 131 bytes .../it/party_ui/party_slot_overlay_lv_it.png | Bin 0 -> 115 bytes .../ja/battle_ui/overlay_exp_label_ja.png | Bin 0 -> 126 bytes .../ja/battle_ui/overlay_hp_label_boss_ja.png | Bin 0 -> 148 bytes .../ja/battle_ui/overlay_hp_label_ja.png | Bin 0 -> 127 bytes .../ja/battle_ui/overlay_lv_ja.png | Bin 0 -> 123 bytes .../ja/battle_ui/pbinfo_stat_ja.json | 209 ++++++++++++++++++ .../ja/battle_ui/pbinfo_stat_ja.png | Bin 0 -> 278 bytes .../ja/party_ui/party_slot_overlay_hp_ja.png | Bin 0 -> 127 bytes .../ja/party_ui/party_slot_overlay_lv_ja.png | Bin 0 -> 124 bytes .../ko/battle_ui/overlay_exp_label_ko.png | Bin 0 -> 126 bytes .../ko/battle_ui/overlay_hp_label_boss_ko.png | Bin 0 -> 148 bytes .../ko/battle_ui/overlay_hp_label_ko.png | Bin 0 -> 127 bytes .../ko/battle_ui/overlay_lv_ko.png | Bin 0 -> 123 bytes .../ko/battle_ui/pbinfo_stat_ko.json | 209 ++++++++++++++++++ .../ko/battle_ui/pbinfo_stat_ko.png | Bin 0 -> 278 bytes .../ko/party_ui/party_slot_overlay_hp_ko.png | Bin 0 -> 127 bytes .../ko/party_ui/party_slot_overlay_lv_ko.png | Bin 0 -> 124 bytes .../battle_ui/overlay_exp_label_pt-BR.png | Bin 0 -> 126 bytes .../battle_ui/overlay_hp_label_boss_pt-BR.png | Bin 0 -> 148 bytes .../battle_ui/overlay_hp_label_pt-BR.png | Bin 0 -> 147 bytes .../pt-BR/battle_ui/overlay_lv_pt-BR.png | Bin 0 -> 124 bytes .../pt-BR/battle_ui/pbinfo_stat_pt-BR.json | 209 ++++++++++++++++++ .../pt-BR/battle_ui/pbinfo_stat_pt-BR.png | Bin 0 -> 292 bytes .../party_ui/party_slot_overlay_hp_pt-BR.png | Bin 0 -> 131 bytes .../party_ui/party_slot_overlay_lv_pt-BR.png | Bin 0 -> 127 bytes .../ro/battle_ui/overlay_exp_label_ro.png | Bin 0 -> 126 bytes .../ro/battle_ui/overlay_hp_label_boss_ro.png | Bin 0 -> 148 bytes .../ro/battle_ui/overlay_hp_label_ro.png | Bin 0 -> 127 bytes .../ro/battle_ui/overlay_lv_ro.png | Bin 0 -> 123 bytes .../ro/battle_ui/pbinfo_stat_ro.json | 209 ++++++++++++++++++ .../ro/battle_ui/pbinfo_stat_ro.png | Bin 0 -> 278 bytes .../ro/party_ui/party_slot_overlay_hp_ro.png | Bin 0 -> 127 bytes .../ro/party_ui/party_slot_overlay_lv_ro.png | Bin 0 -> 124 bytes .../ru/battle_ui/overlay_exp_label_ru.png | Bin 0 -> 136 bytes .../ru/battle_ui/overlay_hp_label_boss_ru.png | Bin 0 -> 156 bytes .../ru/battle_ui/overlay_hp_label_ru.png | Bin 0 -> 146 bytes .../ru/battle_ui/overlay_lv_ru.png | Bin 0 -> 144 bytes .../ru/battle_ui/pbinfo_stat_ru.json | 209 ++++++++++++++++++ .../ru/battle_ui/pbinfo_stat_ru.png | Bin 0 -> 318 bytes .../ru/party_ui/party_slot_overlay_hp_ru.png | Bin 0 -> 145 bytes .../ru/party_ui/party_slot_overlay_lv_ru.png | Bin 0 -> 144 bytes .../tl/battle_ui/overlay_exp_label_tl.png | Bin 0 -> 126 bytes .../tl/battle_ui/overlay_hp_label_boss_tl.png | Bin 0 -> 148 bytes .../tl/battle_ui/overlay_hp_label_tl.png | Bin 0 -> 127 bytes .../tl/battle_ui/overlay_lv_tl.png | Bin 0 -> 123 bytes .../tl/battle_ui/pbinfo_stat_tl.json | 209 ++++++++++++++++++ .../tl/battle_ui/pbinfo_stat_tl.png | Bin 0 -> 278 bytes .../tl/party_ui/party_slot_overlay_hp_tl.png | Bin 0 -> 127 bytes .../tl/party_ui/party_slot_overlay_lv_tl.png | Bin 0 -> 124 bytes .../tr/battle_ui/overlay_exp_label_tr.png | Bin 0 -> 125 bytes .../tr/battle_ui/overlay_hp_label_boss_tr.png | Bin 0 -> 148 bytes .../tr/battle_ui/overlay_hp_label_tr.png | Bin 0 -> 145 bytes .../tr/battle_ui/overlay_lv_tr.png | Bin 0 -> 124 bytes .../tr/battle_ui/pbinfo_stat_tr.json | 209 ++++++++++++++++++ .../tr/battle_ui/pbinfo_stat_tr.png | Bin 0 -> 278 bytes .../tr/party_ui/party_slot_overlay_hp_tr.png | Bin 0 -> 148 bytes .../tr/party_ui/party_slot_overlay_lv_tr.png | Bin 0 -> 126 bytes .../battle_ui/overlay_exp_label_zh-CN.png | Bin 0 -> 126 bytes .../battle_ui/overlay_hp_label_boss_zh-CN.png | Bin 0 -> 148 bytes .../battle_ui/overlay_hp_label_zh-CN.png | Bin 0 -> 127 bytes .../zh-CN/battle_ui/overlay_lv_zh-CN.png | Bin 0 -> 123 bytes .../zh-CN/battle_ui/pbinfo_stat_zh-CN.json | 209 ++++++++++++++++++ .../zh-CN/battle_ui/pbinfo_stat_zh-CN.png | Bin 0 -> 278 bytes .../party_ui/party_slot_overlay_hp_zh-CN.png | Bin 0 -> 127 bytes .../party_ui/party_slot_overlay_lv_zh-CN.png | Bin 0 -> 124 bytes .../battle_ui/overlay_exp_label_zh-TW.png | Bin 0 -> 126 bytes .../battle_ui/overlay_hp_label_boss_zh-TW.png | Bin 0 -> 148 bytes .../battle_ui/overlay_hp_label_zh-TW.png | Bin 0 -> 127 bytes .../zh-TW/battle_ui/overlay_lv_zh-TW.png | Bin 0 -> 123 bytes .../zh-TW/battle_ui/pbinfo_stat_zh-TW.json | 209 ++++++++++++++++++ .../zh-TW/battle_ui/pbinfo_stat_zh-TW.png | Bin 0 -> 278 bytes .../party_ui/party_slot_overlay_hp_zh-TW.png | Bin 0 -> 127 bytes .../party_ui/party_slot_overlay_lv_zh-TW.png | Bin 0 -> 124 bytes src/loading-scene.ts | 31 ++- src/ui/battle-info/battle-info.ts | 10 +- src/ui/battle-info/enemy-battle-info.ts | 4 + src/ui/battle-info/player-battle-info.ts | 11 +- src/ui/party-ui-handler.ts | 21 +- 295 files changed, 6757 insertions(+), 8 deletions(-) delete mode 100644 public/images/ui/legacy/numbers_alt.png delete mode 100644 public/images/ui/legacy/numbers_red_alt.png delete mode 100644 public/images/ui/legacy/overlay_lv.png delete mode 100644 public/images/ui/legacy/overlay_lv_alt.png delete mode 100644 public/images/ui/legacy/party_slot_overlay_lv_alt.png delete mode 100644 public/images/ui/legacy/pbinfo_stat.png create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/overlay_exp_label_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/overlay_lv_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/pbinfo_stat_ca.json create mode 100644 public/images/ui/legacy/text_images/ca/battle_ui/pbinfo_stat_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/party_ui/party_slot_overlay_hp_ca.png create mode 100644 public/images/ui/legacy/text_images/ca/party_ui/party_slot_overlay_lv_ca.png create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/overlay_exp_label_da.png create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/overlay_hp_label_boss_da.png create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/overlay_hp_label_da.png create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/overlay_lv_da.png create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.json create mode 100644 public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.png create mode 100644 public/images/ui/legacy/text_images/da/party_ui/party_slot_overlay_hp_da.png rename public/images/ui/legacy/{party_slot_overlay_lv.png => text_images/da/party_ui/party_slot_overlay_lv_da.png} (100%) create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/overlay_exp_label_de.png create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/overlay_hp_label_boss_de.png create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/overlay_hp_label_de.png create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/overlay_lv_de.png create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.json create mode 100644 public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.png create mode 100644 public/images/ui/legacy/text_images/de/party_ui/party_slot_overlay_hp_de.png create mode 100644 public/images/ui/legacy/text_images/de/party_ui/party_slot_overlay_lv_de.png create mode 100644 public/images/ui/legacy/text_images/en/battle_ui/overlay_exp_label.png create mode 100644 public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label.png create mode 100644 public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label_boss.png create mode 100644 public/images/ui/legacy/text_images/en/battle_ui/overlay_lv.png rename public/images/ui/legacy/{ => text_images/en/battle_ui}/pbinfo_stat.json (100%) create mode 100644 public/images/ui/legacy/text_images/en/battle_ui/pbinfo_stat.png create mode 100644 public/images/ui/legacy/text_images/en/party_ui/party_slot_overlay_hp.png create mode 100644 public/images/ui/legacy/text_images/en/party_ui/party_slot_overlay_lv.png create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_hp_label_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_lv_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/pbinfo_stat_es_ES.json create mode 100644 public/images/ui/legacy/text_images/es-ES/battle_ui/pbinfo_stat_es_ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/party_ui/party_slot_overlay_hp_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-ES/party_ui/party_slot_overlay_lv_es-ES.png create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_exp_label_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_hp_label_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_lv_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/pbinfo_stat_es_MX.json create mode 100644 public/images/ui/legacy/text_images/es-MX/battle_ui/pbinfo_stat_es_MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/party_ui/party_slot_overlay_hp_es-MX.png create mode 100644 public/images/ui/legacy/text_images/es-MX/party_ui/party_slot_overlay_lv_es-MX.png create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/overlay_exp_label_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/overlay_lv_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.json create mode 100644 public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/party_ui/party_slot_overlay_hp_fr.png create mode 100644 public/images/ui/legacy/text_images/fr/party_ui/party_slot_overlay_lv_fr.png create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/overlay_exp_label_it.png create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_boss_it.png create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_it.png create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/overlay_lv_it.png create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/pbinfo_stat_it.json create mode 100644 public/images/ui/legacy/text_images/it/battle_ui/pbinfo_stat_it.png create mode 100644 public/images/ui/legacy/text_images/it/party_ui/party_slot_overlay_hp_it.png create mode 100644 public/images/ui/legacy/text_images/it/party_ui/party_slot_overlay_lv_it.png create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/overlay_exp_label_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/overlay_lv_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.json create mode 100644 public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/party_ui/party_slot_overlay_hp_ja.png create mode 100644 public/images/ui/legacy/text_images/ja/party_ui/party_slot_overlay_lv_ja.png create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/overlay_exp_label_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/overlay_lv_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.json create mode 100644 public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/party_ui/party_slot_overlay_hp_ko.png create mode 100644 public/images/ui/legacy/text_images/ko/party_ui/party_slot_overlay_lv_ko.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_lv_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/pbinfo_stat_pt-BR.json create mode 100644 public/images/ui/legacy/text_images/pt-BR/battle_ui/pbinfo_stat_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/pt-BR/party_ui/party_slot_overlay_lv_pt-BR.png create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/overlay_exp_label_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/overlay_lv_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.json create mode 100644 public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/party_ui/party_slot_overlay_hp_ro.png create mode 100644 public/images/ui/legacy/text_images/ro/party_ui/party_slot_overlay_lv_ro.png create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/overlay_exp_label_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/overlay_hp_label_boss_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/overlay_hp_label_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/overlay_lv_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/pbinfo_stat_ru.json create mode 100644 public/images/ui/legacy/text_images/ru/battle_ui/pbinfo_stat_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/party_ui/party_slot_overlay_hp_ru.png create mode 100644 public/images/ui/legacy/text_images/ru/party_ui/party_slot_overlay_lv_ru.png create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/overlay_exp_label_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/overlay_lv_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.json create mode 100644 public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/party_ui/party_slot_overlay_hp_tl.png create mode 100644 public/images/ui/legacy/text_images/tl/party_ui/party_slot_overlay_lv_tl.png create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/overlay_exp_label_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_boss_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/overlay_lv_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.json create mode 100644 public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/party_ui/party_slot_overlay_hp_tr.png create mode 100644 public/images/ui/legacy/text_images/tr/party_ui/party_slot_overlay_lv_tr.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json create mode 100644 public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/party_ui/party_slot_overlay_hp_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json create mode 100644 public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/party_ui/party_slot_overlay_hp_zh-TW.png create mode 100644 public/images/ui/legacy/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png delete mode 100644 public/images/ui/overlay_lv.png delete mode 100644 public/images/ui/pbinfo_stat.png create mode 100644 public/images/ui/text_images/ca/battle_ui/overlay_exp_label_ca.png create mode 100644 public/images/ui/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png create mode 100644 public/images/ui/text_images/ca/battle_ui/overlay_hp_label_ca.png create mode 100644 public/images/ui/text_images/ca/battle_ui/overlay_lv_ca.png create mode 100644 public/images/ui/text_images/ca/battle_ui/pbinfo_stat_ca.json create mode 100644 public/images/ui/text_images/ca/battle_ui/pbinfo_stat_ca.png create mode 100644 public/images/ui/text_images/ca/party_ui/party_slot_overlay_hp_ca.png create mode 100644 public/images/ui/text_images/ca/party_ui/party_slot_overlay_lv_ca.png create mode 100644 public/images/ui/text_images/da/battle_ui/overlay_exp_label_da.png create mode 100644 public/images/ui/text_images/da/battle_ui/overlay_hp_label_boss_da.png create mode 100644 public/images/ui/text_images/da/battle_ui/overlay_hp_label_da.png create mode 100644 public/images/ui/text_images/da/battle_ui/overlay_lv_da.png create mode 100644 public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.json create mode 100644 public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.png create mode 100644 public/images/ui/text_images/da/party_ui/party_slot_overlay_hp_da.png rename public/images/ui/{party_slot_overlay_lv.png => text_images/da/party_ui/party_slot_overlay_lv_da.png} (100%) create mode 100644 public/images/ui/text_images/de/battle_ui/overlay_exp_label_de.png create mode 100644 public/images/ui/text_images/de/battle_ui/overlay_hp_label_boss_de.png create mode 100644 public/images/ui/text_images/de/battle_ui/overlay_hp_label_de.png create mode 100644 public/images/ui/text_images/de/battle_ui/overlay_lv_de.png create mode 100644 public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.json create mode 100644 public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.png create mode 100644 public/images/ui/text_images/de/party_ui/party_slot_overlay_hp_de.png create mode 100644 public/images/ui/text_images/de/party_ui/party_slot_overlay_lv_de.png create mode 100644 public/images/ui/text_images/en/battle_ui/overlay_exp_label.png create mode 100644 public/images/ui/text_images/en/battle_ui/overlay_hp_label.png create mode 100644 public/images/ui/text_images/en/battle_ui/overlay_hp_label_boss.png create mode 100644 public/images/ui/text_images/en/battle_ui/overlay_lv.png rename public/images/ui/{ => text_images/en/battle_ui}/pbinfo_stat.json (100%) create mode 100644 public/images/ui/text_images/en/battle_ui/pbinfo_stat.png create mode 100644 public/images/ui/text_images/en/party_ui/party_slot_overlay_hp.png create mode 100644 public/images/ui/text_images/en/party_ui/party_slot_overlay_lv.png create mode 100644 public/images/ui/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/battle_ui/overlay_lv_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/battle_ui/pbinfo_stat_es-ES.json create mode 100644 public/images/ui/text_images/es-ES/battle_ui/pbinfo_stat_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/party_ui/party_slot_overlay_hp_es-ES.png create mode 100644 public/images/ui/text_images/es-ES/party_ui/party_slot_overlay_lv_es-ES.png create mode 100644 public/images/ui/text_images/es-MX/battle_ui/overlay_exp_label_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/battle_ui/overlay_lv_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/battle_ui/pbinfo_stat_es-MX.json create mode 100644 public/images/ui/text_images/es-MX/battle_ui/pbinfo_stat_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/party_ui/party_slot_overlay_hp_es-MX.png create mode 100644 public/images/ui/text_images/es-MX/party_ui/party_slot_overlay_lv_es-MX.png create mode 100644 public/images/ui/text_images/fr/battle_ui/overlay_exp_label_fr.png create mode 100644 public/images/ui/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png create mode 100644 public/images/ui/text_images/fr/battle_ui/overlay_hp_label_fr.png create mode 100644 public/images/ui/text_images/fr/battle_ui/overlay_lv_fr.png create mode 100644 public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.json create mode 100644 public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.png create mode 100644 public/images/ui/text_images/fr/party_ui/party_slot_overlay_hp_fr.png create mode 100644 public/images/ui/text_images/fr/party_ui/party_slot_overlay_lv_fr.png create mode 100644 public/images/ui/text_images/it/battle_ui/overlay_exp_label_it.png create mode 100644 public/images/ui/text_images/it/battle_ui/overlay_hp_label_boss_it.png create mode 100644 public/images/ui/text_images/it/battle_ui/overlay_hp_label_it.png create mode 100644 public/images/ui/text_images/it/battle_ui/overlay_lv_it.png create mode 100644 public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.json create mode 100644 public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.png create mode 100644 public/images/ui/text_images/it/party_ui/party_slot_overlay_hp_it.png create mode 100644 public/images/ui/text_images/it/party_ui/party_slot_overlay_lv_it.png create mode 100644 public/images/ui/text_images/ja/battle_ui/overlay_exp_label_ja.png create mode 100644 public/images/ui/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png create mode 100644 public/images/ui/text_images/ja/battle_ui/overlay_hp_label_ja.png create mode 100644 public/images/ui/text_images/ja/battle_ui/overlay_lv_ja.png create mode 100644 public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.json create mode 100644 public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.png create mode 100644 public/images/ui/text_images/ja/party_ui/party_slot_overlay_hp_ja.png create mode 100644 public/images/ui/text_images/ja/party_ui/party_slot_overlay_lv_ja.png create mode 100644 public/images/ui/text_images/ko/battle_ui/overlay_exp_label_ko.png create mode 100644 public/images/ui/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png create mode 100644 public/images/ui/text_images/ko/battle_ui/overlay_hp_label_ko.png create mode 100644 public/images/ui/text_images/ko/battle_ui/overlay_lv_ko.png create mode 100644 public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.json create mode 100644 public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.png create mode 100644 public/images/ui/text_images/ko/party_ui/party_slot_overlay_hp_ko.png create mode 100644 public/images/ui/text_images/ko/party_ui/party_slot_overlay_lv_ko.png create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/overlay_lv_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/pbinfo_stat_pt-BR.json create mode 100644 public/images/ui/text_images/pt-BR/battle_ui/pbinfo_stat_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png create mode 100644 public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_lv_pt-BR.png create mode 100644 public/images/ui/text_images/ro/battle_ui/overlay_exp_label_ro.png create mode 100644 public/images/ui/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png create mode 100644 public/images/ui/text_images/ro/battle_ui/overlay_hp_label_ro.png create mode 100644 public/images/ui/text_images/ro/battle_ui/overlay_lv_ro.png create mode 100644 public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.json create mode 100644 public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.png create mode 100644 public/images/ui/text_images/ro/party_ui/party_slot_overlay_hp_ro.png create mode 100644 public/images/ui/text_images/ro/party_ui/party_slot_overlay_lv_ro.png create mode 100644 public/images/ui/text_images/ru/battle_ui/overlay_exp_label_ru.png create mode 100644 public/images/ui/text_images/ru/battle_ui/overlay_hp_label_boss_ru.png create mode 100644 public/images/ui/text_images/ru/battle_ui/overlay_hp_label_ru.png create mode 100644 public/images/ui/text_images/ru/battle_ui/overlay_lv_ru.png create mode 100644 public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.json create mode 100644 public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.png create mode 100644 public/images/ui/text_images/ru/party_ui/party_slot_overlay_hp_ru.png create mode 100644 public/images/ui/text_images/ru/party_ui/party_slot_overlay_lv_ru.png create mode 100644 public/images/ui/text_images/tl/battle_ui/overlay_exp_label_tl.png create mode 100644 public/images/ui/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png create mode 100644 public/images/ui/text_images/tl/battle_ui/overlay_hp_label_tl.png create mode 100644 public/images/ui/text_images/tl/battle_ui/overlay_lv_tl.png create mode 100644 public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.json create mode 100644 public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.png create mode 100644 public/images/ui/text_images/tl/party_ui/party_slot_overlay_hp_tl.png create mode 100644 public/images/ui/text_images/tl/party_ui/party_slot_overlay_lv_tl.png create mode 100644 public/images/ui/text_images/tr/battle_ui/overlay_exp_label_tr.png create mode 100644 public/images/ui/text_images/tr/battle_ui/overlay_hp_label_boss_tr.png create mode 100644 public/images/ui/text_images/tr/battle_ui/overlay_hp_label_tr.png create mode 100644 public/images/ui/text_images/tr/battle_ui/overlay_lv_tr.png create mode 100644 public/images/ui/text_images/tr/battle_ui/pbinfo_stat_tr.json create mode 100644 public/images/ui/text_images/tr/battle_ui/pbinfo_stat_tr.png create mode 100644 public/images/ui/text_images/tr/party_ui/party_slot_overlay_hp_tr.png create mode 100644 public/images/ui/text_images/tr/party_ui/party_slot_overlay_lv_tr.png create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json create mode 100644 public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_hp_zh-CN.png create mode 100644 public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json create mode 100644 public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_hp_zh-TW.png create mode 100644 public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png diff --git a/public/images/ui/legacy/numbers_alt.png b/public/images/ui/legacy/numbers_alt.png deleted file mode 100644 index fb5104654718c85a083aeaa46a8d57fdf6eb020f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^5kSn&!VDzqlBcTzDgFST5LX~AARr(iAu(&xtk0i6 z`$wEU0Tf~^3GxeOaCmkj4an*7ba4!+h>Ptz$jfBN!*V@j!qixYk_!$Bye-B5O&{_e zZ$F-~B=V$Dk4jfP_o{dX_x7_gA7pMT{?_UiT=|c+q9o!NlXk$o)8``0JO!28%NlR5 zKAhd6e%AEKr$e7|ny&uMvbZO^agtg1>V3y~H;3k5eR{W`o@t$S)pi|$`2V|fz8HC! iDQ{;@`FOv-k6)HeMWA@fl0u-n7(8A5T-G@yGywpVcUV*a diff --git a/public/images/ui/legacy/numbers_red_alt.png b/public/images/ui/legacy/numbers_red_alt.png deleted file mode 100644 index d9edb0468d82ac38c26557d4023a246aefb1c658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^5kSn&!VDzqlBcTzDgFST5LX~AARr(iAu&}}@)ro3fI^HVL4Lsu4$p3+0XaRME{-7;aj|^|d6^7(Sgwamm>TO)a=}4?x25>M=|kS* z?Z-2gM4mM2QR%AZUKP*a-hNi*gUoHk-&);*EB~=pltdh3(hit+`doyWr=W6sS>x^1 zhqGJM&ze5@bm&t~)78IO7WZT~PBIH$z3({h=Ft4BPwy7gGp*CE+O8uI|9_Xx7b6cd h3NRSx} Mp00i_>zopr0QamXH2?qr delta 141 zcmeBST*){=rCun&C&ZP3fuW$FARr*%$Ay3&K(N7Kg;PTsP?WJG$S;_|;n@uk$JNut zF+?IfIYA&uiIc;?z(7k{Qd?SDd#3=Wh@?b|LsZX{(2lLAJR2N6Oie^OLRdOk5_BCG pu5$ERl9AYwp?Fk(NxK9?yqn3lh3oD{0S#pEbY=5%S?83{1ON!gF0B9n diff --git a/public/images/ui/legacy/party_slot_overlay_lv_alt.png b/public/images/ui/legacy/party_slot_overlay_lv_alt.png deleted file mode 100644 index 7aa9a590a1379c15f6e2a9677c6e4556aff7b580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATTRY;PWPi)!k3O z0r`w2L4Lsu4$p3+0XcG>E{-7_vdIih0&HzUY;BhW+CB-jZCc8+wOrE4nbGhN>zvG~ Rx{^SZ44$rjF6*2UngC`j9_Ii6 diff --git a/public/images/ui/legacy/pbinfo_enemy_boss.png b/public/images/ui/legacy/pbinfo_enemy_boss.png index 98b2f09f9417cbfb3f505e772623dd53c16c6a18..20eb74c59b3c1bd42103bde83b712ccb8802d3d2 100644 GIT binary patch delta 249 zcmVX$7!3pi00027CW>nS001hHB_@B?wg3O#|NsA*U}!I=HfUe~gLXwhDg&Vku)!RPn!BkCCaHr>W|ureZE#W? zY;uzh)lEJPF}ZLK%}m}is7)RJ)0^RFhM)b9L>-{9Y+HIGo^aVEOaZm00000NkvXXu0mjfsHS20 delta 282 zcmV+#0pWkU)kd`gSbb@3(n8Ud*q<`VvG5$)+&QQLM32*U`P!m7bGx%L8_u4nLsEEYyg|0 z`b;uGkt)~(R`FHjg5{!M6Oy#ZHen^igup6_O_)WB0i!02nr|>_!U`80z>`=LTD*5- z2b*RQX@bjUW9-06i&zu3xL^lfTGa8ya*9K8k!k{krCebsxVR4@zpxhy4Nah|!U+up wJAy5gB9Op<0Z244i~$p*QtSwZG}0Ua0K#YFp3uCRE&u=k07*qoM6N<$f>TOkF#rGn delta 281 zcmV+!0p|Xa0<;2o`IZ{F)IRM7JbKcgq|Nq|B&b?A=TK~0s z|Ns9=LR$BfbKYxOyp)n700001bW%=J06^y0W&i*HwMj%lRCr!vU|{AlL|O0+VYwxuDbuY=W>k*(Q`hOi&4@*nfm{;tUuyVbp|C6FO(& z1=9$cP%(4W%9X2Dt(?6ZJJ_5~$b?F;2`g9bIfES>Hz#bu-Mcq|Xy;7qV7fVBU%Y$y z^4-gs_>IB_*&U7?mgj0t~2tbQ2XBFo6)o fj$jZZ%@F{I+!FfxW2m5c00000NkvXXu0mjf+wpX$ diff --git a/public/images/ui/legacy/pbinfo_player.png b/public/images/ui/legacy/pbinfo_player.png index 60c92f886aaa950f71f07334f047eaed3d4ded04..f9e16a9aa0c1821dcf7710f4ef3430e007295741 100644 GIT binary patch delta 303 zcmV+~0nq;A0=@!}7=Hu<0001uVxCO^001XYOjJbx0G0p${~r&iz24Tf|Nq|q|Nm$`@zMYQ00MMUPE!B?c9YFG0002QNkl88dG(rIL59(Tl~tR0MGZsYxjGQeZk*XKV30AtfU>AIKYx_WU6P6OJ#F{@06%!& z^pK<~0bZJ@7R0j0D@?7h>SqO~TqRamY)f7nD+pCG+gqU%I19tC055pK3+MPv(@Fq7 z3%mKfxy!Mo5MRg5O`^8KEpBcW{pkw+CprCG@PZdMRxoTq)q+641WtomFi=^+Y7|0~ zBmuBz6rO^CODGA+mm!$9?trS4q;V27Q5P<)i5{*3K9Dm?1gZc4002ovPDHLkV1i6~ Bf}sEa delta 340 zcmV-a0jvJL0^QOSOoUqkIv#by4x39LWx?nhg8n6R2;K-rFoF?`V1(m@S2z^^BS`)uh#xX=lhECWMM0b9(R0NM{f}Io~<$eTWkX@(?Mdkjf0VJj4Tj$CF|NBN)L54r&iz24Tf z|Nq|q|Nldx1*HH000MMUPE!B?c9YFG00020Nklv7G;%=!#02(aB{G3> zI>dxx<*rrafo3y^2}#|%$pkypz$UO8?r5Lcv}-|!qHIdAljOmz9^$KB-zt6c2ic;mZceYt)ir~XHQE@ zR-&lJDNCaS6fg*~lV(6V13C~aBhgMw6G(FbrU49sl!C!#!l((OCIA4eMSf?4u45Gd P0000o`IZ{F)IRM7JbKcgq|Nq|B&b?A=TK~0s z|Ns9=LR$BfbKYxOyp)n700001bW%=J06^y0W&i*Hwn;=mRCr!vfB;4%a)AKU0A&|4 zfwLmS1Yzf}H1a^O5yS+Q@NzOisT0H##^vOKGKdLGt`wW#R)0<$7&T$kgi#YZXW|9Z z2%1nabJfa~t5&U?y&F5&oKDDuN{|UawC41)~4}2or$yaBmupYXATM07*qoM6N<$g0iG|jQ{`u diff --git a/public/images/ui/legacy/pbinfo_stat.png b/public/images/ui/legacy/pbinfo_stat.png deleted file mode 100644 index 25c94f9a8076e6cedffd87d147fde80f0194a058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!#0(@$l{S3lFzsfZIj?#R{bz|;CL=L?6kpTbe*)(N4@9wb{Wf3b{7&f&;Z z5drJvIXrvpYo_etycw!;)IwE^g=J32!jRwBJDInJy|I4x$c?3NOX<(g)y`LYBk#28 zE|_pu!OeO8^W}?0*o|$v92nao6rJZSzkDQ|BRTdU#|ggT=F3<2c}K4+>sf1i%fgMR cy#GhNW4>E};>)L&K!-7Sy85}Sb4q9e0CPW98UO$Q diff --git a/public/images/ui/legacy/text_images/ca/battle_ui/overlay_exp_label_ca.png b/public/images/ui/legacy/text_images/ca/battle_ui/overlay_exp_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..acb04a84a31793070378d9cf958105fa8b104d28 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq&Ne7LR|j?!E=UVdy9EhnC}Ax z8B2ovf*Bm1-ADs+Bt2amLn`8u53q-otYHXbWKvYnI&zfJgONf1BXg>P+Dc!bA_h-a KKbLh*2~7a2cOP;9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png b/public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_ca.png b/public/images/ui/legacy/text_images/ca/battle_ui/overlay_hp_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..4f388b70a75f1238f6d9bb1369f61c0645b1057f GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh)BFFWe{ zl;UgW_WE%=TL+Y7ED7=pW^j0RBMrzg^mK6ysfbH%U=DLM5J=z<2?}CTVq|kvR8>?| tbyRRZa?~~80;`5%U(Iin5dh`2_=MhRu`HW&x?4o-U3d6>+`27kLjE@VI=QsMm0csfDj0$n3-4XvKT= zqVHxY{BT^Q>wW%xlIqp_TJjYO=B=iT!DE>YKQS#xrf9 z3(SFn3~DVhy4fFiuF6NJOj5MYyDHVUp5>%cbs6`z{+NZktR3<+#P+Ic>jrXr) cv~qTK{#y3Z{08W4$S;_|;n|HeAjiL|_t literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/battle_ui/overlay_exp_label_da.png b/public/images/ui/legacy/text_images/da/battle_ui/overlay_exp_label_da.png new file mode 100644 index 0000000000000000000000000000000000000000..4c456fff94e65576f0f68c71b7709e41b99926bb GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq<8{+LR|j?!E=UVdy9eOL0R8p zKyjv$AirP+hO)_LEr2{pPZ!6Kin!zh>|tvn7#G>q{9s!2?~X0Q5{8g{>}jiO0-ggE OF?hQAxvXNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/battle_ui/overlay_hp_label_da.png b/public/images/ui/legacy/text_images/da/battle_ui/overlay_hp_label_da.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/battle_ui/overlay_lv_da.png b/public/images/ui/legacy/text_images/da/battle_ui/overlay_lv_da.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.json b/public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.json new file mode 100644 index 00000000000..eca2a9071ac --- /dev/null +++ b/public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_da.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.png b/public/images/ui/legacy/text_images/da/battle_ui/pbinfo_stat_da.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/party_slot_overlay_lv.png b/public/images/ui/legacy/text_images/da/party_ui/party_slot_overlay_lv_da.png similarity index 100% rename from public/images/ui/legacy/party_slot_overlay_lv.png rename to public/images/ui/legacy/text_images/da/party_ui/party_slot_overlay_lv_da.png diff --git a/public/images/ui/legacy/text_images/de/battle_ui/overlay_exp_label_de.png b/public/images/ui/legacy/text_images/de/battle_ui/overlay_exp_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..4c456fff94e65576f0f68c71b7709e41b99926bb GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq<8{+LR|j?!E=UVdy9eOL0R8p zKyjv$AirP+hO)_LEr2{pPZ!6Kin!zh>|tvn7#G>q{9s!2?~X0Q5{8g{>}jiO0-ggE OF?hQAxvXNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/battle_ui/overlay_hp_label_de.png b/public/images/ui/legacy/text_images/de/battle_ui/overlay_hp_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..b8404159bc93079db787b7dfe1db5c68fb20ca05 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMrzg^mK6ysfbH%U=DLM5J=z<2?`Mk3KB{X5D8*Z uQdDrhaUIEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.json b/public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.json new file mode 100644 index 00000000000..c5ace776596 --- /dev/null +++ b/public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_de.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.png b/public/images/ui/legacy/text_images/de/battle_ui/pbinfo_stat_de.png new file mode 100644 index 0000000000000000000000000000000000000000..8de02e9f16e39742c34ecb0852f1837a656dc95e GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDWL$L5LY1W;NWoY+SdR7|3esN z>%U(Iin5dh`2_=MhRu`HW&x>APZ!6Kin!G7gSk?n*KjE*J)Wv8W4$S;_|;n|HeAjiPd#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0uhly n5fK(c7ZzDphpYuWJMgTe~DWM4fbfhG~ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/de/party_ui/party_slot_overlay_lv_de.png b/public/images/ui/legacy/text_images/de/party_ui/party_slot_overlay_lv_de.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/battle_ui/overlay_exp_label.png b/public/images/ui/legacy/text_images/en/battle_ui/overlay_exp_label.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label.png b/public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label_boss.png b/public/images/ui/legacy/text_images/en/battle_ui/overlay_hp_label_boss.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/battle_ui/overlay_lv.png b/public/images/ui/legacy/text_images/en/battle_ui/overlay_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/pbinfo_stat.json b/public/images/ui/legacy/text_images/en/battle_ui/pbinfo_stat.json similarity index 100% rename from public/images/ui/legacy/pbinfo_stat.json rename to public/images/ui/legacy/text_images/en/battle_ui/pbinfo_stat.json diff --git a/public/images/ui/legacy/text_images/en/battle_ui/pbinfo_stat.png b/public/images/ui/legacy/text_images/en/battle_ui/pbinfo_stat.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/en/party_ui/party_slot_overlay_lv.png b/public/images/ui/legacy/text_images/en/party_ui/party_slot_overlay_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png b/public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..acb04a84a31793070378d9cf958105fa8b104d28 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq&Ne7LR|j?!E=UVdy9EhnC}Ax z8B2ovf*Bm1-ADs+Bt2amLn`8u53q-otYHXbWKvYnI&zfJgONf1BXg>P+Dc!bA_h-a KKbLh*2~7a2cOP;9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png b/public/images/ui/legacy/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..6018011d75bf5ba58aded90339304d7354e74a90 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQP?T_?GDTNT?| tbyRRZa?~~80;`5%U(Iin5dh`2_=MhRu`HW&x>fo-U3d6>+`&7kLjGaJc*|Fw0Q)uy%M_!hGL;QQH5| zs&tW+_EVXd>@5T~eT~2EU$HQLgZ*juxG1}%2S2_vKI9RIQrvvceL|2*{v1}$-yfuT zW^k4m7zRyvwNYDmen{LNZE1bW3WE)PoH;3^uqng8{-qJ Z9&s=5DO-NouIn7gC!Vf;F6*2UngAPkZmR$Q literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-ES/party_ui/party_slot_overlay_hp_es-ES.png b/public/images/ui/legacy/text_images/es-ES/party_ui/party_slot_overlay_hp_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..981d8573acab5cd43b100adbd3995babe8dd034e GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96Jg1Oj|QT!HkD4Gupp1QZk$1Ox;; z_&xnSP>8W4$S;_|;n|HeAjiL|_t literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_exp_label_es-MX.png b/public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_exp_label_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..acb04a84a31793070378d9cf958105fa8b104d28 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq&Ne7LR|j?!E=UVdy9EhnC}Ax z8B2ovf*Bm1-ADs+Bt2amLn`8u53q-otYHXbWKvYnI&zfJgONf1BXg>P+Dc!bA_h-a KKbLh*2~7a2cOP;9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png b/public/images/ui/legacy/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..6018011d75bf5ba58aded90339304d7354e74a90 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQP?T_?GDTNT?| tbyRRZa?~~80;`5%U(Iin5dh`2_=MhRu`HW&x>fo-U3d6>+`&7kLjGaJc*|Fw0Q)uy%M_!hGL;QQH5| zs&tW+_EVXd>@5T~eT~2EU$HQLgZ*juxG1}%2S2_vKI9RIQrvvceL|2*{v1}$-yfuT zW^k4m7zRyvwNYDmen{LNZE1bW3WE)PoH;3^uqng8{-qJ Z9&s=5DO-NouIn7gC!Vf;F6*2UngAPkZmR$Q literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/es-MX/party_ui/party_slot_overlay_hp_es-MX.png b/public/images/ui/legacy/text_images/es-MX/party_ui/party_slot_overlay_hp_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..981d8573acab5cd43b100adbd3995babe8dd034e GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96Jg1Oj|QT!HkD4Gupp1QZk$1Ox;; z_&xnSP>8W4$S;_|;n|HeAjiL|_t literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/battle_ui/overlay_exp_label_fr.png b/public/images/ui/legacy/text_images/fr/battle_ui/overlay_exp_label_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png b/public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_fr.png b/public/images/ui/legacy/text_images/fr/battle_ui/overlay_hp_label_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7e12c3246f4d7b445002a4963a36dbe85ab373 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Q zb9?V)M_vCB_XjA;SQ6wH%;50sMjDW#@9E+gQW2Njz%1ryAdpZX5)>p96e5%$AQB|h sWYE&v%i7D^7_?|%Q`4d*rh=mk^;smg8_sU*lRn1P{e@>vTYPuA1LF{C0cnW5>putc4I!Vmk#hkxzbuK$*pww8$@_#3B* Thf!iJP$7e-tDnm{r-UW|x{D|8 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.json b/public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.json new file mode 100644 index 00000000000..00cc9f7ea0e --- /dev/null +++ b/public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_fr.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 8 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 18, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 8 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 18, + "h": 8 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 8 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 16, + "h": 8 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 8 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 12, + "h": 8 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 8 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 12, + "h": 8 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 8 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 12, + "h": 8 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 8 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 12, + "h": 8 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 8 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 12, + "h": 8 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 8 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 8, + "h": 8 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.png b/public/images/ui/legacy/text_images/fr/battle_ui/pbinfo_stat_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..1919561ddfe1415983277fed18b1230d4dc2b6b0 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0v!VDx2WT+_sDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DOh>ud*ZefYdrq7srr_xZ2)}nMWLWT*R-59tl5aCHq2DA$|G(Sw&foQPxOtZ) zC^(#Wu%nn;}k4TVZ~IM|eej*}+fVZZ}t^E}ymK>GmZhOVVyUDa8W4$S;_|;n|HeAjjC##WAEJE;+%Vkdcv{ElpijRb5n-olRI>RGs5+V8Dey q7l9)Jg@uA5jH?(8WnyI>>|*fe=ej5FlJXL$ox#)9&t;ucLK6V*;U%L0 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/fr/party_ui/party_slot_overlay_lv_fr.png b/public/images/ui/legacy/text_images/fr/party_ui/party_slot_overlay_lv_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bbec23b0737888443a4d2040a8a19dd5a29320 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRM#0(_E7Tct<7UrG+vTYPtw!HF{C0c`2c%Z#u|n|d7pm`E9~X@7&IB2RoPs3Eb?vv PDq`?-^>bP0l+XkK%XK46 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_boss_it.png b/public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_boss_it.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_it.png b/public/images/ui/legacy/text_images/it/battle_ui/overlay_hp_label_it.png new file mode 100644 index 0000000000000000000000000000000000000000..4f388b70a75f1238f6d9bb1369f61c0645b1057f GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh)BFFWe{ zl;UgW_WE%=TL+Y7ED7=pW^j0RBMrzg^mK6ysfbH%U=DLM5J=z<2?}CTVq|kvR8>?| tbyRRZa?~~80;`5{2`X49@^n OFnGH9xvX%U(Iin5dh`2_=MhRu`HW&x=so-U3d6>+Bh7c*HLd7Rljq&Rl-KKZ6~L;K(_@w6-T z+7rWFn5P{%JR@?xp2$1qqyI0s9%!xG(Z+u3BlqclT5=Hwu3h8xbvTr9TvU!D_2$1> zJGtWb{JPg`>C_%{vi0%Nf(k3+(^vPcxy#+=eqX&|v19uSrHtesK4*R(JaPI#r)bA> zo|xk8X_dY0?9cAs{+Std$^5?VRt?`=``5nW+BODvef?kCyKab6-~B8m1>|l|S3j3^ HP68W4$S;_|;n|HeAjiNo>$(k4 zkg+7lFPOpM*^M+HN5s>`F{C0cdB%Z;E)&VHETfh#CI%~WmScP?cf|tb89ZJ6T-G@y GGywn-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png b/public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_ja.png b/public/images/ui/legacy/text_images/ja/battle_ui/overlay_hp_label_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/battle_ui/overlay_lv_ja.png b/public/images/ui/legacy/text_images/ja/battle_ui/overlay_lv_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.json b/public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.json new file mode 100644 index 00000000000..d8907e8e68c --- /dev/null +++ b/public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ja.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.png b/public/images/ui/legacy/text_images/ja/battle_ui/pbinfo_stat_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ja/party_ui/party_slot_overlay_lv_ja.png b/public/images/ui/legacy/text_images/ja/party_ui/party_slot_overlay_lv_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/overlay_exp_label_ko.png b/public/images/ui/legacy/text_images/ko/battle_ui/overlay_exp_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png b/public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_ko.png b/public/images/ui/legacy/text_images/ko/battle_ui/overlay_hp_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/overlay_lv_ko.png b/public/images/ui/legacy/text_images/ko/battle_ui/overlay_lv_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.json b/public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.json new file mode 100644 index 00000000000..359e3a5b76f --- /dev/null +++ b/public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ko.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.png b/public/images/ui/legacy/text_images/ko/battle_ui/pbinfo_stat_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ko/party_ui/party_slot_overlay_lv_ko.png b/public/images/ui/legacy/text_images/ko/party_ui/party_slot_overlay_lv_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..acb04a84a31793070378d9cf958105fa8b104d28 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f#0(^7rN5gBq&Ne7LR|j?!E=UVdy9EhnC}Ax z8B2ovf*Bm1-ADs+Bt2amLn`8u53q-otYHXbWKvYnI&zfJgONf1BXg>P+Dc!bA_h-a KKbLh*2~7a2cOP;9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..4f388b70a75f1238f6d9bb1369f61c0645b1057f GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh)BFFWe{ zl;UgW_WE%=TL+Y7ED7=pW^j0RBMrzg^mK6ysfbH%U=DLM5J=z<2?}CTVq|kvR8>?| tbyRRZa?~~80;`5%U(Iin5dh`2_=MhRu`HW`QVA7srr_xZd7CJ|;sBm!CKG9;|A*$~@zmbjd%?X}{x- z&b;PU@6*E2KT}{$&GDTN`aZe;u~_%>dSP#yvX^tQ7{_gwva_#0ELU1@=XmJmp9V(T zMkcc`t{|z<){2QmA6Mr6c~T`Iv7Y5xQSqviUtXRLDQma*VOcGa@v4}iU`IkmNbIFA zuBT*u&m{j~eV?3F!z{5ddurCK%k$G7zj^Uwc3^OQ|`wr*Zh6#2#Q@5Jp2+1=t= WZ^}aNbj9?5yy5BU=d#Wzp$P!ba(E5^ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png b/public/images/ui/legacy/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..981d8573acab5cd43b100adbd3995babe8dd034e GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96Jg1Oj|QT!HkD4Gupp1QZk$1Ox;; z_&xnSP>8W4$S;_|;n|HeAjiL|_t literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/overlay_exp_label_ro.png b/public/images/ui/legacy/text_images/ro/battle_ui/overlay_exp_label_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png b/public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_ro.png b/public/images/ui/legacy/text_images/ro/battle_ui/overlay_hp_label_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/overlay_lv_ro.png b/public/images/ui/legacy/text_images/ro/battle_ui/overlay_lv_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.json b/public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.json new file mode 100644 index 00000000000..8c268a77098 --- /dev/null +++ b/public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ro.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.png b/public/images/ui/legacy/text_images/ro/battle_ui/pbinfo_stat_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ro/party_ui/party_slot_overlay_lv_ro.png b/public/images/ui/legacy/text_images/ro/party_ui/party_slot_overlay_lv_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/battle_ui/overlay_exp_label_ru.png b/public/images/ui/legacy/text_images/ru/battle_ui/overlay_exp_label_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..d88171084086ba5f0f90cc33203e9d926f8727ce GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f!VF@mOPc~I{s5m4*Z)B9oZ;BsVhHK@y~GeG z#at5P7Yw9-l^wYUq~ttZ978JNk`+XESTrcKVUGR>j48#x z*9(Po))f8;P3Jex@s3+GD~}^YZ|AXD2`&Q9c{w)hOSUe)`^4<}{tt}OKP8%dLhNdR PCNg-s`njxgN@xNAG8jAe literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/battle_ui/overlay_hp_label_ru.png b/public/images/ui/legacy/text_images/ru/battle_ui/overlay_hp_label_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..490c93f8d3975fc1b9785db7ad412e8608802042 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh)BFFWe{ zl;UgW_WE%=TL+Y7ED7=pW^j0RBMrzg@^o8(ARQ9K sV&oFz!V)Xf7mdKI;Vst01{d(#{d8T literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/ru/battle_ui/overlay_lv_ru.png b/public/images/ui/legacy/text_images/ru/battle_ui/overlay_lv_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..e8760560dfaf68d4b21cdad96506af1c7d14277d GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4`~f~8uJ^8OP1W=K|Np;}lM|4A zbg|-BpcHdSkY6y6{#AD59*|P^ba4!+h)XswOcZGmJjTa!PEAdXM@OOQ;E@}xjt7q( fndsq)}JzX3_D&l;55Are@^054EU<=4N5Tn%~Wb^;Tk-yuW z=4|$}=$Fkb6U{vFJo^AsvB#E)nRoUT^h}xlv48vAvyL2%k{c8>?ov*g&pNa>{GwlN`m~F? bu3!Dfm}i-`E3f3T2FNR(u6{1-oD!M8W4$S;_|;n|HeAjiPd#WAEJE;+%Vkdcv{ElpijRb5@3olRI>Rh{E-;Dw8> n0W60Ym=;L6J30z5uj6LO_2pi?@psl@pk4+~S3j3^P60f0>?g1$^PZ!6KinwG0!$1)ir8&MmvJw$KK0Xo>3N0JCnVY*i em6<1mFfcUtvF_z@=6ej(!QkoY=d#Wzp$P!A0VaC@ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/overlay_exp_label_tl.png b/public/images/ui/legacy/text_images/tl/battle_ui/overlay_exp_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png b/public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_tl.png b/public/images/ui/legacy/text_images/tl/battle_ui/overlay_hp_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/overlay_lv_tl.png b/public/images/ui/legacy/text_images/tl/battle_ui/overlay_lv_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.json b/public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.json new file mode 100644 index 00000000000..023a5ee45f9 --- /dev/null +++ b/public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_tl.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.png b/public/images/ui/legacy/text_images/tl/battle_ui/pbinfo_stat_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tl/party_ui/party_slot_overlay_lv_tl.png b/public/images/ui/legacy/text_images/tl/party_ui/party_slot_overlay_lv_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/battle_ui/overlay_exp_label_tr.png b/public/images/ui/legacy/text_images/tr/battle_ui/overlay_exp_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9bd8825819f8f45c6d9535e454a71d082a97c7 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f!VF@mOPc~I{s5m4*Z=?jAKP2}|2YE?0U1}` zOjrk$VlD~t3kK4^%8uLvQgWUyjv*Cs$qJ%7EOuG!uyD9>sOuOP8&AQuM#C0n2G4S4 V`w#LZmw_r7JYD@<);T3K0RS=hC~p7& literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_boss_tr.png b/public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_boss_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_tr.png b/public/images/ui/legacy/text_images/tr/battle_ui/overlay_hp_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..da11c11cb50cb2734e2e628d82195263138daede GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh)BFFWe{ zl;UgW_WE%=TL+Y7ED7=pW^j0RBMr#W_jGX#sfbH%U=DLM5J=z<2?}CTVq|kvR8a&wJOl{{R2q$;k=G zsFzCi0ZK8K1o;I6>0f0>?g1$^PZ!6Kin!zeGr@!egF;5ZE;TitbAAp^M_4>0c3bQ= e*kRFS!NB03z^XWN@`=qr9SokXelF{r5}E*?Rwr5j literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.json b/public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.json new file mode 100644 index 00000000000..6de50500767 --- /dev/null +++ b/public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_tr.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.png b/public/images/ui/legacy/text_images/tr/battle_ui/pbinfo_stat_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAjinl#WAEJE;+%Vkdcv{ElpijRiOyT2`U64CL5#nph3g&EVwxSqlmZ{{R2~st-^rgQu&X%Q~loCIFvFF^m8J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json b/public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json new file mode 100644 index 00000000000..49649bbc315 --- /dev/null +++ b/public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_zh-CN.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png b/public/images/ui/legacy/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..40b5e8925a1b3dbfcb82560db7225ebbda8e3d88 GIT binary patch literal 1401 zcmbVMzfaUq952Bjpezy+Wok+^7;XF7yI$!F74Zsk#v*}Bz)9b=@9r9|eYJhZ-I3^E zSd5FV#y`Or7bXWy7~OQy#leL*xtOREzTS@p3`(TQ>-+V2pYQMQqou{`Bg5mv9LJ3m z7OZ79kFjxbaDe@HhX#^qC|tN5bKI%XWb|>*o}cBo6JNdJ8eOw*LWlSga!CnGO+RF4 zj+>rohR9jRlrQ0m7ns7g*KY*gb4_7Yvwca7O<^_>$gkN;e4a#@*QA{2C|Q-)4N1uXL(N|1RiNlH z&}Ahf0tJE`%ou$46PUEfEyHDNzAKCEOrc6?2xYm^Xh@BWM52nU7=|GORaRAzA;h>9 zP}CHIc%sK(;n<11ka{HG6Gl`bb!rMs(~b##n9>Gu*GZzL))lgM*5F%cVICo(*}z0Y=wF2h-8wP>T*(p9V_HN4Q$`-tJfZ!HGyQA zb|1D$`xg#a(~4Mk+Ieu}KI?3`f;C&59CLo|?alOWD?5Yw_m7{y?19r~-p)_F8{K`s sdv$#4>G>zWK#OYDx#166k1zD~b1&{}|M;ZSS4nd$%q?0kuibt48<8ltA^-pY literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..283d63fb235a416b3244c48f3915efc696ef55c1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX!VDxut3KrdDWL$L5ZC`eu(kU8l;V5YQPNkKH-| PG?2m5)z4*}Q$iB}IL1A+ literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..67824c7ee4e61e92f26c658f4ca03de81e78bffc GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!VDx;S96H~DWL$L5ZC|z{|9A9{oh*seM<4Y z?5Jz!_G+KJZ3&cRED7=pW^j0RBMr#W^K@|xsfbH%U=DLM5J=z<2@(lK r;7LqQR$%h#+|kjogM;gUC^JK&8q2FYbJ8vWbuxIm`njxgN@xNAczi2J literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..ea32ac03ee21098b52fcaf67fa2564acc4b0f169 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+D)IEGZjCC@m(;AXrqBUQ_J1qXvY6Ps}IlINU2c?M5cKbLh* G2~7ZOmmCfN literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json b/public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json new file mode 100644 index 00000000000..5a2e0fe2c30 --- /dev/null +++ b/public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_zh-TW.png", + "format": "RGBA8888", + "size": { + "w": 112, + "h": 6 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 0, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 18, + "h": 6 + }, + "frame": { + "x": 18, + "y": 0, + "w": 18, + "h": 6 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 16, + "h": 6 + }, + "frame": { + "x": 36, + "y": 0, + "w": 16, + "h": 6 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 52, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 64, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 76, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 88, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 12, + "h": 6 + }, + "frame": { + "x": 100, + "y": 0, + "w": 12, + "h": 6 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 8, + "h": 6 + }, + "frame": { + "x": 112, + "y": 0, + "w": 8, + "h": 6 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:40d30205ce8efd40dfa86cd11b0491d6:7076db6ed74199dcfb38fc8cd4d4a0e8:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..c729e7a2207ca6b2fd4dc50a86d82a35118b275a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0!!VDyTCAkLxDgFST5LY05@7mV?|NlEUH~<;z zT}AE#g_ui%{DMI$%Z}UwQk|YIjv*Csw!Ig5ofUbG_*Lax5`4tCV#nX~R};mjdL+E* zf8jVkpRw_lE9;M%stiVjPw=yFfX3({s<_SRfSjzp)) zKmQwi&1s1qE|ZCxzTC%F_>?m}Ws+SGHP`33=FyK&CorD8{q2-!#8W4$S;_|;n|HeAV=TR#WAEJE;+%Vkdcv{ElpiiRb5q;olRK4`6%a!0ud1w mB>`ub3xO<4*iJRPW@7Lt<0>_{cxnSsD}$%2pUXO@geCxPBPDtO literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png b/public/images/ui/legacy/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb545c7affbde77af5aac4f1de158d934f56d4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$efR}XF0A3uH+6cqfNc-#pn z$XF8O7tG-B>_!@pBkJkm7{U>q>=SW-!!;*BgTe~ HDWM4f##kP+ literal 0 HcmV?d00001 diff --git a/public/images/ui/overlay_lv.png b/public/images/ui/overlay_lv.png deleted file mode 100644 index 6ced2da2660c9eec9aaf776259483dfcfc02ce46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E#0(@CGsK?*Qak}ZA+A7LQBkp}wC(@@|6!Y- z@B{gbB|(0{3=Yq3qyag~o-U3d9J0xYU+y0`bb;Z>8b%!+8D1Tp`u+_DC+rduJAU&s YL>yyxZ7$t!094N4>FVdQ&MBb@0N}PHk^lez diff --git a/public/images/ui/party_slot_hp_bar.png b/public/images/ui/party_slot_hp_bar.png index 181bd04c0ea744ce1f717d2dd97ae0b19075c9b8..c1818439e75a1f9b99672cc41835f1ae9b1c3a0d 100644 GIT binary patch delta 105 zcmZ3$*v&XWGwJ{T{|pQaKYsjBR8%xHG@SeYK?0D^R1)MD%)n4K`K$$yr|Ie97*Y|J z+`!}}uGFZ&%(Fp5kW)r7;lRlm9t)g0#RMzopr07VZi2mk;8 diff --git a/public/images/ui/pbinfo_enemy_boss.png b/public/images/ui/pbinfo_enemy_boss.png index ce829bf46319da69f9361b177861d8cb3483d633..421edabba03c3af6915719d66028dd00a24cc3bc 100644 GIT binary patch delta 224 zcmV<603ZLN0{j7xB!3uCOjJbx00960{~;kEHZ4A5V`J9V*7*4N|NsB96=@Ry0007X zQchC<0CtnjH~;_ukx4{BRCr$P)iDZyFbqcFpWdK1C~eify+IM&1#x%q0HXBz+QE*h zkO+$J0N;=V0?8Gl3J2WlOuk0C4|q$g3>E&(Aw{%b!%TB!KXB(SCgr90M40aq-DT16x@U|_xs6~Afn0fo01Yki4fYxT-RsqAPlM|zyA2e#i2wiq M07*qoM6N<$f_|TQAOHXW diff --git a/public/images/ui/pbinfo_enemy_mini.png b/public/images/ui/pbinfo_enemy_mini.png index ddf107767784f608b86b404e08b9c872d17d6af3..bf60bb0f964cbe3eea6acecca7988585481fe36b 100644 GIT binary patch delta 223 zcmV<503iR90{a1wB!3uCOjJbx00960{~;kEHZ4A5V`J9V*7*4N|NsB96=@Ry0007X zQchC<0CtnjH~;_ukV!;ARCr$P)iDZ$Fc5{|M{eK^LZWV;+&~0-LAJNp1BjCA?^-yO zWAU6~3;%ZDgJd8*L_t(|UhUMe3d0}}fMM|wd;&R}rnA05xF-+-oimiqS-J;O zeC(P+%n+4wTp>gLSwFZF6vs#cDZL5Ck+O_}bi_2DV5ov+6L6#>r+I{J2>KYO@aNYA zYXHnof@u0o9xolDf>PfzVilfY--OsjqZ>|6U002ovPDHLkV1h0fYZL$g diff --git a/public/images/ui/pbinfo_player.png b/public/images/ui/pbinfo_player.png index c7b2227e8009d48f321aca057c652feb89b8ae7b..55c381bd436c821a4fc4f5eeefb26f0ca3e5eb06 100644 GIT binary patch delta 257 zcmV+c0sj8j0-XYoB!3=IOjJbx00960{~;kEHZ4A5V`G|L_t(|UftF~3WOjOhw*qfXio6Zh}!B6Voord_5mHF zRqJ-$wv=XPQqMmaeXBtHfl^vgruH78*i)k1%tIh6ijjhr33>)7kQK%_K}!V#6Ud5V zl%VB;0SROiVlRB7sk8j37pgVZ(#+we)(v+~sN=$w-RQ|L2DR)->yBqcg@_#Hpx8?_h{&GKrfLX-`S33SsL>h@#00000NkvXX Hu0mjfd)#)x delta 317 zcmV-D0mA;B0@wnOB!4GROjJbx0001angF`<4ze#HAt5#`J~{t;V`F2QlA6}m*7Ni8 z`1tt$|Nk}I21Wn?00DGTPE!Ct=GbNc007@fL_t(|UhUQ~4uUWg$Kej|2wuR(BX9s> z{*@3M%MD0R(4-e|a%S-!Y_5(TN{a(ADOesgIQW~JFT92p#D81=z)B2J%_>hRD4w7b z3RE-8(+P?z=wt%b?DABC;tP7YFg*mc0#w8pw#QX`w^7su$Xig2^I;;u5a)`v8niQTj!8Y9}3R0p}uilCYrsSKi6>&*u7f)cSXI z>Tj0DE0#dLAU5TGyOUDQ9%2wSkYEY|zSlGG{y+rhjEZ1%j_&j|VfGXc-G>W?OL{;# P00000NkvXXu0mjfvoVit diff --git a/public/images/ui/pbinfo_player_mini.png b/public/images/ui/pbinfo_player_mini.png index 90d5e03dae845086de1c1202903b48ad3147621a..255ad00f8cad728d0e92c7eb8eedeba5b4138426 100644 GIT binary patch delta 225 zcmV<703QF80{sDyB!3uCOjJbx00960{~;kEHZ4A5V`J9V*7*4N|NsB96=@Ry0007X zQchC<0CtnjH~;_ul1W5CRCr$P)G-Q#Fc5{|M{ck;2#IQ++&~0-LF_H|0E?3AuNFy_ zu^6YYn7@7SK@tc)Pm>Y=<5*cB3qG<6f`W<6teoJvLJ$*7WLjsX1kV>j7F2l4YoZzH z9Mv@r$ikYae%-g;)~9q7!Q2R&tJhtEEyBbT_9CENsAlpM?Kz?d4eurgK;o}{nhGkY bpaRt&G?;vWYa6_d00000NkvXXu0mjf?aN>Y delta 248 zcmVdlgdQ%om5l$@uhn{dRg4&}xvLKxG!dYcTKe>H!SBuP&vUMeG6vlo*90000+(JhFnaB0iNzKW& zvig#I=K0B~PH)8m68E%rtu>TjYIpdSwBJQyM(4H*D?|7m#ha@|yQZ`q znrqP`*gkcdQ2Tt@Q+F=1sj*~mDo@+^JayTVo0gk4HHUld+joI8;ojZ}xBpK{SeyNW YVWDURgH6UQkQW#{UHx3vIVCg!07p1)UH||9 diff --git a/public/images/ui/text_images/ca/battle_ui/overlay_exp_label_ca.png b/public/images/ui/text_images/ca/battle_ui/overlay_exp_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png b/public/images/ui/text_images/ca/battle_ui/overlay_hp_label_boss_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/battle_ui/overlay_hp_label_ca.png b/public/images/ui/text_images/ca/battle_ui/overlay_hp_label_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7ccba752f616e929200052cf590d6aecdbbc92 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4S4Bld%m39tl5dkfka1W; z;Q&yIsU*lRn1P{e@>vTY&(PDwF{C0+wxf}g!GPoNDZLw_zuE{6aB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/battle_ui/overlay_lv_ca.png b/public/images/ui/text_images/ca/battle_ui/overlay_lv_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..869a1ee0051e250ca529dce8a0e1ad60311262cc GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+Gb1zgD%auH-4-Eb(rt@t^#|NlU;sk9Bq za9kuLK*#Y}OYmdvQUK zuQcz;3U1d+5{fdv$_|t<@zqKn0Xg4P pea^|g$IfoNd^T!-*cykQ%xs6M_pdJFS_AYCgQu&X%Q~loCIG@sc7^}| literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/party_ui/party_slot_overlay_hp_ca.png b/public/images/ui/text_images/ca/party_ui/party_slot_overlay_hp_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc95e4f95e8d6ce67a830c47147845b9eada2b8 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^*Z=?j|M>C4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}s;7%%NJU)og{UoEjfq*M8O(>boLI%ywlXxjan00+ygX7q bt0fo~i*OZ}EAd+aH86O(`njxgN@xNARZ=J! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ca/party_ui/party_slot_overlay_lv_ca.png b/public/images/ui/text_images/ca/party_ui/party_slot_overlay_lv_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..c5971de4fd005e1a917668e47e5b7094cd447f07 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^*Z*LkprFuH+IIc$;weCJ z#*!evU*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/battle_ui/overlay_hp_label_da.png b/public/images/ui/text_images/da/battle_ui/overlay_hp_label_da.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/battle_ui/overlay_lv_da.png b/public/images/ui/text_images/da/battle_ui/overlay_lv_da.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.json b/public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.json new file mode 100644 index 00000000000..5108fa59582 --- /dev/null +++ b/public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_da.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.png b/public/images/ui/text_images/da/battle_ui/pbinfo_stat_da.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/da/party_ui/party_slot_overlay_hp_da.png b/public/images/ui/text_images/da/party_ui/party_slot_overlay_hp_da.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/party_slot_overlay_lv.png b/public/images/ui/text_images/da/party_ui/party_slot_overlay_lv_da.png similarity index 100% rename from public/images/ui/party_slot_overlay_lv.png rename to public/images/ui/text_images/da/party_ui/party_slot_overlay_lv_da.png diff --git a/public/images/ui/text_images/de/battle_ui/overlay_exp_label_de.png b/public/images/ui/text_images/de/battle_ui/overlay_exp_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..39a92725bc0ffbc81c8e5c5cb98379d9efeb2674 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj=ZOfV@O3@G6ySD+nUJJVMZzLxwpAemijVwvKky*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/battle_ui/overlay_hp_label_de.png b/public/images/ui/text_images/de/battle_ui/overlay_hp_label_de.png new file mode 100644 index 0000000000000000000000000000000000000000..8b227eebd7a70a2a5fc7e8fc8473547120f5d931 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3p#Yx{*Z=?jTmG-++oTUfii(Or z_C3CXr-8D}B|(0{K>AnNk$XVOz|+Msq#`akp|BvaurM*9fS0qBm$xi|LC8U^gRk+@ pL50E%H67f{%-xH-yO^1o84~XBSkAvuehH|T!PC{xWt~$(69B2QEDQhu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/battle_ui/overlay_lv_de.png b/public/images/ui/text_images/de/battle_ui/overlay_lv_de.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.json b/public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.json new file mode 100644 index 00000000000..dbf39c94059 --- /dev/null +++ b/public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_de.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.png b/public/images/ui/text_images/de/battle_ui/pbinfo_stat_de.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bcb6138b968236b484358a56e89c0f9d70a6db GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K!VDzurW-E666=mz)&{%tOby_+SA1`q#~|%;zdqoLmp@2LlZfZp86J~FdhGWJ|xGrO zv+jt|5>IFMSHDiAh|b@%zGSOpa^5!{-S_Vv79PGMaV`94Ge0-a6f>C{ix)ELsDzi7 zS2ATapWgcS!Qqz16FVaeZry2Sn09ThxyHNiZEquMKP2|4PFenOk7LKARU4|r7Wn7B zG-%7rJZVa=N|~wc)&GAR{`RaF|8UhOeWv@$&p>B0 Nc)I$ztaD0e0su|(Z4Ceb literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/party_ui/party_slot_overlay_hp_de.png b/public/images/ui/text_images/de/party_ui/party_slot_overlay_hp_de.png new file mode 100644 index 0000000000000000000000000000000000000000..47ac22e52cb9cfe432a1ab6a3f5e1298ee0652a7 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^*Z=?j|M>C4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}lBbJfNJU)og@`R(jfqhy70idPoC;BxD0z?JNtz*ps+0u7 Y3>D608w1s}fT|fhUHx3vIVCg!0Jdo+CIA2c literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/de/party_ui/party_slot_overlay_lv_de.png b/public/images/ui/text_images/de/party_ui/party_slot_overlay_lv_de.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/battle_ui/overlay_exp_label.png b/public/images/ui/text_images/en/battle_ui/overlay_exp_label.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/battle_ui/overlay_hp_label.png b/public/images/ui/text_images/en/battle_ui/overlay_hp_label.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/battle_ui/overlay_hp_label_boss.png b/public/images/ui/text_images/en/battle_ui/overlay_hp_label_boss.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/battle_ui/overlay_lv.png b/public/images/ui/text_images/en/battle_ui/overlay_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/pbinfo_stat.json b/public/images/ui/text_images/en/battle_ui/pbinfo_stat.json similarity index 100% rename from public/images/ui/pbinfo_stat.json rename to public/images/ui/text_images/en/battle_ui/pbinfo_stat.json diff --git a/public/images/ui/text_images/en/battle_ui/pbinfo_stat.png b/public/images/ui/text_images/en/battle_ui/pbinfo_stat.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/party_ui/party_slot_overlay_hp.png b/public/images/ui/text_images/en/party_ui/party_slot_overlay_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/en/party_ui/party_slot_overlay_lv.png b/public/images/ui/text_images/en/party_ui/party_slot_overlay_lv.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png b/public/images/ui/text_images/es-ES/battle_ui/overlay_exp_label_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png b/public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_boss_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..440ba6136dc87f67fb8b57236d8777e30d435c4d GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC!VDz;`FiF7DbWC*5ZC|z|0^mg?lzSD9HRv! zfove-#LVjRKm{x%L4LtNnql+gv{^vP(bL5-q#`cafqmhcg#j#2HY{sh>KMo{W4aWV zBO}k6g$@@(ID`^7yj`bpdwMfwdZn_wPUhte<>fWy6%gU&6=h&}enM)>G7r{zkfENg KelF{r5}E)j3@>y5 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_es-ES.png b/public/images/ui/text_images/es-ES/battle_ui/overlay_hp_label_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7ccba752f616e929200052cf590d6aecdbbc92 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4S4Bld%m39tl5dkfka1W; z;Q&yIsU*lRn1P{e@>vTY&(PDwF{C0+wxf}g!GPoNDZLw_zuE{6aB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/battle_ui/overlay_lv_es-ES.png b/public/images/ui/text_images/es-ES/battle_ui/overlay_lv_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..869a1ee0051e250ca529dce8a0e1ad60311262cc GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+Gb1zgD%auH-4-Eb(rt@t^#|NlU;sk9Bq za9kC4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}s;7%%NJU)og{UoEjfq*M8O(>boLI%ywlXxjan00+ygX7q bt0fo~i*OZ}EAd+aH86O(`njxgN@xNARZ=J! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-ES/party_ui/party_slot_overlay_lv_es-ES.png b/public/images/ui/text_images/es-ES/party_ui/party_slot_overlay_lv_es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..c5971de4fd005e1a917668e47e5b7094cd447f07 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^*Z*LkprFuH+IIc$;weCJ z#*!evU XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png b/public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_boss_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..440ba6136dc87f67fb8b57236d8777e30d435c4d GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC!VDz;`FiF7DbWC*5ZC|z|0^mg?lzSD9HRv! zfove-#LVjRKm{x%L4LtNnql+gv{^vP(bL5-q#`cafqmhcg#j#2HY{sh>KMo{W4aWV zBO}k6g$@@(ID`^7yj`bpdwMfwdZn_wPUhte<>fWy6%gU&6=h&}enM)>G7r{zkfENg KelF{r5}E)j3@>y5 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_es-MX.png b/public/images/ui/text_images/es-MX/battle_ui/overlay_hp_label_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7ccba752f616e929200052cf590d6aecdbbc92 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4S4Bld%m39tl5dkfka1W; z;Q&yIsU*lRn1P{e@>vTY&(PDwF{C0+wxf}g!GPoNDZLw_zuE{6aB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/battle_ui/overlay_lv_es-MX.png b/public/images/ui/text_images/es-MX/battle_ui/overlay_lv_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..869a1ee0051e250ca529dce8a0e1ad60311262cc GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+Gb1zgD%auH-4-Eb(rt@t^#|NlU;sk9Bq za9kC4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}s;7%%NJU)og{UoEjfq*M8O(>boLI%ywlXxjan00+ygX7q bt0fo~i*OZ}EAd+aH86O(`njxgN@xNARZ=J! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/es-MX/party_ui/party_slot_overlay_lv_es-MX.png b/public/images/ui/text_images/es-MX/party_ui/party_slot_overlay_lv_es-MX.png new file mode 100644 index 0000000000000000000000000000000000000000..c5971de4fd005e1a917668e47e5b7094cd447f07 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^*Z*LkprFuH+IIc$;weCJ z#*!evU XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png b/public/images/ui/text_images/fr/battle_ui/overlay_hp_label_boss_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/battle_ui/overlay_hp_label_fr.png b/public/images/ui/text_images/fr/battle_ui/overlay_hp_label_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..e086339f047615cd38b7e7fc2b08849f397c9ab6 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jTmG+BR8-{Kr2jV3 z=owI)u_VYZn8D%MjWi%f#nZ(xq#`c)Le!S7#>A}DEat;oJR}UaTFIP<5o{KXYh3Ob6Mw<&;$Uo#3ytB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/battle_ui/overlay_lv_fr.png b/public/images/ui/text_images/fr/battle_ui/overlay_lv_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9ccb6d02d8be6ab3d9f0196ec8e3d427e247f7 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@!VDyjmkZ_sDgFST5LZP-#sB~RL&&DmHiolb z*nv_^B|(0{3=CzH&sqR^%APKcAr*1S0YO1R2?1e7OhRr7hmLkMI!4~~;8aOtnH0*z Y;M~ppvt1_bI#4--r>mdKI;Vst0I5?Y4FCWD literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.json b/public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.json new file mode 100644 index 00000000000..1275fe16ec3 --- /dev/null +++ b/public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_fr.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 9 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 19, + "h": 9 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 9 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 19, + "h": 9 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 9 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 17, + "h": 9 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 9 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 13, + "h": 9 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 9 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 13, + "h": 9 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 9 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 13, + "h": 9 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 9 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 13, + "h": 9 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 9 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 13, + "h": 9 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 9 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": -1, + "w": 9, + "h": 9 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 9 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.png b/public/images/ui/text_images/fr/battle_ui/pbinfo_stat_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..baea5c8d93cebdefaad4f2949c545441aaa7d4eb GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!F!VDyz=LTH^QbGYfA+A7LQBm>#|NlU;sk9Bq za9kzopr0PQ1v)c^nh literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/fr/party_ui/party_slot_overlay_hp_fr.png b/public/images/ui/text_images/fr/party_ui/party_slot_overlay_hp_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..140c99eef6886b265f5d6d22bc93f38a475e702a GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^*Z=?j|M>C4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}il>WXNJU)og{UoEjfq*QSQJ}$S;_Ip=|P53m{L$)5S5QA}*PMSyffljV)DGSs{@{DW-=-a>~@+DGo_)3X!S| Y4t&gaZ}Bkg2dZcAboFyt=akR{08s8CF#rGn literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/battle_ui/overlay_exp_label_it.png b/public/images/ui/text_images/it/battle_ui/overlay_exp_label_it.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad5855cc46ea34559600c71bf71becdbfea2093 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj*_Q~V@O3@G6yd&Z{mqr+j3Q%%WiC)$`iSHoiA%AtHA+A Zh8vSOH=fu0y&b5U!PC{xWt~$(695j7C7l2O literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/battle_ui/overlay_hp_label_boss_it.png b/public/images/ui/text_images/it/battle_ui/overlay_hp_label_boss_it.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/battle_ui/overlay_hp_label_it.png b/public/images/ui/text_images/it/battle_ui/overlay_hp_label_it.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7ccba752f616e929200052cf590d6aecdbbc92 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4S4Bld%m39tl5dkfka1W; z;Q&yIsU*lRn1P{e@>vTY&(PDwF{C0+wxf}g!GPoNDZLw_zuE{6aB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/battle_ui/overlay_lv_it.png b/public/images/ui/text_images/it/battle_ui/overlay_lv_it.png new file mode 100644 index 0000000000000000000000000000000000000000..987d806b93a4abab3cf51571751e91adff240af6 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQk(%kA+G=b|5s2@0Fn|LxSWB4 zj3q&S!3+-1ZlnP@VxBIJAr*1S9Ek}YjSH^?w5^%Rvv47U;$P+$R}{|F16441y85}S Ib4q9e09`gAwg3PC literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.json b/public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.json new file mode 100644 index 00000000000..111a88ba365 --- /dev/null +++ b/public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_it.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.png b/public/images/ui/text_images/it/battle_ui/pbinfo_stat_it.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ac58da1847c38084481ba978019b0dea4eb974 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K!VDzurW-E#|NlU;sk9Bq za9kn!-_d=^A>m-aO;T*+z|Fy-+fBtd>yN-k>(cl5F3e|4lZilcE{iUy|}IPPt*Br fi}x=sKVv`LJ7Y5Mv^0O9Cm1|k{an^LB{Ts5H79fd literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/party_ui/party_slot_overlay_hp_it.png b/public/images/ui/text_images/it/party_ui/party_slot_overlay_hp_it.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc95e4f95e8d6ce67a830c47147845b9eada2b8 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^*Z=?j|M>C4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}s;7%%NJU)og{UoEjfq*M8O(>boLI%ywlXxjan00+ygX7q bt0fo~i*OZ}EAd+aH86O(`njxgN@xNARZ=J! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/it/party_ui/party_slot_overlay_lv_it.png b/public/images/ui/text_images/it/party_ui/party_slot_overlay_lv_it.png new file mode 100644 index 0000000000000000000000000000000000000000..31a2a31dd411542f95aac9f347334c52bae5882a GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$ef*Z=?jD<~)cNr??y&OkxN zk|4ie28U-i(tsQZPZ!6KinwHkCIPlK5eYBe)DyE#3II)2Vqku8DxpXcsD{DQ)z4*} HQ$iB}0+$_t literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/battle_ui/overlay_exp_label_ja.png b/public/images/ui/text_images/ja/battle_ui/overlay_exp_label_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png b/public/images/ui/text_images/ja/battle_ui/overlay_hp_label_boss_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/battle_ui/overlay_hp_label_ja.png b/public/images/ui/text_images/ja/battle_ui/overlay_hp_label_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/battle_ui/overlay_lv_ja.png b/public/images/ui/text_images/ja/battle_ui/overlay_lv_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.json b/public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.json new file mode 100644 index 00000000000..d8de5c788ef --- /dev/null +++ b/public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ja.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.png b/public/images/ui/text_images/ja/battle_ui/pbinfo_stat_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/party_ui/party_slot_overlay_hp_ja.png b/public/images/ui/text_images/ja/party_ui/party_slot_overlay_hp_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ja/party_ui/party_slot_overlay_lv_ja.png b/public/images/ui/text_images/ja/party_ui/party_slot_overlay_lv_ja.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/battle_ui/overlay_exp_label_ko.png b/public/images/ui/text_images/ko/battle_ui/overlay_exp_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png b/public/images/ui/text_images/ko/battle_ui/overlay_hp_label_boss_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/battle_ui/overlay_hp_label_ko.png b/public/images/ui/text_images/ko/battle_ui/overlay_hp_label_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/battle_ui/overlay_lv_ko.png b/public/images/ui/text_images/ko/battle_ui/overlay_lv_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.json b/public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.json new file mode 100644 index 00000000000..a1d660dfca3 --- /dev/null +++ b/public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ko.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.png b/public/images/ui/text_images/ko/battle_ui/pbinfo_stat_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/party_ui/party_slot_overlay_hp_ko.png b/public/images/ui/text_images/ko/party_ui/party_slot_overlay_hp_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ko/party_ui/party_slot_overlay_lv_ko.png b/public/images/ui/text_images/ko/party_ui/party_slot_overlay_lv_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png b/public/images/ui/text_images/pt-BR/battle_ui/overlay_exp_label_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png b/public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_boss_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png b/public/images/ui/text_images/pt-BR/battle_ui/overlay_hp_label_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7ccba752f616e929200052cf590d6aecdbbc92 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4S4Bld%m39tl5dkfka1W; z;Q&yIsU*lRn1P{e@>vTY&(PDwF{C0+wxf}g!GPoNDZLw_zuE{6aB literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/battle_ui/overlay_lv_pt-BR.png b/public/images/ui/text_images/pt-BR/battle_ui/overlay_lv_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..869a1ee0051e250ca529dce8a0e1ad60311262cc GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+Gb1zgD%auH-4-Eb(rt@t^#|NlU;sk9Bq za9kw9#I#NL}$ z7hek>UN({M)zWusj$U$eI_cvOx=?^s@NC6GwkI17&)(qvRGP=@bV#6SgxGpx?Kw+R zPt-D<^$RI-I31AAR%7&FwxdXPo6Co%0qzO~c@K6pcO8?JT5VzZtuycYiI!vwb=$*5 k@jutj71NC`XL`x&`n=XW_u1B6K%X#py85}Sb4q9e060K(@c;k- literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png b/public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_hp_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc95e4f95e8d6ce67a830c47147845b9eada2b8 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^*Z=?j|M>C4z`&rOpx^?V z{XC#JV@Z%-FoVOh8)-m}s;7%%NJU)og{UoEjfq*M8O(>boLI%ywlXxjan00+ygX7q bt0fo~i*OZ}EAd+aH86O(`njxgN@xNARZ=J! literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_lv_pt-BR.png b/public/images/ui/text_images/pt-BR/party_ui/party_slot_overlay_lv_pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..c5971de4fd005e1a917668e47e5b7094cd447f07 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^*Z*LkprFuH+IIc$;weCJ z#*!evU XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png b/public/images/ui/text_images/ro/battle_ui/overlay_hp_label_boss_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/battle_ui/overlay_hp_label_ro.png b/public/images/ui/text_images/ro/battle_ui/overlay_hp_label_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/battle_ui/overlay_lv_ro.png b/public/images/ui/text_images/ro/battle_ui/overlay_lv_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.json b/public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.json new file mode 100644 index 00000000000..b5f74fdd7cc --- /dev/null +++ b/public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ro.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.png b/public/images/ui/text_images/ro/battle_ui/pbinfo_stat_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/party_ui/party_slot_overlay_hp_ro.png b/public/images/ui/text_images/ro/party_ui/party_slot_overlay_hp_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ro/party_ui/party_slot_overlay_lv_ro.png b/public/images/ui/text_images/ro/party_ui/party_slot_overlay_lv_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/battle_ui/overlay_exp_label_ru.png b/public/images/ui/text_images/ru/battle_ui/overlay_exp_label_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..8342acb74fbd61926096e54d2396a61a13f97a0f GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p!VDxo^Ia$eQv3lvA+G=b|5sF0WZ3nYp>h_G z@#9GALZB2=NswPK14G&5vlc*}nx~6nNJU(7K_e5Jx~izEDv)4P7Zp`i7FV6XG2_z4&Gl8AnNk$XT&$J50zq#`ak!OVd2OwYOrw0kp)RPZ;mWjl9O^|K~B<} kGYgiaEID%Ez!DV(hUiw7cIP1ea-dEIPgg&ebxsLQ03%Q>s{jB1 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.json b/public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.json new file mode 100644 index 00000000000..61618578d25 --- /dev/null +++ b/public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_ru.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 8 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 8 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 8 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 8 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 8 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 8 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 8 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 8 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 8 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 8 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 8 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 8 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 8 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 8 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 8 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 8 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 8 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.png b/public/images/ui/text_images/ru/battle_ui/pbinfo_stat_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..9688d78d42532a1c340b48270f69b190addcacb6 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!7!VDyJ3>%AqlxToYh%1m*R8(v#ZTtWKKb$em zYVIna1WQSfUoenn*gQFH7LdB)>Eakt5jS<>>(0Xl0xi5N9gc{q@E)1QJz?j?5QUI~ zZ@$GJTFCCF_dm~pd$;@d_N`?F#Uaa z?bOG!_ii1FKeFGd;Qxzlzm?C_aVNTR6xP4%{~%Uu8$`0V!=y7srr_xa0&gGd3kQwqWsaVPRorHsN&fWbt%^Tp^(( i24VJd2OwYOrw0kp)RPZ;mWjl9O^|K~B<} kGYgiaEID%Ez!DV(hUiw7cIP1ea-dEIPgg&ebxsLQ03%Q>s{jB1 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/battle_ui/overlay_exp_label_tl.png b/public/images/ui/text_images/tl/battle_ui/overlay_exp_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png b/public/images/ui/text_images/tl/battle_ui/overlay_hp_label_boss_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/battle_ui/overlay_hp_label_tl.png b/public/images/ui/text_images/tl/battle_ui/overlay_hp_label_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/battle_ui/overlay_lv_tl.png b/public/images/ui/text_images/tl/battle_ui/overlay_lv_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.json b/public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.json new file mode 100644 index 00000000000..d2277c79f24 --- /dev/null +++ b/public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_tl.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.png b/public/images/ui/text_images/tl/battle_ui/pbinfo_stat_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/party_ui/party_slot_overlay_hp_tl.png b/public/images/ui/text_images/tl/party_ui/party_slot_overlay_hp_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tl/party_ui/party_slot_overlay_lv_tl.png b/public/images/ui/text_images/tl/party_ui/party_slot_overlay_lv_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/battle_ui/overlay_exp_label_tr.png b/public/images/ui/text_images/tr/battle_ui/overlay_exp_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..0920a95fba26347b0a38107833f4efcf8e4e6f06 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj=ZOfV@O3@G6ySD+nUJJVMZ>lv9nJph_a@1HXV7uz;NUR W$GmU-FOL9~GI+ZBxvX*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/battle_ui/overlay_hp_label_tr.png b/public/images/ui/text_images/tr/battle_ui/overlay_hp_label_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..e28aceaf0fa69a3d89f609941474a722c76c5fb3 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj<3?vofZfOE3{s5m4*Z=?jD}n*vCVk8Q)!M6h zwSiJhB|(0{3=CzH&sqR^`kpS1Ar*1S0zpAcN^ESY;^Ly>>8xy`;;N$R;;ahyC4ID4 lIvjPZQDxgu#mdIU@WO@t_kueG=Yd)oJYD@<);T3K0RYu;BP;*_ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/battle_ui/overlay_lv_tr.png b/public/images/ui/text_images/tr/battle_ui/overlay_lv_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..5140444ec158a0bedc28aa6b11d4f6f835515004 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+G+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/party_ui/party_slot_overlay_hp_tr.png b/public/images/ui/text_images/tr/party_ui/party_slot_overlay_hp_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0017bcb582c6c4ccc1d87a9493bb4d53076d8e GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML%3?yGMarOWyp#Yx{S0HU*U|?uy_~XZqf`S4d zySQM{aiAzuNswPK14G&5vlc*}zNd?0NJU(-057j-P*73=hoKptnOR^0hZ!fYnNe5* o2XEttMwbnO0dhmdKI;Vst09^bfYXATM literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/tr/party_ui/party_slot_overlay_lv_tr.png b/public/images/ui/text_images/tr/party_ui/party_slot_overlay_lv_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..12782430b9e2f39a3010f74cc17dde19d661ed9d GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^*Z=?jD<~)c$)?ga4#TT= zf#QrML4Lsu4$p3+0XYhuE{-7;amfh@2^^&fD~b|4cvDx*J1OvOx}tTjqKOED)lb$p UN4@5K0;*;3boFyt=akR{07v;IsQ>@~ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png b/public/images/ui/text_images/zh-CN/battle_ui/overlay_exp_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png b/public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_boss_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png b/public/images/ui/text_images/zh-CN/battle_ui/overlay_hp_label_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png b/public/images/ui/text_images/zh-CN/battle_ui/overlay_lv_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json b/public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json new file mode 100644 index 00000000000..22a1da0b536 --- /dev/null +++ b/public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_zh-CN.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png b/public/images/ui/text_images/zh-CN/battle_ui/pbinfo_stat_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_hp_zh-CN.png b/public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_hp_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png b/public/images/ui/text_images/zh-CN/party_ui/party_slot_overlay_lv_zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png b/public/images/ui/text_images/zh-TW/battle_ui/overlay_exp_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..fde37213effdba1b333d1473a6b50afb1c49ad79 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p#0(^B{8TRjDV_kI5ZC|z|0^mgGVJ=yP&rF* z^3@QaIAckWUoeBivm0qZj)JF)V@O3@G6yd&Z{mqrUvpHQ%WiC$s&Fl2LIeY|3 XMVwo=-0qVDs%7wW^>bP0l+XkKy&fbu literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png b/public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_boss_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcec679e05ec0550ddedd3d24c8bff2c7c78b12 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMC#0(@0dH0+HQak}ZA+G=b|Nk7LrKqU5+fcU3 zMt(g|oUtUxFPOpM*^M+H$IR2kF{C0cxq)%5>*|J%#>A}BAJ<-7U~9`X4qm?YOjg2- usF}OATFIP=7u~vrQN@0%(H_QSatxDH#8WrgwnqR>VDNPHb6Mw<&;$S(1TUBX literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png b/public/images/ui/text_images/zh-TW/battle_ui/overlay_hp_label_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3476138190b4674143ff0cff9c670388ee965 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mj>3?$dd>30Gto&cW^*Z=?jD=I2l{;%fSq%YjO zE&wRbSQ6wH%;50sMjDW#=;`7ZQW2Ldz{!)Ea3W^gtwzP{n>rGVPneD_Gh#@Um0&pR W$aOaPsFgHOF@vY8pUXO@geCx;=_1Mi literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png b/public/images/ui/text_images/zh-TW/battle_ui/overlay_lv_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad4312d561bd3e159ba3d76a939101c2ad54002 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@#0(@o%%7YEQak}ZA+A7LQBm>#|Nl*;Z96{w z&j<1uOM?7@862M7NCR?YJzX3_D&mqk5)(Xth&R#0JJI9+sR@>o6-`7K^meei?ATfH Q6sVBF)78&qol`;+07EY#-2eap literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json b/public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json new file mode 100644 index 00000000000..26c01d8bcc2 --- /dev/null +++ b/public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.json @@ -0,0 +1,209 @@ +{ + "textures": [ + { + "image": "pbinfo_stat_zh-TW.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 7 + }, + "scale": 1, + "frames": [ + { + "filename": "SPATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 0, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "SPDEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 19, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 19, + "h": 7 + }, + "frame": { + "x": 19, + "y": 0, + "w": 19, + "h": 7 + } + }, + { + "filename": "CRIT", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 17, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 17, + "h": 7 + }, + "frame": { + "x": 38, + "y": 0, + "w": 17, + "h": 7 + } + }, + { + "filename": "ACC", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 55, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "ATK", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 68, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "DEF", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 81, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "EVA", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 94, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "SPD", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 13, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 13, + "h": 7 + }, + "frame": { + "x": 107, + "y": 0, + "w": 13, + "h": 7 + } + }, + { + "filename": "HP", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 9, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 9, + "h": 7 + }, + "frame": { + "x": 120, + "y": 0, + "w": 9, + "h": 7 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:86fbd1b45d46271597a7d9de482aaa74:df702dd9d88db50369f1a096f82fd915:05882267d3999884e0491134e98b1b53$" + } +} diff --git a/public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png b/public/images/ui/text_images/zh-TW/battle_ui/pbinfo_stat_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..9656c5f04b96333ab6e6c721419dccf1d16d415c GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^jX=!K#0(^Z)Q_+(JhFpgn1YDN~`X@;4>FUkXP4V3Ngl%Kt948a^ zlbS9;Z)EQz-Och4Eow@==~R%@)GEKMg8BbP$M;)O*8X31Me4zh`9imR&G%fIl9Zo& zIp{90;#~LH#&@?ha2>uYp0kQ;Z~FU_F=wW8*cx9HlM-!y-@Py_tK{9=d24q{Ep*s; z{!W+ks)u?WVa^3&{ literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_hp_zh-TW.png b/public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_hp_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..9be90b5c6bb6247d67c12aea99e7edaa4679e131 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp@K+ML(3?x&X{^$THo&cW^S0HU@X!zsDkAi}NMLq{C zfPBW1AirP+hi5m^fE-0n7srr_xMTrNp45aBG23o6DrVo*QD97A+!-v{AjHSR(3QmT UxHrOS4^T0Kr>mdKI;Vst083IKvH$=8 literal 0 HcmV?d00001 diff --git a/public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png b/public/images/ui/text_images/zh-TW/party_ui/party_slot_overlay_lv_zh-TW.png new file mode 100644 index 0000000000000000000000000000000000000000..122d3f7151cdeab41b5c0c4d8ebb20efa9bb7ccf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^o&cW^S0F7QATVpvtk0i6zt(j* z2IMoA1o;IsI6S+N2IRPiAtGI+ZBxvX literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index e1b658f578a..232c2abca29 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -60,9 +60,7 @@ export class LoadingScene extends SceneBase { this.loadAtlas("pbinfo_enemy_type", "ui"); this.loadAtlas("pbinfo_enemy_type1", "ui"); this.loadAtlas("pbinfo_enemy_type2", "ui"); - this.loadAtlas("pbinfo_stat", "ui"); this.loadAtlas("pbinfo_stat_numbers", "ui"); - this.loadImage("overlay_lv", "ui"); this.loadAtlas("numbers", "ui"); this.loadAtlas("numbers_red", "ui"); this.loadAtlas("overlay_hp", "ui"); @@ -125,7 +123,6 @@ export class LoadingScene extends SceneBase { this.loadAtlas("party_slot_main", "ui"); this.loadAtlas("party_slot_main_short", "ui"); this.loadAtlas("party_slot", "ui"); - this.loadImage("party_slot_overlay_lv", "ui"); this.loadImage("party_slot_hp_bar", "ui"); this.loadAtlas("party_slot_hp_overlay", "ui"); this.loadAtlas("party_pb", "ui"); @@ -309,6 +306,34 @@ export class LoadingScene extends SceneBase { `text_images/${lang}/summary/summary_moves_effect_title${keySuffix}.png`, ); // Pixel text 'EFFECT' + this.loadAtlas(`pbinfo_stat${keySuffix}`, "ui", `text_images/${lang}/battle_ui/pbinfo_stat${keySuffix}`); // Pixel text for in-battle stats info tab + this.loadImage(`overlay_lv${keySuffix}`, "ui", `text_images/${lang}/battle_ui/overlay_lv${keySuffix}.png`); // Pixel text in-battle 'Lv.' + this.loadImage( + `overlay_hp_label${keySuffix}`, + "ui", + `text_images/${lang}/battle_ui/overlay_hp_label${keySuffix}.png`, + ); // Pixel text in-battle 'HP' + this.loadImage( + `overlay_hp_label_boss${keySuffix}`, + "ui", + `text_images/${lang}/battle_ui/overlay_hp_label_boss${keySuffix}.png`, + ); // Pixel text in-battle 'BOSS' + this.loadImage( + `overlay_exp_label${keySuffix}`, + "ui", + `text_images/${lang}/battle_ui/overlay_exp_label${keySuffix}.png`, + ); // Pixel text in-battle 'EXP' + this.loadImage( + `party_slot_overlay_lv${keySuffix}`, + "ui", + `text_images/${lang}/party_ui/party_slot_overlay_lv${keySuffix}.png`, + ); // Pixel text party 'Lv.' + this.loadImage( + `party_slot_overlay_hp${keySuffix}`, + "ui", + `text_images/${lang}/party_ui/party_slot_overlay_hp${keySuffix}.png`, + ); // Pixel text party 'HP' + if (timedEventManager.activeEventHasBanner()) { const availableLangs = timedEventManager.getEventBannerLangs(); if (lang && availableLangs.includes(lang)) { diff --git a/src/ui/battle-info/battle-info.ts b/src/ui/battle-info/battle-info.ts index 4d2cf597ed2..2a502148bc5 100644 --- a/src/ui/battle-info/battle-info.ts +++ b/src/ui/battle-info/battle-info.ts @@ -72,6 +72,7 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { protected splicedIcon: Phaser.GameObjects.Sprite; protected statusIndicator: Phaser.GameObjects.Sprite; protected levelContainer: Phaser.GameObjects.Container; + protected hpLabel: Phaser.GameObjects.Image; protected hpBar: Phaser.GameObjects.Image; protected levelNumbersContainer: Phaser.GameObjects.Container; protected type1Icon: Phaser.GameObjects.Sprite; @@ -178,7 +179,7 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { } const statLabel = globalScene.add - .sprite(statX, statY, "pbinfo_stat", Stat[s]) + .sprite(statX, statY, getLocalizedSpriteKey("pbinfo_stat"), Stat[s]) .setName("icon_stat_label_" + i.toString()) .setOrigin(0); statLabels.push(statLabel); @@ -259,12 +260,17 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container { .setName("container_level"); this.add(this.levelContainer); - const levelOverlay = globalScene.add.image(0, 0, "overlay_lv"); + const levelOverlay = globalScene.add.image(5.5, 0, getLocalizedSpriteKey("overlay_lv")).setOrigin(1, 0.5); this.levelContainer.add(levelOverlay); this.hpBar = globalScene.add.image(posParams.hpBarX, posParams.hpBarY, "overlay_hp").setName("hp_bar").setOrigin(0); this.add(this.hpBar); + this.hpLabel = globalScene.add + .image(posParams.hpBarX - 1, posParams.hpBarY - 3, getLocalizedSpriteKey("overlay_hp_label")) + .setOrigin(1, 0); + this.add(this.hpLabel); + this.levelNumbersContainer = globalScene.add .container(9.5, globalScene.uiTheme === UiTheme.LEGACY ? 0 : -0.5) .setName("container_level"); diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 0feb314a2e7..a48948e9617 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -8,6 +8,7 @@ import type { BattleInfoParamList } from "#ui/battle-info"; import { BattleInfo } from "#ui/battle-info"; import { addTextObject } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; +import { getLocalizedSpriteKey } from "#utils/common"; import i18next from "i18next"; import type { GameObjects } from "phaser"; @@ -189,6 +190,9 @@ export class EnemyBattleInfo extends BattleInfo { this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); + this.hpLabel.x += 38 * (boss ? -1 : 1); + this.hpLabel.y += 1 * (this.boss ? -1 : 1); + this.hpLabel.setTexture(getLocalizedSpriteKey(`overlay_hp_label${boss ? "_boss" : ""}`)); this.levelContainer.x += 2 * (boss ? -1 : 1); this.box.setTexture(this.getTextureName()); this.statsBox.setTexture(`${this.getTextureName()}_stats`); diff --git a/src/ui/battle-info/player-battle-info.ts b/src/ui/battle-info/player-battle-info.ts index f0b50748154..5a23eab2071 100644 --- a/src/ui/battle-info/player-battle-info.ts +++ b/src/ui/battle-info/player-battle-info.ts @@ -5,10 +5,12 @@ import { Stat } from "#enums/stat"; import type { PlayerPokemon } from "#field/pokemon"; import type { BattleInfoParamList } from "#ui/battle-info"; import { BattleInfo } from "#ui/battle-info"; +import { getLocalizedSpriteKey } from "#utils/common"; export class PlayerBattleInfo extends BattleInfo { protected player: true = true; protected hpNumbersContainer: Phaser.GameObjects.Container; + protected expBarLabel: Phaser.GameObjects.Image; override get statOrder(): Stat[] { return [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD]; @@ -46,6 +48,12 @@ export class PlayerBattleInfo extends BattleInfo { // hp number container must be beneath the stat container for overlay to display properly this.addAt(this.hpNumbersContainer, this.getIndex(this.statsContainer)); + const expBarLabel = globalScene.add + .image(-91, 20, getLocalizedSpriteKey("overlay_exp_label")) + .setName("overlay_exp_label") + .setOrigin(1, 1); + this.add(expBarLabel); + const expBar = globalScene.add.image(-98, 18, "overlay_exp").setName("overlay_exp").setOrigin(0); this.add(expBar); @@ -60,6 +68,7 @@ export class PlayerBattleInfo extends BattleInfo { expBar.setMask(expMask); + this.expBarLabel = expBarLabel; this.expBar = expBar; this.expMaskRect = expMaskRect; } @@ -108,7 +117,7 @@ export class PlayerBattleInfo extends BattleInfo { this.statValuesContainer.x += 2 * (mini ? 1 : -1); this.statValuesContainer.y += -7 * (mini ? 1 : -1); - const toggledElements = [this.hpNumbersContainer, this.expBar]; + const toggledElements = [this.hpNumbersContainer, this.expBarLabel, this.expBar]; toggledElements.forEach(el => el.setVisible(!mini)); } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index b77710d8140..9fc777809bf 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -631,6 +631,7 @@ export class PartyUiHandler extends MessageUiHandler { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text ableToTransferText = ""; } + partySlot.slotHpLabel.setVisible(false); partySlot.slotHpBar.setVisible(false); partySlot.slotHpOverlay.setVisible(false); partySlot.slotHpText.setVisible(false); @@ -1738,6 +1739,7 @@ export class PartyUiHandler extends MessageUiHandler { this.partySlots[this.transferCursor].setTransfer(false); for (let i = 0; i < this.partySlots.length; i++) { this.partySlots[i].slotDescriptionLabel.setVisible(false); + this.partySlots[i].slotHpLabel.setVisible(true); this.partySlots[i].slotHpBar.setVisible(true); this.partySlots[i].slotHpOverlay.setVisible(true); this.partySlots[i].slotHpText.setVisible(true); @@ -1890,6 +1892,7 @@ class PartySlot extends Phaser.GameObjects.Container { private slotBg: Phaser.GameObjects.Image; private slotPb: Phaser.GameObjects.Sprite; public slotName: Phaser.GameObjects.Text; + public slotHpLabel: Phaser.GameObjects.Image; public slotHpBar: Phaser.GameObjects.Image; public slotHpOverlay: Phaser.GameObjects.Sprite; public slotHpText: Phaser.GameObjects.Text; @@ -2042,7 +2045,7 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotName.setOrigin(0); const slotLevelLabel = globalScene.add - .image(0, 0, "party_slot_overlay_lv") + .image(0, 0, getLocalizedSpriteKey("party_slot_overlay_lv")) .setPositionRelative(this.slotBg, levelLabelPosition.x, levelLabelPosition.y) .setOrigin(0); @@ -2104,6 +2107,12 @@ class PartySlot extends Phaser.GameObjects.Container { } } + this.slotHpLabel = globalScene.add + .image(0, 0, getLocalizedSpriteKey("party_slot_overlay_hp")) + .setOrigin(1, 0) + .setVisible(false) + .setPositionRelative(this.slotBg, hpBarPosition.x + 15, hpBarPosition.y); + this.slotHpBar = globalScene.add .image(0, 0, "party_slot_hp_bar") .setOrigin(0) @@ -2133,14 +2142,22 @@ class PartySlot extends Phaser.GameObjects.Container { .setVisible(false) .setPositionRelative(this.slotBg, descriptionLabelPosition.x, descriptionLabelPosition.y); - slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]); + slotInfoContainer.add([ + this.slotHpLabel, + this.slotHpBar, + this.slotHpOverlay, + this.slotHpText, + this.slotDescriptionLabel, + ]); if (partyUiMode !== PartyUiMode.TM_MODIFIER) { this.slotDescriptionLabel.setVisible(false); + this.slotHpLabel.setVisible(true); this.slotHpBar.setVisible(true); this.slotHpOverlay.setVisible(true); this.slotHpText.setVisible(true); } else { + this.slotHpLabel.setVisible(false); this.slotHpBar.setVisible(false); this.slotHpOverlay.setVisible(false); this.slotHpText.setVisible(false); From 7001f78beb154767e07d09ef960139a4249ca806 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 6 Sep 2025 02:45:28 -0700 Subject: [PATCH 098/134] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 2686cd3edc0..090bfefaf7e 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 2686cd3edc0bd2c7a7f12cc54c00c109e51a48d7 +Subproject commit 090bfefaf7e9d4efcbca61fa78a9cdf5d701830b From d18f77bea95c7c1d70f91d0367021e30152544bf Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:25:09 -0400 Subject: [PATCH 099/134] [Misc] [Docs] Update README.md svg to actually go to discord (#6501) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf70b5d9335..d381b8f47f5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ PokéRogue -![Discord Static Badge](https://img.shields.io/badge/Community_Discord-blurple?style=flat&logo=discord&logoSize=auto&labelColor=white&color=5865F2&link=https://discord.gg/pokerogue) +[![Discord Static Badge](https://img.shields.io/badge/Community_Discord-blurple?style=flat&logo=discord&logoSize=auto&labelColor=white&color=5865F2)](https://discord.gg/pokerogue) [![Docs Coverage Static Badge](https://pagefaultgames.github.io/pokerogue/beta/coverage.svg)](https://pagefaultgames.github.io/pokerogue/beta) [![Testing Badge](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml/badge.svg)](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml) [![License: GNU AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) From 21aa40e46a4995cf80e9185bcef70716b300b426 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:39:09 -0400 Subject: [PATCH 100/134] [GitHub] [Docs] Update github-pages.yml to add the files into the right subdirectory (#6500) --- .github/workflows/github-pages.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index b7b1aad5ae7..4148b4e9db0 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -77,9 +77,7 @@ jobs: cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]" - mkdir -p $GITHUB_REF_NAME - rm -rf $GITHUB_REF_NAME/* - cp -r /tmp/docs $GITHUB_REF_NAME + mv -f /tmp/docs $GITHUB_REF_NAME git add $GITHUB_REF_NAME git commit -m "[skip ci] Deploy docs" git push From 550f3b896e867646faa4bb2eac3371a2c6f2938f Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 6 Sep 2025 10:58:03 -0500 Subject: [PATCH 101/134] [GitHub] [Docs] Copy entirety of docs folder --- .github/workflows/github-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 4148b4e9db0..57140f3c4fb 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -77,7 +77,7 @@ jobs: cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]" - mv -f /tmp/docs $GITHUB_REF_NAME + mv -f /tmp/docs/* $GITHUB_REF_NAME git add $GITHUB_REF_NAME git commit -m "[skip ci] Deploy docs" git push From f29bfa31cda2a111904580c18c1189c25c37b346 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:16:31 -0500 Subject: [PATCH 102/134] [GitHub] [Docs] Use `rsync` in workflow run --- .github/workflows/github-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 57140f3c4fb..6e056bc4032 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -77,7 +77,7 @@ jobs: cd pokerogue_gh git config user.email "github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]" - mv -f /tmp/docs/* $GITHUB_REF_NAME + rsync -rd --delete /tmp/docs/ $GITHUB_REF_NAME git add $GITHUB_REF_NAME git commit -m "[skip ci] Deploy docs" git push From b5124ae3ce8297a49fab42f4318fb1c3c9c77970 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 6 Sep 2025 18:43:26 -0400 Subject: [PATCH 103/134] [Misc/Docs] Fix Typedoc workflow to not break the "go to main" link (#6502) * Fixed missing `img src=` --- typedoc-plugins/typedoc-plugin-rename-svg.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/typedoc-plugins/typedoc-plugin-rename-svg.js b/typedoc-plugins/typedoc-plugin-rename-svg.js index 5fda4ee3c6d..307206d6006 100644 --- a/typedoc-plugins/typedoc-plugin-rename-svg.js +++ b/typedoc-plugins/typedoc-plugin-rename-svg.js @@ -19,15 +19,10 @@ export function load(app) { app.renderer.on(Renderer.EVENT_END_PAGE, page => { if (page.pageKind === PageKind.Index && page.contents) { page.contents = page.contents - // Replace links to the beta documentation site with the current ref name + // Replace the SVG to the beta documentation site with the current ref name .replace( - /href="(.*pagefaultgames.github.io\/pokerogue\/).*?"/, // formatting - `href="$1/${process.env.REF_NAME}"`, - ) - // Replace the link to Beta's coverage SVG with the SVG file for the branch in question. - .replace( - /img src=".*?coverage.svg/, // formatting - `img src="coverage.svg"`, + /^ Date: Sun, 7 Sep 2025 08:16:43 +0900 Subject: [PATCH 104/134] [UI] Add cyclic navigation in settings menu for LEFT/RIGHT buttons (#6404) * feat: add cyclic navigation to settings menu * review > refactor: use Phaser.Math.Wrap instead the ternary operator --- .../abstract-control-settings-ui-handler.ts | 18 +++++++++++++---- .../settings/abstract-settings-ui-handler.ts | 20 +++++++++++-------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index c08f1570b75..17812785d1e 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -544,8 +544,13 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { } if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { success = false; - } else if (this.optionCursors[cursor]) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); + } else { + // Cycle to the rightmost position when at the leftmost, otherwise move left + success = this.setOptionCursor( + cursor, + Phaser.Math.Wrap(this.optionCursors[cursor] - 1, 0, this.optionValueLabels[cursor].length), + true, + ); } break; case Button.RIGHT: // Move selection right within the current option set. @@ -554,8 +559,13 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { } if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { success = false; - } else if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); + } else { + // Cycle to the leftmost position when at the rightmost, otherwise move right + success = this.setOptionCursor( + cursor, + Phaser.Math.Wrap(this.optionCursors[cursor] + 1, 0, this.optionValueLabels[cursor].length), + true, + ); } break; case Button.CYCLE_FORM: diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index ae1bb40dbeb..85e93bd8e2e 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -318,16 +318,20 @@ export class AbstractSettingsUiHandler extends MessageUiHandler { } break; case Button.LEFT: - if (this.optionCursors[cursor]) { - // Moves the option cursor left, if possible. - success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); - } + // Cycle to the rightmost position when at the leftmost, otherwise move left + success = this.setOptionCursor( + cursor, + Phaser.Math.Wrap(this.optionCursors[cursor] - 1, 0, this.optionValueLabels[cursor].length), + true, + ); break; case Button.RIGHT: - // Moves the option cursor right, if possible. - if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); - } + // Cycle to the leftmost position when at the rightmost, otherwise move right + success = this.setOptionCursor( + cursor, + Phaser.Math.Wrap(this.optionCursors[cursor] + 1, 0, this.optionValueLabels[cursor].length), + true, + ); break; case Button.CYCLE_FORM: case Button.CYCLE_SHINY: From 9815c5eebffca0e0c6016782d581c130cae47102 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:18:47 -0400 Subject: [PATCH 105/134] [Test] Revamped `MockConsoleLog` with color support (#6218) * Added mock console and fixed up many many things * Cleaned up handling of colors and such * Added minor comment * Fix Focus Punch test * Fix typo * Remove redundant comment * Update vitest.setup.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Added color map inside new folder * Made constants not object bc i was told to * Update src/constants/colors.ts * Removed all moves init check * Removed import * Fixed up some stuff + added aquamarine color to settings helper * Added logging for test end * Removed intentionally failing test * Fixed console log to use inheritance to not override vitest's wrapping * Added a custom Vitest reporter to not log the test name every 2 lines * Moved coloration to a hook to prevent misplacing things * Fixed import issue by copypasting vitest soure * Removed intentionally failing test look i need to check that `test:silent` works on github ok * Added REUSE annotations to copied parts of source * Fixed import issue --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- package.json | 1 + pnpm-lock.yaml | 3 + public/locales | 2 +- src/constants/colors.ts | 23 ++ src/phase-manager.ts | 2 +- src/phases/move-phase.ts | 6 +- test/abilities/cud-chew.test.ts | 2 +- test/moves/focus-punch.test.ts | 6 +- test/test-utils/game-wrapper.ts | 19 +- test/test-utils/helpers/overrides-helper.ts | 5 +- test/test-utils/helpers/settings-helper.ts | 4 +- test/test-utils/mocks/mock-console-log.ts | 80 ------- .../mocks/mock-console/color-map.json | 150 +++++++++++++ .../mocks/mock-console/infer-color.ts | 61 +++++ .../mocks/mock-console/mock-console.ts | 211 ++++++++++++++++++ .../mocks/mocks-container/mock-text.ts | 22 +- .../reporters/custom-default-reporter.ts | 62 +++++ test/test-utils/setup/test-end-log.ts | 113 ++++++++++ test/test-utils/test-file-initialization.ts | 25 ++- test/test-utils/text-interceptor.ts | 60 ++--- test/vitest.setup.ts | 36 ++- typedoc.config.js | 8 +- vitest.config.ts | 13 +- 23 files changed, 747 insertions(+), 167 deletions(-) create mode 100644 src/constants/colors.ts delete mode 100644 test/test-utils/mocks/mock-console-log.ts create mode 100644 test/test-utils/mocks/mock-console/color-map.json create mode 100644 test/test-utils/mocks/mock-console/infer-color.ts create mode 100644 test/test-utils/mocks/mock-console/mock-console.ts create mode 100644 test/test-utils/reporters/custom-default-reporter.ts create mode 100644 test/test-utils/setup/test-end-log.ts diff --git a/package.json b/package.json index 0620cf6a88c..f6097b8ccb9 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@types/node": "^22.16.5", "@vitest/coverage-istanbul": "^3.2.4", "@vitest/expect": "^3.2.4", + "@vitest/utils": "^3.2.4", "chalk": "^5.4.1", "dependency-cruiser": "^16.10.4", "inquirer": "^12.8.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 089689818ac..be3e683f71c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,9 @@ importers: '@vitest/expect': specifier: ^3.2.4 version: 3.2.4 + '@vitest/utils': + specifier: ^3.2.4 + version: 3.2.4 chalk: specifier: ^5.4.1 version: 5.4.1 diff --git a/public/locales b/public/locales index 2686cd3edc0..102cbdcd924 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 2686cd3edc0bd2c7a7f12cc54c00c109e51a48d7 +Subproject commit 102cbdcd924e2a7cdc7eab64d1ce79f6ec7604ff diff --git a/src/constants/colors.ts b/src/constants/colors.ts new file mode 100644 index 00000000000..e4d740addff --- /dev/null +++ b/src/constants/colors.ts @@ -0,0 +1,23 @@ +/** + * @module + * A big file storing colors used in logging. + * Minified by Terser during production builds, so has no overhead. + */ + +// Colors used in prod +export const PHASE_START_COLOR = "green" as const; +export const MOVE_COLOR = "RebeccaPurple" as const; + +// Colors used for testing code +export const NEW_TURN_COLOR = "#ffad00ff" as const; +export const UI_MSG_COLOR = "#009dffff" as const; +export const OVERRIDES_COLOR = "#b0b01eff" as const; +export const SETTINGS_COLOR = "#008844ff" as const; + +// Colors used for Vitest-related test utils +export const TEST_NAME_COLOR = "#008886ff" as const; +export const VITEST_PINK_COLOR = "#c162de" as const; + +// Mock console log stuff +export const TRACE_COLOR = "#b700ff" as const; +export const DEBUG_COLOR = "#874600ff" as const; diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 281ac8bd671..68b7d74293b 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -392,7 +392,7 @@ export class PhaseManager { * Helper method to start and log the current phase. */ private startCurrentPhase(): void { - console.log(`%cStart Phase ${this.currentPhase.phaseName}`, "color:green;"); + console.log(`%cStart Phase ${this.currentPhase.phaseName}`, "color:${PHASE_START_COLOR};"); this.currentPhase.start(); } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 9a8e509e302..6587597a0d9 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -1,4 +1,5 @@ import { applyAbAttrs } from "#abilities/apply-ab-attrs"; +import { MOVE_COLOR } from "#app/constants/colors"; import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; @@ -118,7 +119,10 @@ export class MovePhase extends BattlePhase { public start(): void { super.start(); - console.log(MoveId[this.move.moveId], enumValueToKey(MoveUseMode, this.useMode)); + console.log( + `%cMove: ${MoveId[this.move.moveId]}\nUse Mode: ${enumValueToKey(MoveUseMode, this.useMode)}`, + `color:${MOVE_COLOR}`, + ); // Check if move is unusable (e.g. running out of PP due to a mid-turn Spite // or the user no longer being on field), ending the phase early if not. diff --git a/test/abilities/cud-chew.test.ts b/test/abilities/cud-chew.test.ts index f68141096eb..ae3b4ad8765 100644 --- a/test/abilities/cud-chew.test.ts +++ b/test/abilities/cud-chew.test.ts @@ -99,7 +99,7 @@ describe("Abilities - Cud Chew", () => { expect(abDisplaySpy.mock.calls[1][2]).toBe(false); // should display messgae - expect(game.textInterceptor.getLatestMessage()).toBe( + expect(game.textInterceptor.logs).toContain( i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(farigiraf), }), diff --git a/test/moves/focus-punch.test.ts b/test/moves/focus-punch.test.ts index 9a76dbec0db..d7b40569aaa 100644 --- a/test/moves/focus-punch.test.ts +++ b/test/moves/focus-punch.test.ts @@ -9,7 +9,7 @@ import { TurnStartPhase } from "#phases/turn-start-phase"; import { GameManager } from "#test/test-utils/game-manager"; import i18next from "i18next"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Focus Punch", () => { let phaserGame: Phaser.Game; @@ -125,8 +125,8 @@ describe("Moves - Focus Punch", () => { game.move.select(MoveId.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", { pokemonName: "Charizard" })); + expect(game.textInterceptor.logs).toContain(i18next.t("moveTriggers:lostFocus", { pokemonName: "Charizard" })); + expect(game.textInterceptor.logs).not.toContain(i18next.t("battle:attackFailed")); }); }); diff --git a/test/test-utils/game-wrapper.ts b/test/test-utils/game-wrapper.ts index 1a906bf8492..d18ea9301ea 100644 --- a/test/test-utils/game-wrapper.ts +++ b/test/test-utils/game-wrapper.ts @@ -6,17 +6,13 @@ import * as bypassLoginModule from "#app/global-vars/bypass-login"; import { MoveAnim } from "#data/battle-anims"; import { Pokemon } from "#field/pokemon"; import { version } from "#package.json"; -import { blobToString } from "#test/test-utils/game-manager-utils"; import { MockClock } from "#test/test-utils/mocks/mock-clock"; -import { MockFetch } from "#test/test-utils/mocks/mock-fetch"; import { MockGameObjectCreator } from "#test/test-utils/mocks/mock-game-object-creator"; import { MockLoader } from "#test/test-utils/mocks/mock-loader"; import { MockTextureManager } from "#test/test-utils/mocks/mock-texture-manager"; import { MockTimedEventManager } from "#test/test-utils/mocks/mock-timed-event-manager"; import { MockContainer } from "#test/test-utils/mocks/mocks-container/mock-container"; import { PokedexMonContainer } from "#ui/pokedex-mon-container"; -import { sessionIdKey } from "#utils/common"; -import { setCookie } from "#utils/cookies"; import fs from "node:fs"; import Phaser from "phaser"; import { vi } from "vitest"; @@ -28,20 +24,6 @@ const GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; const EventEmitter = Phaser.Events.EventEmitter; const UpdateList = Phaser.GameObjects.UpdateList; -window.URL.createObjectURL = (blob: Blob) => { - blobToString(blob).then((data: string) => { - localStorage.setItem("toExport", data); - }); - return null; -}; -navigator.getGamepads = () => []; -global.fetch = vi.fn(MockFetch); -setCookie(sessionIdKey, "fake_token"); - -window.matchMedia = () => ({ - matches: false, -}); - export class GameWrapper { public game: Phaser.Game; public scene: BattleScene; @@ -99,6 +81,7 @@ export class GameWrapper { removeAll: () => null, }; + // TODO: Can't we just turn on `noAudio` in audio config? this.scene.sound = { play: () => null, pause: () => null, diff --git a/test/test-utils/helpers/overrides-helper.ts b/test/test-utils/helpers/overrides-helper.ts index 93b89688935..07ea1ea3d09 100644 --- a/test/test-utils/helpers/overrides-helper.ts +++ b/test/test-utils/helpers/overrides-helper.ts @@ -1,7 +1,9 @@ /** biome-ignore-start lint/correctness/noUnusedImports: tsdoc imports */ import type { NewArenaEvent } from "#events/battle-scene"; + /** biome-ignore-end lint/correctness/noUnusedImports: tsdoc imports */ +import { OVERRIDES_COLOR } from "#app/constants/colors"; import type { BattleStyle, RandomTrainerOverride } from "#app/overrides"; import Overrides from "#app/overrides"; import { AbilityId } from "#enums/ability-id"; @@ -19,6 +21,7 @@ import type { ModifierOverride } from "#modifiers/modifier-type"; import type { Variant } from "#sprites/variant"; import { GameManagerHelper } from "#test/test-utils/helpers/game-manager-helper"; import { coerceArray, shiftCharCodes } from "#utils/common"; +import chalk from "chalk"; import { vi } from "vitest"; /** @@ -665,6 +668,6 @@ export class OverridesHelper extends GameManagerHelper { } private log(...params: any[]) { - console.log("Overrides:", ...params); + console.log(chalk.hex(OVERRIDES_COLOR)(...params)); } } diff --git a/test/test-utils/helpers/settings-helper.ts b/test/test-utils/helpers/settings-helper.ts index a26aa2de33c..46ac74b83dc 100644 --- a/test/test-utils/helpers/settings-helper.ts +++ b/test/test-utils/helpers/settings-helper.ts @@ -1,7 +1,9 @@ +import { SETTINGS_COLOR } from "#app/constants/colors"; import { BattleStyle } from "#enums/battle-style"; import { ExpGainsSpeed } from "#enums/exp-gains-speed"; import { PlayerGender } from "#enums/player-gender"; import { GameManagerHelper } from "#test/test-utils/helpers/game-manager-helper"; +import chalk from "chalk"; /** * Helper to handle settings for tests @@ -49,6 +51,6 @@ export class SettingsHelper extends GameManagerHelper { } private log(...params: any[]) { - console.log("Settings:", ...params); + console.log(chalk.hex(SETTINGS_COLOR)(...params)); } } diff --git a/test/test-utils/mocks/mock-console-log.ts b/test/test-utils/mocks/mock-console-log.ts deleted file mode 100644 index f54d41fea3e..00000000000 --- a/test/test-utils/mocks/mock-console-log.ts +++ /dev/null @@ -1,80 +0,0 @@ -const originalLog = console.log; -const originalError = console.error; -const originalDebug = console.debug; -const originalWarn = console.warn; - -const blacklist = ["Phaser", "variant icon does not exist", 'Texture "%s" not found']; -const whitelist = ["Phase"]; - -export class MockConsoleLog { - constructor( - private logDisabled = false, - private phaseText = false, - ) {} - private logs: any[] = []; - private notified: any[] = []; - - public log(...args) { - const argsStr = this.getStr(args); - this.logs.push(argsStr); - if (this.logDisabled && !this.phaseText) { - return; - } - if ((this.phaseText && !whitelist.some(b => argsStr.includes(b))) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalLog(args); - } - public error(...args) { - const argsStr = this.getStr(args); - this.logs.push(argsStr); - originalError(args); // Appelle le console.error originel - } - public debug(...args) { - const argsStr = this.getStr(args); - this.logs.push(argsStr); - if (this.logDisabled && !this.phaseText) { - return; - } - if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalDebug(args); - } - warn(...args) { - const argsStr = this.getStr(args); - this.logs.push(args); - if (this.logDisabled && !this.phaseText) { - return; - } - if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalWarn(args); - } - notify(msg) { - originalLog(msg); - this.notified.push(msg); - } - getLogs() { - return this.logs; - } - clearLogs() { - this.logs = []; - } - getStr(...args) { - return args - .map(arg => { - if (typeof arg === "object" && arg !== null) { - // Handle objects including arrays - return JSON.stringify(arg, (_key, value) => (typeof value === "bigint" ? value.toString() : value)); - } - if (typeof arg === "bigint") { - // Handle BigInt values - return arg.toString(); - } - return arg.toString(); - }) - .join(";"); - } -} diff --git a/test/test-utils/mocks/mock-console/color-map.json b/test/test-utils/mocks/mock-console/color-map.json new file mode 100644 index 00000000000..ded83e889b0 --- /dev/null +++ b/test/test-utils/mocks/mock-console/color-map.json @@ -0,0 +1,150 @@ +{ + "AliceBlue": "f0f8ff", + "AntiqueWhite": "faebd7", + "Aqua": "00ffff", + "Aquamarine": "7fffd4", + "Azure": "f0ffff", + "Beige": "f5f5dc", + "Bisque": "ffe4c4", + "Black": "000000", + "BlanchedAlmond": "ffebcd", + "Blue": "0000ff", + "BlueViolet": "8a2be2", + "Brown": "a52a2a", + "BurlyWood": "deb887", + "CadetBlue": "5f9ea0", + "Chartreuse": "7fff00", + "Chocolate": "d2691e", + "Coral": "ff7f50", + "CornflowerBlue": "6495ed", + "Cornsilk": "fff8dc", + "Crimson": "dc143c", + "Cyan": "00ffff", + "DarkBlue": "00008b", + "DarkCyan": "008b8b", + "DarkGoldenRod": "b8860b", + "DarkGray": "a9a9a9", + "DarkGrey": "a9a9a9", + "DarkGreen": "006400", + "DarkKhaki": "bdb76b", + "DarkMagenta": "8b008b", + "DarkOliveGreen": "556b2f", + "DarkOrange": "ff8c00", + "DarkOrchid": "9932cc", + "DarkRed": "8b0000", + "DarkSalmon": "e9967a", + "DarkSeaGreen": "8fbc8f", + "DarkSlateBlue": "483d8b", + "DarkSlateGray": "2f4f4f", + "DarkSlateGrey": "2f4f4f", + "DarkTurquoise": "00ced1", + "DarkViolet": "9400d3", + "DeepPink": "ff1493", + "DeepSkyBlue": "00bfff", + "DimGray": "696969", + "DimGrey": "696969", + "DodgerBlue": "1e90ff", + "FireBrick": "b22222", + "FloralWhite": "fffaf0", + "ForestGreen": "228b22", + "Fuchsia": "ff00ff", + "Gainsboro": "dcdcdc", + "GhostWhite": "f8f8ff", + "Gold": "ffd700", + "GoldenRod": "daa520", + "Gray": "808080", + "Grey": "808080", + "Green": "008000", + "GreenYellow": "adff2f", + "HoneyDew": "f0fff0", + "HotPink": "ff69b4", + "IndianRed": "cd5c5c", + "Indigo": "4b0082", + "Ivory": "fffff0", + "Khaki": "f0e68c", + "Lavender": "e6e6fa", + "LavenderBlush": "fff0f5", + "LawnGreen": "7cfc00", + "LemonChiffon": "fffacd", + "LightBlue": "add8e6", + "LightCoral": "f08080", + "LightCyan": "e0ffff", + "LightGoldenRodYellow": "fafad2", + "LightGray": "d3d3d3", + "LightGrey": "d3d3d3", + "LightGreen": "90ee90", + "LightPink": "ffb6c1", + "LightSalmon": "ffa07a", + "LightSeaGreen": "20b2aa", + "LightSkyBlue": "87cefa", + "LightSlateGray": "778899", + "LightSlateGrey": "778899", + "LightSteelBlue": "b0c4de", + "LightYellow": "ffffe0", + "Lime": "00ff00", + "LimeGreen": "32cd32", + "Linen": "faf0e6", + "Magenta": "ff00ff", + "Maroon": "800000", + "MediumAquaMarine": "66cdaa", + "MediumBlue": "0000cd", + "MediumOrchid": "ba55d3", + "MediumPurple": "9370db", + "MediumSeaGreen": "3cb371", + "MediumSlateBlue": "7b68ee", + "MediumSpringGreen": "00fa9a", + "MediumTurquoise": "48d1cc", + "MediumVioletRed": "c71585", + "MidnightBlue": "191970", + "MintCream": "f5fffa", + "MistyRose": "ffe4e1", + "Moccasin": "ffe4b5", + "NavajoWhite": "ffdead", + "Navy": "000080", + "OldLace": "fdf5e6", + "Olive": "808000", + "OliveDrab": "6b8e23", + "Orange": "ffa500", + "OrangeRed": "ff4500", + "Orchid": "da70d6", + "PaleGoldenRod": "eee8aa", + "PaleGreen": "98fb98", + "PaleTurquoise": "afeeee", + "PaleVioletRed": "db7093", + "PapayaWhip": "ffefd5", + "PeachPuff": "ffdab9", + "Peru": "cd853f", + "Pink": "ffc0cb", + "Plum": "dda0dd", + "PowderBlue": "b0e0e6", + "Purple": "800080", + "RebeccaPurple": "663399", + "Red": "ff0000", + "RosyBrown": "bc8f8f", + "RoyalBlue": "4169e1", + "SaddleBrown": "8b4513", + "Salmon": "fa8072", + "SandyBrown": "f4a460", + "SeaGreen": "2e8b57", + "SeaShell": "fff5ee", + "Sienna": "a0522d", + "Silver": "c0c0c0", + "SkyBlue": "87ceeb", + "SlateBlue": "6a5acd", + "SlateGray": "708090", + "SlateGrey": "708090", + "Snow": "fffafa", + "SpringGreen": "00ff7f", + "SteelBlue": "4682b4", + "Tan": "d2b48c", + "Teal": "008080", + "Thistle": "d8bfd8", + "Tomato": "ff6347", + "Turquoise": "40e0d0", + "Violet": "ee82ee", + "Wheat": "f5deb3", + "White": "ffffff", + "WhiteSmoke": "f5f5f5", + "Yellow": "ffff00", + "YellowGreen": "9acd32" +} diff --git a/test/test-utils/mocks/mock-console/infer-color.ts b/test/test-utils/mocks/mock-console/infer-color.ts new file mode 100644 index 00000000000..e01adbc4ad4 --- /dev/null +++ b/test/test-utils/mocks/mock-console/infer-color.ts @@ -0,0 +1,61 @@ +import { hslToHex } from "#utils/common"; +import chalk, { type ChalkInstance, type ForegroundColorName, foregroundColorNames } from "chalk"; +import colorMap from "./color-map.json"; + +export function inferColorFormat(data: [string, ...unknown[]]): ChalkInstance { + // Remove all CSS format strings and find the first one containing something vaguely resembling a color + data[0] = data[0].replaceAll("%c", ""); + const args = data.slice(1).filter(t => typeof t === "string"); + const color = findColorPrefix(args); + + // If the color is within Chalk's native roster, use it directly. + if ((foregroundColorNames as string[]).includes(color)) { + return chalk[color as ForegroundColorName]; + } + + // Otherwise, coerce it to hex before feeding it in. + return getColor(color); +} + +/** + * Find the first string with a "color:" CSS directive in an argument list. + * @param args - The arguments containing the color directive + * @returns The found color, or `"green"` if none were found + */ +function findColorPrefix(args: string[]): string { + for (const arg of args) { + const match = /color:\s*(.+?)(?:;|$)/g.exec(arg); + if (match === null) { + continue; + } + + return match[1]; + } + return "green"; +} + +/** + * Coerce an arbitrary CSS color string to a Chalk instance. + * @param color - The color to coerce + * @returns The Chalk color equivalent. + */ +function getColor(color: string): ChalkInstance { + if (/^#([a-z0-9]{3,4}|[a-z0-9]{6}|[a-z0-9]{8})$/i.test(color)) { + // already in hex + return chalk.hex(color); + } + + const rgbMatch = /^rgba?\((\d{1,3})%?,\s*(\d{1,3})%?,?\s*(\d{1,3})%?,\s*/i.exec(color); + if (rgbMatch) { + const [red, green, blue] = rgbMatch; + return chalk.rgb(+red, +green, +blue); + } + + const hslMatch = /^hslv?\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/i.exec(color); + if (hslMatch) { + const [hue, saturation, light] = hslMatch; + return chalk.hex(hslToHex(+hue, +saturation / 100, +light / 100)); + } + + return chalk.hex(colorMap[color] ?? "#00ff95ff"); +} diff --git a/test/test-utils/mocks/mock-console/mock-console.ts b/test/test-utils/mocks/mock-console/mock-console.ts new file mode 100644 index 00000000000..52ed0af6aa7 --- /dev/null +++ b/test/test-utils/mocks/mock-console/mock-console.ts @@ -0,0 +1,211 @@ +import { DEBUG_COLOR, NEW_TURN_COLOR, TRACE_COLOR, UI_MSG_COLOR } from "#app/constants/colors"; +import { inferColorFormat } from "#test/test-utils/mocks/mock-console/infer-color"; +import { coerceArray } from "#utils/common"; +import { type InspectOptions, inspect } from "node:util"; +import chalk, { type ChalkInstance } from "chalk"; + +// Tell chalk we support truecolor +chalk.level = 3; + +// TODO: Review this +const blacklist = [ + "variant icon does not exist", // Repetitive warnings about icons not found + 'Texture "%s" not found', // Repetitive warnings about textures not found + "type: 'Pokemon',", // Large Pokemon objects + "gameVersion: ", // Large session-data and system-data objects + "Phaser v", // Phaser version text + "Seed:", // Stuff about wave seed (we should really stop logging this shit) + "Wave Seed:", // Stuff about wave seed (we should really stop logging this shit) +] as const; +const whitelist = ["Start Phase"] as const; + +const inspectOptions: InspectOptions = { sorted: true, breakLength: 120, numericSeparator: true }; + +/** + * The {@linkcode MockConsole} is a wrapper around the global {@linkcode console} object. + * It automatically colors text and such. + */ +export class MockConsole implements Omit { + /** + * A list of warnings that are queued to be displayed after all tests in the same file are finished. + */ + private static readonly queuedWarnings: unknown[][] = []; + /** + * The original `Console` object, preserved to avoid overwriting + * Vitest's native `console.log` wrapping. + */ + private console = console; + + //#region Static Properties + + /** + * Queue a warning to be printed after all tests in the same file are finished. + */ + // TODO: Add some warnings + public static queuePostTestWarning(...data: unknown[]): void { + MockConsole.queuedWarnings.push(data); + } + + /** + * Print and reset all post-test warnings. + */ + public static printPostTestWarnings(): void { + for (const data of MockConsole.queuedWarnings) { + console.warn(...data); + } + MockConsole.queuedWarnings.splice(0); + } + + //#endregion Private Properties + + //#region Utilities + + /** + * Check whether a given set of data is in the blacklist to be barred from logging. + * @param data - The data being logged + * @returns Whether `data` is blacklisted from console logging + */ + private checkBlacklist(data: unknown[]): boolean { + const dataStr = this.getStr(data); + return !whitelist.some(b => dataStr.includes(b)) && blacklist.some(b => dataStr.includes(b)); + } + + /** + * Returns a human-readable string representation of `data`. + */ + private getStr(data: unknown): string { + return inspect(data, inspectOptions); + } + + /** + * Stringify the given data in a manner fit for logging. + * @param color - A Chalk instance or other transformation function used to transform the output, + * or `undefined` to not transform it at all. + * @param data - The data that the format should be applied to. + * @returns A stringified copy of `data` with {@linkcode color} applied to each individual argument. + * @todo Do we need to apply color to each entry or just run it through `util.format`? + */ + private format(color: ((s: unknown) => unknown) | undefined, data: unknown | unknown[]): unknown[] { + data = coerceArray(data); + color ??= a => a; + return (data as unknown[]).map(a => color(typeof a === "function" || typeof a === "object" ? this.getStr(a) : a)); + } + + //#endregion Utilities + + //#region Custom wrappers + public info(...data: unknown[]) { + return this.log(...data); + } + + public trace(...data: unknown[]) { + if (this.checkBlacklist(data)) { + return; + } + + // TODO: Figure out how to add color to the full trace text + this.console.trace(...this.format(chalk.hex(TRACE_COLOR), data)); + } + + public debug(...data: unknown[]) { + if (this.checkBlacklist(data)) { + return; + } + + this.console.debug(...this.format(chalk.hex(DEBUG_COLOR), data)); + } + + public log(...data: unknown[]): void { + if (this.checkBlacklist(data)) { + return; + } + + let formatter: ChalkInstance | undefined; + + if (data.some(d => typeof d === "string" && d.includes("color:"))) { + // Infer the color format from the arguments, then remove everything but the message. + formatter = inferColorFormat(data as [string, ...unknown[]]); + data.splice(1); + } else if (data[0] === "[UI]") { + // Cyan for UI debug messages + formatter = chalk.hex(UI_MSG_COLOR); + } else if (typeof data[0] === "string" && data[0].startsWith("=====")) { + // Orange logging for "New Turn"/etc messages + formatter = chalk.hex(NEW_TURN_COLOR); + } + + this.console.log(...this.format(formatter, data)); + } + + public warn(...data: unknown[]) { + if (this.checkBlacklist(data)) { + return; + } + + this.console.warn(...this.format(chalk.yellow, data)); + } + + public error(...data: unknown[]) { + if (this.checkBlacklist(data)) { + return; + } + + this.console.error(...this.format(chalk.redBright, data)); + } + + //#endregion Custom Wrappers + + //#region Copy-pasted Console code + // TODO: Progressively add proper coloration and support for all these methods + public dir(...args: Parameters<(typeof console)["dir"]>): ReturnType<(typeof console)["dir"]> { + return this.console.dir(...args); + } + public dirxml(...args: Parameters<(typeof console)["dirxml"]>): ReturnType<(typeof console)["dirxml"]> { + return this.console.dirxml(...args); + } + public table(...args: Parameters<(typeof console)["table"]>): ReturnType<(typeof console)["table"]> { + return this.console.table(...args); + } + public group(...args: Parameters<(typeof console)["group"]>): ReturnType<(typeof console)["group"]> { + return this.console.group(...args); + } + public groupCollapsed( + ...args: Parameters<(typeof console)["groupCollapsed"]> + ): ReturnType<(typeof console)["groupCollapsed"]> { + return this.console.groupCollapsed(...args); + } + public groupEnd(...args: Parameters<(typeof console)["groupEnd"]>): ReturnType<(typeof console)["groupEnd"]> { + return this.console.groupEnd(...args); + } + public clear(...args: Parameters<(typeof console)["clear"]>): ReturnType<(typeof console)["clear"]> { + return this.console.clear(...args); + } + public count(...args: Parameters<(typeof console)["count"]>): ReturnType<(typeof console)["count"]> { + return this.console.count(...args); + } + public countReset(...args: Parameters<(typeof console)["countReset"]>): ReturnType<(typeof console)["countReset"]> { + return this.console.countReset(...args); + } + public assert(...args: Parameters<(typeof console)["assert"]>): ReturnType<(typeof console)["assert"]> { + return this.console.assert(...args); + } + public profile(...args: Parameters<(typeof console)["profile"]>): ReturnType<(typeof console)["profile"]> { + return this.console.profile(...args); + } + public profileEnd(...args: Parameters<(typeof console)["profileEnd"]>): ReturnType<(typeof console)["profileEnd"]> { + return this.console.profileEnd(...args); + } + public time(...args: Parameters<(typeof console)["time"]>): ReturnType<(typeof console)["time"]> { + return this.console.time(...args); + } + public timeLog(...args: Parameters<(typeof console)["timeLog"]>): ReturnType<(typeof console)["timeLog"]> { + return this.console.timeLog(...args); + } + public timeEnd(...args: Parameters<(typeof console)["timeEnd"]>): ReturnType<(typeof console)["timeEnd"]> { + return this.console.timeEnd(...args); + } + public timeStamp(...args: Parameters<(typeof console)["timeStamp"]>): ReturnType<(typeof console)["timeStamp"]> { + return this.console.timeStamp(...args); + } + //#endregion Copy-pasted Console code +} diff --git a/test/test-utils/mocks/mocks-container/mock-text.ts b/test/test-utils/mocks/mocks-container/mock-text.ts index ad2fce80972..a64aa45ef80 100644 --- a/test/test-utils/mocks/mocks-container/mock-text.ts +++ b/test/test-utils/mocks/mocks-container/mock-text.ts @@ -1,4 +1,5 @@ import type { MockGameObject } from "#test/test-utils/mocks/mock-game-object"; +import type { TextInterceptor } from "#test/test-utils/text-interceptor"; import { UI } from "#ui/ui"; export class MockText implements MockGameObject { @@ -82,13 +83,14 @@ export class MockText implements MockGameObject { showText( text: string, - delay?: number | null, + _delay?: number | null, callback?: Function | null, - callbackDelay?: number | null, - prompt?: boolean | null, - promptDelay?: number | null, + _callbackDelay?: number | null, + _prompt?: boolean | null, + _promptDelay?: number | null, ) { - this.scene.messageWrapper.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + // TODO: this is a very bad way to pass calls around + (this.scene.messageWrapper as TextInterceptor).showText(text); if (callback) { callback(); } @@ -96,13 +98,13 @@ export class MockText implements MockGameObject { showDialogue( keyOrText: string, - name: string | undefined, - delay: number | null = 0, + name: string, + _delay: number | null, callback: Function, - callbackDelay?: number, - promptDelay?: number, + _callbackDelay?: number, + _promptDelay?: number, ) { - this.scene.messageWrapper.showDialogue(keyOrText, name, delay, callback, callbackDelay, promptDelay); + (this.scene.messageWrapper as TextInterceptor).showDialogue(keyOrText, name); if (callback) { callback(); } diff --git a/test/test-utils/reporters/custom-default-reporter.ts b/test/test-utils/reporters/custom-default-reporter.ts new file mode 100644 index 00000000000..15c4881b83c --- /dev/null +++ b/test/test-utils/reporters/custom-default-reporter.ts @@ -0,0 +1,62 @@ +import { relative } from "node:path"; +import { parseStacktrace } from "@vitest/utils/source-map"; +import chalk from "chalk"; +import type { UserConsoleLog } from "vitest"; +import type { TestState } from "vitest/node"; +import { DefaultReporter } from "vitest/reporters"; + +/** + * Custom Vitest reporter to strip the current file names from the output. + */ +export default class CustomDefaultReporter extends DefaultReporter { + public override onUserConsoleLog(log: UserConsoleLog, taskState?: TestState): void { + // This code is more or less copied verbatim from `vitest/reporters` source, with minor tweaks to use + // dependencies we actually _have_ (i.e. chalk) rather than ones we don't (i.e. tinyrainbow). + + // SPDX-SnippetBegin + // SPDX-SnippetCopyrightText: 2021 VoidZero Inc. and Vitest contributors + // SPDX-License-Identifier: MIT + + if (!super.shouldLog(log, taskState)) { + return; + } + + const output = log.type === "stdout" ? this.ctx.logger.outputStream : this.ctx.logger.errorStream; + + const write = (msg: string) => output.write(msg); + + const task = log.taskId ? this.ctx.state.idMap.get(log.taskId) : undefined; + + write(log.content); // this is about the only changed line (that and us skipping a newline) + + if (!log.origin) { + return; + } + + // Code for stack trace, ripped directly out of Vitest source code. + // I wish they had a helper function to do this so we didn't have to import `@vitest/utils`, but oh well... + // browser logs don't have an extra end of line at the end like Node.js does + if (log.browser) { + write("\n"); + } + + const project = task ? this.ctx.getProjectByName(task.file.projectName ?? "") : this.ctx.getRootProject(); + + const stack = log.browser ? (project.browser?.parseStacktrace(log.origin) ?? []) : parseStacktrace(log.origin); + + const highlight = task && stack.find(i => i.file === task.file.filepath); + + for (const frame of stack) { + const color = frame === highlight ? chalk.cyan : chalk.gray; + const path = relative(project.config.root, frame.file); + + const positions = [frame.method, `${path}:${chalk.dim(`${frame.line}:${frame.column}`)}`] + .filter(Boolean) + .join(" "); + + write(color(` ${chalk.dim(">")} ${positions}\n`)); + } + + // SPDX-SnippetEnd + } +} diff --git a/test/test-utils/setup/test-end-log.ts b/test/test-utils/setup/test-end-log.ts new file mode 100644 index 00000000000..9814ba8a45c --- /dev/null +++ b/test/test-utils/setup/test-end-log.ts @@ -0,0 +1,113 @@ +// biome-ignore lint/correctness/noUnusedImports: TSDoc +import type CustomDefaultReporter from "#test/test-utils/reporters/custom-default-reporter"; +import { basename, join, relative } from "path"; +import chalk from "chalk"; +import type { RunnerTask, RunnerTaskResult, RunnerTestCase } from "vitest"; + +/** + * @module + * Code to add markers to the beginning and end of tests. + * Intended for use with {@linkcode CustomDefaultReporter}, and placed inside test hooks + * (rather than as part of the reporter) to ensure Vitest waits for the log messages to be printed. + */ + +/** A long string of "="s to partition off each test from one another. */ +const TEST_END_BARRIER = chalk.bold.hex("#ff7c7cff")("=================="); + +// Colors used for Vitest-related test utils +const TEST_NAME_COLOR = "#008886ff" as const; +const VITEST_PINK_COLOR = "#c162de" as const; + +const testRoot = join(import.meta.dirname, "..", "..", ".."); + +/** + * Log the testfile name and path upon a case starting. \ + * Used to compensate for us overridding the global Console object and removing Vitest's + * test name annotations. + * @param test - The {@linkcode RunnerTask} passed from the context + */ +export function logTestStart(test: RunnerTask): void { + console.log(TEST_END_BARRIER); + console.log( + `${chalk.dim("> ")}${chalk.hex(VITEST_PINK_COLOR)("Starting test: ")}${chalk.hex(TEST_NAME_COLOR)(getTestName(test))}`, + ); +} + +/** + * Log the testfile name, path and result upon a case ending. \ + * Used to compensate for us overridding the global Console object and removing Vitest's + * test name annotations. + * @param task - The {@linkcode RunnerTestCase} passed from the hook + */ +export function logTestEnd(task: RunnerTestCase): void { + const durationStr = getDurationPrefix(task.result); + const resultStr = getResultStr(task.result); + console.log(`${chalk.dim("> ")}${chalk.black.bgHex(VITEST_PINK_COLOR)(" Test finished! ")} + Name: ${chalk.hex(TEST_NAME_COLOR)(getTestName(task))} + Result: ${resultStr}${durationStr} + File: ${chalk.hex("#d29b0eff")( + getPathFromTest(task.file.filepath) + (task.location ? `:${task.location.line}:${task.location.column}` : ""), + )}`); +} + +/** + * Get the path of the current test file relative to the `test` directory. + * @param abs - The absolute path to the file + * @returns The relative path with `test/` appended to it. + */ +function getPathFromTest(abs: string): string { + return join(basename(testRoot), relative(testRoot, abs)); +} + +function getResultStr(result: RunnerTaskResult | undefined): string { + if (result?.state !== "pass" && result?.state !== "fail") { + return "Unknown"; + } + + const resultStr = + result.state === "pass" + ? chalk.green.bold("✔ Passed") + : (result?.duration ?? 0) > 2 + ? chalk.cyan.bold("◴ Timed out") + : chalk.red.bold("✗ Failed"); + + return resultStr; +} + +/** + * Get the text to be displayed for a test's duration. + * @param result - The {@linkcode RunnerTaskResult} of the finished test + * @returns An appropriately colored suffix for the start time. + * Will return an empty string if `result.startTime` is `undefined` + */ +function getDurationPrefix(result?: RunnerTaskResult): string { + const startTime = result?.startTime; + if (!startTime) { + return ""; + } + const duration = Math.round(Date.now() - startTime); + + // TODO: Figure out a way to access the current vitest config from a hook + const color = duration > 10_000 ? chalk.yellow : chalk.green; + return ` ${chalk.dim("in")} ${color(duration)}${chalk.dim("ms")}`; +} + +// Function copied from vitest source to avoid having to import `@vitest/runner/utils` for 1 function + +// SPDX-SnippetBegin +// SPDX-SnippetCopyrightText: 2021 VoidZero Inc. and Vitest contributors +// SPDX-License-Identifier: MIT +function getTestName(task: RunnerTask, separator = " > "): string { + const names: string[] = [task.name]; + let current: RunnerTask | undefined = task; + + while ((current = current?.suite)) { + if (current?.name) { + names.unshift(current.name); + } + } + + return names.join(separator); +} + +// SPDX-SnippetEnd diff --git a/test/test-utils/test-file-initialization.ts b/test/test-utils/test-file-initialization.ts index 631d3f9146b..c172e2d1da8 100644 --- a/test/test-utils/test-file-initialization.ts +++ b/test/test-utils/test-file-initialization.ts @@ -3,7 +3,7 @@ import { initializeGame } from "#app/init/init"; import { initI18n } from "#plugins/i18n"; import { blobToString } from "#test/test-utils/game-manager-utils"; import { manageListeners } from "#test/test-utils/listeners-manager"; -import { MockConsoleLog } from "#test/test-utils/mocks/mock-console-log"; +import { MockConsole } from "#test/test-utils/mocks/mock-console/mock-console"; import { mockContext } from "#test/test-utils/mocks/mock-context-canvas"; import { mockLocalStorage } from "#test/test-utils/mocks/mock-local-storage"; import { MockImage } from "#test/test-utils/mocks/mocks-container/mock-image"; @@ -38,14 +38,22 @@ function initTestFile(): void { /** * Setup various stubs for testing. * @todo Move this into a dedicated stub file instead of running it once per test instance + * @todo review these to see which are actually necessary * @todo Investigate why this resets on new test suite start */ function setupStubs(): void { - Object.defineProperty(window, "localStorage", { - value: mockLocalStorage(), - }); - Object.defineProperty(window, "console", { - value: new MockConsoleLog(false), + Object.defineProperties(global, { + localStorage: { + value: mockLocalStorage(), + }, + console: { + value: new MockConsole(), + }, + matchMedia: { + value: () => ({ + matches: false, + }), + }, }); Object.defineProperty(document, "fonts", { writable: true, @@ -69,11 +77,6 @@ function setupStubs(): void { navigator.getGamepads = () => []; setCookie(SESSION_ID_COOKIE_NAME, "fake_token"); - window.matchMedia = () => - ({ - matches: false, - }) as any; - /** * Sets this object's position relative to another object with a given offset * @param guideObject - The {@linkcode Phaser.GameObjects.GameObject} to base the position off of diff --git a/test/test-utils/text-interceptor.ts b/test/test-utils/text-interceptor.ts index 36a5db4c78d..dfbaf2ff11c 100644 --- a/test/test-utils/text-interceptor.ts +++ b/test/test-utils/text-interceptor.ts @@ -1,39 +1,49 @@ +import type { BattleScene } from "#app/battle-scene"; +import chalk from "chalk"; + /** - * Class will intercept any text or dialogue message calls and log them for test purposes + * The {@linkcode TextInterceptor} is a wrapper class that intercepts and logs any messages + * that would be displayed on-screen. */ export class TextInterceptor { - private scene; - public logs: string[] = []; - constructor(scene) { - this.scene = scene; + /** A log containing messages having been displayed on screen, sorted in FIFO order. */ + public readonly logs: string[] = []; + + constructor(scene: BattleScene) { + // @ts-expect-error: Find another more sanitary way of doing this scene.messageWrapper = this; } - showText( - text: string, - _delay?: number, - _callback?: Function, - _callbackDelay?: number, - _prompt?: boolean, - _promptDelay?: number, - ): void { - console.log(text); + /** Clear the current content of the TextInterceptor. */ + public clearLogs(): void { + this.logs.splice(0); + } + + showText(text: string): void { + // NB: We do not format the raw _logs_ themselves as tests will be actively checking it. + console.log(this.formatText(text)); this.logs.push(text); } - showDialogue( - text: string, - name: string, - _delay?: number, - _callback?: Function, - _callbackDelay?: number, - _promptDelay?: number, - ): void { - console.log(name, text); + showDialogue(text: string, name: string): void { + console.log(`${name}: \n${this.formatText(text)}`); this.logs.push(name, text); } - getLatestMessage(): string { - return this.logs.pop() ?? ""; + /** + * Format text to be displayed to the test console, as follows: + * 1. Replaces new lines and new text boxes (marked by `$`) with indented new lines. + * 2. Removes all `@c{}`, `@d{}`, `@s{}`, and `@f{}` flags from the text. + * 3. Makes text blue + * @param text - The unformatted text + * @returns The formatted text + */ + private formatText(text: string): string { + return chalk.blue( + text + .replace(/\n/g, " ") + .replace(/\$/g, "\n ") + .replace(/@\w{.*?}/g, ""), + ); } } diff --git a/test/vitest.setup.ts b/test/vitest.setup.ts index be35e18e2e9..23adab01a05 100644 --- a/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -1,16 +1,21 @@ import "vitest-canvas-mock"; +import { MockConsole } from "#test/test-utils/mocks/mock-console/mock-console"; +import { logTestEnd, logTestStart } from "#test/test-utils/setup/test-end-log"; import { initTests } from "#test/test-utils/test-file-initialization"; -import { afterAll, beforeAll, vi } from "vitest"; +import chalk from "chalk"; +import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest"; -/** Set the timezone to UTC for tests. */ +//#region Mocking -/** Mock the override import to always return default values, ignoring any custom overrides. */ -vi.mock("#app/overrides", async importOriginal => { - const { defaultOverrides } = await importOriginal(); +// Mock the override import to always return default values, ignoring any custom overrides. +vi.mock(import("#app/overrides"), async importOriginal => { + const { defaultOverrides } = await importOriginal(); return { default: defaultOverrides, - defaultOverrides, + // Export `defaultOverrides` as a *copy*. + // This ensures we can easily reset `overrides` back to its default values after modifying it. + defaultOverrides: { ...defaultOverrides }, } satisfies typeof import("#app/overrides"); }); @@ -20,7 +25,7 @@ vi.mock("#app/overrides", async importOriginal => { * This is necessary because how our code is structured. * Do NOT try to put any of this code into external functions, it won't work as it's elevated during runtime. */ -vi.mock("i18next", async importOriginal => { +vi.mock(import("i18next"), async importOriginal => { console.log("Mocking i18next"); const { setupServer } = await import("msw/node"); const { http, HttpResponse } = await import("msw"); @@ -30,8 +35,11 @@ vi.mock("i18next", async importOriginal => { const filename = req.params[0]; try { - const json = await import(`../public/locales/en/${req.params[0]}`); - console.log("Loaded locale", filename); + const localeFiles = import.meta.glob("../public/locales/en/**/*.json", { eager: true }); + const json = localeFiles[`../public/locales/en/${filename}`] || {}; + if (import.meta.env.VITE_I18N_DEBUG === "1") { + console.log("Loaded locale", filename); + } return HttpResponse.json(json); } catch (err) { console.log(`Failed to load locale ${filename}!`, err); @@ -54,7 +62,15 @@ beforeAll(() => { initTests(); }); +beforeEach(context => { + logTestStart(context.task); +}); +afterEach(context => { + logTestEnd(context.task); +}); + afterAll(() => { global.server.close(); - console.log("Closing i18n MSW server!"); + MockConsole.printPostTestWarnings(); + console.log(chalk.hex("#dfb8d8")("Closing i18n MSW server!")); }); diff --git a/typedoc.config.js b/typedoc.config.js index 1f944cd544e..ef932a5d077 100644 --- a/typedoc.config.js +++ b/typedoc.config.js @@ -8,7 +8,13 @@ const dryRun = !!process.env.DRY_RUN?.match(/true/gi); const config = { entryPoints: ["./src", "./test/test-utils"], entryPointStrategy: "expand", - exclude: ["**/*+.test.ts", "src/polyfills.ts", "src/vite.env.d.ts"], + exclude: [ + "src/polyfills.ts", + "src/vite.env.d.ts", + "**/*+.test.ts", + "test/test-utils/setup", + "test/test-utils/reporters", + ], excludeReferences: true, // prevent documenting re-exports requiredToBeDocumented: [ "Enum", diff --git a/vitest.config.ts b/vitest.config.ts index 65c5427e591..7fa2494bb4e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,18 +1,25 @@ -import { defineProject } from "vitest/config"; +import { defineConfig } from "vitest/config"; import { BaseSequencer, type TestSpecification } from "vitest/node"; import { defaultConfig } from "./vite.config"; -export default defineProject(({ mode }) => ({ +export default defineConfig(({ mode }) => ({ ...defaultConfig, test: { + reporters: process.env.GITHUB_ACTIONS + ? ["github-actions", "./test/test-utils/reporters/custom-default-reporter.ts"] + : ["./test/test-utils/reporters/custom-default-reporter.ts"], env: { TZ: "UTC", }, - testTimeout: 20000, + testTimeout: 20_000, + slowTestThreshold: 10_000, + // TODO: Consider enabling + // expect: {requireAssertions: true}, setupFiles: ["./test/font-face.setup.ts", "./test/vitest.setup.ts", "./test/matchers.setup.ts"], sequence: { sequencer: MySequencer, }, + includeTaskLocation: true, environment: "jsdom" as const, environmentOptions: { jsdom: { From e222731623b78aac65963f9293c6c8b4e0810d80 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:43:01 -0500 Subject: [PATCH 106/134] Center text in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d381b8f47f5..73477968bc0 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -PokéRogue +
PokéRogue [![Discord Static Badge](https://img.shields.io/badge/Community_Discord-blurple?style=flat&logo=discord&logoSize=auto&labelColor=white&color=5865F2)](https://discord.gg/pokerogue) [![Docs Coverage Static Badge](https://pagefaultgames.github.io/pokerogue/beta/coverage.svg)](https://pagefaultgames.github.io/pokerogue/beta) [![Testing Badge](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml/badge.svg)](https://github.com/pagefaultgames/pokerogue/actions/workflows/tests.yml) -[![License: GNU AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) +[![License: GNU AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! From 2cf23b7ea7b1662c260b74ee61a42a19dd955e8b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:58:40 -0700 Subject: [PATCH 107/134] [Misc] Fix console log colors --- src/constants/colors.ts | 4 +++- src/phase-manager.ts | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/constants/colors.ts b/src/constants/colors.ts index e4d740addff..717c5fa5f0d 100644 --- a/src/constants/colors.ts +++ b/src/constants/colors.ts @@ -5,8 +5,10 @@ */ // Colors used in prod +/** Color used for "Start Phase " logs */ export const PHASE_START_COLOR = "green" as const; -export const MOVE_COLOR = "RebeccaPurple" as const; +/** Color used for logs in `MovePhase` */ +export const MOVE_COLOR = "orchid" as const; // Colors used for testing code export const NEW_TURN_COLOR = "#ffad00ff" as const; diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 68b7d74293b..2185de559ae 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -1,3 +1,4 @@ +import { PHASE_START_COLOR } from "#app/constants/colors"; import { globalScene } from "#app/global-scene"; import type { Phase } from "#app/phase"; import { type PhasePriorityQueue, PostSummonPhasePriorityQueue } from "#data/phase-priority-queue"; @@ -392,7 +393,7 @@ export class PhaseManager { * Helper method to start and log the current phase. */ private startCurrentPhase(): void { - console.log(`%cStart Phase ${this.currentPhase.phaseName}`, "color:${PHASE_START_COLOR};"); + console.log(`%cStart Phase ${this.currentPhase.phaseName}`, `color:${PHASE_START_COLOR};`); this.currentPhase.start(); } From 8b95361d616a778c47c2f0da9c9e40317996be9e Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 7 Sep 2025 14:35:52 -0400 Subject: [PATCH 108/134] [Dev] Added egg move parse script & script type checking (#6116) * Added egg move parse utility script * Update interactive.js Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update interactive.js Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update interactive.js Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Applied kev's reviews * Removed `basePath` from tsconfig the docs literally recommend against using it so yeah * Fixed up configs so that script folder has its own file * Reverted changes to egg move contents * renamed boilerplate so biome doesn't lint it * Fix `jsconfig.json` so that it doesn't typecheck all of `node_modules` See https://github.com/microsoft/TypeScript/issues/50862#issuecomment-1565175938 for more info * Update tsconfig.json Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Updated workflows and fixed issues * Removed eslint from linting workflow * Fixed type error in d.ts file to shut up linters * Reverted test-filters.yml * Update biome.jsonc * Update decrypt-save.js comment * Update interactive.js * Apply Biome * Fixed type errors for scripts * Fixed biome from removing tsdoc linkcodes * Update test/@types/vitest.d.ts --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- .github/workflows/linting.yml | 81 +++++++-- biome.jsonc | 15 +- package.json | 2 + scripts/create-test/create-test.js | 2 +- scripts/decrypt-save.js | 18 +- scripts/jsconfig.json | 17 ++ .../egg-move-template.boilerplate.ts | 10 ++ scripts/parse-egg-moves/help-message.js | 17 ++ scripts/parse-egg-moves/interactive.js | 108 +++++++++++ scripts/parse-egg-moves/main.js | 168 ++++++++++++++++++ scripts/parse-egg-moves/parse.js | 79 ++++++++ scripts/scrape-trainer-names/fetch-names.js | 8 +- src/data/balance/egg-moves.ts | 62 +------ src/init/init.ts | 2 - test/@types/vitest.d.ts | 12 +- .../helpers/challenge-mode-helper.ts | 2 +- tsconfig.json | 74 ++++---- 17 files changed, 550 insertions(+), 127 deletions(-) create mode 100644 scripts/jsconfig.json create mode 100644 scripts/parse-egg-moves/egg-move-template.boilerplate.ts create mode 100644 scripts/parse-egg-moves/help-message.js create mode 100644 scripts/parse-egg-moves/interactive.js create mode 100644 scripts/parse-egg-moves/main.js create mode 100644 scripts/parse-egg-moves/parse.js diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 08327ee3653..edecae64f95 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,7 @@ on: jobs: run-linters: - name: Run linters + name: Run all linters timeout-minutes: 10 runs-on: ubuntu-latest @@ -26,27 +26,86 @@ jobs: - name: Check out Git repository uses: actions/checkout@v4 with: - submodules: 'recursive' + submodules: "recursive" - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 10 - - name: Set up Node.js + - name: Set up Node uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' - cache: 'pnpm' + node-version-file: ".nvmrc" + cache: "pnpm" - - name: Install Node.js dependencies + - name: Install Node modules run: pnpm i - - name: Lint with Biome + # Lint files with Biome-Lint - https://biomejs.dev/linter/ + - name: Run Biome-Lint run: pnpm biome-ci + id: biome_lint + continue-on-error: true - - name: Check dependencies with depcruise + # Validate dependencies with dependency-cruiser - https://github.com/sverweij/dependency-cruiser + - name: Run Dependency-Cruise run: pnpm depcruise - - - name: Lint with ls-lint - run: pnpm ls-lint \ No newline at end of file + id: depcruise + continue-on-error: true + + # Validate types with tsc - https://www.typescriptlang.org/docs/handbook/compiler-options.html#using-the-cli + - name: Run Typecheck + run: pnpm typecheck + id: typecheck + continue-on-error: true + + # The exact same thing + - name: Run Typecheck (scripts) + run: pnpm typecheck:scripts + id: typecheck-scripts + continue-on-error: true + + - name: Evaluate for Errors + env: + BIOME_LINT_OUTCOME: ${{ steps.biome_lint.outcome }} + DEPCRUISE_OUTCOME: ${{ steps.depcruise.outcome }} + TYPECHECK_OUTCOME: ${{ steps.typecheck.outcome }} + TYPECHECK_SCRIPTS_OUTCOME: ${{ steps.typecheck-scripts.outcome }} + run: | + # Check for Errors + + # Make text red. + red () { + printf "\e[31m%s\e[0m" "$1" + } + + # Make text green. + green () { + printf "\e[32m%s\e[0m" "$1" + } + + print_result() { + local name=$1 + local outcome=$2 + if [ "$outcome" == "success" ]; then + printf "$(green "✅ $name: $outcome")\n" + else + printf "$(red "❌ $name: $outcome")\n" + fi + } + + print_result "Biome" "$BIOME_LINT_OUTCOME" + print_result "Depcruise" "$DEPCRUISE_OUTCOME" + print_result "Typecheck" "$TYPECHECK_OUTCOME" + print_result "Typecheck scripts" "$TYPECHECK_SCRIPTS_OUTCOME" + + if [[ "$BIOME_LINT_OUTCOME" != "success" || \ + "$DEPCRUISE_OUTCOME" != "success" || \ + "$TYPECHECK_OUTCOME" != "success" || \ + "$TYPECHECK_SCRIPTS_OUTCOME" != "success" ]]; then + printf "$(red "❌ One or more checks failed!")\n" >&2 + exit 1 + fi + + printf "$(green "✅ All checks passed!")\n" diff --git a/biome.jsonc b/biome.jsonc index a63ce0ee07d..e6f9ff5711a 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -175,10 +175,17 @@ } }, - // Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes), - // as well as in all TS files in `scripts/` (which are assumed to be boilerplate templates). + // Overrides to prevent unused import removal inside `overrides.ts`, enums & `.d.ts` files (for TSDoc linkcodes), + // as well as inside script boilerplate files. { - "includes": ["**/src/overrides.ts", "**/src/enums/**/*", "**/scripts/**/*.ts", "**/*.d.ts"], + // TODO: Rename existing boilerplates in the folder and remove this last alias + "includes": [ + "**/src/overrides.ts", + "**/src/enums/**/*", + "**/*.d.ts", + "scripts/**/*.boilerplate.ts", + "**/boilerplates/*.ts" + ], "linter": { "rules": { "correctness": { @@ -188,7 +195,7 @@ } }, { - "includes": ["**/src/overrides.ts", "**/scripts/**/*.ts"], + "includes": ["**/src/overrides.ts"], "linter": { "rules": { "style": { diff --git a/package.json b/package.json index f6097b8ccb9..d33c5e390d6 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "test:watch": "vitest watch --coverage --no-isolate", "test:silent": "vitest run --silent='passed-only' --no-isolate", "test:create": "node scripts/create-test/create-test.js", + "eggMoves:parse": "node scripts/parse-egg-moves/main.js", "scrape-trainers": "node scripts/scrape-trainer-names/main.js", "typecheck": "tsc --noEmit", + "typecheck:scripts": "tsc -p scripts/jsconfig.json", "biome": "biome check --write --changed --no-errors-on-unmatched --diagnostic-level=error", "biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched", "typedoc": "typedoc", diff --git a/scripts/create-test/create-test.js b/scripts/create-test/create-test.js index 765993959d1..5e395783da7 100644 --- a/scripts/create-test/create-test.js +++ b/scripts/create-test/create-test.js @@ -156,7 +156,7 @@ async function runInteractive() { console.log(chalk.green.bold(`✔ File created at: test/${localDir}/${fileName}.test.ts\n`)); console.groupEnd(); } catch (err) { - console.error(chalk.red("✗ Error: ", err.message)); + console.error(chalk.red("✗ Error: ", err)); } } diff --git a/scripts/decrypt-save.js b/scripts/decrypt-save.js index e50f152f159..26b0a311378 100644 --- a/scripts/decrypt-save.js +++ b/scripts/decrypt-save.js @@ -1,7 +1,6 @@ // Usage: node decrypt-save.js [save-file] -// biome-ignore lint/performance/noNamespaceImport: This is how you import fs from node -import * as fs from "node:fs"; +import fs from "node:fs"; import crypto_js from "crypto-js"; const { AES, enc } = crypto_js; @@ -60,6 +59,11 @@ function decryptSave(path) { try { fileData = fs.readFileSync(path, "utf8"); } catch (e) { + if (!(e instanceof Error)) { + console.error(`Unrecognized error: ${e}`); + process.exit(1); + } + // @ts-expect-error - e is usually a SystemError (all of which have codes) switch (e.code) { case "ENOENT": console.error(`File not found: ${path}`); @@ -104,6 +108,13 @@ function writeToFile(filePath, data) { try { fs.writeFileSync(filePath, data); } catch (e) { + if (!(e instanceof Error)) { + console.error("Unknown error detected: ", e); + process.exitCode = 1; + return; + } + + // @ts-expect-error - e is usually a SystemError (all of which have codes) switch (e.code) { case "EACCES": console.error(`Could not open ${filePath}: Permission denied`); @@ -114,7 +125,8 @@ function writeToFile(filePath, data) { default: console.error(`Error writing file: ${e.message}`); } - process.exit(1); + process.exitCode = 1; + return; } } diff --git a/scripts/jsconfig.json b/scripts/jsconfig.json new file mode 100644 index 00000000000..aed71f4f576 --- /dev/null +++ b/scripts/jsconfig.json @@ -0,0 +1,17 @@ +{ + "include": ["**/*.js"], + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "rootDir": ".", + "target": "esnext", + "module": "nodenext", + "moduleResolution": "nodenext", + "erasableSyntaxOnly": true, + "strict": true, + "noEmit": true, + // Forcibly disable `node_modules` recursion to prevent TSC from typechecking random JS files. + // This is disabled by default in `tsconfig.json`, but needs to be explicitly disabled from the default of `2` + "maxNodeModuleJsDepth": 0 + } +} diff --git a/scripts/parse-egg-moves/egg-move-template.boilerplate.ts b/scripts/parse-egg-moves/egg-move-template.boilerplate.ts new file mode 100644 index 00000000000..bfac05f4bde --- /dev/null +++ b/scripts/parse-egg-moves/egg-move-template.boilerplate.ts @@ -0,0 +1,10 @@ +//! DO NOT EDIT THIS FILE - CREATED BY THE `eggMoves:parse` script automatically +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; + +/** + * An object mapping all base form {@linkcode SpeciesId}s to an array of {@linkcode MoveId}s corresponding + * to their current egg moves. + * Generated by the `eggMoves:parse` script using a CSV sourced from the current Balance Team spreadsheet. + */ +export const speciesEggMoves = "{{table}}"; diff --git a/scripts/parse-egg-moves/help-message.js b/scripts/parse-egg-moves/help-message.js new file mode 100644 index 00000000000..397a28e5011 --- /dev/null +++ b/scripts/parse-egg-moves/help-message.js @@ -0,0 +1,17 @@ +import chalk from "chalk"; + +/** Show help/usage text for the `eggMoves:parse` CLI. */ +export function showHelpText() { + console.log(` +Usage: ${chalk.cyan("pnpm eggMoves:parse [options]")} +If given no options, assumes ${chalk.blue("\`--interactive\`")}. +If given only a file path, assumes ${chalk.blue("\`--file\`")}. + +${chalk.hex("#ffa500")("Options:")} + ${chalk.blue("-h, --help")} Show this help message. + ${chalk.blue("-f, --file[=PATH]")} Specify a path to a CSV file to read, or provide one from stdin. + ${chalk.blue("-t, --text[=TEXT]")} + ${chalk.blue("-c, --console[=TEXT]")} Specify CSV text to read, or provide it from stdin. + ${chalk.blue("-i, --interactive")} Run in interactive mode (default) +`); +} diff --git a/scripts/parse-egg-moves/interactive.js b/scripts/parse-egg-moves/interactive.js new file mode 100644 index 00000000000..68ee41e7900 --- /dev/null +++ b/scripts/parse-egg-moves/interactive.js @@ -0,0 +1,108 @@ +import fs from "fs"; +import chalk from "chalk"; +import inquirer from "inquirer"; +import { showHelpText } from "./help-message.js"; + +/** + * @import { Option } from "./main.js" + */ + +/** + * Prompt the user to interactively select an option (console/file) to retrieve the egg move CSV. + * @returns {Promise