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 01/20] [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 02/20] [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 03/20] [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 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 04/20] [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 05/20] [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 06/20] [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 07/20] [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 08/20] [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 09/20] [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 10/20] [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 11/20] [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 12/20] [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 13/20] [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 14/20] [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 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 15/20] [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 16/20] [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 17/20] [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 18/20] [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 19/20] [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 20/20] [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: