From d9288a7908c2fa9ae65f17b9a54573d4c48cab6e Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:19:37 -0700 Subject: [PATCH 01/48] [Bug] Add Neutralizing Gas Message for each user (#5527) Add message to onOverlap Co-authored-by: damocleas --- src/data/arena-tag.ts | 23 +++++++++++++++-------- src/field/arena.ts | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 276cfa035b8..6e8339dd54c 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -64,7 +64,7 @@ export abstract class ArenaTag { } } - onOverlap(_arena: Arena): void {} + onOverlap(_arena: Arena, _source: Pokemon | null): void {} lapse(_arena: Arena): boolean { return this.turnCount < 1 || !!--this.turnCount; @@ -706,7 +706,7 @@ export class ArenaTrapTag extends ArenaTag { this.maxLayers = maxLayers; } - onOverlap(arena: Arena): void { + onOverlap(arena: Arena, _source: Pokemon | null): void { if (this.layers < this.maxLayers) { this.layers++; @@ -1427,11 +1427,7 @@ export class SuppressAbilitiesTag extends ArenaTag { public override onAdd(_arena: Arena): void { const pokemon = this.getSourcePokemon(); if (pokemon) { - globalScene.queueMessage( - i18next.t("arenaTag:neutralizingGasOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - }), - ); + this.playActivationMessage(pokemon); for (const fieldPokemon of globalScene.getField(true)) { if (fieldPokemon && fieldPokemon.id !== pokemon.id) { @@ -1441,8 +1437,9 @@ export class SuppressAbilitiesTag extends ArenaTag { } } - public override onOverlap(_arena: Arena): void { + public override onOverlap(_arena: Arena, source: Pokemon | null): void { this.sourceCount++; + this.playActivationMessage(source); } public onSourceLeave(arena: Arena): void { @@ -1481,6 +1478,16 @@ export class SuppressAbilitiesTag extends ArenaTag { public isBeingRemoved() { return this.beingRemoved; } + + private playActivationMessage(pokemon: Pokemon | null) { + if (pokemon) { + globalScene.queueMessage( + i18next.t("arenaTag:neutralizingGasOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + } + } } // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter diff --git a/src/field/arena.ts b/src/field/arena.ts index 997b80b3237..2c538de890f 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -673,7 +673,7 @@ export class Arena { ): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { - existingTag.onOverlap(this); + existingTag.onOverlap(this, globalScene.getPokemonById(sourceId)); if (existingTag instanceof ArenaTrapTag) { const { tagType, side, turnCount, layers, maxLayers } = existingTag as ArenaTrapTag; From 3b99d3aea211e3421f4cbf99271f190c95815b52 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 18 Mar 2025 18:52:49 -0700 Subject: [PATCH 02/48] [Misc] Add `* -crlf` to `.gitattributes` (#5539) --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index dfe0770424b..a6bfb838587 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ # Auto detect text files and perform LF normalization * text=auto +* -crlf From b1d494eadbf057da6e11bdb330a462935f321e12 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 19 Mar 2025 04:22:52 +0100 Subject: [PATCH 03/48] [UI/UX] [Bug] Icons for egg moves and passives show up even when not unlocked (#5540) Reworked icons to more compact code --- src/ui/pokedex-ui-handler.ts | 50 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index f4cb9f51c16..f3625f64476 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1742,36 +1742,26 @@ export default class PokedexUiHandler extends MessageUiHandler { container.icon.setTint(0); } - if (data.eggMove1) { - container.eggMove1Icon.setVisible(true); - } else { - container.eggMove1Icon.setVisible(false); - } - if (data.eggMove2) { - container.eggMove2Icon.setVisible(true); - } else { - container.eggMove2Icon.setVisible(false); - } - if (data.tmMove1) { - container.tmMove1Icon.setVisible(true); - } else { - container.tmMove1Icon.setVisible(false); - } - if (data.tmMove2) { - container.tmMove2Icon.setVisible(true); - } else { - container.tmMove2Icon.setVisible(false); - } - if (data.passive1) { - container.passive1Icon.setVisible(true); - } else { - container.passive1Icon.setVisible(false); - } - if (data.passive2) { - container.passive2Icon.setVisible(true); - } else { - container.passive2Icon.setVisible(false); - } + const pairs: [boolean | undefined, Phaser.GameObjects.Image][] = [ + [data.eggMove1, container.eggMove1Icon], + [data.eggMove2, container.eggMove2Icon], + [data.tmMove1, container.tmMove1Icon], + [data.tmMove2, container.tmMove2Icon], + [data.passive1, container.passive1Icon], + [data.passive2, container.passive2Icon], + ]; + + pairs.forEach(([unlocked, icon]) => { + if (unlocked) { + icon.setVisible(true); + icon.clearTint(); + } else if (unlocked === false) { + icon.setVisible(true); + icon.setTint(0x808080); + } else { + icon.setVisible(false); + } + }); if (this.showDecorations) { if (this.pokerusSpecies.includes(data.species)) { From b2848af8990da1b4d5d8ee45736a3c8fc6a6a88a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 18 Mar 2025 21:00:46 -0700 Subject: [PATCH 04/48] [Test] Add ability overrides to Tailwind tests (#5541) --- test/moves/tailwind.test.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts index 24a7fa25061..591b94408ce 100644 --- a/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -1,9 +1,9 @@ -import { Stat } from "#enums/stat"; import { ArenaTagSide } from "#app/data/arena-tag"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,13 +24,16 @@ describe("Moves - Tailwind", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("double"); - game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - game.override.enemyMoveset(Moves.SPLASH); + game.override + .battleType("double") + .moveset([Moves.TAILWIND, Moves.SPLASH]) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.BALL_FETCH); }); it("doubles the Speed stat of the Pokemons on its side", async () => { - await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MEOWTH]); const magikarp = game.scene.getPlayerField()[0]; const meowth = game.scene.getPlayerField()[1]; @@ -43,7 +46,7 @@ describe("Moves - Tailwind", () => { game.move.select(Moves.TAILWIND); game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(magikarp.getEffectiveStat(Stat.SPD)).toBe(magikarpSpd * 2); expect(meowth.getEffectiveStat(Stat.SPD)).toBe(meowthSpd * 2); @@ -53,7 +56,7 @@ describe("Moves - Tailwind", () => { it("lasts for 4 turns", async () => { game.override.battleType("single"); - await game.startBattle([Species.MAGIKARP]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.TAILWIND); await game.toNextTurn(); @@ -76,7 +79,7 @@ describe("Moves - Tailwind", () => { it("does not affect the opposing side", async () => { game.override.battleType("single"); - await game.startBattle([Species.MAGIKARP]); + await game.classicMode.startBattle([Species.MAGIKARP]); const ally = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -91,7 +94,7 @@ describe("Moves - Tailwind", () => { game.move.select(Moves.TAILWIND); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(ally.getEffectiveStat(Stat.SPD)).toBe(allySpd * 2); expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd); From a1a6b0dd5a66e9323289f20aeb0c49da1d375b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilde=20Sim=C3=B5es?= Date: Wed, 19 Mar 2025 22:01:33 +0000 Subject: [PATCH 05/48] [Bug] Nicknames not properly sanitized (#5537) * Fix #5082: Nicknames not properly sanitized When a player changes the name of the pokemon to one that uses one of the following combination of letters: "@c{}", "@s{}", "@d{}", "@f{}" and "$" the game shows the name of the pokemon incorrectly in a battle. Changes made: - on message-ui-handler.ts file I updated the "showTextInternal" function to get the original name of the pokemon or pokemons (in case it's a double battle) saving it in a list named "pokename" and change it in the text for their correspondent placeholder which is saved in the list "repname" (e.g "#POKEMON1" for the first pokemon and "#POKEMON2" for the second pokemon). After the text is properly modified because of the special characters ("@c{}", "@s{}", "@d{}", "@f{}") the name of the pokemons is replaced to it's original value. - on message-phase.ts file I updated the "start" function to use a similar approach but only change the pokemon name to it's original form after the "pageIndex" (which checks the index of the "$") is updated, so the text is cut properly. - on ui.ts file I updated the "showtext" function to use same approach of the previous files, ensuring that the pokemon names were only replaced back to their original values after all text processing on "$" was completed. * Replace `let` with `const` --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/phases/message-phase.ts | 31 +++++++++++++++++++++---------- src/ui/message-ui-handler.ts | 9 +++++++++ src/ui/ui.ts | 11 +++++++++++ 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index f671307d86a..2a5bcf6b99c 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -28,17 +28,28 @@ export class MessagePhase extends Phase { super.start(); if (this.text.indexOf("$") > -1) { + const pokename: string[] = []; + const repname = [ "#POKEMON1", "#POKEMON2" ]; + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + pokename.push(globalScene.getPlayerField()[p].getNameToRender()); + this.text = this.text.split(pokename[p]).join(repname[p]); + } const pageIndex = this.text.indexOf("$"); - globalScene.unshiftPhase( - new MessagePhase( - this.text.slice(pageIndex + 1), - this.callbackDelay, - this.prompt, - this.promptDelay, - this.speaker, - ), - ); - this.text = this.text.slice(0, pageIndex).trim(); + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + this.text = this.text.split(repname[p]).join(pokename[p]); + } + if (pageIndex !== -1) { + globalScene.unshiftPhase( + new MessagePhase( + this.text.slice(pageIndex + 1), + this.callbackDelay, + this.prompt, + this.promptDelay, + this.speaker, + ), + ); + this.text = this.text.slice(0, pageIndex).trim(); + } } if (this.speaker) { diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 50522152021..230b951de59 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -76,6 +76,12 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const fadeMap = new Map(); const actionPattern = /@(c|d|s|f)\{(.*?)\}/; let actionMatch: RegExpExecArray | null; + const pokename: string[] = []; + const repname = [ "#POKEMON1", "#POKEMON2" ]; + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + pokename.push(globalScene.getPlayerField()[p].getNameToRender()); + text = text.split(pokename[p]).join(repname[p]); + } while ((actionMatch = actionPattern.exec(text))) { switch (actionMatch[1]) { case "c": @@ -94,6 +100,9 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); } + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + text = text.split(repname[p]).join(pokename[p]); + } if (text) { // Predetermine overflow line breaks to avoid words breaking while displaying const textWords = text.split(" "); diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 7c202e9210d..026e42ccf46 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -328,17 +328,28 @@ export default class UI extends Phaser.GameObjects.Container { prompt?: boolean | null, promptDelay?: number | null, ): void { + const pokename: string[] = []; + const repname = [ "#POKEMON1", "#POKEMON2" ]; + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + pokename.push(globalScene.getPlayerField()[p].getNameToRender()); + text = text.split(pokename[p]).join(repname[p]); + } if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); // biome-ignore lint/complexity/useOptionalChain: optional chain would change this to be null instead of undefined. let showMessageAndCallback = () => callback && callback(); for (let p = messagePages.length - 1; p >= 0; p--) { const originalFunc = showMessageAndCallback; + messagePages[p] = messagePages[p].split(repname[0]).join(pokename[0]); + messagePages[p] = messagePages[p].split(repname[1]).join(pokename[1]); showMessageAndCallback = () => this.showText(messagePages[p], null, originalFunc, null, true); } showMessageAndCallback(); } else { const handler = this.getHandler(); + for (let p = 0; p < globalScene.getPlayerField().length; p++) { + text = text.split(repname[p]).join(pokename[p]); + } if (handler instanceof MessageUiHandler) { (handler as MessageUiHandler).showText(text, delay, callback, callbackDelay, prompt, promptDelay); } else { From 3f887988a6126d96e3624c3dcd34884746c04e6e Mon Sep 17 00:00:00 2001 From: Matheus Rabello Noya Alves Date: Wed, 19 Mar 2025 22:45:41 +0000 Subject: [PATCH 06/48] [Bug] [UI/UX] Smack Down and Thousand Arrows now display a message for Grounding (#5536) Fix #5027: Missing confirmation message for moves special effects When using the moves Thousand Arrows and Smack Down, though the special effect of grounding the opponent is applied, a confirming message was not displayed. In this fix a new AddBattlerTagAttr subclass has been created to handle the message display, compared to previous multiple attribute additions. This new subclass verifies the conditions for the message to be displayed through asserting if target is grounded and accesses a new locale message created to display if necessary. --- src/data/moves/move.ts | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index f2157ab65b7..3d80b6b3f4c 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -5542,6 +5542,31 @@ export class LeechSeedAttr extends AddBattlerTagAttr { } } +/** + * Adds the appropriate battler tag for Smack Down and Thousand arrows + * @extends AddBattlerTagAttr + */ +export class FallDownAttr extends AddBattlerTagAttr { + constructor() { + super(BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true); + } + + /** + * Adds Grounded Tag to the target and checks if fallDown message should be displayed + * @param user the {@linkcode Pokemon} using the move + * @param target the {@linkcode Pokemon} targeted by the move + * @param move the {@linkcode Move} invoking this effect + * @param args n/a + * @returns `true` if the effect successfully applies; `false` otherwise + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!target.isGrounded()) { + globalScene.queueMessage(i18next.t("moveTriggers:fallDown", { targetPokemonName: getPokemonNameWithAffix(target) })); + } + return super.apply(user, target, move, args); + } +} + /** * Adds the appropriate battler tag for Gulp Missile when Surf or Dive is used. * @extends MoveEffectAttr @@ -9646,7 +9671,7 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES) .unimplemented(), new AttackMove(Moves.SMACK_DOWN, PokemonType.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) - .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) + .attr(FallDownAttr) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .attr(HitsTagAttr, BattlerTagType.FLYING) @@ -10097,7 +10122,7 @@ export function initMoves() { .triageMove(), new AttackMove(Moves.THOUSAND_ARROWS, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) - .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) + .attr(FallDownAttr) .attr(HitsTagAttr, BattlerTagType.FLYING) .attr(HitsTagAttr, BattlerTagType.FLOATING) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) From 585f040057d0eef323918bb28b46981252da9aa4 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:25:14 -0700 Subject: [PATCH 07/48] [Test] Fix Chilly Reception Test Ability Overrides (#5543) * Fix ability overrides * Remove extraneous resets --- test/moves/chilly_reception.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts index f90aaf6bb02..39342a921b6 100644 --- a/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -27,8 +27,8 @@ describe("Moves - Chilly Reception", () => { .battleType("single") .moveset([Moves.CHILLY_RECEPTION, Moves.SNOWSCAPE]) .enemyMoveset(Array(4).fill(Moves.SPLASH)) - .enemyAbility(Abilities.NONE) - .ability(Abilities.NONE); + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.BALL_FETCH); }); it("should still change the weather if user can't switch out", async () => { @@ -72,7 +72,6 @@ describe("Moves - Chilly Reception", () => { game.override .battleType("single") .enemyMoveset([Moves.CHILLY_RECEPTION, Moves.TACKLE]) - .enemyAbility(Abilities.NONE) .moveset(Array(4).fill(Moves.SPLASH)); await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); @@ -89,7 +88,6 @@ describe("Moves - Chilly Reception", () => { .battleType("single") .startingWave(8) .enemyMoveset(Array(4).fill(Moves.CHILLY_RECEPTION)) - .enemyAbility(Abilities.NONE) .enemySpecies(Species.MAGIKARP) .moveset([Moves.SPLASH, Moves.THUNDERBOLT]); From b3c7300c37ce0b7a13e54e12abe3df91f28f936c Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:15:12 +0100 Subject: [PATCH 08/48] [Sprite] Fixing the naming issue in exp-sprite.json +Disabling few problematic exp's (#5526) * fixing the naming in exp-sprite.json * Did the same thing to 931 * Undo for 3 pokemons due to exp animation quality. * Corrected the Indicator for the exp being disabled * Charcadet line exp disable --- public/exp-sprites.json | 256 ++++++++++++++++++++-------------------- 1 file changed, 129 insertions(+), 127 deletions(-) diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 50e10a8822d..c83fb910010 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -13,10 +13,10 @@ "1005", "1006", "1006", - "1007-apex", - "1007-apex", - "1008-ultimate", - "1008-ultimate", + "1007-apex-build-Disabled", + "1007-apex-build-Disabled", + "1008-ultimate-mode-Disabled", + "1008-ultimate-mode-Disabled", "115-mega", "115-mega", "127-mega", @@ -185,9 +185,9 @@ "531-mega", "569-gigantamax", "569-gigantamax", - "6-mega", - "6-mega", "6-mega-x", + "6-mega-x", + "6-mega-y", "6-mega-y", "6058", "6058", @@ -825,8 +825,8 @@ "873", "874", "874", - "875-no", - "875-no", + "875-no-ice", + "875-no-ice", "875", "875", "876-female", @@ -963,26 +963,26 @@ "929", "930", "930", - "931-blue", - "931-blue", - "931-green", - "931-green", - "931-white", - "931-white", - "931-yellow", - "931-yellow", + "931-blue-plumage-Disabled", + "931-blue-plumage-Disabled", + "931-green-plumage-Disabled", + "931-green-plumage-Disabled", + "931-white-plumage-Disabled", + "931-white-plumage-Disabled", + "931-yellow-plumage-Disabled", + "931-yellow-plumage-Disabled", "932", "932", "933", "933", "934", "934", - "935", - "935", - "936", - "936", - "937", - "937", + "935-Disabled", + "935-Disabled", + "936-Disabled", + "936-Disabled", + "937-Disabled", + "937-Disabled", "938", "938", "939", @@ -1073,6 +1073,8 @@ "978-droopy", "978-stretchy", "978-stretchy", + "979-Disabled", + "979-Disabled", "980", "980", "981", @@ -1131,10 +1133,10 @@ "1005b", "1006b", "1006b", - "1007b-apex", - "1007b-apex", - "1008b-ultimate", - "1008b-ultimate", + "1007b-apex-build-Disabled", + "1007b-apex-build-Disabled", + "1008b-ultimate-mode-Disabled", + "1008b-ultimate-mode-Disabled", "115b-mega", "115b-mega", "127b-mega", @@ -1303,9 +1305,9 @@ "531b-mega", "569b-gigantamax", "569b-gigantamax", - "6b-mega", - "6b-mega", "6b-mega-x", + "6b-mega-x", + "6b-mega-y", "6b-mega-y", "6058b", "6058b", @@ -1943,8 +1945,8 @@ "873b", "874b", "874b", - "875b-no", - "875b-no", + "875b-no-ice", + "875b-no-ice", "875b", "875b", "876b-female", @@ -2083,26 +2085,26 @@ "929b", "930b", "930b", - "931b-blue", - "931b-blue", - "931b-green", - "931b-green", - "931b-white", - "931b-white", - "931b-yellow", - "931b-yellow", + "931b-blue-plumage-Disabled", + "931b-blue-plumage-Disabled", + "931b-green-plumage-Disabled", + "931b-green-plumage-Disabled", + "931b-white-plumage-Disabled", + "931b-white-plumage-Disabled", + "931b-yellow-plumage-Disabled", + "931b-yellow-plumage-Disabled", "932b", "932b", "933b", "933b", "934b", "934b", - "935b", - "935b", - "936b", - "936b", - "937b", - "937b", + "935b-Disabled", + "935b-Disabled", + "936b-Disabled", + "936b-Disabled", + "937b-Disabled", + "937b-Disabled", "938b", "938b", "939b", @@ -2251,10 +2253,10 @@ "1005sb", "1006sb", "1006sb", - "1007sb-apex", - "1007sb-apex", - "1008sb-ultimate", - "1008sb-ultimate", + "1007sb-apex-build-Disabled", + "1007sb-apex-build-Disabled", + "1008sb-ultimate-mode-Disabled", + "1008sb-ultimate-mode-Disabled", "115sb-mega", "115sb-mega", "127sb-mega", @@ -3063,8 +3065,8 @@ "873sb", "874sb", "874sb", - "875sb-no", - "875sb-no", + "875sb-no-ice", + "875sb-no-ice", "875sb", "875sb", "876sb-female", @@ -3203,26 +3205,26 @@ "929sb", "930sb", "930sb", - "931sb-blue", - "931sb-blue", - "931sb-green", - "931sb-green", - "931sb-white", - "931sb-white", - "931sb-yellow", - "931sb-yellow", + "931sb-blue-plumage-Disabled", + "931sb-blue-plumage-Disabled", + "931sb-green-plumage-Disabled", + "931sb-green-plumage-Disabled", + "931sb-white-plumage-Disabled", + "931sb-white-plumage-Disabled", + "931sb-yellow-plumage-Disabled", + "931sb-yellow-plumage-Disabled", "932sb", "932sb", "933sb", "933sb", "934sb", "934sb", - "935sb", - "935sb", - "936sb", - "936sb", - "937sb", - "937sb", + "935sb-Disabled", + "935sb-Disabled", + "936sb-Disabled", + "936sb-Disabled", + "937sb-Disabled", + "937sb-Disabled", "938sb", "938sb", "939sb", @@ -3376,10 +3378,10 @@ "1005s", "1006s", "1006s", - "1007s-apex", - "1007s-apex", - "1008s-ultimate", - "1008s-ultimate", + "1007s-apex-build-Disabled", + "1007s-apex-build-Disabled", + "1008s-ultimate-mode-Disabled", + "1008s-ultimate-mode-Disabled", "115s-mega", "115s-mega", "127s-mega", @@ -4188,8 +4190,8 @@ "873s", "874s", "874s", - "875s-no", - "875s-no", + "875s-no-ice", + "875s-no-ice", "875s", "875s", "876s-female", @@ -4328,26 +4330,26 @@ "929s", "930s", "930s", - "931s-blue", - "931s-blue", - "931s-green", - "931s-green", - "931s-white", - "931s-white", - "931s-yellow", - "931s-yellow", + "931s-blue-plumage-Disabled", + "931s-blue-plumage-Disabled", + "931s-green-plumage-Disabled", + "931s-green-plumage-Disabled", + "931s-white-plumage-Disabled", + "931s-white-plumage-Disabled", + "931s-yellow-plumage-Disabled", + "931s-yellow-plumage-Disabled", "932s", "932s", "933s", "933s", "934s", "934s", - "935s", - "935s", - "936s", - "936s", - "937s", - "937s", + "935s-Disabled", + "935s-Disabled", + "936s-Disabled", + "936s-Disabled", + "937s-Disabled", + "937s-Disabled", "938s", "938s", "939s", @@ -4438,6 +4440,8 @@ "978s-droopy", "978s-stretchy", "978s-stretchy", + "979s-Disabled", + "979s-Disabled", "980s", "980s", "981s", @@ -4485,11 +4489,10 @@ "1000", "1001", "1004", - "1007-apex", - "1007-apex", - "1007-apex", - "1007-apex", - "1008-ultimate", + "1007-apex-build-Disabled", + "1007-apex-build-Disabled", + "1008-ultimate-mode-Disabled", + "1008-ultimate-mode-Disabled", "127-mega", "142-mega", "150-mega", @@ -4698,21 +4701,21 @@ "933_3", "933_3", "934", - "935", - "935_3", - "935_3", - "936_1", - "936_1", - "936_2", - "936_2", - "936_3", - "936_3", - "937_1", - "937_1", - "937_2", - "937_2", - "937_3", - "937_3", + "935-Disabled", + "935_3-Disabled", + "935_3-Disabled", + "936_1-Disabled", + "936_1-Disabled", + "936_2-Disabled", + "936_2-Disabled", + "936_3-Disabled", + "936_3-Disabled", + "937_1-Disabled", + "937_1-Disabled", + "937_2-Disabled", + "937_2-Disabled", + "937_3-Disabled", + "937_3-Disabled", "94-mega_1", "94-mega_1", "94-mega_2", @@ -4755,11 +4758,10 @@ "1000b", "1001b", "1004b", - "1007b-apex", - "1007b-apex", - "1007b-apex", - "1007b-apex", - "1008b-ultimate", + "1007b-apex-build-Disabled", + "1007b-apex-build-Disabled", + "1008b-ultimate-mode-Disabled", + "1008b-ultimate-mode-Disabled", "127b-mega", "142b-mega", "150b-mega", @@ -4920,24 +4922,24 @@ "932b", "933b", "934b", - "935_1b", - "935_1b", - "935_2b", - "935_2b", - "935_3b", - "935_3b", - "936_1b", - "936_1b", - "936_2b", - "936_2b", - "936_3b", - "936_3b", - "937_1b", - "937_1b", - "937_2b", - "937_2b", - "937_3b", - "937_3b", + "935_1b-Disabled", + "935_1b-Disabled", + "935_2b-Disabled", + "935_2b-Disabled", + "935_3b-Disabled", + "935_3b-Disabled", + "936_1b-Disabled", + "936_1b-Disabled", + "936_2b-Disabled", + "936_2b-Disabled", + "936_3b-Disabled", + "936_3b-Disabled", + "937_1b-Disabled", + "937_1b-Disabled", + "937_2b-Disabled", + "937_2b-Disabled", + "937_3b-Disabled", + "937_3b-Disabled", "94b-mega", "948b", "949b", From 17e71a1b8affcac6def2fb180b8b53064c5384f5 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:26:49 -0700 Subject: [PATCH 09/48] [Bug] Fix Poison Heal Crash on beta (#5544) Fix !== null uses --- src/data/ability.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index ab78d1dd06c..d9e29c5506c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3860,7 +3860,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { } override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return (pokemon.status !== null) && this.effects.includes(pokemon.status.effect) && !pokemon.isFullHp(); + return !Utils.isNullOrUndefined(pokemon.status) && this.effects.includes(pokemon.status.effect) && !pokemon.isFullHp(); } /** @@ -4103,7 +4103,7 @@ export class FetchBallAbAttr extends PostTurnAbAttr { } override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return !simulated && globalScene.currentBattle.lastUsedPokeball !== null && !!pokemon.isPlayer; + return !simulated && !Utils.isNullOrUndefined(globalScene.currentBattle.lastUsedPokeball) && !!pokemon.isPlayer; } /** From 66965bf7e29f1bc9c136451565870ab4da0300d4 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:37:16 -0700 Subject: [PATCH 10/48] [Bug] Fix Slow Start Message being Deferred (#5534) Fix deferred message --- src/data/battler-tags.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 43a7072fd12..7ff74d893b6 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1922,10 +1922,6 @@ export class SlowStartTag extends AbilityBattlerTag { i18next.t("battlerTags:slowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }), - null, - false, - null, - true, ); } From c792d5e7046f06db415078854a6a4cc2bbb007be Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Thu, 20 Mar 2025 15:53:27 -0400 Subject: [PATCH 11/48] [Balance] Changes to several trainer classes (#5505) * Changes to Biker, Baker, Beauty, Cyclist, Parasol Lady, Hex Maniac * Linting and extra beauty mons * Further changes * Find to some --------- Co-authored-by: damocleas --- src/data/balance/biomes.ts | 28 +++++---- src/data/trainer-config.ts | 126 ++++++++++++++++++++++++++++++++++--- 2 files changed, 134 insertions(+), 20 deletions(-) diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 71a48162e57..a4e051d80c9 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1680,7 +1680,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.METROPOLIS]: { - [BiomePoolTier.COMMON]: [ TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER ], + [BiomePoolTier.COMMON]: [ TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER, TrainerType.BEAUTY ], [BiomePoolTier.UNCOMMON]: [ TrainerType.BREEDER, TrainerType.DEPOT_AGENT, TrainerType.GUITARIST ], [BiomePoolTier.RARE]: [ TrainerType.ARTIST ], [BiomePoolTier.SUPER_RARE]: [], @@ -1713,7 +1713,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.SWAMP]: { - [BiomePoolTier.COMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY ], [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], @@ -1724,7 +1724,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.BEACH]: { - [BiomePoolTier.COMMON]: [ TrainerType.FISHERMAN, TrainerType.PARASOL_LADY, TrainerType.SAILOR ], + [BiomePoolTier.COMMON]: [ TrainerType.FISHERMAN, TrainerType.SAILOR ], [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BREEDER ], [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], @@ -1735,7 +1735,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.LAKE]: { - [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.FISHERMAN ], + [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.FISHERMAN, TrainerType.PARASOL_LADY ], [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], @@ -1790,7 +1790,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.DESERT]: { - [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST ], + [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST, TrainerType.BACKPACKER ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], @@ -1812,8 +1812,8 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.MEADOW]: { - [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BREEDER ], + [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY, TrainerType.BEAUTY ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BREEDER, TrainerType.BAKER ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1879,7 +1879,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.RUINS]: { [BiomePoolTier.COMMON]: [ TrainerType.PSYCHIC, TrainerType.SCIENTIST ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BLACK_BELT ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BLACK_BELT, TrainerType.HEX_MANIAC ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -7165,14 +7165,18 @@ export function initBiomes() { [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.COMMON ] + [ Biome.JUNGLE, BiomePoolTier.COMMON ], + [ Biome.DESERT, BiomePoolTier.COMMON ] ] ], [ TrainerType.BAKER, [ - [ Biome.SLUM, BiomePoolTier.UNCOMMON ] + [ Biome.SLUM, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] ] ], [ TrainerType.BEAUTY, [ + [ Biome.METROPOLIS, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ]], [ TrainerType.BIKER, [ @@ -7247,7 +7251,8 @@ export function initBiomes() { ] ], [ TrainerType.PARASOL_LADY, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.SWAMP, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], @@ -7313,6 +7318,7 @@ export function initBiomes() { ] ], [ TrainerType.HEX_MANIAC, [ + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] ] ], diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 3884aa05b13..ffe5cdfe04c 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -23,6 +23,7 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { Gender } from "#app/data/gender"; import { signatureSpecies } from "./balance/signature-species"; +import { Abilities } from "#enums/abilities"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; @@ -1811,12 +1812,92 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BAKER]: new TrainerConfig(++t) .setEncounterBgm(TrainerType.CLERK) .setMoneyMultiplier(1.35) - .setSpeciesFilter(s => s.isOfType(PokemonType.GRASS) || s.isOfType(PokemonType.FIRE)), - [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), + .setSpeciesFilter( + s => + [s.ability1, s.ability2, s.abilityHidden].some( + a => + !!a && + [ + Abilities.WHITE_SMOKE, + Abilities.GLUTTONY, + Abilities.HONEY_GATHER, + Abilities.HARVEST, + Abilities.CHEEK_POUCH, + Abilities.SWEET_VEIL, + Abilities.RIPEN, + Abilities.PURIFYING_SALT, + Abilities.WELL_BAKED_BODY, + Abilities.SUPERSWEET_SYRUP, + Abilities.HOSPITALITY, + ].includes(a), + ) || + s + .getLevelMoves() + .some(plm => + [Moves.SOFT_BOILED, Moves.SPORE, Moves.MILK_DRINK, Moves.OVERHEAT, Moves.TEATIME].includes(plm[1]), + ), + ), // Mons with baking related abilities or who learn Overheat, Teatime, Milk Drink, Spore, or Soft-Boiled by level + [TrainerType.BEAUTY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.PARASOL_LADY) + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, + trainerPartyTemplates.THREE_AVG_SAME, + trainerPartyTemplates.THREE_AVG, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.ONE_STRONG, + ) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.MEOWTH, + Species.GOLDEEN, + Species.MAREEP, + Species.MARILL, + Species.SKITTY, + Species.GLAMEOW, + Species.PURRLOIN, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.SMOOCHUM, + Species.ROSELIA, + Species.LUVDISC, + Species.BLITZLE, + Species.SEWADDLE, + Species.PETILIL, + Species.MINCCINO, + Species.GOTHITA, + Species.SPRITZEE, + Species.FLITTLE, + ], + [TrainerPoolTier.RARE]: [ + Species.FEEBAS, + Species.FURFROU, + Species.SALANDIT, + Species.BRUXISH, + Species.HATENNA, + Species.SNOM, + Species.ALOLA_VULPIX, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.CLAMPERL, Species.AMAURA, Species.SYLVEON, Species.GOOMY, Species.POPPLIO], + }), [TrainerType.BIKER]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) .setEncounterBgm(TrainerType.ROUGHNECK) - .setSpeciesFilter(s => s.isOfType(PokemonType.POISON)), + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [Species.EKANS, Species.KOFFING, Species.CROAGUNK, Species.VENIPEDE, Species.SCRAGGY], + [TrainerPoolTier.UNCOMMON]: [ + Species.GRIMER, + Species.VOLTORB, + Species.TEDDIURSA, + Species.MAGBY, + Species.SKORUPI, + Species.SANDILE, + Species.PAWNIARD, + Species.SHROODLE, + ], + [TrainerPoolTier.RARE]: [Species.VAROOM, Species.CYCLIZAR], + }), [TrainerType.BLACK_BELT]: new TrainerConfig(++t) .setHasGenders("Battle Girl", TrainerType.PSYCHIC) .setHasDouble("Crush Kin") @@ -1918,9 +1999,15 @@ export const trainerConfigs: TrainerConfigs = { .setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND], - [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL], - [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA], + [TrainerPoolTier.COMMON]: [Species.DODUO, Species.PICHU, Species.TAILLOW, Species.STARLY, Species.PONYTA], + [TrainerPoolTier.UNCOMMON]: [ + Species.ELECTRIKE, + Species.SHINX, + Species.BLITZLE, + Species.DUCKLETT, + Species.WATTREL, + ], + [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA, Species.SKIDDO], [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY], }), [TrainerType.DANCER]: new TrainerConfig(++t) @@ -1936,7 +2023,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW], [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS], [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO], - [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO], + [TrainerPoolTier.SUPER_RARE]: [Species.QUAXLY, Species.JANGMO_O], }), [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK), [TrainerType.DOCTOR]: new TrainerConfig(++t) @@ -2074,7 +2161,7 @@ export const trainerConfigs: TrainerConfigs = { trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG, ) - .setSpeciesFilter(s => s.isOfType(PokemonType.GHOST)), + .setSpeciesFilter(s => s.isOfType(PokemonType.GHOST) || s.isOfType(PokemonType.PSYCHIC)), [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), [TrainerType.OFFICER]: new TrainerConfig(++t) .setMoneyMultiplier(1.55) @@ -2104,7 +2191,28 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PARASOL_LADY]: new TrainerConfig(++t) .setMoneyMultiplier(1.55) .setEncounterBgm(TrainerType.PARASOL_LADY) - .setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.ONE_STRONG, + ) + .setSpeciesFilter( + s => + [s.ability1, s.ability2, s.abilityHidden].some( + a => + !!a && + [ + Abilities.DRIZZLE, + Abilities.SWIFT_SWIM, + Abilities.HYDRATION, + Abilities.RAIN_DISH, + Abilities.DRY_SKIN, + Abilities.WIND_POWER, + ].includes(a), + ) || s.getLevelMoves().some(plm => plm[1] === Moves.RAIN_DANCE), + ), // Mons with rain abilities or who learn Rain Dance by level [TrainerType.PILOT]: new TrainerConfig(++t) .setEncounterBgm(TrainerType.CLERK) .setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), From 87b78e6b706924d435f57924c991d9705b93972b Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 22 Mar 2025 15:47:41 -0400 Subject: [PATCH 12/48] [Balance] [Move] Made more moves callable with Metronome, Assist, Sleep Talk, and Copycat (#5549) Update invalid-moves.ts --- src/data/moves/invalid-moves.ts | 104 -------------------------------- 1 file changed, 104 deletions(-) diff --git a/src/data/moves/invalid-moves.ts b/src/data/moves/invalid-moves.ts index 50f815b9e58..64052902d9d 100644 --- a/src/data/moves/invalid-moves.ts +++ b/src/data/moves/invalid-moves.ts @@ -3,144 +3,47 @@ import { Moves } from "#enums/moves"; /** Set of moves that cannot be called by {@linkcode Moves.METRONOME Metronome} */ export const invalidMetronomeMoves: ReadonlySet = new Set([ Moves.AFTER_YOU, - Moves.APPLE_ACID, - Moves.ARMOR_CANNON, Moves.ASSIST, - Moves.ASTRAL_BARRAGE, - Moves.AURA_WHEEL, Moves.BANEFUL_BUNKER, Moves.BEAK_BLAST, - Moves.BEHEMOTH_BASH, - Moves.BEHEMOTH_BLADE, Moves.BELCH, Moves.BESTOW, - Moves.BLAZING_TORQUE, - Moves.BODY_PRESS, - Moves.BRANCH_POKE, - Moves.BREAKING_SWIPE, - Moves.CELEBRATE, - Moves.CHATTER, - Moves.CHILLING_WATER, - Moves.CHILLY_RECEPTION, - Moves.CLANGOROUS_SOUL, - Moves.COLLISION_COURSE, - Moves.COMBAT_TORQUE, Moves.COMEUPPANCE, Moves.COPYCAT, Moves.COUNTER, - Moves.COVET, Moves.CRAFTY_SHIELD, - Moves.DECORATE, Moves.DESTINY_BOND, Moves.DETECT, - Moves.DIAMOND_STORM, - Moves.DOODLE, - Moves.DOUBLE_IRON_BASH, - Moves.DOUBLE_SHOCK, - Moves.DRAGON_ASCENT, - Moves.DRAGON_ENERGY, - Moves.DRUM_BEATING, - Moves.DYNAMAX_CANNON, - Moves.ELECTRO_DRIFT, Moves.ENDURE, - Moves.ETERNABEAM, - Moves.FALSE_SURRENDER, Moves.FEINT, - Moves.FIERY_WRATH, - Moves.FILLET_AWAY, Moves.FLEUR_CANNON, Moves.FOCUS_PUNCH, Moves.FOLLOW_ME, - Moves.FREEZE_SHOCK, - Moves.FREEZING_GLARE, - Moves.GLACIAL_LANCE, - Moves.GRAV_APPLE, Moves.HELPING_HAND, - Moves.HOLD_HANDS, - Moves.HYPER_DRILL, - Moves.HYPERSPACE_FURY, - Moves.HYPERSPACE_HOLE, - Moves.ICE_BURN, Moves.INSTRUCT, - Moves.JET_PUNCH, - Moves.JUNGLE_HEALING, Moves.KINGS_SHIELD, - Moves.LIFE_DEW, - Moves.LIGHT_OF_RUIN, - Moves.MAKE_IT_RAIN, - Moves.MAGICAL_TORQUE, Moves.MAT_BLOCK, Moves.ME_FIRST, - Moves.METEOR_ASSAULT, Moves.METRONOME, Moves.MIMIC, - Moves.MIND_BLOWN, Moves.MIRROR_COAT, Moves.MIRROR_MOVE, - Moves.MOONGEIST_BEAM, - Moves.NATURE_POWER, - Moves.NATURES_MADNESS, - Moves.NOXIOUS_TORQUE, Moves.OBSTRUCT, - Moves.ORDER_UP, - Moves.ORIGIN_PULSE, - Moves.OVERDRIVE, - Moves.PHOTON_GEYSER, - Moves.PLASMA_FISTS, - Moves.POPULATION_BOMB, - Moves.POUNCE, - Moves.POWER_SHIFT, - Moves.PRECIPICE_BLADES, Moves.PROTECT, - Moves.PYRO_BALL, Moves.QUASH, Moves.QUICK_GUARD, - Moves.RAGE_FIST, Moves.RAGE_POWDER, - Moves.RAGING_BULL, - Moves.RAGING_FURY, - Moves.RELIC_SONG, Moves.REVIVAL_BLESSING, - Moves.RUINATION, - Moves.SALT_CURE, - Moves.SECRET_SWORD, - Moves.SHED_TAIL, Moves.SHELL_TRAP, Moves.SILK_TRAP, Moves.SKETCH, Moves.SLEEP_TALK, - Moves.SNAP_TRAP, - Moves.SNARL, Moves.SNATCH, Moves.SNORE, - Moves.SNOWSCAPE, - Moves.SPECTRAL_THIEF, - Moves.SPICY_EXTRACT, Moves.SPIKY_SHIELD, - Moves.SPIRIT_BREAK, Moves.SPOTLIGHT, - Moves.STEAM_ERUPTION, - Moves.STEEL_BEAM, - Moves.STRANGE_STEAM, Moves.STRUGGLE, - Moves.SUNSTEEL_STRIKE, - Moves.SURGING_STRIKES, - Moves.SWITCHEROO, - Moves.TECHNO_BLAST, - Moves.TERA_STARSTORM, - Moves.THIEF, - Moves.THOUSAND_ARROWS, - Moves.THOUSAND_WAVES, - Moves.THUNDER_CAGE, - Moves.THUNDEROUS_KICK, - Moves.TIDY_UP, - Moves.TRAILBLAZE, Moves.TRANSFORM, - Moves.TRICK, - Moves.TWIN_BEAM, - Moves.V_CREATE, - Moves.WICKED_BLOW, - Moves.WICKED_TORQUE, Moves.WIDE_GUARD, ]); @@ -157,7 +60,6 @@ export const invalidAssistMoves: ReadonlySet = new Set([ Moves.CIRCLE_THROW, Moves.COPYCAT, Moves.COUNTER, - Moves.COVET, Moves.DESTINY_BOND, Moves.DETECT, Moves.DIG, @@ -192,7 +94,6 @@ export const invalidAssistMoves: ReadonlySet = new Set([ Moves.SPOTLIGHT, Moves.STRUGGLE, Moves.SWITCHEROO, - Moves.THIEF, Moves.TRANSFORM, Moves.TRICK, Moves.WHIRLWIND, @@ -208,7 +109,6 @@ export const invalidSleepTalkMoves: ReadonlySet = new Set([ Moves.COPYCAT, Moves.DIG, Moves.DIVE, - Moves.DYNAMAX_CANNON, Moves.FREEZE_SHOCK, Moves.FLY, Moves.FOCUS_PUNCH, @@ -238,15 +138,12 @@ export const invalidCopycatMoves: ReadonlySet = new Set([ Moves.ASSIST, Moves.BANEFUL_BUNKER, Moves.BEAK_BLAST, - Moves.BEHEMOTH_BASH, - Moves.BEHEMOTH_BLADE, Moves.BESTOW, Moves.CELEBRATE, Moves.CHATTER, Moves.CIRCLE_THROW, Moves.COPYCAT, Moves.COUNTER, - Moves.COVET, Moves.DESTINY_BOND, Moves.DETECT, Moves.DRAGON_TAIL, @@ -274,7 +171,6 @@ export const invalidCopycatMoves: ReadonlySet = new Set([ Moves.SPOTLIGHT, Moves.STRUGGLE, Moves.SWITCHEROO, - Moves.THIEF, Moves.TRANSFORM, Moves.TRICK, Moves.WHIRLWIND, From d0a9672e91de1c7fcf87d1f81eede4faa7dc6a86 Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 22 Mar 2025 16:18:08 -0400 Subject: [PATCH 13/48] [Balance] [Move] Add Fleur Cannon as a Metronome callableove (#5551) * Update invalid-moves.ts * forgot fleur cannon --- src/data/moves/invalid-moves.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/moves/invalid-moves.ts b/src/data/moves/invalid-moves.ts index 64052902d9d..7284831528a 100644 --- a/src/data/moves/invalid-moves.ts +++ b/src/data/moves/invalid-moves.ts @@ -16,7 +16,6 @@ export const invalidMetronomeMoves: ReadonlySet = new Set([ Moves.DETECT, Moves.ENDURE, Moves.FEINT, - Moves.FLEUR_CANNON, Moves.FOCUS_PUNCH, Moves.FOLLOW_ME, Moves.HELPING_HAND, From 4b8f1df8cd4bc98b985f05931befa11183e0443d Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 22 Mar 2025 14:46:58 -0700 Subject: [PATCH 14/48] [Bug] Add list of uncallable moves for Mirror Move (#5552) * Add list of uncallable moves for Mirror Move * Mirror Move now respects the uncallable moves list --------- Co-authored-by: damocleas --- src/data/moves/invalid-moves.ts | 66 +++++++++++++++++++++++++++++++++ src/data/moves/move.ts | 7 ++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/data/moves/invalid-moves.ts b/src/data/moves/invalid-moves.ts index 7284831528a..5cd45de7939 100644 --- a/src/data/moves/invalid-moves.ts +++ b/src/data/moves/invalid-moves.ts @@ -174,3 +174,69 @@ export const invalidCopycatMoves: ReadonlySet = new Set([ Moves.TRICK, Moves.WHIRLWIND, ]); + +export const invalidMirrorMoveMoves: ReadonlySet = new Set([ + Moves.ACUPRESSURE, + Moves.AFTER_YOU, + Moves.AROMATIC_MIST, + Moves.BEAK_BLAST, + Moves.BELCH, + Moves.CHILLY_RECEPTION, + Moves.COACHING, + Moves.CONVERSION_2, + Moves.COUNTER, + Moves.CRAFTY_SHIELD, + Moves.CURSE, + Moves.DECORATE, + Moves.DOODLE, + Moves.DOOM_DESIRE, + Moves.DRAGON_CHEER, + Moves.ELECTRIC_TERRAIN, + Moves.FINAL_GAMBIT, + Moves.FLORAL_HEALING, + Moves.FLOWER_SHIELD, + Moves.FOCUS_PUNCH, + Moves.FUTURE_SIGHT, + Moves.GEAR_UP, + Moves.GRASSY_TERRAIN, + Moves.GRAVITY, + Moves.GUARD_SPLIT, + Moves.HAIL, + Moves.HAZE, + Moves.HEAL_PULSE, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.INSTRUCT, + Moves.ION_DELUGE, + Moves.MAGNETIC_FLUX, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.MIMIC, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.MIST, + Moves.MISTY_TERRAIN, + Moves.MUD_SPORT, + Moves.PERISH_SONG, + Moves.POWER_SPLIT, + Moves.PSYCH_UP, + Moves.PSYCHIC_TERRAIN, + Moves.PURIFY, + Moves.QUICK_GUARD, + Moves.RAIN_DANCE, + Moves.REFLECT_TYPE, + Moves.ROLE_PLAY, + Moves.ROTOTILLER, + Moves.SANDSTORM, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SNOWSCAPE, + Moves.SPIT_UP, + Moves.SPOTLIGHT, + Moves.STRUGGLE, + Moves.SUNNY_DAY, + Moves.TEATIME, + Moves.TRANSFORM, + Moves.WATER_SPORT, + Moves.WIDE_GUARD, +]); diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 3d80b6b3f4c..c7b5b4aec6b 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -125,7 +125,7 @@ import { MoveTarget } from "#enums/MoveTarget"; import { MoveFlags } from "#enums/MoveFlags"; import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; import { MultiHitType } from "#enums/MultiHitType"; -import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidSleepTalkMoves } from "./invalid-moves"; +import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves"; type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; @@ -6966,7 +6966,8 @@ export class CopyMoveAttr extends CallMoveAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { if (this.mirrorMove) { - return target.getMoveHistory().length !== 0; + const lastMove = target.getLastXMoves()[0]?.move; + return !!lastMove && !this.invalidMoves.has(lastMove); } else { const lastMove = globalScene.currentBattle.lastMove; return lastMove !== undefined && !this.invalidMoves.has(lastMove); @@ -8562,7 +8563,7 @@ export function initMoves() { new SelfStatusMove(Moves.METRONOME, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(RandomMoveAttr, invalidMetronomeMoves), new StatusMove(Moves.MIRROR_MOVE, PokemonType.FLYING, -1, 20, -1, 0, 1) - .attr(CopyMoveAttr, true), + .attr(CopyMoveAttr, true, invalidMirrorMoveMoves), new AttackMove(Moves.SELF_DESTRUCT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 100, 5, -1, 0, 1) .attr(SacrificialAttr) .makesContact(false) From 1e876ec595195d4094d3cccc076c8bd7d98a5099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Serrado=20Marques?= Date: Sun, 23 Mar 2025 19:07:14 +0000 Subject: [PATCH 15/48] [BUG] fixes #5472 - transform on reload (#5508) * [BUG] fixes #5472 - transform on reload * Fix the bug where transformed pokemon failed to load sprite on reload if it was not the base form * Now properly loads the transformed sprite assets during summon phase --- src/field/pokemon.ts | 2 +- src/phases/summon-phase.ts | 4 ++ src/system/pokemon-data.ts | 29 +++++++++++++- test/abilities/imposter.test.ts | 59 +++++++++++++++++++++++++++ test/moves/transform.test.ts | 70 ++++++++++++++++++++++++++++++++- 5 files changed, 160 insertions(+), 4 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 890c6bab0d6..42fe1dc1010 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -5575,7 +5575,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.resetBattleSummonData(); if (this.summonDataPrimer) { - for (const k of Object.keys(this.summonData)) { + for (const k of Object.keys(this.summonDataPrimer)) { if (this.summonDataPrimer[k]) { this.summonData[k] = this.summonDataPrimer[k]; } diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts index 31cd2645e68..42463e7edb0 100644 --- a/src/phases/summon-phase.ts +++ b/src/phases/summon-phase.ts @@ -195,6 +195,10 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); pokemon.getSprite().clearTint(); pokemon.resetSummonData(); + // necessary to stay transformed during wild waves + if (pokemon.summonData?.speciesForm) { + pokemon.loadAssets(false); + } globalScene.time.delayedCall(1000, () => this.end()); }, }); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 4e694bc1189..76f5526e407 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -3,7 +3,7 @@ import { globalScene } from "#app/global-scene"; import type { Gender } from "../data/gender"; import type { Nature } from "#enums/nature"; import type { PokeballType } from "#enums/pokeball"; -import { getPokemonSpecies } from "../data/pokemon-species"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "../data/pokemon-species"; import { Status } from "../data/status-effect"; import Pokemon, { EnemyPokemon, PokemonMove, PokemonSummonData } from "../field/pokemon"; import { TrainerSlot } from "../data/trainer-config"; @@ -14,6 +14,7 @@ import { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import type { PokemonType } from "#enums/pokemon-type"; +import { getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; export default class PokemonData { public id: number; @@ -63,6 +64,7 @@ export default class PokemonData { public bossSegments?: number; public summonData: PokemonSummonData; + public summonDataSpeciesFormIndex: number; /** Data that can customize a Pokemon in non-standard ways from its Species */ public customPokemonData: CustomPokemonData; @@ -145,8 +147,9 @@ export default class PokemonData { this.moveset = sourcePokemon.moveset; if (!forHistory) { this.status = sourcePokemon.status; - if (this.player) { + if (this.player && sourcePokemon.summonData) { this.summonData = sourcePokemon.summonData; + this.summonDataSpeciesFormIndex = this.getSummonDataSpeciesFormIndex(); } } } else { @@ -170,6 +173,8 @@ export default class PokemonData { this.summonData.ability = source.summonData.ability; this.summonData.moveset = source.summonData.moveset?.map(m => PokemonMove.loadMove(m)); this.summonData.types = source.summonData.types; + this.summonData.speciesForm = source.summonData.speciesForm; + this.summonDataSpeciesFormIndex = source.summonDataSpeciesFormIndex; if (source.summonData.tags) { this.summonData.tags = source.summonData.tags?.map(t => loadBattlerTag(t)); @@ -213,8 +218,28 @@ export default class PokemonData { this, ); if (this.summonData) { + // when loading from saved session, recover summonData.speciesFrom and form index species object + // used to stay transformed on reload session + if (this.summonData.speciesForm) { + this.summonData.speciesForm = getPokemonSpeciesForm( + this.summonData.speciesForm.speciesId, + this.summonDataSpeciesFormIndex, + ); + } ret.primeSummonData(this.summonData); } return ret; } + + /** + * Method to save summon data species form index + * Necessary in case the pokemon is transformed + * to reload the correct form + */ + getSummonDataSpeciesFormIndex(): number { + if (this.summonData.speciesForm) { + return this.summonData.speciesForm.formIndex; + } + return 0; + } } diff --git a/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts index b4469cd9042..2c7302d04b7 100644 --- a/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -127,4 +127,63 @@ describe("Abilities - Imposter", () => { expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); }); + + it("should persist transformed attributes across reloads", async () => { + game.override.moveset([Moves.ABSORB]); + + await game.classicMode.startBattle([Species.DITTO]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(game.scene.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game.scene.currentBattle.waveIndex).toBe(2); + + await game.reload.reloadSession(); + + const playerReloaded = game.scene.getPlayerPokemon()!; + const playerMoveset = player.getMoveset(); + + expect(playerReloaded.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId); + expect(playerReloaded.getAbility()).toBe(enemy.getAbility()); + expect(playerReloaded.getGender()).toBe(enemy.getGender()); + + expect(playerReloaded.getStat(Stat.HP, false)).not.toBe(enemy.getStat(Stat.HP)); + for (const s of EFFECTIVE_STATS) { + expect(playerReloaded.getStat(s, false)).toBe(enemy.getStat(s, false)); + } + + expect(playerMoveset.length).toEqual(1); + expect(playerMoveset[0]?.moveId).toEqual(Moves.SPLASH); + }); + + it("should stay transformed with the correct form after reload", async () => { + game.override.moveset([Moves.ABSORB]); + game.override.enemySpecies(Species.UNOWN); + await game.classicMode.startBattle([Species.DITTO]); + + const enemy = game.scene.getEnemyPokemon()!; + + // change form + enemy.species.forms[5]; + enemy.species.formIndex = 5; + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(game.scene.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game.scene.currentBattle.waveIndex).toBe(2); + + await game.reload.reloadSession(); + + const playerReloaded = game.scene.getPlayerPokemon()!; + + expect(playerReloaded.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId); + expect(playerReloaded.getSpeciesForm().formIndex).toBe(enemy.getSpeciesForm().formIndex); + }); }); diff --git a/test/moves/transform.test.ts b/test/moves/transform.test.ts index 5140202a383..d37decf28f4 100644 --- a/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -6,6 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; +import { BattlerIndex } from "#app/battle"; // TODO: Add more tests once Transform is fully implemented describe("Moves - Transform", () => { @@ -58,7 +59,7 @@ describe("Moves - Transform", () => { } const playerMoveset = player.getMoveset(); - const enemyMoveset = player.getMoveset(); + const enemyMoveset = enemy.getMoveset(); expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { @@ -127,4 +128,71 @@ describe("Moves - Transform", () => { expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); }); + + it("should persist transformed attributes across reloads", async () => { + game.override.enemyMoveset([]).moveset([]); + + await game.classicMode.startBattle([Species.DITTO]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.changeMoveset(player, Moves.TRANSFORM); + game.move.changeMoveset(enemy, Moves.MEMENTO); + + game.move.select(Moves.TRANSFORM); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextWave(); + + expect(game.scene.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game.scene.currentBattle.waveIndex).toBe(2); + + await game.reload.reloadSession(); + + const playerReloaded = game.scene.getPlayerPokemon()!; + const playerMoveset = player.getMoveset(); + + expect(playerReloaded.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId); + expect(playerReloaded.getAbility()).toBe(enemy.getAbility()); + expect(playerReloaded.getGender()).toBe(enemy.getGender()); + + expect(playerReloaded.getStat(Stat.HP, false)).not.toBe(enemy.getStat(Stat.HP)); + for (const s of EFFECTIVE_STATS) { + expect(playerReloaded.getStat(s, false)).toBe(enemy.getStat(s, false)); + } + + expect(playerMoveset.length).toEqual(1); + expect(playerMoveset[0]?.moveId).toEqual(Moves.MEMENTO); + }); + + it("should stay transformed with the correct form after reload", async () => { + game.override.enemyMoveset([]).moveset([]); + game.override.enemySpecies(Species.DARMANITAN); + + await game.classicMode.startBattle([Species.DITTO]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + // change form + enemy.species.forms[1]; + enemy.species.formIndex = 1; + + game.move.changeMoveset(player, Moves.TRANSFORM); + game.move.changeMoveset(enemy, Moves.MEMENTO); + + game.move.select(Moves.TRANSFORM); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextWave(); + + expect(game.scene.getCurrentPhase()?.constructor.name).toBe("CommandPhase"); + expect(game.scene.currentBattle.waveIndex).toBe(2); + + await game.reload.reloadSession(); + + const playerReloaded = game.scene.getPlayerPokemon()!; + + expect(playerReloaded.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId); + expect(playerReloaded.getSpeciesForm().formIndex).toBe(enemy.getSpeciesForm().formIndex); + }); }); From 817095d8950d75c062c7c41ecf24c2f3c1bfe2d3 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 23 Mar 2025 13:47:51 -0700 Subject: [PATCH 16/48] [Bug] Fix #2769 Revival Blessing Softlock in doubles (#5141) * Properly handle cases where enemy switches in due to revival * Fix user ally using move when revived * Move revival blessing function to move.ts * Properly filter for the right switch phase to remove * Re-add bug fix * Add test --- src/data/moves/move.ts | 14 +++++++++++--- test/moves/revival_blessing.test.ts | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index c7b5b4aec6b..9d470b86186 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -16,6 +16,7 @@ import type { AttackMoveResult, TurnMove } from "../../field/pokemon"; import type Pokemon from "../../field/pokemon"; import { EnemyPokemon, + FieldPosition, HitResult, MoveResult, PlayerPokemon, @@ -6158,9 +6159,16 @@ export class RevivalBlessingAttr extends MoveEffectAttr { if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); - if (slotIndex <= 1) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); - } else if (allyPokemon.isFainted()) { + // Handle cases where revived pokemon needs to get switched in on same turn + if (allyPokemon.isFainted() || allyPokemon === pokemon) { + // Enemy switch phase should be removed and replaced with the revived pkmn switching in + globalScene.tryRemovePhase((phase: SwitchSummonPhase) => phase instanceof SwitchSummonPhase && phase.getPokemon() === pokemon); + // If the pokemon being revived was alive earlier in the turn, cancel its move + // (revived pokemon can't move in the turn they're brought back) + globalScene.findPhase((phase: MovePhase) => phase.pokemon === pokemon)?.cancel(); + if (user.fieldPosition === FieldPosition.CENTER) { + user.setFieldPosition(FieldPosition.LEFT); + } globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } } diff --git a/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts index 187b5e62e76..1ceb850edea 100644 --- a/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -114,4 +114,25 @@ describe("Moves - Revival Blessing", () => { expect(feebas.hp).toBe(toDmgValue(0.5 * feebas.getMaxHp())); expect(game.scene.getPlayerField()[0]).toBe(feebas); }); + + it("should not summon multiple pokemon to the same slot when reviving the enemy ally in doubles", async () => { + game.override + .battleType("double") + .enemyMoveset([ Moves.REVIVAL_BLESSING ]) + .moveset([ Moves.SPLASH ]) + .startingWave(25); // 2nd rival battle - must have 3+ pokemon + await game.classicMode.startBattle([ Species.ARCEUS, Species.GIRATINA ]); + + const enemyFainting = game.scene.getEnemyField()[0]; + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.killPokemon(enemyFainting); + + await game.phaseInterceptor.to("BerryPhase"); + await game.toNextTurn(); + // If there are incorrectly two switch phases into this slot, the fainted pokemon will end up in slot 3 + // Make sure it's still in slot 1 + expect(game.scene.getEnemyParty()[0]).toBe(enemyFainting); + }); }); From 40e1e7fd4eb3a852c92433683fbe7e11279a6055 Mon Sep 17 00:00:00 2001 From: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:59:19 -0400 Subject: [PATCH 17/48] [Bug] Fix Reviver Seed and endure triggering on indirect damage (#5182) * Create new turnData field for tracking damageResults, check for HitResult in Reviver Seed modifier * Optional chaining for cases like stealth rock * Adds HitResult.SELF for confusion to distinguish from indirect damage * Adds HitResult.SELF to damage sound effect switch * Cover edge case of salt cure, insert HitResult for ALL damage regardless of optional variable * Change Liquid Ooze HitResult to OTHER from HEAL * Adjust OHKO moves to not bypass endure or RSeed * Add tests for reviver seed * Fixes endure to no longer block indirect damage, updates weather damage to be HitResult.OTHER, adds/fixes unit test * Change destiny bond to HitResult.OTHER so it doesn't trigger rseed * Adds destiny bond unit test * Creates additional unit tests for endure * Rename SELF hitresult to CONFUSION * Update CONFUSION enum * Refactors implementation per Wlowscha's suggestions: removes damageSources array and preventEndure variable * Rename HitResult.OTHER to INDIRECT, create INDIRECT_KO for PSong/DBond, add functionality for INDIRECT_KO to damageanim/number handler * Fixes hit result for stealth rock * Removes unnecessary check, makes DamageResult default to EFFECTIVE, updates remaining damageAndUpdate calls to use INDIRECT * Refactors damageAndUpdate to replace optional parameters with object parameter * Fixes based on Kev's suggestions * Updates tsdocs for damageAndUpdate * Fix merge conflict --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- public/locales | 2 +- src/data/ability.ts | 12 +-- src/data/arena-tag.ts | 6 +- src/data/battler-tags.ts | 22 ++-- src/data/moves/move.ts | 19 ++-- src/field/damage-number-handler.ts | 1 + src/field/pokemon.ts | 79 +++++++------- src/modifier/modifier.ts | 3 +- src/phases/damage-anim-phase.ts | 6 +- src/phases/faint-phase.ts | 2 +- src/phases/pokemon-heal-phase.ts | 3 +- src/phases/weather-effect-phase.ts | 2 +- test/items/reviver_seed.test.ts | 159 +++++++++++++++++++++++++++++ test/moves/endure.test.ts | 39 +++++-- 14 files changed, 272 insertions(+), 83 deletions(-) create mode 100644 test/items/reviver_seed.test.ts diff --git a/public/locales b/public/locales index 6b3f37cb351..0e5c6096ba2 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 6b3f37cb351552721232f4dabefa17bddb5b9004 +Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b diff --git a/src/data/ability.ts b/src/data/ability.ts index d9e29c5506c..3a14ad1456d 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1064,7 +1064,7 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { } override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), { result: HitResult.INDIRECT }); attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); } @@ -3792,7 +3792,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { if (!simulated) { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; globalScene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); - pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), { result: HitResult.INDIRECT }); } } } @@ -4084,7 +4084,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { if (!simulated) { - opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER); + opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), { result: HitResult.INDIRECT }); globalScene.queueMessage(i18next.t("abilityTriggers:badDreams", { pokemonName: getPokemonNameWithAffix(opp) })); } } @@ -4567,7 +4567,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { if (!simulated) { - attacker!.damageAndUpdate(Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker!.damageAndUpdate(Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)), { result: HitResult.INDIRECT }); attacker!.turnData.damageTaken += Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)); } } @@ -4588,7 +4588,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage const damage = pokemon.turnData.attacksReceived[0].damage; - attacker.damageAndUpdate((damage), HitResult.OTHER); + attacker.damageAndUpdate((damage), { result: HitResult.INDIRECT }); attacker.turnData.damageTaken += damage; } } @@ -4989,7 +4989,7 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { (args[0] as Utils.NumberHolder).value = this.multiplier; pokemon.removeTag(this.tagType); if (this.recoilDamageFunc) { - pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); + pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), { result: HitResult.INDIRECT, ignoreSegments: true, ignoreFaintPhase: true }); } } } diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 6e8339dd54c..8f1d6b09a73 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -788,7 +788,7 @@ class SpikesTag extends ArenaTrapTag { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }), ); - pokemon.damageAndUpdate(damage, HitResult.OTHER); + pokemon.damageAndUpdate(damage, { result: HitResult.INDIRECT }); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; } @@ -982,7 +982,7 @@ class StealthRockTag extends ArenaTrapTag { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }), ); - pokemon.damageAndUpdate(damage, HitResult.OTHER); + pokemon.damageAndUpdate(damage, { result: HitResult.INDIRECT }); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; } @@ -1327,7 +1327,7 @@ class FireGrassPledgeTag extends ArenaTag { globalScene.unshiftPhase( new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM), ); - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8), { result: HitResult.INDIRECT }); }); return super.lapse(arena); diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 7ff74d893b6..4952488b48e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -757,7 +757,7 @@ export class ConfusedTag extends BattlerTag { ((((2 * pokemon.level) / 5 + 2) * 40 * atk) / def / 50 + 2) * (pokemon.randSeedIntRange(85, 100) / 100), ); globalScene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); - pokemon.damageAndUpdate(damage); + pokemon.damageAndUpdate(damage, { result: HitResult.CONFUSION }); pokemon.battleData.hitCount++; (globalScene.getCurrentPhase() as MovePhase).cancel(); } @@ -818,7 +818,7 @@ export class DestinyBondTag extends BattlerTag { pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon), }), ); - pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); + pokemon.damageAndUpdate(pokemon.hp, { result: HitResult.INDIRECT_KO, ignoreSegments: true }); return false; } } @@ -952,7 +952,7 @@ export class SeedTag extends BattlerTag { new CommonAnimPhase(source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED), ); - const damage = pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); + const damage = pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8), { result: HitResult.INDIRECT }); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); globalScene.unshiftPhase( new PokemonHealPhase( @@ -1029,7 +1029,7 @@ export class PowderTag extends BattlerTag { const cancelDamage = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelDamage); if (!cancelDamage.value) { - pokemon.damageAndUpdate(Math.floor(pokemon.getMaxHp() / 4), HitResult.OTHER); + pokemon.damageAndUpdate(Math.floor(pokemon.getMaxHp() / 4), { result: HitResult.INDIRECT }); } // "When the flame touched the powder\non the Pokémon, it exploded!" @@ -1082,7 +1082,7 @@ export class NightmareTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4), { result: HitResult.INDIRECT }); } } @@ -1440,7 +1440,7 @@ export abstract class DamagingTrapTag extends TrappedTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8), { result: HitResult.INDIRECT }); } } @@ -1644,7 +1644,7 @@ export class ContactDamageProtectedTag extends ProtectedTag { if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), { result: HitResult.INDIRECT }); } } } @@ -1810,7 +1810,7 @@ export class PerishSongTag extends BattlerTag { }), ); } else { - pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); + pokemon.damageAndUpdate(pokemon.hp, { result: HitResult.INDIRECT_KO, ignoreSegments: true }); } return ret; @@ -2240,7 +2240,7 @@ export class SaltCuredTag extends BattlerTag { if (!cancelled.value) { const pokemonSteelOrWater = pokemon.isOfType(PokemonType.STEEL) || pokemon.isOfType(PokemonType.WATER); - pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), { result: HitResult.INDIRECT }); globalScene.queueMessage( i18next.t("battlerTags:saltCuredLapse", { @@ -2288,7 +2288,7 @@ export class CursedTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4), { result: HitResult.INDIRECT }); globalScene.queueMessage( i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), @@ -2611,7 +2611,7 @@ export class GulpMissileTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled); if (!cancelled.value) { - attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), HitResult.OTHER); + attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), { result: HitResult.INDIRECT }); } if (this.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) { diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 9d470b86186..1555967789c 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -1647,7 +1647,7 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); + user.damageAndUpdate(recoilDamage, { result: HitResult.INDIRECT, ignoreSegments: true }); globalScene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", { pokemonName: getPokemonNameWithAffix(user) })); user.turnData.damageTaken += recoilDamage; @@ -1679,7 +1679,7 @@ export class SacrificialAttr extends MoveEffectAttr { * @returns true if the function succeeds **/ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true); + user.damageAndUpdate(user.hp, { result: HitResult.INDIRECT, ignoreSegments: true }); user.turnData.damageTaken += user.hp; return true; @@ -1717,7 +1717,7 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { return false; } - user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true); + user.damageAndUpdate(user.hp, { result: HitResult.INDIRECT, ignoreSegments: true }); user.turnData.damageTaken += user.hp; return true; @@ -1759,7 +1759,7 @@ export class HalfSacrificialAttr extends MoveEffectAttr { // Check to see if the Pokemon has an ability that blocks non-direct damage applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value) { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true, true); + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), { result: HitResult.INDIRECT, ignoreSegments: true }); globalScene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", { pokemonName: getPokemonNameWithAffix(user) })); // Queue recoil message } return true; @@ -1806,7 +1806,7 @@ export class AddSubstituteAttr extends MoveEffectAttr { } const damageTaken = this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost); - user.damageAndUpdate(damageTaken, HitResult.OTHER, false, true, true); + user.damageAndUpdate(damageTaken, { result: HitResult.INDIRECT, ignoreSegments: true, ignoreFaintPhase: true }); user.addTag(BattlerTagType.SUBSTITUTE, 0, move.id, user.id); return true; } @@ -1956,7 +1956,7 @@ export class FlameBurstAttr extends MoveEffectAttr { return false; } - targetAlly.damageAndUpdate(Math.max(1, Math.floor(1 / 16 * targetAlly.getMaxHp())), HitResult.OTHER); + targetAlly.damageAndUpdate(Math.max(1, Math.floor(1 / 16 * targetAlly.getMaxHp())), { result: HitResult.INDIRECT }); return true; } @@ -3435,9 +3435,8 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { this.cutRatio = cutRatio; this.messageCallback = messageCallback; } - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), { result: HitResult.INDIRECT }); user.updateInfo(); const ret = super.apply(user, target, move, args); if (this.messageCallback) { @@ -5329,7 +5328,7 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { return false; } - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true); + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), { result: HitResult.INDIRECT }); globalScene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", { pokemonName: getPokemonNameWithAffix(user) })); user.turnData.damageTaken += Utils.toDmgValue(user.getMaxHp() / 2); @@ -5650,7 +5649,7 @@ export class CurseAttr extends MoveEffectAttr { return false; } const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); - user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); + user.damageAndUpdate(curseRecoilDamage, { result: HitResult.INDIRECT, ignoreSegments: true }); globalScene.queueMessage( i18next.t("battlerTags:cursedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user), diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 63da641a114..9e0010a0c10 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -46,6 +46,7 @@ export default class DamageNumberHandler { case HitResult.NOT_VERY_EFFECTIVE: [textColor, shadowColor] = ["#f08030", "#c03028"]; break; + case HitResult.INDIRECT_KO: case HitResult.ONE_HIT_KO: [textColor, shadowColor] = ["#a040a0", "#483850"]; break; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 42fe1dc1010..43bab0f049d 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4465,11 +4465,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return result; } - // In case of fatal damage, this tag would have gotten cleared before we could lapse it. - const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - const grudgeTag = this.getTag(BattlerTagType.GRUDGE); - - const isOneHitKo = result === HitResult.ONE_HIT_KO; + // In case of fatal damage, this tag would have gotten cleared before we could lapse it. + const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); + const grudgeTag = this.getTag(BattlerTagType.GRUDGE); if (dmg) { this.lapseTags(BattlerTagLapseType.HIT); @@ -4484,19 +4482,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.applyModifiers(EnemyEndureChanceModifier, false, this); } - /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - const damage = this.damageAndUpdate( - isBlockedBySubstitute ? 0 : dmg, - result as DamageResult, - isCritical, - isOneHitKo, - isOneHitKo, - true, - source, - ); + /** + * We explicitly require to ignore the faint phase here, as we want to show the messages + * about the critical hit and the super effective/not very effective messages before the faint phase. + */ + const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, + { + result: result as DamageResult, + isCritical, + ignoreFaintPhase: true, + source + }); if (damage > 0) { if (source.isPlayer()) { @@ -4557,7 +4553,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.unshiftPhase( new FaintPhase( this.getBattlerIndex(), - isOneHitKo, + false, destinyTag, grudgeTag, source, @@ -4635,28 +4631,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Called by apply(), given the damage, adds a new DamagePhase and actually updates HP values, etc. + * Checks for 'Indirect' HitResults to account for Endure/Reviver Seed applying correctly * @param damage integer - passed to damage() * @param result an enum if it's super effective, not very, etc. - * @param critical boolean if move is a critical hit + * @param isCritical boolean if move is a critical hit * @param ignoreSegments boolean, passed to damage() and not used currently * @param preventEndure boolean, ignore endure properties of pokemon, passed to damage() * @param ignoreFaintPhase boolean to ignore adding a FaintPhase, passsed to damage() * @returns integer of damage done */ - damageAndUpdate( - damage: number, - result?: DamageResult, - critical = false, - ignoreSegments = false, - preventEndure = false, - ignoreFaintPhase = false, - source?: Pokemon, + damageAndUpdate(damage: number, + { + result = HitResult.EFFECTIVE, + isCritical = false, + ignoreSegments = false, + ignoreFaintPhase = false, + source = undefined, + }: + { + result?: DamageResult, + isCritical?: boolean, + ignoreSegments?: boolean, + ignoreFaintPhase?: boolean, + source?: Pokemon, + } = {} ): number { + const isIndirectDamage = [ HitResult.INDIRECT, HitResult.INDIRECT_KO ].includes(result); const damagePhase = new DamageAnimPhase( - this.getBattlerIndex(), - damage, - result as DamageResult, - critical, + this.getBattlerIndex(), + damage, + result as DamageResult, + isCritical ); globalScene.unshiftPhase(damagePhase); if (this.switchOutStatus && source) { @@ -4665,7 +4670,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { damage = this.damage( damage, ignoreSegments, - preventEndure, + isIndirectDamage, ignoreFaintPhase, ); // Damage amount may have changed, but needed to be queued before calling damage function @@ -7711,8 +7716,10 @@ export enum HitResult { HEAL, FAIL, MISS, - OTHER, + INDIRECT, IMMUNE, + CONFUSION, + INDIRECT_KO, } export type DamageResult = @@ -7720,7 +7727,9 @@ export type DamageResult = | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO - | HitResult.OTHER; + | HitResult.CONFUSION + | HitResult.INDIRECT_KO + | HitResult.INDIRECT; /** Interface containing the results of a damage calculation for a given move */ export interface DamageCalculationResult { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index a084474ddac..4c59bfe1ef1 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -5,8 +5,7 @@ import { allMoves } from "#app/data/moves/move"; import { MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; import { type FormChangeItem, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; -import type { PlayerPokemon } from "#app/field/pokemon"; -import Pokemon from "#app/field/pokemon"; +import Pokemon, { type PlayerPokemon } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; import { EvolutionPhase } from "#app/phases/evolution-phase"; diff --git a/src/phases/damage-anim-phase.ts b/src/phases/damage-anim-phase.ts index e31fe8c9475..703cd3d160e 100644 --- a/src/phases/damage-anim-phase.ts +++ b/src/phases/damage-anim-phase.ts @@ -21,7 +21,7 @@ export class DamageAnimPhase extends PokemonPhase { start() { super.start(); - if (this.damageResult === HitResult.ONE_HIT_KO) { + if (this.damageResult === HitResult.ONE_HIT_KO || this.damageResult === HitResult.INDIRECT_KO) { if (globalScene.moveAnimations) { globalScene.toggleInvert(true); } @@ -42,9 +42,11 @@ export class DamageAnimPhase extends PokemonPhase { applyDamage() { switch (this.damageResult) { case HitResult.EFFECTIVE: + case HitResult.CONFUSION: globalScene.playSound("se/hit"); break; case HitResult.SUPER_EFFECTIVE: + case HitResult.INDIRECT_KO: case HitResult.ONE_HIT_KO: globalScene.playSound("se/hit_strong"); break; @@ -57,7 +59,7 @@ export class DamageAnimPhase extends PokemonPhase { globalScene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); } - if (this.damageResult !== HitResult.OTHER && this.amount > 0) { + if (this.damageResult !== HitResult.INDIRECT && this.amount > 0) { const flashTimer = globalScene.time.addEvent({ delay: 100, repeat: 5, diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 7fc7a517853..dfc0e0653a5 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -258,7 +258,7 @@ export class FaintPhase extends PokemonPhase { } else { // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase enemy.hp++; - globalScene.unshiftPhase(new DamageAnimPhase(enemy.getBattlerIndex(), 0, HitResult.OTHER)); + globalScene.unshiftPhase(new DamageAnimPhase(enemy.getBattlerIndex(), 0, HitResult.INDIRECT)); this.end(); } return true; diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index ab49def5a3d..ecfe99389eb 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -3,7 +3,6 @@ import type { BattlerIndex } from "#app/battle"; import { CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectHealText } from "#app/data/status-effect"; import { StatusEffect } from "#app/enums/status-effect"; -import type { DamageResult } from "#app/field/pokemon"; import { HitResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { HealingBoosterModifier } from "#app/modifier/modifier"; @@ -79,7 +78,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); if (healAmount.value < 0) { - pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL as DamageResult); + pokemon.damageAndUpdate(healAmount.value * -1, { result: HitResult.INDIRECT }); healAmount.value = 0; } // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index 9199b7996bc..d7a1f193029 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -66,7 +66,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { const damage = Utils.toDmgValue(pokemon.getMaxHp() / 16); globalScene.queueMessage(getWeatherDamageMessage(this.weather?.weatherType!, pokemon)!); // TODO: are those bangs correct? - pokemon.damageAndUpdate(damage, HitResult.EFFECTIVE, false, false, true); + pokemon.damageAndUpdate(damage, { result: HitResult.INDIRECT, ignoreSegments: true }); }; this.executeForAll((pokemon: Pokemon) => { diff --git a/test/items/reviver_seed.test.ts b/test/items/reviver_seed.test.ts new file mode 100644 index 00000000000..ab249d48a23 --- /dev/null +++ b/test/items/reviver_seed.test.ts @@ -0,0 +1,159 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/moves/move"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import type { PokemonInstantReviveModifier } from "#app/modifier/modifier"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Items - Reviver Seed", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.TACKLE, Moves.ENDURE ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .startingHeldItems([{ name: "REVIVER_SEED" }]) + .enemyHeldItems([{ name: "REVIVER_SEED" }]) + .enemyMoveset(Moves.SPLASH); + vi.spyOn(allMoves[Moves.SHEER_COLD], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.LEECH_SEED], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.WHIRLPOOL], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.WILL_O_WISP], "accuracy", "get").mockReturnValue(100); + }); + + it.each([ + { moveType: "Special Move", move: Moves.WATER_GUN }, + { moveType: "Physical Move", move: Moves.TACKLE }, + { moveType: "Fixed Damage Move", move: Moves.SEISMIC_TOSS }, + { moveType: "Final Gambit", move: Moves.FINAL_GAMBIT }, + { moveType: "Counter", move: Moves.COUNTER }, + { moveType: "OHKO", move: Moves.SHEER_COLD } + ])("should activate the holder's reviver seed from a $moveType", async ({ move }) => { + game.override + .enemyLevel(100) + .startingLevel(1) + .enemyMoveset(move); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + const player = game.scene.getPlayerPokemon()!; + player.damageAndUpdate(player.hp - 1); + + const reviverSeed = player.getHeldItems()[0] as PokemonInstantReviveModifier; + vi.spyOn(reviverSeed, "apply"); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(player.isFainted()).toBeFalsy(); + }); + + it("should activate the holder's reviver seed from confusion self-hit", async () => { + game.override + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + const player = game.scene.getPlayerPokemon()!; + player.damageAndUpdate(player.hp - 1); + player.addTag(BattlerTagType.CONFUSED, 3); + + const reviverSeed = player.getHeldItems()[0] as PokemonInstantReviveModifier; + vi.spyOn(reviverSeed, "apply"); + + vi.spyOn(player, "randSeedInt").mockReturnValue(0); // Force confusion self-hit + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(player.isFainted()).toBeFalsy(); + }); + + // Damaging opponents tests + it.each([ + { moveType: "Damaging Move Chip Damage", move: Moves.SALT_CURE }, + { moveType: "Chip Damage", move: Moves.LEECH_SEED }, + { moveType: "Trapping Chip Damage", move: Moves.WHIRLPOOL }, + { moveType: "Status Effect Damage", move: Moves.WILL_O_WISP }, + { moveType: "Weather", move: Moves.SANDSTORM }, + ])("should not activate the holder's reviver seed from $moveType", async ({ move }) => { + game.override + .enemyLevel(1) + .startingLevel(100) + .enemySpecies(Species.MAGIKARP) + .moveset(move) + .enemyMoveset(Moves.ENDURE); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + const enemy = game.scene.getEnemyPokemon()!; + enemy.damageAndUpdate(enemy.hp - 1); + + game.move.select(move); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemy.isFainted()).toBeTruthy(); + }); + + // Self-damage tests + it.each([ + { moveType: "Recoil", move: Moves.DOUBLE_EDGE }, + { moveType: "Self-KO", move: Moves.EXPLOSION }, + { moveType: "Self-Deduction", move: Moves.CURSE }, + { moveType: "Liquid Ooze", move: Moves.GIGA_DRAIN }, + ])("should not activate the holder's reviver seed from $moveType", async ({ move }) => { + game.override + .enemyLevel(100) + .startingLevel(1) + .enemySpecies(Species.MAGIKARP) + .moveset(move) + .enemyAbility(Abilities.LIQUID_OOZE) + .enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([ Species.GASTLY, Species.FEEBAS ]); + const player = game.scene.getPlayerPokemon()!; + player.damageAndUpdate(player.hp - 1); + + const playerSeed = player.getHeldItems()[0] as PokemonInstantReviveModifier; + vi.spyOn(playerSeed, "apply"); + + game.move.select(move); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(player.isFainted()).toBeTruthy(); + }); + + it("should not activate the holder's reviver seed from Destiny Bond fainting", async () => { + game.override + .enemyLevel(100) + .startingLevel(1) + .enemySpecies(Species.MAGIKARP) + .moveset(Moves.DESTINY_BOND) + .startingHeldItems([]) // reset held items to nothing so user doesn't revive and not trigger Destiny Bond + .enemyMoveset(Moves.TACKLE); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + const player = game.scene.getPlayerPokemon()!; + player.damageAndUpdate(player.hp - 1); + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DESTINY_BOND); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemy.isFainted()).toBeTruthy(); + }); +}); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts index 8151128479d..d706d5d9581 100644 --- a/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -22,7 +22,7 @@ describe("Moves - Endure", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC]) + .moveset([ Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC, Moves.SHEER_COLD ]) .ability(Abilities.SKILL_LINK) .startingLevel(100) .battleType("single") @@ -50,16 +50,37 @@ describe("Moves - Endure", () => { expect(game.scene.getEnemyPokemon()!.hp).toBe(1); }); - it("shouldn't prevent fainting from indirect damage", async () => { - game.override.enemyLevel(100); - await game.classicMode.startBattle([Species.ARCEUS]); - + it("should let the pokemon survive against OHKO moves", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); const enemy = game.scene.getEnemyPokemon()!; - enemy.hp = 2; - game.move.select(Moves.TOXIC); - await game.phaseInterceptor.to("VictoryPhase"); + game.move.select(Moves.SHEER_COLD); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.isFainted()).toBe(true); + expect(enemy.isFainted()).toBeFalsy(); + }); + + // comprehensive indirect damage test copied from Reviver Seed test + it.each([ + { moveType: "Damaging Move Chip Damage", move: Moves.SALT_CURE }, + { moveType: "Chip Damage", move: Moves.LEECH_SEED }, + { moveType: "Trapping Chip Damage", move: Moves.WHIRLPOOL }, + { moveType: "Status Effect Damage", move: Moves.TOXIC }, + { moveType: "Weather", move: Moves.SANDSTORM }, + ])("should not prevent fainting from $moveType", async ({ move }) => { + game.override + .enemyLevel(1) + .startingLevel(100) + .enemySpecies(Species.MAGIKARP) + .moveset(move) + .enemyMoveset(Moves.ENDURE); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + const enemy = game.scene.getEnemyPokemon()!; + enemy.damageAndUpdate(enemy.hp - 1); + + game.move.select(move); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemy.isFainted()).toBeTruthy(); }); }); From dbc8ac26af131ae09caec5a2872d820eb38dc43d Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:27:20 -0700 Subject: [PATCH 18/48] [Bug] Fix #5422 Neut. Gas and Primal Weather Persist After Flee (#5496) * Add applyPreLeaveFieldAbAttrs call to AttemptRunPhase * Update tests --- src/phases/attempt-run-phase.ts | 4 +++- test/abilities/desolate-land.test.ts | 18 ++++++++++++++++++ test/abilities/neutralizing_gas.test.ts | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index c9c0e23dabb..dab5b8789da 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -1,4 +1,4 @@ -import { applyAbAttrs, RunSuccessAbAttr } from "#app/data/ability"; +import { applyAbAttrs, applyPreLeaveFieldAbAttrs, PreLeaveFieldAbAttr, RunSuccessAbAttr } from "#app/data/ability"; import { Stat } from "#app/enums/stat"; import { StatusEffect } from "#app/enums/status-effect"; import type { PlayerPokemon, EnemyPokemon } from "#app/field/pokemon"; @@ -29,6 +29,8 @@ export class AttemptRunPhase extends PokemonPhase { applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); if (playerPokemon.randSeedInt(100) < escapeChance.value && !this.forceFailEscape) { + enemyField.forEach(enemyPokemon => applyPreLeaveFieldAbAttrs(PreLeaveFieldAbAttr, enemyPokemon)); + globalScene.playSound("se/flee"); globalScene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); diff --git a/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts index 67d9ac1cdf5..405aab873aa 100644 --- a/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -1,5 +1,7 @@ import { PokeballType } from "#app/enums/pokeball"; import { WeatherType } from "#app/enums/weather-type"; +import type { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -131,4 +133,20 @@ describe("Abilities - Desolate Land", () => { expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); }); + + it("should lift after fleeing from a wild pokemon", async () => { + game.override + .enemyAbility(Abilities.DESOLATE_LAND) + .ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + vi.spyOn(game.scene.getPlayerPokemon()!, "randSeedInt").mockReturnValue(0); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); + }); }); diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index 08ab884d806..0003ee56598 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -1,4 +1,6 @@ import { BattlerIndex } from "#app/battle"; +import type { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; import { PostSummonWeatherChangeAbAttr } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; @@ -157,6 +159,22 @@ describe("Abilities - Neutralizing Gas", () => { expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); }); + it("should deactivate after fleeing from a wild pokemon", async () => { + game.override + .enemyAbility(Abilities.NEUTRALIZING_GAS) + .ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + vi.spyOn(game.scene.getPlayerPokemon()!, "randSeedInt").mockReturnValue(0); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + it("should not activate abilities of pokemon no longer on the field", async () => { game.override .battleType("single") From 37e51e965740dd986310ae436c8940db8db82781 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Mon, 24 Mar 2025 03:40:17 +0100 Subject: [PATCH 19/48] [Bug][Challenge][UI/UX] Exclude invalid starters when combining challenges (#5509) * Filtering correctly when combining gen and monotype challenges * Clean-up * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Always check requested form first * Fixing Basculin * Only check forms which are starter selectable * Exclude form changes that are not triggered by an item --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/challenge.ts | 153 +++++++++++++++++----------- src/ui/pokedex-page-ui-handler.ts | 19 ---- src/ui/starter-select-ui-handler.ts | 85 +++++----------- 3 files changed, 115 insertions(+), 142 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index b9d817836c3..a54f72aa7cc 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -18,9 +18,10 @@ import { TrainerType } from "#enums/trainer-type"; import { Nature } from "#enums/nature"; import type { Moves } from "#enums/moves"; import { TypeColor, TypeShadow } from "#enums/color"; -import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; -import { pokemonFormChanges } from "#app/data/pokemon-forms"; import { ModifierTier } from "#app/modifier/modifier-tier"; +import { globalScene } from "#app/global-scene"; +import { pokemonFormChanges } from "./pokemon-forms"; +import { pokemonEvolutions } from "./balance/pokemon-evolutions"; /** A constant for the default max cost of the starting party before a run */ const DEFAULT_PARTY_MAX_COST = 10; @@ -285,15 +286,9 @@ export abstract class Challenge { * @param _pokemon {@link PokemonSpecies} The pokemon to check the validity of. * @param _valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @param _dexAttr {@link DexAttrProps} The dex attributes of the pokemon. - * @param _soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyStarterChoice( - _pokemon: PokemonSpecies, - _valid: Utils.BooleanHolder, - _dexAttr: DexAttrProps, - _soft = false, - ): boolean { + applyStarterChoice(_pokemon: PokemonSpecies, _valid: Utils.BooleanHolder, _dexAttr: DexAttrProps): boolean { return false; } @@ -445,27 +440,8 @@ export class SingleGenerationChallenge extends Challenge { super(Challenges.SINGLE_GENERATION, 9); } - applyStarterChoice( - pokemon: PokemonSpecies, - valid: Utils.BooleanHolder, - _dexAttr: DexAttrProps, - soft = false, - ): boolean { - const generations = [pokemon.generation]; - if (soft) { - const speciesToCheck = [pokemon.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (checking && pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - generations.push(getPokemonSpecies(e.speciesId).generation); - }); - } - } - } - - if (!generations.includes(this.value)) { + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { + if (pokemon.generation !== this.value) { valid.value = false; return true; } @@ -739,41 +715,14 @@ export class SingleTypeChallenge extends Challenge { { species: Species.CASTFORM, type: PokemonType.NORMAL, fusion: false }, ]; // TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy - private static SPECIES_OVERRIDES: Species[] = [Species.MELOETTA]; constructor() { super(Challenges.SINGLE_TYPE, 18); } - override applyStarterChoice( - pokemon: PokemonSpecies, - valid: Utils.BooleanHolder, - dexAttr: DexAttrProps, - soft = false, - ): boolean { + override applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps): boolean { const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); const types = [speciesForm.type1, speciesForm.type2]; - if (soft && !SingleTypeChallenge.SPECIES_OVERRIDES.includes(pokemon.speciesId)) { - const speciesToCheck = [pokemon.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (checking && pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); - }); - } - if (checking && pokemonFormChanges.hasOwnProperty(checking)) { - pokemonFormChanges[checking].forEach(f1 => { - getPokemonSpecies(checking).forms.forEach(f2 => { - if (f1.formKey === f2.formKey) { - types.push(f2.type1, f2.type2); - } - }); - }); - } - } - } if (!types.includes(this.value - 1)) { valid.value = false; return true; @@ -1030,7 +979,6 @@ export class LowerStarterPointsChallenge extends Challenge { * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. - * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns True if any challenge was successfully applied. */ export function applyChallenges( @@ -1039,7 +987,6 @@ export function applyChallenges( pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, - soft: boolean, ): boolean; /** * Apply all challenges that modify available total starter points. @@ -1222,7 +1169,7 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType if (c.value !== 0) { switch (challengeType) { case ChallengeType.STARTER_CHOICE: - ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3]); + ret ||= c.applyStarterChoice(args[0], args[1], args[2]); break; case ChallengeType.STARTER_POINTS: ret ||= c.applyStarterPoints(args[0]); @@ -1305,3 +1252,87 @@ export function initChallenges() { new FlipStatChallenge(), ); } + +/** + * Apply all challenges to the given starter (and form) to check its validity. + * Differs from {@linkcode checkSpeciesValidForChallenge} which only checks form changes. + * @param species - The {@linkcode PokemonSpecies} to check the validity of. + * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. + * @param soft - If `true`, allow it if it could become valid through evolution or form change. + * @returns `true` if the species is considered valid. + */ +export function checkStarterValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { + if (!soft) { + const isValidForChallenge = new Utils.BooleanHolder(true); + applyChallenges(globalScene.gameMode, ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); + return isValidForChallenge.value; + } + // We check the validity of every evolution and form change, and require that at least one is valid + const speciesToCheck = [species.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + // Linter complains if we don't handle this + if (!checking) { + return false; + } + const checkingSpecies = getPokemonSpecies(checking); + if (checkSpeciesValidForChallenge(checkingSpecies, props, true)) { + return true; + } + if (checking && pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + // Form check to deal with cases such as Basculin -> Basculegion + // TODO: does this miss anything if checking forms of a stage 2 Pokémon? + if (!e?.preFormKey || e.preFormKey === species.forms[props.formIndex].formKey) { + speciesToCheck.push(e.speciesId); + } + }); + } + } + return false; +} + +/** + * Apply all challenges to the given species (and form) to check its validity. + * Differs from {@linkcode checkStarterValidForChallenge} which also checks evolutions. + * @param species - The {@linkcode PokemonSpecies} to check the validity of. + * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. + * @param soft - If `true`, allow it if it could become valid through a form change. + * @returns `true` if the species is considered valid. + */ +function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { + const isValidForChallenge = new Utils.BooleanHolder(true); + applyChallenges(globalScene.gameMode, ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); + if (!soft || !pokemonFormChanges.hasOwnProperty(species.speciesId)) { + return isValidForChallenge.value; + } + // If the form in props is valid, return true before checking other form changes + if (soft && isValidForChallenge.value) { + return true; + } + pokemonFormChanges[species.speciesId].forEach(f1 => { + // Exclude form changes that require the mon to be on the field to begin with, + // such as Castform + if (!("item" in f1)) { + return; + } + species.forms.forEach((f2, formIndex) => { + if (f1.formKey === f2.formKey) { + const formProps = { ...props }; + formProps.formIndex = formIndex; + const isFormValidForChallenge = new Utils.BooleanHolder(true); + applyChallenges( + globalScene.gameMode, + ChallengeType.STARTER_CHOICE, + species, + isFormValidForChallenge, + formProps, + ); + if (isFormValidForChallenge.value) { + return true; + } + } + }); + }); + return false; +} diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 74921f13683..fc6e96d427f 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -20,7 +20,6 @@ import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, normalForm } from import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { PokemonType } from "#enums/pokemon-type"; -import { GameModes } from "#app/game-mode"; import type { DexEntry, StarterAttributes } from "#app/system/game-data"; import { AbilityAttr, DexAttr } from "#app/system/game-data"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; @@ -33,7 +32,6 @@ import { Egg } from "#app/data/egg"; import Overrides from "#app/overrides"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { Passive as PassiveAttr } from "#enums/passive"; -import * as Challenge from "#app/data/challenge"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; import PokedexInfoOverlay from "#app/ui/pokedex-info-overlay"; import { getEggTierForSpecies } from "#app/data/egg"; @@ -51,7 +49,6 @@ import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, - NumberHolder, padInt, rgbHexToRgba, toReadableString, @@ -2128,22 +2125,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } } - getValueLimit(): number { - const valueLimit = new NumberHolder(0); - switch (globalScene.gameMode.modeId) { - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - valueLimit.value = 15; - break; - default: - valueLimit.value = 10; - } - - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); - - return valueLimit.value; - } - setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ccc56f38368..ab8ea0adf7c 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,6 +1,6 @@ import type { CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; import { BattleSceneEventType } from "#app/events/battle-scene"; -import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import type { Variant } from "#app/data/variant"; import { getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; @@ -19,7 +19,7 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; @@ -80,6 +80,7 @@ import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { achvs } from "#app/system/achv"; import * as Utils from "../utils"; import type { GameObjects } from "phaser"; +import { checkStarterValidForChallenge } from "#app/data/challenge"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -1760,21 +1761,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const species = starter.species; const [isDupe] = this.isInParty(species); const starterCost = globalScene.gameData.getSpeciesStarterValue(species.speciesId); - const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( species, - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), this.isPartyValid(), ); const isCaught = globalScene.gameData.dexData[species.speciesId].caughtAttr; return ( - !isDupe && - isValidForChallenge.value && - currentPartyValue + starterCost <= this.getValueLimit() && - isCaught + !isDupe && isValidForChallenge && currentPartyValue + starterCost <= this.getValueLimit() && isCaught ); }); if (validStarters.length === 0) { @@ -1861,16 +1855,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const ui = this.getUi(); let options: any[] = []; // TODO: add proper type - const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); const isPartyValid = this.isPartyValid(); - const isValidForChallenge = new BooleanHolder(true); - - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( this.lastSpecies, - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps( this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId), @@ -1888,11 +1877,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const newCost = globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); if ( !isDupe && - isValidForChallenge.value && + isValidForChallenge && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < PLAYER_PARTY_MAX_SIZE ) { - // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party options = [ { label: i18next.t("starterSelectUiHandler:addToParty"), @@ -1902,7 +1890,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), true, ); - if (!isDupe && isValidForChallenge.value && isOverValueLimit) { + if (!isDupe && isValidForChallenge && isOverValueLimit) { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); @@ -2993,32 +2981,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /* Here we are making a fake form index dex props for challenges * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge */ + if (!species.forms[i].isStarterSelectable) { + continue; + } const tempFormProps = BigInt(Math.pow(2, i)) * DexAttr.DEFAULT_FORM; - const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( container.species, - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, tempFormProps), true, ); - allFormsValid = allFormsValid || isValidForChallenge.value; + allFormsValid = allFormsValid || isValidForChallenge; } } else { - const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( container.species, - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps( species, globalScene.gameData.getSpeciesDefaultDexAttr(container.species, false, true), ), true, ); - allFormsValid = isValidForChallenge.value; + allFormsValid = isValidForChallenge; } if (allFormsValid) { this.validStarterContainers.push(container); @@ -3851,15 +3834,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonSprite.setVisible(!this.statsMode); } - const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, - species, - isValidForChallenge, - globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), - !!this.starterSpecies.length, - ); const currentFilteredContainer = this.filteredStarterContainers.find( p => p.species.speciesId === species.speciesId, ); @@ -4233,20 +4207,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { globalScene.time.delayedCall(fixedInt(500), () => this.tryUpdateValue()); return false; } - let isPartyValid: boolean = this.isPartyValid(); // this checks to see if the party is valid + let isPartyValid: boolean = this.isPartyValid(); if (addingToParty) { - // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean - const isNewPokemonValid = new BooleanHolder(true); const species = this.filteredStarterContainers[this.cursor].species; - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isNewPokemonValid = checkStarterValidForChallenge( species, - isNewPokemonValid, globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false, ); - isPartyValid = isPartyValid || isNewPokemonValid.value; + isPartyValid = isPartyValid || isNewPokemonValid; } /** @@ -4270,12 +4239,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * If speciesStarterDexEntry?.caughtAttr is true, this species registered in stater. * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. */ - const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( this.allSpecies[s], - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps( this.allSpecies[s], this.getCurrentDexProps(this.allSpecies[s].speciesId), @@ -4283,7 +4248,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { isPartyValid, ); - const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; + const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge; const isPokemonInParty = this.isInParty(this.allSpecies[s])[0]; // this will get the valud of isDupe from isInParty. This will let us see if the pokemon in question is in our party already so we don't grey out the sprites if they're invalid @@ -4417,17 +4382,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { isPartyValid(): boolean { let canStart = false; for (let s = 0; s < this.starterSpecies.length; s++) { - const isValidForChallenge = new BooleanHolder(true); const species = this.starterSpecies[s]; - Challenge.applyChallenges( - globalScene.gameMode, - Challenge.ChallengeType.STARTER_CHOICE, + const isValidForChallenge = checkStarterValidForChallenge( species, - isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false, ); - canStart = canStart || isValidForChallenge.value; + canStart = canStart || isValidForChallenge; } return canStart; } From 7f72794d2343825a0b8148cfa970663389e18a6b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Mon, 24 Mar 2025 06:03:11 +0100 Subject: [PATCH 20/48] =?UTF-8?q?[UI/UX]=20Cancel=20button=20on=20Pok?= =?UTF-8?q?=C3=A9dex=20page=20to=20previously=20selected=20Pok=C3=A9mon=20?= =?UTF-8?q?(#5528)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed redundant form index argument in show() of pokedex page * Storing previous pokémon for cancel button --- src/ui/party-ui-handler.ts | 4 +-- src/ui/pokedex-page-ui-handler.ts | 48 +++++++++++++++++++++++------ src/ui/pokedex-ui-handler.ts | 4 +-- src/ui/starter-select-ui-handler.ts | 2 +- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 21e5f9077f4..6a9b565989d 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -574,9 +574,7 @@ export default class PartyUiHandler extends MessageUiHandler { form: pokemon.formIndex, female: pokemon.gender === Gender.FEMALE, }; - ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, pokemon.formIndex, attributes).then(() => - this.clearOptions(), - ); + ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, attributes).then(() => this.clearOptions()); return true; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index fc6e96d427f..86460a24fdc 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -239,6 +239,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private starterAttributes: StarterAttributes; private savedStarterAttributes: StarterAttributes; + private previousSpecies: PokemonSpecies[]; + private previousStarterAttributes: StarterAttributes[]; + protected blockInput = false; protected blockInputOverlay = false; @@ -653,6 +656,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Filter bar sits above everything, except the message box this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + + this.previousSpecies = []; + this.previousStarterAttributes = []; } show(args: any[]): boolean { @@ -665,14 +671,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return false; } this.species = args[0]; - this.formIndex = args[1] ?? 0; - this.savedStarterAttributes = args[2] ?? { + this.savedStarterAttributes = args[1] ?? { shiny: false, female: true, variant: 0, form: 0, }; - this.filteredIndices = args[3] ?? null; + this.formIndex = this.savedStarterAttributes.form ?? 0; + this.filteredIndices = args[2] ?? null; this.starterSetup(); this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers @@ -1088,8 +1094,19 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.statsMode) { this.toggleStatsMode(false); success = true; + } else if (this.previousSpecies.length > 0) { + this.blockInput = true; + ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + const species = this.previousSpecies.pop(); + const starterAttributes = this.previousStarterAttributes.pop(); + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, species, starterAttributes); + success = true; + }); + this.blockInput = false; } else { - this.getUi().revertMode(); + ui.revertMode(); success = true; } } else { @@ -1504,6 +1521,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ? (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) : (preSpecies ?? this.species).getExpandedSpeciesName(), handler: () => { + this.previousSpecies.push(this.species); + this.previousStarterAttributes.push({ ...this.savedStarterAttributes }); const newSpecies = allSpecies.find( species => species.speciesId === pokemonPrevolutions[pre.speciesId], ); @@ -1519,7 +1538,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, this.savedStarterAttributes); return true; }, onHover: () => this.showText(conditionText), @@ -1555,11 +1574,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { : (evoSpecies ?? this.species).getExpandedSpeciesName(), style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, handler: () => { + this.previousSpecies.push(this.species); + this.previousStarterAttributes.push({ ...this.savedStarterAttributes }); this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, evoSpecies, newFormIndex, this.savedStarterAttributes); + ui.setMode(Mode.POKEDEX_PAGE, evoSpecies, this.savedStarterAttributes); return true; }, onHover: () => this.showText(conditionText), @@ -1595,6 +1616,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { label: label, style: isFormCaught ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, handler: () => { + this.previousSpecies.push(this.species); + this.previousStarterAttributes.push({ ...this.savedStarterAttributes }); const newSpecies = this.species; const newFormIndex = this.species.forms.find(f => f.formKey === bf.formKey)?.formIndex; this.starterAttributes.form = newFormIndex; @@ -1604,7 +1627,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode( Mode.POKEDEX_PAGE, newSpecies, - newFormIndex, this.savedStarterAttributes, this.filteredIndices, ); @@ -1955,6 +1977,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { case Button.LEFT: this.blockInput = true; ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + // Always go back to first selection after scrolling around + if (this.previousSpecies.length === 0) { + this.previousSpecies.push(this.species); + this.previousStarterAttributes.push({ ...this.savedStarterAttributes }); + } let newSpecies: PokemonSpecies; if (this.filteredIndices) { const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); @@ -1976,7 +2003,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setModeForceTransition( Mode.POKEDEX_PAGE, newSpecies, - newFormIndex, this.savedStarterAttributes, this.filteredIndices, ); @@ -1985,6 +2011,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case Button.RIGHT: ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + // Always go back to first selection after scrolling around + if (this.previousSpecies.length === 0) { + this.previousSpecies.push(this.species); + this.previousStarterAttributes.push({ ...this.savedStarterAttributes }); + } let newSpecies: PokemonSpecies; if (this.filteredIndices) { const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); @@ -2006,7 +2037,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setModeForceTransition( Mode.POKEDEX_PAGE, newSpecies, - newFormIndex, this.savedStarterAttributes, this.filteredIndices, ); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index f3625f64476..1f79d7006b0 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1125,7 +1125,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else if (this.showingTray) { if (button === Button.ACTION) { const formIndex = this.trayForms[this.trayCursor].formIndex; - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }, this.filteredIndices); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, { form: formIndex }, this.filteredIndices); success = true; } else { const numberOfForms = this.trayContainers.length; @@ -1174,7 +1174,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } } else { if (button === Button.ACTION) { - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0, null, this.filteredIndices); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, null, this.filteredIndices); success = true; } else { switch (button) { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index ab8ea0adf7c..8265ad827bc 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2324,7 +2324,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { form: starterAttributes.form, female: starterAttributes.female, }; - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, starterAttributes.form, attributes); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, attributes); }); return true; }, From f3141280c91174cd7e7fef0cf4e1979cec58057d Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:51:59 -0500 Subject: [PATCH 21/48] [Balance] Implement more trainer types & add to biomes (#5520) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add more trainer types to biomes This makes the Hooligans, Musician, Pilot, Poké Fan, Rich, and Rich Kid trainer types able to be battled. * Adjusted Rich and Rich Kid $$$ multipliers * Add basic dialogue for trainer types Also added the Clerk's dialogue entries, as that trainer type has localized text, but no entry in the code. * Fix Musician to Pokefan encounter music * Add dialogue entries for new dialogue --------- Co-authored-by: damocleas --- src/data/balance/biomes.ts | 94 ++++++++++++++++++++------------ src/data/dialogue.ts | 107 +++++++++++++++++++++++++++++++++++++ src/data/trainer-config.ts | 48 ++++++++++++++--- 3 files changed, 208 insertions(+), 41 deletions(-) diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index a4e051d80c9..3dff1722af6 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1659,7 +1659,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.GRASS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.SCHOOL_KID ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.POKEFAN ], [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1680,9 +1680,9 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.METROPOLIS]: { - [BiomePoolTier.COMMON]: [ TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER, TrainerType.BEAUTY ], + [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER ], [BiomePoolTier.UNCOMMON]: [ TrainerType.BREEDER, TrainerType.DEPOT_AGENT, TrainerType.GUITARIST ], - [BiomePoolTier.RARE]: [ TrainerType.ARTIST ], + [BiomePoolTier.RARE]: [ TrainerType.ARTIST, TrainerType.RICH_KID ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ], @@ -1702,7 +1702,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.SEA]: { - [BiomePoolTier.COMMON]: [ TrainerType.SWIMMER, TrainerType.SAILOR ], + [BiomePoolTier.COMMON]: [ TrainerType.SAILOR, TrainerType.SWIMMER ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], @@ -1758,7 +1758,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.MOUNTAIN]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.BLACK_BELT, TrainerType.HIKER ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.PILOT ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1790,7 +1790,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.DESERT]: { - [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST, TrainerType.BACKPACKER ], + [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.SCIENTIST ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], @@ -1812,8 +1812,8 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.MEADOW]: { - [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY, TrainerType.BEAUTY ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BREEDER, TrainerType.BAKER ], + [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.MUSICIAN, TrainerType.PARASOL_LADY ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BAKER, TrainerType.BREEDER, TrainerType.POKEFAN ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1967,7 +1967,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.SLUM]: { [BiomePoolTier.COMMON]: [ TrainerType.BIKER, TrainerType.OFFICER, TrainerType.ROUGHNECK ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.BAKER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.BAKER, TrainerType.HOOLIGANS ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1988,8 +1988,8 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.ISLAND]: { - [BiomePoolTier.COMMON]: [], - [BiomePoolTier.UNCOMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.RICH_KID ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.RICH ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -7178,7 +7178,8 @@ export function initBiomes() { [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.BIKER, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] @@ -7208,7 +7209,8 @@ export function initBiomes() { ], [ TrainerType.CLERK, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.CYCLIST, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] @@ -7217,18 +7219,23 @@ export function initBiomes() { [ TrainerType.DANCER, []], [ TrainerType.DEPOT_AGENT, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] - ]], + ] + ], [ TrainerType.DOCTOR, []], + [ TrainerType.FIREBREATHER, [ + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.FISHERMAN, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ TrainerType.RICH, []], [ TrainerType.GUITARIST, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.HARLEQUIN, []], [ TrainerType.HIKER, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], @@ -7236,13 +7243,24 @@ export function initBiomes() { [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ TrainerType.HOOLIGANS, []], + [ TrainerType.HOOLIGANS, [ + [ Biome.SLUM, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.HOOPSTER, []], [ TrainerType.INFIELDER, []], [ TrainerType.JANITOR, []], [ TrainerType.LINEBACKER, []], [ TrainerType.MAID, []], - [ TrainerType.MUSICIAN, []], + [ TrainerType.MUSICIAN, [ + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] + ], + [ TrainerType.HEX_MANIAC, [ + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.NURSERY_AIDE, []], [ TrainerType.OFFICER, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], @@ -7256,8 +7274,15 @@ export function initBiomes() { [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ TrainerType.PILOT, []], - [ TrainerType.POKEFAN, []], + [ TrainerType.PILOT, [ + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ] + ] + ], + [ TrainerType.POKEFAN, [ + [ Biome.GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.PRESCHOOLER, []], [ TrainerType.PSYCHIC, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], @@ -7270,11 +7295,24 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ TrainerType.RICH_KID, []], + [ TrainerType.RICH, [ + [ Biome.ISLAND, BiomePoolTier.UNCOMMON ] + ] + ], + [ TrainerType.RICH_KID, [ + [ Biome.METROPOLIS, BiomePoolTier.RARE ], + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.ROUGHNECK, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], + [ TrainerType.SAILOR, [ + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.SCIENTIST, [ [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ] @@ -7317,20 +7355,6 @@ export function initBiomes() { [ Biome.TOWN, BiomePoolTier.COMMON ] ] ], - [ TrainerType.HEX_MANIAC, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] - ] - ], - [ TrainerType.FIREBREATHER, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] - ], - [ TrainerType.SAILOR, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] - ], [ TrainerType.BROCK, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 208e269bd9c..0e755d54e15 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -312,6 +312,113 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { victory: ["dialogue:sailor.victory.1", "dialogue:sailor.victory.2", "dialogue:sailor.victory.3"], }, ], + [TrainerType.CLERK]: [ + { + encounter: ["dialogue:clerk.encounter.1", "dialogue:clerk.encounter.2", "dialogue:clerk.encounter.3"], + victory: ["dialogue:clerk.victory.1", "dialogue:clerk.victory.2", "dialogue:clerk.victory.3"], + }, + { + encounter: [ + "dialogue:clerk_female.encounter.1", + "dialogue:clerk_female.encounter.2", + "dialogue:clerk_female.encounter.3", + ], + victory: [ + "dialogue:clerk_female.victory.1", + "dialogue:clerk_female.victory.2", + "dialogue:clerk_female.victory.3", + ], + }, + ], + [TrainerType.HOOLIGANS]: [ + { + encounter: ["dialogue:hooligans.encounter.1", "dialogue:hooligans.encounter.2"], + victory: ["dialogue:hooligans.victory.1", "dialogue:hooligans.victory.2"], + }, + ], + [TrainerType.MUSICIAN]: [ + { + encounter: [ + "dialogue:musician.encounter.1", + "dialogue:musician.encounter.2", + "dialogue:musician.encounter.3", + "dialogue:musician.encounter.4", + ], + victory: ["dialogue:musician.victory.1", "dialogue:musician.victory.2", "dialogue:musician.victory.3"], + }, + ], + [TrainerType.PILOT]: [ + { + encounter: [ + "dialogue:pilot.encounter.1", + "dialogue:pilot.encounter.2", + "dialogue:pilot.encounter.3", + "dialogue:pilot.encounter.4", + ], + victory: [ + "dialogue:pilot.victory.1", + "dialogue:pilot.victory.2", + "dialogue:pilot.victory.3", + "dialogue:pilot.victory.4", + ], + }, + ], + [TrainerType.POKEFAN]: [ + { + encounter: ["dialogue:pokefan.encounter.1", "dialogue:pokefan.encounter.2", "dialogue:pokefan.encounter.3"], + victory: ["dialogue:pokefan.victory.1", "dialogue:pokefan.victory.2", "dialogue:pokefan.victory.3"], + }, + { + encounter: [ + "dialogue:pokefan_female.encounter.1", + "dialogue:pokefan_female.encounter.2", + "dialogue:pokefan_female.encounter.3", + ], + victory: [ + "dialogue:pokefan_female.victory.1", + "dialogue:pokefan_female.victory.2", + "dialogue:pokefan_female.victory.3", + ], + }, + ], + [TrainerType.RICH]: [ + { + encounter: ["dialogue:rich.encounter.1", "dialogue:rich.encounter.2", "dialogue:rich.encounter.3"], + victory: ["dialogue:rich.victory.1", "dialogue:rich.victory.2", "dialogue:rich.victory.3"], + }, + { + encounter: [ + "dialogue:rich_female.encounter.1", + "dialogue:rich_female.encounter.2", + "dialogue:rich_female.encounter.3", + ], + victory: ["dialogue:rich_female.victory.1", "dialogue:rich_female.victory.2", "dialogue:rich_female.victory.3"], + }, + ], + [TrainerType.RICH_KID]: [ + { + encounter: ["dialogue:rich_kid.encounter.1", "dialogue:rich_kid.encounter.2", "dialogue:rich_kid.encounter.3"], + victory: [ + "dialogue:rich_kid.victory.1", + "dialogue:rich_kid.victory.2", + "dialogue:rich_kid.victory.3", + "dialogue:rich_kid.victory.4", + ], + }, + { + encounter: [ + "dialogue:rich_kid_female.encounter.1", + "dialogue:rich_kid_female.encounter.2", + "dialogue:rich_kid_female.encounter.3", + ], + victory: [ + "dialogue:rich_kid_female.victory.1", + "dialogue:rich_kid_female.victory.2", + "dialogue:rich_kid_female.victory.3", + "dialogue:rich_kid_female.victory.4", + ], + }, + ], [TrainerType.ROCKET_GRUNT]: [ { encounter: [ diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index ffe5cdfe04c..0417e7abc32 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2141,7 +2141,15 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.HOOLIGANS]: new TrainerConfig(++t) .setDoubleOnly() + .setMoneyMultiplier(1.5) .setEncounterBgm(TrainerType.ROUGHNECK) + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + ), + ) .setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), @@ -2149,7 +2157,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH), [TrainerType.MUSICIAN]: new TrainerConfig(++t) - .setEncounterBgm(TrainerType.ROUGHNECK) + .setMoneyMultiplier(1.1) + .setEncounterBgm(TrainerType.POKEFAN) + .setPartyTemplates( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + ) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), [TrainerType.HEX_MANIAC]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) @@ -2214,7 +2229,14 @@ export const trainerConfigs: TrainerConfigs = { ) || s.getLevelMoves().some(plm => plm[1] === Moves.RAIN_DANCE), ), // Mons with rain abilities or who learn Rain Dance by level [TrainerType.PILOT]: new TrainerConfig(++t) + .setMoneyMultiplier(1.75) .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.THREE_AVG, + ) .setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), [TrainerType.POKEFAN]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) @@ -2230,7 +2252,8 @@ export const trainerConfigs: TrainerConfigs = { trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME, - ), + ) + .setSpeciesFilter(s => tmSpecies[Moves.HELPING_HAND].indexOf(s.speciesId) > -1), [TrainerType.PRESCHOOLER]: new TrainerConfig(++t) .setMoneyMultiplier(0.2) .setEncounterBgm(TrainerType.YOUNGSTER) @@ -2352,16 +2375,29 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA], }), [TrainerType.RICH]: new TrainerConfig(++t) - .setMoneyMultiplier(5) + .setMoneyMultiplier(3.25) .setName("Gentleman") .setHasGenders("Madame") - .setHasDouble("Rich Couple"), + .setHasDouble("Rich Couple") + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.THREE_AVG, + ) + .setSpeciesFilter(s => s.isOfType(PokemonType.NORMAL) || s.isOfType(PokemonType.ELECTRIC)), [TrainerType.RICH_KID]: new TrainerConfig(++t) - .setMoneyMultiplier(3.75) + .setMoneyMultiplier(2.5) .setName("Rich Boy") .setHasGenders("Lady") .setHasDouble("Rich Kids") - .setEncounterBgm(TrainerType.RICH), + .setEncounterBgm(TrainerType.RICH) + .setPartyTemplates( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.THREE_WEAK_SAME, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + ) + .setSpeciesFilter(s => s.baseTotal <= 460), [TrainerType.ROUGHNECK]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) .setEncounterBgm(TrainerType.ROUGHNECK) From 443264a3ea377da4ef4f25554aa156395dc1cf6f Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 25 Mar 2025 01:55:26 -0400 Subject: [PATCH 22/48] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 0e5c6096ba2..cd4057af258 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b +Subproject commit cd4057af258b659ba2c1ed2778bb2793fa1f6141 From f78015d75730d205d4bf08a4fd09547d8b8a8b37 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:06:24 +0100 Subject: [PATCH 23/48] [Localization] Catalan reactivation (#5555) * Add files via upload * Update settings.ts * Add files via upload * Add files via upload * Update starter-select-ui-handler.ts * Update utils.ts with Catalan * Update loading-scene.ts --- public/images/statuses_ca-ES.png | Bin 441 -> 2244 bytes public/images/types_ca-ES.json | 440 ++++++++++++++++++++++++++++ public/images/types_ca-ES.png | Bin 0 -> 6383 bytes src/loading-scene.ts | 2 +- src/system/settings/settings.ts | 8 +- src/ui/starter-select-ui-handler.ts | 2 +- src/utils.ts | 1 + 7 files changed, 447 insertions(+), 6 deletions(-) create mode 100644 public/images/types_ca-ES.json create mode 100644 public/images/types_ca-ES.png diff --git a/public/images/statuses_ca-ES.png b/public/images/statuses_ca-ES.png index d372b989be966007e5fccac5f54fe341457e598b..fe05e243f7a5cd6de4d3b9a340707ebf06cc7e58 100644 GIT binary patch literal 2244 zcmbVO4Nw$i7+$d-vQWaTbkep33$wlbxgYKpP6dtx^U%{%FlENQ-92vOZg<;VjypzY z(EJ~Nl7dMAr=gU>$)rY7F^g=lI#J0&MXpR#RL~-uL4>UD__?&HoZOjjzi)S+?|I+n zec$h$T{}B-den$6eD^xG%Gqdjn5+iGz2A0^+`07$EmP`%jE?#@^js12+Xr)Buj6_tx_uI z;?oOdZf;?wohi&?Oe`{W3Y_Gl0D*^7Y1rp+3ku~kBmKM-SchI?2;2`*^UO$c$RM0; zoeigoG6(B529zOmB%EN<5C+^t>Ry0JoJhd%1dPz4I6>hCN^61#F9cYVStm8e^5UQ^ z@MK0@swzgb^A%B&i?BGGUyQFT4AVvkb<$IS(hO3cwO!tmG0^ zQE`d?LLL5mhXD{;t2J!nAARw7!X^|o%?o4<2IL>nirp`9*c?s~^JRuh^8z^qS6AxWmwDzP^{s3mNIfQj?)Py)L=A{sE*WWQJQejsE%Ru9Em#| zq|-38-y$;kp}Y?5XaDE^SuzjK745!f9#H>(DI8)+28tArIA!p3q|mv8D>pwSBs1hD zVbl|x!>C2I2~GypYjrGYB5@8Sw6vZv7zl%b!IQAiQ2?9Zfz<#J_TLu!3zSOdLmv1C z?at+14SN9h*Ca(Vp|fU2m{5^%EHe0-zvqk$&=$BjK>8o$Hvm&ar&>VETyieR-d&0t z8Q^=96tpQn{Kd^O4+Ej9JMnfKZb*Rz?s+P@tAL=};;g`cZ)t!s$x zG9R1Ov!dfebIQW`?2(F`v)(0RHa8xBuq<+|A{5tH)7PDv9~*e0f$wZ=&Ju5xKNnp^ zM0_3;4m2whkxSm;MYpnBTWWL8UrH&CThm=tbZz*gtxrvcrq%s8u3K~T>=s{K+CFVg zuQ3)nA$wOgZjLq0f8&Vh*`=K^o9iz|Bx+0dc)Aygt72@$ar+Ie{)|b!#fyFZ6^XTH zZY4mi`vY9b?r%sa@?6`~(4oMI%IfMp^e4fY#&aHT@Ipihm#}``8g|E`*@+we_}Du$ z&sJw!l~lB$Ej#Xjj@fwH-#5?ld|-XcjnYQ{&YaR=Pd0P}TTtWoLAW))V?{|s(c7ou zq0|jgO+jUOP;nSDj(W|nw5}Po-Q^c-+ZJA3-1e?_5F|51mtWbF1&%BJZN4 zH@7tBuiKxw=ekp=kPL~?*_XS^gyPo&7hB6KvQ9ZK?L{u4k zRzAISi@v^*#u_SN-kY_VUJE9fk2@I(~mO zK5b{UWnRhXaScoTlHtM_nOSM0{KZO-TQ>G}+I zIn7o0!+Dp;xZJZk++_QIf*BQ_vO9cL>_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?z zvW;$NS#fE(5J*QH>;TO#qj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~a zG}z~@!Q2dSmt873PQXLUg+O|T!QM`p^A|K=@Suc&?b@)04>kGLv3=K17yh?|Mhx#G)+hhQwMYUUT0RT>1-XbQdPI;dWdHyG07*qoM6N<$g7t5` A=>Px# diff --git a/public/images/types_ca-ES.json b/public/images/types_ca-ES.json new file mode 100644 index 00000000000..fa3abaaf259 --- /dev/null +++ b/public/images/types_ca-ES.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "types_ca-ES.png", + "format": "RGBA8888", + "size": { + "w": 32, + "h": 280 + }, + "scale": 1, + "frames": [ + { + "filename": "unknown", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + } + }, + { + "filename": "bug", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 14, + "w": 32, + "h": 14 + } + }, + { + "filename": "dark", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 28, + "w": 32, + "h": 14 + } + }, + { + "filename": "dragon", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 42, + "w": 32, + "h": 14 + } + }, + { + "filename": "electric", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 56, + "w": 32, + "h": 14 + } + }, + { + "filename": "fairy", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 70, + "w": 32, + "h": 14 + } + }, + { + "filename": "fighting", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 84, + "w": 32, + "h": 14 + } + }, + { + "filename": "fire", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 98, + "w": 32, + "h": 14 + } + }, + { + "filename": "flying", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 112, + "w": 32, + "h": 14 + } + }, + { + "filename": "ghost", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 126, + "w": 32, + "h": 14 + } + }, + { + "filename": "grass", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 140, + "w": 32, + "h": 14 + } + }, + { + "filename": "ground", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 154, + "w": 32, + "h": 14 + } + }, + { + "filename": "ice", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 168, + "w": 32, + "h": 14 + } + }, + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 182, + "w": 32, + "h": 14 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 196, + "w": 32, + "h": 14 + } + }, + { + "filename": "psychic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 210, + "w": 32, + "h": 14 + } + }, + { + "filename": "rock", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 224, + "w": 32, + "h": 14 + } + }, + { + "filename": "steel", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 238, + "w": 32, + "h": 14 + } + }, + { + "filename": "water", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 252, + "w": 32, + "h": 14 + } + }, + { + "filename": "stellar", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 266, + "w": 32, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f14cf47d9a8f1d40c8e03aa6ba00fff3:6fc4227b57a95d429a1faad4280f7ec8:5961efbfbf4c56b8745347e7a663a32f$" + } +} diff --git a/public/images/types_ca-ES.png b/public/images/types_ca-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..e85c84ed9c987049fd9965771a4a64a12dcc6b0b GIT binary patch literal 6383 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 literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 295dc318db4..7f05634db48 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -250,7 +250,7 @@ export class LoadingScene extends SceneBase { this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } - const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"]; + const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN", "zh-TW", "ca-ES"]; if (lang && availableLangs.includes(lang)) { this.loadImage(`pkmnday2025event-${lang}`, "events"); } else { diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 1a7279d371c..b2b1d3eb298 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -948,10 +948,10 @@ export function setSetting(setting: string, value: number): boolean { label: "日本語", handler: () => changeLocaleHandler("ja"), }, - // { - // label: "Català", - // handler: () => changeLocaleHandler("ca-ES") - // }, + { + label: "Català", + handler: () => changeLocaleHandler("ca-ES") + }, { label: i18next.t("settings:back"), handler: () => cancelHandler(), diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 8265ad827bc..91940d3af76 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -150,7 +150,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { instructionTextSize: "38px", }, "ca-ES": { - starterInfoTextSize: "56px", + starterInfoTextSize: "52px", instructionTextSize: "38px", }, }; diff --git a/src/utils.ts b/src/utils.ts index 7d3dea0247e..fbca8410feb 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -464,6 +464,7 @@ export function hasAllLocalizedSprites(lang?: string): boolean { case "pt-BR": case "ko": case "ja": + case "ca-ES": return true; default: return false; From bba7c1610de9b1b5e0c685f9375214a58cca89fd Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:36:12 +0100 Subject: [PATCH 24/48] =?UTF-8?q?[UI/UX]=20Option=20to=20see=20Pokedex=20e?= =?UTF-8?q?ntry=20after=20catching=20wild=20Pok=C3=A9mon=20(#5538)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pokedex option after catching * Also changing catching for mystery encounters --- .../utils/encounter-pokemon-utils.ts | 20 ++++++++++++++++ src/phases/attempt-capture-phase.ts | 21 ++++++++++++++++ src/ui/confirm-ui-handler.ts | 24 ++++++++++++------- src/ui/pokedex-page-ui-handler.ts | 15 +++++++++++- src/ui/pokemon-info-container.ts | 2 +- 5 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 275078dbace..a4787e819b8 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -741,6 +741,26 @@ export async function catchPokemon( false, ); }, + () => { + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE, + }; + globalScene.ui.setOverlayMode( + Mode.POKEDEX_PAGE, + pokemon.species, + pokemon.formIndex, + attributes, + null, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + ); + }, () => { globalScene.ui.setMode( Mode.PARTY, diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 6b905c2a07f..6e2a2d29af4 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -24,6 +24,7 @@ import type { PokeballType } from "#enums/pokeball"; import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; import { globalScene } from "#app/global-scene"; +import { Gender } from "#app/data/gender"; export class AttemptCapturePhase extends PokemonPhase { private pokeballType: PokeballType; @@ -321,6 +322,26 @@ export class AttemptCapturePhase extends PokemonPhase { false, ); }, + () => { + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE, + }; + globalScene.ui.setOverlayMode( + Mode.POKEDEX_PAGE, + pokemon.species, + pokemon.formIndex, + attributes, + null, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + ); + }, () => { globalScene.ui.setMode( Mode.PARTY, diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index a8710b0ab01..eb7018051b7 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -21,11 +21,12 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { show(args: any[]): boolean { if ( - args.length === 4 && + args.length === 5 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && - args[3] === "fullParty" + args[3] instanceof Function && + args[4] === "fullParty" ) { const config: OptionSelectConfig = { options: [ @@ -37,29 +38,36 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { }, }, { - label: i18next.t("menu:yes"), + label: i18next.t("partyUiHandler:POKEDEX"), handler: () => { args[1](); return true; }, }, { - label: i18next.t("menu:no"), + label: i18next.t("menu:yes"), handler: () => { args[2](); return true; }, }, + { + label: i18next.t("menu:no"), + handler: () => { + args[3](); + return true; + }, + }, ], - delay: args.length >= 8 && args[7] !== null ? (args[7] as number) : 0, + delay: args.length >= 9 && args[8] !== null ? (args[8] as number) : 0, }; super.show([config]); - this.switchCheck = args.length >= 5 && args[4] !== null && (args[4] as boolean); + this.switchCheck = args.length >= 6 && args[5] !== null && (args[5] as boolean); - const xOffset = args.length >= 6 && args[5] !== null ? (args[5] as number) : 0; - const yOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; + const xOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; + const yOffset = args.length >= 8 && args[7] !== null ? (args[7] as number) : 0; this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 86460a24fdc..8f96f1e44c2 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -261,6 +261,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private unlockedVariants: boolean[]; private canUseCandies: boolean; + private exitCallback; constructor() { super(Mode.POKEDEX_PAGE); @@ -681,6 +682,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.filteredIndices = args[2] ?? null; this.starterSetup(); + if (args[4] instanceof Function) { + this.exitCallback = args[4]; + } + this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers this.infoOverlay.clear(); @@ -1106,7 +1111,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.blockInput = false; } else { - ui.revertMode(); + ui.revertMode() + .then(() => { + console.log("exitCallback", this.exitCallback); + if (this.exitCallback instanceof Function) { + const exitCallback = this.exitCallback; + this.exitCallback = null; + exitCallback(); + } + }); success = true; } } else { diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 64c743ec88d..56201f38748 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -458,7 +458,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { makeRoomForConfirmUi(speedMultiplier = 1, fromCatch = false): Promise { const xPosition = fromCatch - ? this.initialX - this.infoWindowWidth - 65 + ? this.initialX - this.infoWindowWidth - 67 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; return new Promise(resolve => { globalScene.tweens.add({ From ead1bc6cce6a4ea1d9884f153b227c35988af93a Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 25 Mar 2025 21:06:28 -0400 Subject: [PATCH 25/48] [UI/UX] Autofill login text color changed to gray (#5523) Update index.css --- index.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.css b/index.css index 49e570bdccc..62ad6266d30 100644 --- a/index.css +++ b/index.css @@ -68,6 +68,10 @@ input:-internal-autofill-selected { background-clip: text; } +input:-webkit-autofill { + -webkit-text-fill-color: #a1a1a1; +} + /* Need adjust input font-size */ input { font-size: 3.2rem; From f911ffc2663bae17196de9f33a3f6524119a2669 Mon Sep 17 00:00:00 2001 From: damocleas Date: Wed, 26 Mar 2025 16:01:54 -0400 Subject: [PATCH 26/48] [Balance] Split Passives and related (#5531) * Initial Split Passives * Lock Battle Bond Froakie/Frogadier Ability, Gallade back to Inner Focus --- src/data/balance/passives.ts | 843 ++++++++++++++++++++++++++++------- src/data/pokemon-species.ts | 8 +- 2 files changed, 680 insertions(+), 171 deletions(-) diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index c613be0137b..f7929650e67 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -11,418 +11,824 @@ interface StarterPassiveAbilities { export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.BULBASAUR]: { 0: Abilities.GRASSY_SURGE }, + [Species.IVYSAUR]: { 0: Abilities.GRASSY_SURGE }, + [Species.VENUSAUR]: { 0: Abilities.GRASSY_SURGE, 1: Abilities.SEED_SOWER, 2: Abilities.FLOWER_VEIL }, [Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST }, + [Species.CHARMELEON]: { 0: Abilities.BEAST_BOOST }, + [Species.CHARIZARD]: { 0: Abilities.BEAST_BOOST, 1: Abilities.LEVITATE, 2: Abilities.INTIMIDATE, 3: Abilities.UNNERVE }, [Species.SQUIRTLE]: { 0: Abilities.DAUNTLESS_SHIELD }, - [Species.CATERPIE]: { 0: Abilities.MAGICIAN }, - [Species.WEEDLE]: { 0: Abilities.TINTED_LENS }, + [Species.WARTORTLE]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.BLASTOISE]: { 0: Abilities.DAUNTLESS_SHIELD, 1: Abilities.BULLETPROOF, 2: Abilities.BULLETPROOF }, + [Species.CATERPIE]: { 0: Abilities.GLUTTONY }, + [Species.METAPOD]: { 0: Abilities.STURDY }, + [Species.BUTTERFREE]: { 0: Abilities.MAGICIAN, 1: Abilities.MAGICIAN }, + [Species.WEEDLE]: { 0: Abilities.POISON_TOUCH }, + [Species.KAKUNA]: { 0: Abilities.STURDY }, + [Species.BEEDRILL]: { 0: Abilities.ADAPTABILITY, 1: Abilities.TINTED_LENS }, [Species.PIDGEY]: { 0: Abilities.SHEER_FORCE }, + [Species.PIDGEOTTO]: { 0: Abilities.SHEER_FORCE }, + [Species.PIDGEOT]: { 0: Abilities.SHEER_FORCE, 1: Abilities.SHEER_FORCE }, [Species.RATTATA]: { 0: Abilities.STRONG_JAW }, + [Species.RATICATE]: { 0: Abilities.STRONG_JAW }, [Species.SPEAROW]: { 0: Abilities.MOXIE }, + [Species.FEAROW]: { 0: Abilities.MOXIE }, [Species.EKANS]: { 0: Abilities.REGENERATOR }, + [Species.ARBOK]: { 0: Abilities.REGENERATOR }, [Species.SANDSHREW]: { 0: Abilities.TOUGH_CLAWS }, + [Species.SANDSLASH]: { 0: Abilities.TOUGH_CLAWS }, [Species.NIDORAN_F]: { 0: Abilities.FLARE_BOOST }, + [Species.NIDORINA]: { 0: Abilities.FLARE_BOOST }, + [Species.NIDOQUEEN]: { 0: Abilities.FLARE_BOOST }, [Species.NIDORAN_M]: { 0: Abilities.GUTS }, + [Species.NIDORINO]: { 0: Abilities.GUTS }, + [Species.NIDOKING]: { 0: Abilities.GUTS }, [Species.VULPIX]: { 0: Abilities.FUR_COAT }, + [Species.NINETALES]: { 0: Abilities.FUR_COAT }, [Species.ZUBAT]: { 0: Abilities.INTIMIDATE }, + [Species.GOLBAT]: { 0: Abilities.INTIMIDATE }, + [Species.CROBAT]: { 0: Abilities.INTIMIDATE }, [Species.ODDISH]: { 0: Abilities.TRIAGE }, + [Species.GLOOM]: { 0: Abilities.TRIAGE }, + [Species.VILEPLUME]: { 0: Abilities.TRIAGE }, + [Species.BELLOSSOM]: { 0: Abilities.TRIAGE }, [Species.PARAS]: { 0: Abilities.TRIAGE }, - [Species.VENONAT]: { 0: Abilities.SIMPLE }, + [Species.PARASECT]: { 0: Abilities.TRIAGE }, + [Species.VENONAT]: { 0: Abilities.FLUFFY }, + [Species.VENOMOTH]: { 0: Abilities.SIMPLE }, [Species.DIGLETT]: { 0: Abilities.STURDY }, - [Species.MEOWTH]: { 0: Abilities.TOUGH_CLAWS }, + [Species.DUGTRIO]: { 0: Abilities.STURDY }, + [Species.MEOWTH]: { 0: Abilities.TOUGH_CLAWS, 1: Abilities.TOUGH_CLAWS }, + [Species.PERSIAN]: { 0: Abilities.TOUGH_CLAWS }, [Species.PSYDUCK]: { 0: Abilities.SIMPLE }, + [Species.GOLDUCK]: { 0: Abilities.SIMPLE }, [Species.MANKEY]: { 0: Abilities.IRON_FIST }, + [Species.PRIMEAPE]: { 0: Abilities.IRON_FIST }, + [Species.ANNIHILAPE]: { 0: Abilities.IRON_FIST }, [Species.GROWLITHE]: { 0: Abilities.FLUFFY }, + [Species.ARCANINE]: { 0: Abilities.FLUFFY }, [Species.POLIWAG]: { 0: Abilities.NO_GUARD }, - [Species.ABRA]: { 0: Abilities.MAGICIAN }, + [Species.POLIWHIRL]: { 0: Abilities.NO_GUARD }, + [Species.POLIWRATH]: { 0: Abilities.NO_GUARD }, + [Species.POLITOED]: { 0: Abilities.NO_GUARD }, + [Species.ABRA]: { 0: Abilities.COMATOSE }, + [Species.KADABRA]: { 0: Abilities.MAGICIAN }, + [Species.ALAKAZAM]: { 0: Abilities.MAGICIAN, 1: Abilities.MAGICIAN }, [Species.MACHOP]: { 0: Abilities.QUICK_FEET }, + [Species.MACHOKE]: { 0: Abilities.QUICK_FEET }, + [Species.MACHAMP]: { 0: Abilities.QUICK_FEET, 1: Abilities.QUICK_FEET }, [Species.BELLSPROUT]: { 0: Abilities.FLOWER_GIFT }, + [Species.WEEPINBELL]: { 0: Abilities.FLOWER_GIFT }, + [Species.VICTREEBEL]: { 0: Abilities.FLOWER_GIFT }, [Species.TENTACOOL]: { 0: Abilities.TOXIC_CHAIN }, + [Species.TENTACRUEL]: { 0: Abilities.TOXIC_CHAIN }, [Species.GEODUDE]: { 0: Abilities.DRY_SKIN }, + [Species.GRAVELER]: { 0: Abilities.DRY_SKIN }, + [Species.GOLEM]: { 0: Abilities.DRY_SKIN }, [Species.PONYTA]: { 0: Abilities.MAGIC_GUARD }, + [Species.RAPIDASH]: { 0: Abilities.MAGIC_GUARD }, [Species.SLOWPOKE]: { 0: Abilities.UNAWARE }, + [Species.SLOWBRO]: { 0: Abilities.UNAWARE, 1: Abilities.REGENERATOR }, + [Species.SLOWKING]: { 0: Abilities.UNAWARE }, [Species.MAGNEMITE]: { 0: Abilities.LEVITATE }, + [Species.MAGNETON]: { 0: Abilities.LEVITATE }, + [Species.MAGNEZONE]: { 0: Abilities.LEVITATE }, [Species.FARFETCHD]: { 0: Abilities.SNIPER }, [Species.DODUO]: { 0: Abilities.PARENTAL_BOND }, + [Species.DODRIO]: { 0: Abilities.PARENTAL_BOND }, [Species.SEEL]: { 0: Abilities.WATER_BUBBLE }, + [Species.DEWGONG]: { 0: Abilities.WATER_BUBBLE }, [Species.GRIMER]: { 0: Abilities.WATER_ABSORB }, - [Species.SHELLDER]: { 0: Abilities.ICE_SCALES }, + [Species.MUK]: { 0: Abilities.WATER_ABSORB }, + [Species.SHELLDER]: { 0: Abilities.STURDY }, + [Species.CLOYSTER]: { 0: Abilities.ICE_SCALES }, [Species.GASTLY]: { 0: Abilities.SHADOW_SHIELD }, + [Species.HAUNTER]: { 0: Abilities.SHADOW_SHIELD }, + [Species.GENGAR]: { 0: Abilities.SHADOW_SHIELD, 1: Abilities.UNNERVE, 2: Abilities.GLUTTONY }, [Species.ONIX]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.STEELIX]: { 0: Abilities.ROCKY_PAYLOAD, 1: Abilities.SAND_SPIT }, [Species.DROWZEE]: { 0: Abilities.MAGICIAN }, + [Species.HYPNO]: { 0: Abilities.MAGICIAN }, [Species.KRABBY]: { 0: Abilities.UNBURDEN }, + [Species.KINGLER]: { 0: Abilities.UNBURDEN, 1: Abilities.UNBURDEN }, [Species.VOLTORB]: { 0: Abilities.TRANSISTOR }, + [Species.ELECTRODE]: { 0: Abilities.TRANSISTOR }, [Species.EXEGGCUTE]: { 0: Abilities.RIPEN }, + [Species.EXEGGUTOR]: { 0: Abilities.RIPEN }, + [Species.ALOLA_EXEGGUTOR]: { 0: Abilities.UNBURDEN }, [Species.CUBONE]: { 0: Abilities.PARENTAL_BOND }, + [Species.MAROWAK]: { 0: Abilities.PARENTAL_BOND }, + [Species.ALOLA_MAROWAK]: { 0: Abilities.PARENTAL_BOND }, [Species.LICKITUNG]: { 0: Abilities.CHEEK_POUCH }, - [Species.KOFFING]: { 0: Abilities.PARENTAL_BOND }, - [Species.RHYHORN]: { 0: Abilities.FILTER }, + [Species.LICKILICKY]: { 0: Abilities.CHEEK_POUCH }, + [Species.KOFFING]: { 0: Abilities.WHITE_SMOKE }, + [Species.WEEZING]: { 0: Abilities.PARENTAL_BOND }, + [Species.GALAR_WEEZING]: { 0: Abilities.PARENTAL_BOND }, + [Species.RHYHORN]: { 0: Abilities.SOLID_ROCK }, + [Species.RHYDON]: { 0: Abilities.SOLID_ROCK }, + [Species.RHYPERIOR]: { 0: Abilities.FILTER }, [Species.TANGELA]: { 0: Abilities.SEED_SOWER }, - [Species.KANGASKHAN]: { 0: Abilities.TECHNICIAN }, + [Species.TANGROWTH]: { 0: Abilities.SEED_SOWER }, + [Species.KANGASKHAN]: { 0: Abilities.TECHNICIAN, 1: Abilities.TECHNICIAN }, [Species.HORSEA]: { 0: Abilities.DRAGONS_MAW }, + [Species.SEADRA]: { 0: Abilities.DRAGONS_MAW }, + [Species.KINGDRA]: { 0: Abilities.MULTISCALE }, [Species.GOLDEEN]: { 0: Abilities.MULTISCALE }, + [Species.SEAKING]: { 0: Abilities.MULTISCALE }, [Species.STARYU]: { 0: Abilities.REGENERATOR }, + [Species.STARMIE]: { 0: Abilities.REGENERATOR }, [Species.SCYTHER]: { 0: Abilities.TINTED_LENS }, - [Species.PINSIR]: { 0: Abilities.TINTED_LENS }, + [Species.SCIZOR]: { 0: Abilities.TOUGH_CLAWS, 1: Abilities.TOUGH_CLAWS }, + [Species.KLEAVOR]: { 0: Abilities.WEAK_ARMOR }, + [Species.PINSIR]: { 0: Abilities.TINTED_LENS, 1: Abilities.MOLD_BREAKER }, [Species.TAUROS]: { 0: Abilities.STAMINA }, [Species.MAGIKARP]: { 0: Abilities.MULTISCALE }, - [Species.LAPRAS]: { 0: Abilities.LIGHTNING_ROD }, + [Species.GYARADOS]: { 0: Abilities.MULTISCALE, 1: Abilities.MULTISCALE }, + [Species.LAPRAS]: { 0: Abilities.LIGHTNING_ROD, 1: Abilities.FILTER }, [Species.DITTO]: { 0: Abilities.ADAPTABILITY }, - [Species.EEVEE]: { 0: Abilities.PICKUP }, - [Species.PORYGON]: { 0: Abilities.PROTEAN }, + [Species.EEVEE]: { 0: Abilities.PICKUP, 1: Abilities.PICKUP, 2: Abilities.FLUFFY }, + [Species.VAPOREON]: { 0: Abilities.REGENERATOR }, + [Species.JOLTEON]: { 0: Abilities.TRANSISTOR }, + [Species.FLAREON]: { 0: Abilities.FUR_COAT }, + [Species.ESPEON]: { 0: Abilities.MAGICIAN }, + [Species.UMBREON]: { 0: Abilities.TOXIC_CHAIN }, + [Species.LEAFEON]: { 0: Abilities.GRASSY_SURGE }, + [Species.GLACEON]: { 0: Abilities.SNOW_WARNING }, + [Species.SYLVEON]: { 0: Abilities.COMPETITIVE }, + [Species.PORYGON]: { 0: Abilities.LEVITATE }, + [Species.PORYGON2]: { 0: Abilities.LEVITATE }, + [Species.PORYGON_Z]: { 0: Abilities.PROTEAN }, [Species.OMANYTE]: { 0: Abilities.STURDY }, + [Species.OMASTAR]: { 0: Abilities.STURDY }, [Species.KABUTO]: { 0: Abilities.TOUGH_CLAWS }, - [Species.AERODACTYL]: { 0: Abilities.ORICHALCUM_PULSE }, + [Species.KABUTOPS]: { 0: Abilities.TOUGH_CLAWS }, + [Species.AERODACTYL]: { 0: Abilities.INTIMIDATE, 1: Abilities.DELTA_STREAM }, [Species.ARTICUNO]: { 0: Abilities.SNOW_WARNING }, [Species.ZAPDOS]: { 0: Abilities.DRIZZLE }, [Species.MOLTRES]: { 0: Abilities.DROUGHT }, - [Species.DRATINI]: { 0: Abilities.AERILATE }, - [Species.MEWTWO]: { 0: Abilities.NEUROFORCE }, + [Species.DRATINI]: { 0: Abilities.MULTISCALE }, + [Species.DRAGONAIR]: { 0: Abilities.MULTISCALE }, + [Species.DRAGONITE]: { 0: Abilities.AERILATE }, + [Species.MEWTWO]: { 0: Abilities.NEUROFORCE, 1: Abilities.NEUROFORCE, 2: Abilities.NEUROFORCE }, [Species.MEW]: { 0: Abilities.PROTEAN }, [Species.CHIKORITA]: { 0: Abilities.THICK_FAT }, + [Species.BAYLEEF]: { 0: Abilities.THICK_FAT }, + [Species.MEGANIUM]: { 0: Abilities.THICK_FAT }, [Species.CYNDAQUIL]: { 0: Abilities.DROUGHT }, + [Species.QUILAVA]: { 0: Abilities.DROUGHT }, + [Species.TYPHLOSION]: { 0: Abilities.DROUGHT }, + [Species.HISUI_TYPHLOSION]: { 0: Abilities.DROUGHT }, [Species.TOTODILE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.CROCONAW]: { 0: Abilities.TOUGH_CLAWS }, + [Species.FERALIGATR]: { 0: Abilities.TOUGH_CLAWS }, [Species.SENTRET]: { 0: Abilities.PICKUP }, + [Species.FURRET]: { 0: Abilities.PICKUP }, [Species.HOOTHOOT]: { 0: Abilities.AERILATE }, + [Species.NOCTOWL]: { 0: Abilities.AERILATE }, [Species.LEDYBA]: { 0: Abilities.PRANKSTER }, + [Species.LEDIAN]: { 0: Abilities.PRANKSTER }, [Species.SPINARAK]: { 0: Abilities.PRANKSTER }, + [Species.ARIADOS]: { 0: Abilities.PRANKSTER }, [Species.CHINCHOU]: { 0: Abilities.REGENERATOR }, - [Species.PICHU]: { 0: Abilities.ELECTRIC_SURGE }, - [Species.CLEFFA]: { 0: Abilities.ANALYTIC }, + [Species.LANTURN]: { 0: Abilities.REGENERATOR }, + [Species.PICHU]: { 0: Abilities.ELECTRIC_SURGE, 1: Abilities.STURDY }, + [Species.PIKACHU]: { 0: Abilities.ELECTRIC_SURGE, 1: Abilities.STURDY, 2: Abilities.COSTAR, 3: Abilities.IRON_FIST, 4: Abilities.QUEENLY_MAJESTY, 5: Abilities.MISTY_SURGE, 6: Abilities.TINTED_LENS, 7: Abilities.LIBERO, 8: Abilities.THICK_FAT }, + [Species.RAICHU]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.ALOLA_RAICHU]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.CLEFFA]: { 0: Abilities.PRANKSTER }, + [Species.CLEFAIRY]: { 0: Abilities.PRANKSTER }, + [Species.CLEFABLE]: { 0: Abilities.ANALYTIC }, [Species.IGGLYBUFF]: { 0: Abilities.HUGE_POWER }, + [Species.JIGGLYPUFF]: { 0: Abilities.HUGE_POWER }, + [Species.WIGGLYTUFF]: { 0: Abilities.HUGE_POWER }, [Species.TOGEPI]: { 0: Abilities.PIXILATE }, - [Species.NATU]: { 0: Abilities.SHEER_FORCE }, + [Species.TOGETIC]: { 0: Abilities.PIXILATE }, + [Species.TOGEKISS]: { 0: Abilities.PIXILATE }, + [Species.NATU]: { 0: Abilities.TINTED_LENS }, + [Species.XATU]: { 0: Abilities.SHEER_FORCE }, [Species.MAREEP]: { 0: Abilities.ELECTROMORPHOSIS }, - [Species.HOPPIP]: { 0: Abilities.FLUFFY }, + [Species.FLAAFFY]: { 0: Abilities.ELECTROMORPHOSIS }, + [Species.AMPHAROS]: { 0: Abilities.ELECTROMORPHOSIS, 1: Abilities.ELECTROMORPHOSIS }, + [Species.HOPPIP]: { 0: Abilities.WIND_RIDER }, + [Species.SKIPLOOM]: { 0: Abilities.WIND_RIDER }, + [Species.JUMPLUFF]: { 0: Abilities.FLUFFY }, [Species.AIPOM]: { 0: Abilities.SCRAPPY }, + [Species.AMBIPOM]: { 0: Abilities.SCRAPPY }, [Species.SUNKERN]: { 0: Abilities.DROUGHT }, - [Species.YANMA]: { 0: Abilities.SHEER_FORCE }, - [Species.WOOPER]: { 0: Abilities.COMATOSE }, + [Species.SUNFLORA]: { 0: Abilities.DROUGHT }, + [Species.YANMA]: { 0: Abilities.TECHNICIAN }, + [Species.YANMEGA]: { 0: Abilities.SHEER_FORCE }, + [Species.WOOPER]: { 0: Abilities.WATER_VEIL }, + [Species.QUAGSIRE]: { 0: Abilities.COMATOSE }, [Species.MURKROW]: { 0: Abilities.DARK_AURA }, + [Species.HONCHKROW]: { 0: Abilities.DARK_AURA }, [Species.MISDREAVUS]: { 0: Abilities.BEADS_OF_RUIN }, - [Species.UNOWN]: { 0: Abilities.PICKUP }, + [Species.MISMAGIUS]: { 0: Abilities.BEADS_OF_RUIN }, + [Species.UNOWN]: { 0: Abilities.ADAPTABILITY, 1: Abilities.BEAST_BOOST, 2: Abilities.CONTRARY, 3: Abilities.DAZZLING, 4: Abilities.EMERGENCY_EXIT, 5: Abilities.FRIEND_GUARD, 6: Abilities.GOOD_AS_GOLD, 7: Abilities.HONEY_GATHER, 8: Abilities.IMPOSTER, 9: Abilities.JUSTIFIED, 10: Abilities.KLUTZ, 11: Abilities.LIBERO, 12: Abilities.MOODY, 13: Abilities.NEUTRALIZING_GAS, 14: Abilities.OPPORTUNIST, 15: Abilities.PICKUP, 16: Abilities.QUICK_DRAW, 17: Abilities.RUN_AWAY, 18: Abilities.SIMPLE, 19: Abilities.TRACE, 20: Abilities.UNNERVE, 21: Abilities.VICTORY_STAR, 22: Abilities.WANDERING_SPIRIT, 23: Abilities.FAIRY_AURA, 24: Abilities.DARK_AURA, 25: Abilities.AURA_BREAK, 26: Abilities.PURE_POWER, 27: Abilities.UNAWARE }, [Species.GIRAFARIG]: { 0: Abilities.PARENTAL_BOND }, - [Species.PINECO]: { 0: Abilities.IRON_BARBS }, + [Species.FARIGIRAF]: { 0: Abilities.PARENTAL_BOND }, + [Species.PINECO]: { 0: Abilities.ROUGH_SKIN }, + [Species.FORRETRESS]: { 0: Abilities.IRON_BARBS }, [Species.DUNSPARCE]: { 0: Abilities.UNAWARE }, - [Species.GLIGAR]: { 0: Abilities.TOXIC_BOOST }, + [Species.DUDUNSPARCE]: { 0: Abilities.UNAWARE }, + [Species.GLIGAR]: { 0: Abilities.POISON_TOUCH }, + [Species.GLISCOR]: { 0: Abilities.TOXIC_BOOST }, [Species.SNUBBULL]: { 0: Abilities.PIXILATE }, + [Species.GRANBULL]: { 0: Abilities.PIXILATE }, [Species.QWILFISH]: { 0: Abilities.TOXIC_DEBRIS }, [Species.SHUCKLE]: { 0: Abilities.HARVEST }, - [Species.HERACROSS]: { 0: Abilities.TECHNICIAN }, + [Species.HERACROSS]: { 0: Abilities.TECHNICIAN, 1: Abilities.TECHNICIAN }, [Species.SNEASEL]: { 0: Abilities.TOUGH_CLAWS }, - [Species.TEDDIURSA]: { 0: Abilities.THICK_FAT }, - [Species.SLUGMA]: { 0: Abilities.DESOLATE_LAND }, - [Species.SWINUB]: { 0: Abilities.SLUSH_RUSH }, + [Species.WEAVILE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.TEDDIURSA]: { 0: Abilities.RUN_AWAY }, + [Species.URSARING]: { 0: Abilities.THICK_FAT }, + [Species.URSALUNA]: { 0: Abilities.THICK_FAT }, + [Species.SLUGMA]: { 0: Abilities.DROUGHT }, + [Species.MAGCARGO]: { 0: Abilities.DESOLATE_LAND }, + [Species.SWINUB]: { 0: Abilities.UNAWARE }, + [Species.PILOSWINE]: { 0: Abilities.UNAWARE }, + [Species.MAMOSWINE]: { 0: Abilities.SLUSH_RUSH }, [Species.CORSOLA]: { 0: Abilities.STORM_DRAIN }, [Species.REMORAID]: { 0: Abilities.SIMPLE }, + [Species.OCTILLERY]: { 0: Abilities.SIMPLE }, [Species.DELIBIRD]: { 0: Abilities.HUGE_POWER }, [Species.SKARMORY]: { 0: Abilities.LIGHTNING_ROD }, - [Species.HOUNDOUR]: { 0: Abilities.LIGHTNING_ROD }, - [Species.PHANPY]: { 0: Abilities.SPEED_BOOST }, + [Species.HOUNDOUR]: { 0: Abilities.BALL_FETCH }, + [Species.HOUNDOOM]: { 0: Abilities.LIGHTNING_ROD, 1: Abilities.LIGHTNING_ROD }, + [Species.PHANPY]: { 0: Abilities.STURDY }, + [Species.DONPHAN]: { 0: Abilities.SPEED_BOOST }, [Species.STANTLER]: { 0: Abilities.SPEED_BOOST }, + [Species.WYRDEER]: { 0: Abilities.SPEED_BOOST }, [Species.SMEARGLE]: { 0: Abilities.PRANKSTER }, - [Species.TYROGUE]: { 0: Abilities.MOXIE }, + [Species.TYROGUE]: { 0: Abilities.DEFIANT }, + [Species.HITMONLEE]: { 0: Abilities.SHEER_FORCE }, + [Species.HITMONCHAN]: { 0: Abilities.MOXIE }, + [Species.HITMONTOP]: { 0: Abilities.SPEED_BOOST }, [Species.SMOOCHUM]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.JYNX]: { 0: Abilities.PSYCHIC_SURGE }, [Species.ELEKID]: { 0: Abilities.SHEER_FORCE }, + [Species.ELECTABUZZ]: { 0: Abilities.SHEER_FORCE }, + [Species.ELECTIVIRE]: { 0: Abilities.SHEER_FORCE }, [Species.MAGBY]: { 0: Abilities.SHEER_FORCE }, + [Species.MAGMAR]: { 0: Abilities.SHEER_FORCE }, + [Species.MAGMORTAR]: { 0: Abilities.SHEER_FORCE }, [Species.MILTANK]: { 0: Abilities.STAMINA }, [Species.RAIKOU]: { 0: Abilities.BEAST_BOOST }, [Species.ENTEI]: { 0: Abilities.BEAST_BOOST }, [Species.SUICUNE]: { 0: Abilities.BEAST_BOOST }, - [Species.LARVITAR]: { 0: Abilities.SOLID_ROCK }, + [Species.LARVITAR]: { 0: Abilities.SOLID_ROCK, 1: Abilities.SOLID_ROCK }, [Species.LUGIA]: { 0: Abilities.DELTA_STREAM }, [Species.HO_OH]: { 0: Abilities.MAGIC_GUARD }, [Species.CELEBI]: { 0: Abilities.PSYCHIC_SURGE }, [Species.TREECKO]: { 0: Abilities.TINTED_LENS }, + [Species.GROVYLE]: { 0: Abilities.TINTED_LENS }, + [Species.SCEPTILE]: { 0: Abilities.TINTED_LENS, 1: Abilities.TINTED_LENS }, [Species.TORCHIC]: { 0: Abilities.DEFIANT }, - [Species.MUDKIP]: { 0: Abilities.DRIZZLE }, + [Species.COMBUSKEN]: { 0: Abilities.DEFIANT }, + [Species.BLAZIKEN]: { 0: Abilities.DEFIANT, 1: Abilities.DEFIANT }, + [Species.MUDKIP]: { 0: Abilities.REGENERATOR }, + [Species.MARSHTOMP]: { 0: Abilities.REGENERATOR }, + [Species.SWAMPERT]: { 0: Abilities.REGENERATOR, 1: Abilities.DRIZZLE }, [Species.POOCHYENA]: { 0: Abilities.TOUGH_CLAWS }, + [Species.MIGHTYENA]: { 0: Abilities.TOUGH_CLAWS }, [Species.ZIGZAGOON]: { 0: Abilities.RUN_AWAY }, - [Species.WURMPLE]: { 0: Abilities.SIMPLE }, + [Species.LINOONE]: { 0: Abilities.RUN_AWAY }, + [Species.WURMPLE]: { 0: Abilities.GLUTTONY }, + [Species.SILCOON]: { 0: Abilities.STURDY }, + [Species.BEAUTIFLY]: { 0: Abilities.SIMPLE }, + [Species.CASCOON]: { 0: Abilities.STURDY }, + [Species.DUSTOX]: { 0: Abilities.SIMPLE }, [Species.LOTAD]: { 0: Abilities.DRIZZLE }, - [Species.SEEDOT]: { 0: Abilities.SHARPNESS }, + [Species.LOMBRE]: { 0: Abilities.DRIZZLE }, + [Species.LUDICOLO]: { 0: Abilities.DRIZZLE }, + [Species.SEEDOT]: { 0: Abilities.STURDY }, + [Species.NUZLEAF]: { 0: Abilities.SHARPNESS }, + [Species.SHIFTRY]: { 0: Abilities.SHARPNESS }, [Species.TAILLOW]: { 0: Abilities.AERILATE }, - [Species.WINGULL]: { 0: Abilities.SWIFT_SWIM }, - [Species.RALTS]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.SWELLOW]: { 0: Abilities.AERILATE }, + [Species.WINGULL]: { 0: Abilities.DRIZZLE }, + [Species.PELIPPER]: { 0: Abilities.SWIFT_SWIM }, + [Species.RALTS]: { 0: Abilities.NEUROFORCE }, + [Species.KIRLIA]: { 0: Abilities.NEUROFORCE }, + [Species.GARDEVOIR]: { 0: Abilities.NEUROFORCE, 1: Abilities.PSYCHIC_SURGE }, + [Species.GALLADE]: { 0: Abilities.NEUROFORCE, 1: Abilities.SHARPNESS }, [Species.SURSKIT]: { 0: Abilities.WATER_BUBBLE }, + [Species.MASQUERAIN]: { 0: Abilities.WATER_BUBBLE }, [Species.SHROOMISH]: { 0: Abilities.GUTS }, + [Species.BRELOOM]: { 0: Abilities.GUTS }, [Species.SLAKOTH]: { 0: Abilities.GUTS }, - [Species.NINCADA]: { 0: Abilities.MAGIC_GUARD }, + [Species.VIGOROTH]: { 0: Abilities.GUTS }, + [Species.SLAKING]: { 0: Abilities.GUTS }, + [Species.NINCADA]: { 0: Abilities.PICKUP }, + [Species.NINJASK]: { 0: Abilities.TECHNICIAN }, + [Species.SHEDINJA]: { 0: Abilities.MAGIC_GUARD }, [Species.WHISMUR]: { 0: Abilities.PUNK_ROCK }, + [Species.LOUDRED]: { 0: Abilities.PUNK_ROCK }, + [Species.EXPLOUD]: { 0: Abilities.PUNK_ROCK }, [Species.MAKUHITA]: { 0: Abilities.STAMINA }, + [Species.HARIYAMA]: { 0: Abilities.STAMINA }, [Species.AZURILL]: { 0: Abilities.MISTY_SURGE }, - [Species.NOSEPASS]: { 0: Abilities.LEVITATE }, + [Species.MARILL]: { 0: Abilities.MISTY_SURGE }, + [Species.AZUMARILL]: { 0: Abilities.MISTY_SURGE }, + [Species.NOSEPASS]: { 0: Abilities.SOLID_ROCK }, + [Species.PROBOPASS]: { 0: Abilities.LEVITATE }, [Species.SKITTY]: { 0: Abilities.SCRAPPY }, - [Species.SABLEYE]: { 0: Abilities.UNNERVE }, - [Species.MAWILE]: { 0: Abilities.UNNERVE }, + [Species.DELCATTY]: { 0: Abilities.SCRAPPY }, + [Species.SABLEYE]: { 0: Abilities.UNNERVE, 1: Abilities.UNNERVE }, + [Species.MAWILE]: { 0: Abilities.ADAPTABILITY, 1: Abilities.INTIMIDATE }, [Species.ARON]: { 0: Abilities.EARTH_EATER }, + [Species.LAIRON]: { 0: Abilities.EARTH_EATER }, + [Species.AGGRON]: { 0: Abilities.EARTH_EATER, 1: Abilities.ROCKY_PAYLOAD }, [Species.MEDITITE]: { 0: Abilities.MINDS_EYE }, - [Species.ELECTRIKE]: { 0: Abilities.FLASH_FIRE }, + [Species.MEDICHAM]: { 0: Abilities.MINDS_EYE, 1: Abilities.MINDS_EYE }, + [Species.ELECTRIKE]: { 0: Abilities.BALL_FETCH }, + [Species.MANECTRIC]: { 0: Abilities.FLASH_FIRE, 1: Abilities.FLASH_FIRE }, [Species.PLUSLE]: { 0: Abilities.POWER_SPOT }, [Species.MINUN]: { 0: Abilities.POWER_SPOT }, [Species.VOLBEAT]: { 0: Abilities.HONEY_GATHER }, [Species.ILLUMISE]: { 0: Abilities.HONEY_GATHER }, [Species.GULPIN]: { 0: Abilities.EARTH_EATER }, + [Species.SWALOT]: { 0: Abilities.EARTH_EATER }, [Species.CARVANHA]: { 0: Abilities.SHEER_FORCE }, + [Species.SHARPEDO]: { 0: Abilities.SHEER_FORCE, 1: Abilities.SPEED_BOOST }, [Species.WAILMER]: { 0: Abilities.LEVITATE }, - [Species.NUMEL]: { 0: Abilities.FUR_COAT }, + [Species.WAILORD]: { 0: Abilities.LEVITATE }, + [Species.NUMEL]: { 0: Abilities.SOLID_ROCK }, + [Species.CAMERUPT]: { 0: Abilities.FUR_COAT, 1: Abilities.STAMINA }, [Species.TORKOAL]: { 0: Abilities.ANALYTIC }, [Species.SPOINK]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.GRUMPIG]: { 0: Abilities.PSYCHIC_SURGE }, [Species.SPINDA]: { 0: Abilities.SIMPLE }, [Species.TRAPINCH]: { 0: Abilities.ADAPTABILITY }, + [Species.VIBRAVA]: { 0: Abilities.ADAPTABILITY }, + [Species.FLYGON]: { 0: Abilities.ADAPTABILITY }, [Species.CACNEA]: { 0: Abilities.SAND_RUSH }, + [Species.CACTURNE]: { 0: Abilities.SAND_RUSH }, [Species.SWABLU]: { 0: Abilities.FLUFFY }, + [Species.ALTARIA]: { 0: Abilities.FLUFFY, 1: Abilities.FLUFFY }, [Species.ZANGOOSE]: { 0: Abilities.POISON_HEAL }, [Species.SEVIPER]: { 0: Abilities.MULTISCALE }, [Species.LUNATONE]: { 0: Abilities.SHADOW_SHIELD }, [Species.SOLROCK]: { 0: Abilities.DROUGHT }, [Species.BARBOACH]: { 0: Abilities.SIMPLE }, + [Species.WHISCASH]: { 0: Abilities.SIMPLE }, [Species.CORPHISH]: { 0: Abilities.TOUGH_CLAWS }, + [Species.CRAWDAUNT]: { 0: Abilities.TOUGH_CLAWS }, [Species.BALTOY]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.CLAYDOL]: { 0: Abilities.WELL_BAKED_BODY }, [Species.LILEEP]: { 0: Abilities.SEED_SOWER }, + [Species.CRADILY]: { 0: Abilities.SEED_SOWER }, [Species.ANORITH]: { 0: Abilities.WATER_ABSORB }, - [Species.FEEBAS]: { 0: Abilities.MAGIC_GUARD }, - [Species.CASTFORM]: { 0: Abilities.ADAPTABILITY }, + [Species.ARMALDO]: { 0: Abilities.WATER_ABSORB }, + [Species.FEEBAS]: { 0: Abilities.MULTISCALE }, + [Species.MILOTIC]: { 0: Abilities.MAGIC_GUARD }, + [Species.CASTFORM]: { 0: Abilities.ADAPTABILITY, 1: Abilities.ADAPTABILITY, 2: Abilities.ADAPTABILITY, 3: Abilities.ADAPTABILITY }, [Species.KECLEON]: { 0: Abilities.ADAPTABILITY }, [Species.SHUPPET]: { 0: Abilities.SHADOW_SHIELD }, + [Species.BANETTE]: { 0: Abilities.SHADOW_SHIELD, 1: Abilities.SHADOW_SHIELD }, [Species.DUSKULL]: { 0: Abilities.UNNERVE }, + [Species.DUSCLOPS]: { 0: Abilities.UNNERVE }, + [Species.DUSKNOIR]: { 0: Abilities.UNNERVE }, [Species.TROPIUS]: { 0: Abilities.RIPEN }, - [Species.ABSOL]: { 0: Abilities.SHARPNESS }, + [Species.ABSOL]: { 0: Abilities.SHARPNESS, 1: Abilities.SHARPNESS }, [Species.WYNAUT]: { 0: Abilities.STURDY }, + [Species.WOBBUFFET]: { 0: Abilities.STURDY }, [Species.SNORUNT]: { 0: Abilities.SNOW_WARNING }, + [Species.GLALIE]: { 0: Abilities.SNOW_WARNING, 1: Abilities.SNOW_WARNING }, + [Species.FROSLASS]: { 0: Abilities.SNOW_WARNING }, [Species.SPHEAL]: { 0: Abilities.UNAWARE }, - [Species.CLAMPERL]: { 0: Abilities.ARENA_TRAP }, + [Species.SEALEO]: { 0: Abilities.UNAWARE }, + [Species.WALREIN]: { 0: Abilities.UNAWARE }, + [Species.CLAMPERL]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.GOREBYSS]: { 0: Abilities.ARENA_TRAP }, + [Species.HUNTAIL]: { 0: Abilities.ARENA_TRAP }, [Species.RELICANTH]: { 0: Abilities.PRIMORDIAL_SEA }, [Species.LUVDISC]: { 0: Abilities.MULTISCALE }, - [Species.BAGON]: { 0: Abilities.MOLD_BREAKER }, + [Species.BAGON]: { 0: Abilities.INTIMIDATE }, + [Species.SHELGON]: { 0: Abilities.ANGER_SHELL }, + [Species.SALAMENCE]: { 0: Abilities.GALE_WINGS, 1: Abilities.ROCK_HEAD }, [Species.BELDUM]: { 0: Abilities.LEVITATE }, + [Species.METANG]: { 0: Abilities.LEVITATE }, + [Species.METAGROSS]: { 0: Abilities.LEVITATE, 1: Abilities.FULL_METAL_BODY }, [Species.REGIROCK]: { 0: Abilities.SAND_STREAM }, [Species.REGICE]: { 0: Abilities.SNOW_WARNING }, [Species.REGISTEEL]: { 0: Abilities.STEELY_SPIRIT }, - [Species.LATIAS]: { 0: Abilities.PRISM_ARMOR }, - [Species.LATIOS]: { 0: Abilities.TINTED_LENS }, - [Species.KYOGRE]: { 0: Abilities.MOLD_BREAKER }, - [Species.GROUDON]: { 0: Abilities.TURBOBLAZE }, - [Species.RAYQUAZA]: { 0: Abilities.UNNERVE }, + [Species.LATIAS]: { 0: Abilities.SPEED_BOOST, 1: Abilities.PRISM_ARMOR }, + [Species.LATIOS]: { 0: Abilities.SPEED_BOOST, 1: Abilities.TINTED_LENS }, + [Species.KYOGRE]: { 0: Abilities.MOLD_BREAKER, 1: Abilities.TERAVOLT }, + [Species.GROUDON]: { 0: Abilities.MOLD_BREAKER, 1: Abilities.TURBOBLAZE }, + [Species.RAYQUAZA]: { 0: Abilities.UNNERVE, 1: Abilities.UNNERVE }, [Species.JIRACHI]: { 0: Abilities.COMATOSE }, - [Species.DEOXYS]: { 0: Abilities.PROTEAN }, + [Species.DEOXYS]: { 0: Abilities.PROTEAN, 1: Abilities.ADAPTABILITY, 2: Abilities.REGENERATOR, 3: Abilities.SHADOW_SHIELD }, - [Species.TURTWIG]: { 0: Abilities.THICK_FAT }, - [Species.CHIMCHAR]: { 0: Abilities.BEAST_BOOST }, - [Species.PIPLUP]: { 0: Abilities.DRIZZLE }, + [Species.TURTWIG]: { 0: Abilities.SOLID_ROCK }, + [Species.GROTLE]: { 0: Abilities.SOLID_ROCK }, + [Species.TORTERRA]: { 0: Abilities.THICK_FAT }, + [Species.CHIMCHAR]: { 0: Abilities.UNNERVE }, + [Species.MONFERNO]: { 0: Abilities.UNNERVE }, + [Species.INFERNAPE]: { 0: Abilities.BEAST_BOOST }, + [Species.PIPLUP]: { 0: Abilities.CUTE_CHARM }, + [Species.PRINPLUP]: { 0: Abilities.DRIZZLE }, + [Species.EMPOLEON]: { 0: Abilities.DRIZZLE }, [Species.STARLY]: { 0: Abilities.ROCK_HEAD }, + [Species.STARAVIA]: { 0: Abilities.ROCK_HEAD }, + [Species.STARAPTOR]: { 0: Abilities.ROCK_HEAD }, [Species.BIDOOF]: { 0: Abilities.SAP_SIPPER }, - [Species.KRICKETOT]: { 0: Abilities.SHARPNESS }, + [Species.BIBAREL]: { 0: Abilities.SAP_SIPPER }, + [Species.KRICKETOT]: { 0: Abilities.HONEY_GATHER }, + [Species.KRICKETUNE]: { 0: Abilities.SHARPNESS }, [Species.SHINX]: { 0: Abilities.SPEED_BOOST }, - [Species.BUDEW]: { 0: Abilities.GRASSY_SURGE }, + [Species.LUXIO]: { 0: Abilities.SPEED_BOOST }, + [Species.LUXRAY]: { 0: Abilities.SPEED_BOOST }, + [Species.BUDEW]: { 0: Abilities.SEED_SOWER }, + [Species.ROSELIA]: { 0: Abilities.GRASSY_SURGE }, + [Species.ROSERADE]: { 0: Abilities.GRASSY_SURGE }, [Species.CRANIDOS]: { 0: Abilities.ROCK_HEAD }, + [Species.RAMPARDOS]: { 0: Abilities.ROCK_HEAD }, [Species.SHIELDON]: { 0: Abilities.EARTH_EATER }, - [Species.BURMY]: { 0: Abilities.STURDY }, - [Species.COMBEE]: { 0: Abilities.INTIMIDATE }, + [Species.BASTIODON]: { 0: Abilities.EARTH_EATER }, + [Species.BURMY]: { 0: Abilities.STURDY, 1: Abilities.STURDY, 2: Abilities.STURDY }, + [Species.WORMADAM]: { 0: Abilities.STURDY, 1: Abilities.STURDY, 2: Abilities.STURDY }, + [Species.MOTHIM]: { 0: Abilities.SPEED_BOOST }, + [Species.COMBEE]: { 0: Abilities.RUN_AWAY }, + [Species.VESPIQUEN]: { 0: Abilities.INTIMIDATE }, [Species.PACHIRISU]: { 0: Abilities.HONEY_GATHER }, [Species.BUIZEL]: { 0: Abilities.MOXIE }, - [Species.CHERUBI]: { 0: Abilities.ORICHALCUM_PULSE }, - [Species.SHELLOS]: { 0: Abilities.REGENERATOR }, + [Species.FLOATZEL]: { 0: Abilities.MOXIE }, + [Species.CHERUBI]: { 0: Abilities.DROUGHT }, + [Species.CHERRIM]: { 0: Abilities.ORICHALCUM_PULSE, 1: Abilities.ORICHALCUM_PULSE }, + [Species.SHELLOS]: { 0: Abilities.REGENERATOR, 1: Abilities.REGENERATOR }, + [Species.GASTRODON]: { 0: Abilities.REGENERATOR, 1: Abilities.REGENERATOR }, [Species.DRIFLOON]: { 0: Abilities.MAGIC_GUARD }, + [Species.DRIFBLIM]: { 0: Abilities.MAGIC_GUARD }, [Species.BUNEARY]: { 0: Abilities.ADAPTABILITY }, + [Species.LOPUNNY]: { 0: Abilities.ADAPTABILITY, 1: Abilities.ADAPTABILITY }, [Species.GLAMEOW]: { 0: Abilities.INTIMIDATE }, + [Species.PURUGLY]: { 0: Abilities.INTIMIDATE }, [Species.CHINGLING]: { 0: Abilities.PUNK_ROCK }, + [Species.CHIMECHO]: { 0: Abilities.PUNK_ROCK }, [Species.STUNKY]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.SKUNTANK]: { 0: Abilities.NEUTRALIZING_GAS }, [Species.BRONZOR]: { 0: Abilities.MIRROR_ARMOR }, + [Species.BRONZONG]: { 0: Abilities.MIRROR_ARMOR }, [Species.BONSLY]: { 0: Abilities.SAP_SIPPER }, + [Species.SUDOWOODO]: { 0: Abilities.SAP_SIPPER }, [Species.MIME_JR]: { 0: Abilities.PRANKSTER }, - [Species.HAPPINY]: { 0: Abilities.FUR_COAT }, + [Species.MR_MIME]: { 0: Abilities.PRANKSTER }, + [Species.GALAR_MR_MIME]: { 0: Abilities.PRANKSTER }, + [Species.MR_RIME]: { 0: Abilities.PRANKSTER }, + [Species.HAPPINY]: { 0: Abilities.HOSPITALITY }, + [Species.CHANSEY]: { 0: Abilities.FRIEND_GUARD }, + [Species.BLISSEY]: { 0: Abilities.FUR_COAT }, [Species.CHATOT]: { 0: Abilities.PUNK_ROCK }, [Species.SPIRITOMB]: { 0: Abilities.VESSEL_OF_RUIN }, - [Species.GIBLE]: { 0: Abilities.SAND_STREAM }, - [Species.MUNCHLAX]: { 0: Abilities.RIPEN }, + [Species.GIBLE]: { 0: Abilities.ARENA_TRAP }, + [Species.GABITE]: { 0: Abilities.ARENA_TRAP }, + [Species.GARCHOMP]: { 0: Abilities.ARENA_TRAP, 1: Abilities.SAND_RUSH }, + [Species.MUNCHLAX]: { 0: Abilities.CHEEK_POUCH }, + [Species.SNORLAX]: { 0: Abilities.CHEEK_POUCH, 1: Abilities.RIPEN }, [Species.RIOLU]: { 0: Abilities.MINDS_EYE }, + [Species.LUCARIO]: { 0: Abilities.MINDS_EYE, 1: Abilities.MINDS_EYE }, [Species.HIPPOPOTAS]: { 0: Abilities.UNAWARE }, + [Species.HIPPOWDON]: { 0: Abilities.UNAWARE }, [Species.SKORUPI]: { 0: Abilities.SUPER_LUCK }, + [Species.DRAPION]: { 0: Abilities.SUPER_LUCK }, [Species.CROAGUNK]: { 0: Abilities.MOXIE }, + [Species.TOXICROAK]: { 0: Abilities.MOXIE }, [Species.CARNIVINE]: { 0: Abilities.ARENA_TRAP }, [Species.FINNEON]: { 0: Abilities.WATER_BUBBLE }, + [Species.LUMINEON]: { 0: Abilities.WATER_BUBBLE }, [Species.MANTYKE]: { 0: Abilities.UNAWARE }, - [Species.SNOVER]: { 0: Abilities.GRASSY_SURGE }, - [Species.ROTOM]: { 0: Abilities.HADRON_ENGINE }, + [Species.MANTINE]: { 0: Abilities.UNAWARE }, + [Species.SNOVER]: { 0: Abilities.SLUSH_RUSH }, + [Species.ABOMASNOW]: { 0: Abilities.SLUSH_RUSH, 1: Abilities.SEED_SOWER }, + [Species.ROTOM]: { 0: Abilities.HADRON_ENGINE, 1: Abilities.HADRON_ENGINE, 2: Abilities.HADRON_ENGINE, 3: Abilities.HADRON_ENGINE, 4: Abilities.HADRON_ENGINE, 5: Abilities.HADRON_ENGINE }, [Species.UXIE]: { 0: Abilities.UNNERVE }, [Species.MESPRIT]: { 0: Abilities.MOODY }, [Species.AZELF]: { 0: Abilities.NEUROFORCE }, - [Species.DIALGA]: { 0: Abilities.BERSERK }, - [Species.PALKIA]: { 0: Abilities.BERSERK }, + [Species.DIALGA]: { 0: Abilities.BERSERK, 1: Abilities.BERSERK }, + [Species.PALKIA]: { 0: Abilities.BERSERK, 1: Abilities.BERSERK }, [Species.HEATRAN]: { 0: Abilities.EARTH_EATER }, [Species.REGIGIGAS]: { 0: Abilities.SCRAPPY }, - [Species.GIRATINA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.GIRATINA]: { 0: Abilities.SHADOW_SHIELD, 1: Abilities.SHADOW_SHIELD }, [Species.CRESSELIA]: { 0: Abilities.SHADOW_SHIELD }, [Species.PHIONE]: { 0: Abilities.SIMPLE }, [Species.MANAPHY]: { 0: Abilities.PRIMORDIAL_SEA }, [Species.DARKRAI]: { 0: Abilities.UNNERVE }, - [Species.SHAYMIN]: { 0: Abilities.WIND_RIDER }, - [Species.ARCEUS]: { 0: Abilities.ADAPTABILITY }, + [Species.SHAYMIN]: { 0: Abilities.GRASSY_SURGE, 1: Abilities.DELTA_STREAM }, + [Species.ARCEUS]: { 0: Abilities.ADAPTABILITY, 1: Abilities.ADAPTABILITY, 2: Abilities.ADAPTABILITY, 3: Abilities.ADAPTABILITY, 4: Abilities.ADAPTABILITY, 5: Abilities.ADAPTABILITY, 6: Abilities.ADAPTABILITY, 7: Abilities.ADAPTABILITY, 8: Abilities.ADAPTABILITY, 9: Abilities.ADAPTABILITY, 10: Abilities.ADAPTABILITY, 11: Abilities.ADAPTABILITY, 12: Abilities.ADAPTABILITY, 13: Abilities.ADAPTABILITY, 14: Abilities.ADAPTABILITY, 15: Abilities.ADAPTABILITY, 16: Abilities.ADAPTABILITY, 17: Abilities.ADAPTABILITY }, [Species.VICTINI]: { 0: Abilities.SHEER_FORCE }, [Species.SNIVY]: { 0: Abilities.MULTISCALE }, - [Species.TEPIG]: { 0: Abilities.ROCK_HEAD }, - [Species.OSHAWOTT]: { 0: Abilities.INTREPID_SWORD }, + [Species.SERVINE]: { 0: Abilities.MULTISCALE }, + [Species.SERPERIOR]: { 0: Abilities.MULTISCALE }, + [Species.TEPIG]: { 0: Abilities.GLUTTONY }, + [Species.PIGNITE]: { 0: Abilities.ROCK_HEAD }, + [Species.EMBOAR]: { 0: Abilities.ROCK_HEAD }, + [Species.OSHAWOTT]: { 0: Abilities.LONG_REACH }, + [Species.DEWOTT]: { 0: Abilities.LONG_REACH }, + [Species.SAMUROTT]: { 0: Abilities.LIGHTNING_ROD }, + [Species.HISUI_SAMUROTT]: { 0: Abilities.MOLD_BREAKER }, [Species.PATRAT]: { 0: Abilities.NO_GUARD }, - [Species.LILLIPUP]: { 0: Abilities.FUR_COAT }, + [Species.WATCHOG]: { 0: Abilities.NO_GUARD }, + [Species.LILLIPUP]: { 0: Abilities.BALL_FETCH }, + [Species.HERDIER]: { 0: Abilities.FUR_COAT }, + [Species.STOUTLAND]: { 0: Abilities.FUR_COAT }, [Species.PURRLOIN]: { 0: Abilities.PICKUP }, + [Species.LIEPARD]: { 0: Abilities.PICKUP }, [Species.PANSAGE]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.SIMISAGE]: { 0: Abilities.WELL_BAKED_BODY }, [Species.PANSEAR]: { 0: Abilities.WATER_ABSORB }, + [Species.SIMISEAR]: { 0: Abilities.WATER_ABSORB }, [Species.PANPOUR]: { 0: Abilities.SAP_SIPPER }, + [Species.SIMIPOUR]: { 0: Abilities.SAP_SIPPER }, [Species.MUNNA]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.MUSHARNA]: { 0: Abilities.NEUTRALIZING_GAS }, [Species.PIDOVE]: { 0: Abilities.SNIPER }, + [Species.TRANQUILL]: { 0: Abilities.SNIPER }, + [Species.UNFEZANT]: { 0: Abilities.SNIPER }, [Species.BLITZLE]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.ZEBSTRIKA]: { 0: Abilities.ELECTRIC_SURGE }, [Species.ROGGENROLA]: { 0: Abilities.SOLID_ROCK }, + [Species.BOLDORE]: { 0: Abilities.SOLID_ROCK }, + [Species.GIGALITH]: { 0: Abilities.SOLID_ROCK }, [Species.WOOBAT]: { 0: Abilities.OPPORTUNIST }, + [Species.SWOOBAT]: { 0: Abilities.OPPORTUNIST }, [Species.DRILBUR]: { 0: Abilities.STURDY }, - [Species.AUDINO]: { 0: Abilities.FRIEND_GUARD }, + [Species.EXCADRILL]: { 0: Abilities.STURDY }, + [Species.AUDINO]: { 0: Abilities.FRIEND_GUARD, 1: Abilities.FAIRY_AURA }, [Species.TIMBURR]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.GURDURR]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.CONKELDURR]: { 0: Abilities.ROCKY_PAYLOAD }, [Species.TYMPOLE]: { 0: Abilities.POISON_HEAL }, + [Species.PALPITOAD]: { 0: Abilities.POISON_HEAL }, + [Species.SEISMITOAD]: { 0: Abilities.POISON_HEAL }, [Species.THROH]: { 0: Abilities.STAMINA }, [Species.SAWK]: { 0: Abilities.SCRAPPY }, - [Species.SEWADDLE]: { 0: Abilities.SHARPNESS }, + [Species.SEWADDLE]: { 0: Abilities.SHIELD_DUST }, + [Species.SWADLOON]: { 0: Abilities.SHIELD_DUST }, + [Species.LEAVANNY]: { 0: Abilities.SHARPNESS }, [Species.VENIPEDE]: { 0: Abilities.STAMINA }, + [Species.WHIRLIPEDE]: { 0: Abilities.STAMINA }, + [Species.SCOLIPEDE]: { 0: Abilities.STAMINA }, [Species.COTTONEE]: { 0: Abilities.FLUFFY }, + [Species.WHIMSICOTT]: { 0: Abilities.FLUFFY }, [Species.PETILIL]: { 0: Abilities.FLOWER_VEIL }, - [Species.BASCULIN]: { 0: Abilities.SUPREME_OVERLORD }, + [Species.LILLIGANT]: { 0: Abilities.GRASSY_SURGE }, + [Species.HISUI_LILLIGANT]: { 0: Abilities.FLOWER_VEIL }, + [Species.BASCULIN]: { 0: Abilities.ROCK_HEAD, 1: Abilities.RECKLESS, 2: Abilities.SUPREME_OVERLORD }, + [Species.BASCULEGION]: { 0: Abilities.SUPREME_OVERLORD, 1: Abilities.SUPREME_OVERLORD }, [Species.SANDILE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.KROKOROK]: { 0: Abilities.TOUGH_CLAWS }, + [Species.KROOKODILE]: { 0: Abilities.TOUGH_CLAWS }, [Species.DARUMAKA]: { 0: Abilities.GORILLA_TACTICS }, + [Species.DARMANITAN]: { 0: Abilities.GORILLA_TACTICS, 1: Abilities.SOLID_ROCK }, [Species.MARACTUS]: { 0: Abilities.WELL_BAKED_BODY }, [Species.DWEBBLE]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.CRUSTLE]: { 0: Abilities.ROCKY_PAYLOAD }, [Species.SCRAGGY]: { 0: Abilities.PROTEAN }, + [Species.SCRAFTY]: { 0: Abilities.PROTEAN }, [Species.SIGILYPH]: { 0: Abilities.FLARE_BOOST }, [Species.YAMASK]: { 0: Abilities.PURIFYING_SALT }, + [Species.COFAGRIGUS]: { 0: Abilities.PURIFYING_SALT }, [Species.TIRTOUGA]: { 0: Abilities.WATER_ABSORB }, + [Species.CARRACOSTA]: { 0: Abilities.WATER_ABSORB }, [Species.ARCHEN]: { 0: Abilities.MULTISCALE }, + [Species.ARCHEOPS]: { 0: Abilities.MULTISCALE }, [Species.TRUBBISH]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.GARBODOR]: { 0: Abilities.NEUTRALIZING_GAS, 1: Abilities.NEUTRALIZING_GAS }, [Species.ZORUA]: { 0: Abilities.DARK_AURA }, + [Species.ZOROARK]: { 0: Abilities.DARK_AURA }, [Species.MINCCINO]: { 0: Abilities.FUR_COAT }, + [Species.CINCCINO]: { 0: Abilities.FUR_COAT }, [Species.GOTHITA]: { 0: Abilities.UNNERVE }, + [Species.GOTHORITA]: { 0: Abilities.UNNERVE }, + [Species.GOTHITELLE]: { 0: Abilities.UNNERVE }, [Species.SOLOSIS]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.DUOSION]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.REUNICLUS]: { 0: Abilities.PSYCHIC_SURGE }, [Species.DUCKLETT]: { 0: Abilities.DRIZZLE }, + [Species.SWANNA]: { 0: Abilities.DRIZZLE }, [Species.VANILLITE]: { 0: Abilities.SLUSH_RUSH }, - [Species.DEERLING]: { 0: Abilities.FUR_COAT }, + [Species.VANILLISH]: { 0: Abilities.SLUSH_RUSH }, + [Species.VANILLUXE]: { 0: Abilities.SLUSH_RUSH }, + [Species.DEERLING]: { 0: Abilities.FLOWER_VEIL, 1: Abilities.CUD_CHEW, 2: Abilities.HARVEST, 3: Abilities.FUR_COAT }, + [Species.SAWSBUCK]: { 0: Abilities.FLOWER_VEIL, 1: Abilities.CUD_CHEW, 2: Abilities.HARVEST, 3: Abilities.FUR_COAT }, [Species.EMOLGA]: { 0: Abilities.SERENE_GRACE }, [Species.KARRABLAST]: { 0: Abilities.QUICK_DRAW }, - [Species.FOONGUS]: { 0: Abilities.THICK_FAT }, + [Species.ESCAVALIER]: { 0: Abilities.QUICK_DRAW }, + [Species.FOONGUS]: { 0: Abilities.MYCELIUM_MIGHT }, + [Species.AMOONGUSS]: { 0: Abilities.THICK_FAT }, [Species.FRILLISH]: { 0: Abilities.POISON_HEAL }, + [Species.JELLICENT]: { 0: Abilities.POISON_HEAL }, [Species.ALOMOMOLA]: { 0: Abilities.MULTISCALE }, [Species.JOLTIK]: { 0: Abilities.TRANSISTOR }, + [Species.GALVANTULA]: { 0: Abilities.TRANSISTOR }, [Species.FERROSEED]: { 0: Abilities.ROUGH_SKIN }, + [Species.FERROTHORN]: { 0: Abilities.ROUGH_SKIN }, [Species.KLINK]: { 0: Abilities.STEELY_SPIRIT }, + [Species.KLANG]: { 0: Abilities.STEELY_SPIRIT }, + [Species.KLINKLANG]: { 0: Abilities.STEELY_SPIRIT }, [Species.TYNAMO]: { 0: Abilities.POISON_HEAL }, + [Species.EELEKTRIK]: { 0: Abilities.POISON_HEAL }, + [Species.EELEKTROSS]: { 0: Abilities.POISON_HEAL }, [Species.ELGYEM]: { 0: Abilities.BEADS_OF_RUIN }, + [Species.BEHEEYEM]: { 0: Abilities.BEADS_OF_RUIN }, [Species.LITWICK]: { 0: Abilities.SHADOW_TAG }, + [Species.LAMPENT]: { 0: Abilities.SHADOW_TAG }, + [Species.CHANDELURE]: { 0: Abilities.SHADOW_TAG }, [Species.AXEW]: { 0: Abilities.DRAGONS_MAW }, + [Species.FRAXURE]: { 0: Abilities.DRAGONS_MAW }, + [Species.HAXORUS]: { 0: Abilities.DRAGONS_MAW }, [Species.CUBCHOO]: { 0: Abilities.FUR_COAT }, + [Species.BEARTIC]: { 0: Abilities.FUR_COAT }, [Species.CRYOGONAL]: { 0: Abilities.SNOW_WARNING }, - [Species.SHELMET]: { 0: Abilities.PROTEAN }, + [Species.SHELMET]: { 0: Abilities.STAMINA }, + [Species.ACCELGOR]: { 0: Abilities.PROTEAN }, [Species.STUNFISK]: { 0: Abilities.STORM_DRAIN }, [Species.MIENFOO]: { 0: Abilities.NO_GUARD }, + [Species.MIENSHAO]: { 0: Abilities.NO_GUARD }, [Species.DRUDDIGON]: { 0: Abilities.INTIMIDATE }, [Species.GOLETT]: { 0: Abilities.SHADOW_SHIELD }, + [Species.GOLURK]: { 0: Abilities.SHADOW_SHIELD }, [Species.PAWNIARD]: { 0: Abilities.SWORD_OF_RUIN }, + [Species.BISHARP]: { 0: Abilities.SWORD_OF_RUIN }, + [Species.KINGAMBIT]: { 0: Abilities.SWORD_OF_RUIN }, [Species.BOUFFALANT]: { 0: Abilities.ROCK_HEAD }, [Species.RUFFLET]: { 0: Abilities.SPEED_BOOST }, + [Species.BRAVIARY]: { 0: Abilities.SPEED_BOOST }, + [Species.HISUI_BRAVIARY]: { 0: Abilities.SPEED_BOOST }, [Species.VULLABY]: { 0: Abilities.THICK_FAT }, + [Species.MANDIBUZZ]: { 0: Abilities.THICK_FAT }, [Species.HEATMOR]: { 0: Abilities.CONTRARY }, [Species.DURANT]: { 0: Abilities.COMPOUND_EYES }, - [Species.DEINO]: { 0: Abilities.PARENTAL_BOND }, - [Species.LARVESTA]: { 0: Abilities.DROUGHT }, + [Species.DEINO]: { 0: Abilities.NO_GUARD }, + [Species.ZWEILOUS]: { 0: Abilities.NO_GUARD }, + [Species.HYDREIGON]: { 0: Abilities.PARENTAL_BOND }, + [Species.LARVESTA]: { 0: Abilities.FLASH_FIRE }, + [Species.VOLCARONA]: { 0: Abilities.DROUGHT }, [Species.COBALION]: { 0: Abilities.INTREPID_SWORD }, [Species.TERRAKION]: { 0: Abilities.ROCKY_PAYLOAD }, [Species.VIRIZION]: { 0: Abilities.SHARPNESS }, - [Species.TORNADUS]: { 0: Abilities.DRIZZLE }, - [Species.THUNDURUS]: { 0: Abilities.DRIZZLE }, + [Species.TORNADUS]: { 0: Abilities.DRIZZLE, 1: Abilities.DRIZZLE }, + [Species.THUNDURUS]: { 0: Abilities.DRIZZLE, 1: Abilities.DRIZZLE }, [Species.RESHIRAM]: { 0: Abilities.ORICHALCUM_PULSE }, [Species.ZEKROM]: { 0: Abilities.HADRON_ENGINE }, - [Species.LANDORUS]: { 0: Abilities.STORM_DRAIN }, - [Species.KYUREM]: { 0: Abilities.SNOW_WARNING }, - [Species.KELDEO]: { 0: Abilities.GRIM_NEIGH }, - [Species.MELOETTA]: { 0: Abilities.MINDS_EYE }, - [Species.GENESECT]: { 0: Abilities.PROTEAN }, + [Species.LANDORUS]: { 0: Abilities.STORM_DRAIN, 1: Abilities.STORM_DRAIN }, + [Species.KYUREM]: { 0: Abilities.SNOW_WARNING, 1: Abilities.HADRON_ENGINE, 2: Abilities.ORICHALCUM_PULSE }, + [Species.KELDEO]: { 0: Abilities.GRIM_NEIGH, 1: Abilities.GRIM_NEIGH }, + [Species.MELOETTA]: { 0: Abilities.PUNK_ROCK, 1: Abilities.SCRAPPY }, + [Species.GENESECT]: { 0: Abilities.PROTEAN, 1: Abilities.PROTEAN, 2: Abilities.PROTEAN, 3: Abilities.PROTEAN, 4: Abilities.PROTEAN }, - [Species.CHESPIN]: { 0: Abilities.DAUNTLESS_SHIELD }, - [Species.FENNEKIN]: { 0: Abilities.PSYCHIC_SURGE }, - [Species.FROAKIE]: { 0: Abilities.STAKEOUT }, - [Species.BUNNELBY]: { 0: Abilities.THICK_FAT }, - [Species.FLETCHLING]: { 0: Abilities.MAGIC_GUARD }, - [Species.SCATTERBUG]: { 0: Abilities.PRANKSTER }, + [Species.CHESPIN]: { 0: Abilities.ROUGH_SKIN }, + [Species.QUILLADIN]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.CHESNAUGHT]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.FENNEKIN]: { 0: Abilities.FLUFFY }, + [Species.BRAIXEN]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.DELPHOX]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.FROAKIE]: { 0: Abilities.STAKEOUT, 1: Abilities.STAKEOUT }, + [Species.FROGADIER]: { 0: Abilities.STAKEOUT, 1: Abilities.STAKEOUT }, + [Species.GRENINJA]: { 0: Abilities.STAKEOUT, 1: Abilities.STAKEOUT }, + [Species.BUNNELBY]: { 0: Abilities.INNER_FOCUS }, + [Species.DIGGERSBY]: { 0: Abilities.THICK_FAT }, + [Species.FLETCHLING]: { 0: Abilities.FLAME_BODY }, + [Species.FLETCHINDER]: { 0: Abilities.MAGIC_GUARD }, + [Species.TALONFLAME]: { 0: Abilities.MAGIC_GUARD }, + [Species.SCATTERBUG]: { 0: Abilities.SHIELD_DUST }, + [Species.SPEWPA]: { 0: Abilities.SHIELD_DUST }, + [Species.VIVILLON]: { 0: Abilities.PRANKSTER }, [Species.LITLEO]: { 0: Abilities.BEAST_BOOST }, + [Species.PYROAR]: { 0: Abilities.BEAST_BOOST }, [Species.FLABEBE]: { 0: Abilities.GRASSY_SURGE }, + [Species.FLOETTE]: { 0: Abilities.GRASSY_SURGE }, + [Species.FLORGES]: { 0: Abilities.GRASSY_SURGE }, [Species.SKIDDO]: { 0: Abilities.SEED_SOWER }, - [Species.PANCHAM]: { 0: Abilities.FUR_COAT }, + [Species.GOGOAT]: { 0: Abilities.SEED_SOWER }, + [Species.PANCHAM]: { 0: Abilities.TECHNICIAN }, + [Species.PANGORO]: { 0: Abilities.FUR_COAT }, [Species.FURFROU]: { 0: Abilities.FLUFFY }, - [Species.ESPURR]: { 0: Abilities.FUR_COAT }, + [Species.ESPURR]: { 0: Abilities.PRANKSTER }, + [Species.MEOWSTIC]: { 0: Abilities.FUR_COAT, 1: Abilities.NEUROFORCE }, [Species.HONEDGE]: { 0: Abilities.SHARPNESS }, + [Species.DOUBLADE]: { 0: Abilities.SHARPNESS }, + [Species.AEGISLASH]: { 0: Abilities.SHARPNESS }, [Species.SPRITZEE]: { 0: Abilities.FUR_COAT }, + [Species.AROMATISSE]: { 0: Abilities.FUR_COAT }, [Species.SWIRLIX]: { 0: Abilities.RIPEN }, - [Species.INKAY]: { 0: Abilities.UNNERVE }, + [Species.SLURPUFF]: { 0: Abilities.RIPEN }, + [Species.INKAY]: { 0: Abilities.SHADOW_SHIELD }, + [Species.MALAMAR]: { 0: Abilities.SHADOW_SHIELD }, [Species.BINACLE]: { 0: Abilities.SAP_SIPPER }, - [Species.SKRELP]: { 0: Abilities.DRAGONS_MAW }, + [Species.BARBARACLE]: { 0: Abilities.SAP_SIPPER }, + [Species.SKRELP]: { 0: Abilities.WATER_BUBBLE }, + [Species.DRAGALGE]: { 0: Abilities.DRAGONS_MAW }, [Species.CLAUNCHER]: { 0: Abilities.PROTEAN }, + [Species.CLAWITZER]: { 0: Abilities.PROTEAN }, [Species.HELIOPTILE]: { 0: Abilities.PROTEAN }, + [Species.HELIOLISK]: { 0: Abilities.PROTEAN }, [Species.TYRUNT]: { 0: Abilities.RECKLESS }, + [Species.TYRANTRUM]: { 0: Abilities.RECKLESS }, [Species.AMAURA]: { 0: Abilities.ICE_SCALES }, + [Species.AURORUS]: { 0: Abilities.ICE_SCALES }, [Species.HAWLUCHA]: { 0: Abilities.MOXIE }, [Species.DEDENNE]: { 0: Abilities.PIXILATE }, [Species.CARBINK]: { 0: Abilities.SOLID_ROCK }, [Species.GOOMY]: { 0: Abilities.REGENERATOR }, + [Species.SLIGGOO]: { 0: Abilities.POISON_HEAL }, + [Species.GOODRA]: { 0: Abilities.POISON_HEAL }, + [Species.HISUI_SLIGGOO]: { 0: Abilities.REGENERATOR }, + [Species.HISUI_GOODRA]: { 0: Abilities.REGENERATOR }, [Species.KLEFKI]: { 0: Abilities.LEVITATE }, [Species.PHANTUMP]: { 0: Abilities.SHADOW_TAG }, - [Species.PUMPKABOO]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.TREVENANT]: { 0: Abilities.SHADOW_TAG }, + [Species.PUMPKABOO]: { 0: Abilities.WELL_BAKED_BODY, 1: Abilities.ADAPTABILITY, 2: Abilities.PRANKSTER, 3: Abilities.SEED_SOWER }, + [Species.GOURGEIST]: { 0: Abilities.WELL_BAKED_BODY, 1: Abilities.ADAPTABILITY, 2: Abilities.PRANKSTER, 3: Abilities.SEED_SOWER }, [Species.BERGMITE]: { 0: Abilities.ICE_SCALES }, - [Species.NOIBAT]: { 0: Abilities.PUNK_ROCK }, + [Species.AVALUGG]: { 0: Abilities.ICE_SCALES }, + [Species.HISUI_AVALUGG]: { 0: Abilities.ICE_SCALES }, + [Species.NOIBAT]: { 0: Abilities.CHEEK_POUCH }, + [Species.NOIVERN]: { 0: Abilities.PUNK_ROCK }, [Species.XERNEAS]: { 0: Abilities.HARVEST }, [Species.YVELTAL]: { 0: Abilities.SOUL_HEART }, - [Species.ZYGARDE]: { 0: Abilities.ADAPTABILITY }, - [Species.DIANCIE]: { 0: Abilities.PRISM_ARMOR }, - [Species.HOOPA]: { 0: Abilities.OPPORTUNIST }, + [Species.ZYGARDE]: { 0: Abilities.UNNERVE, 1: Abilities.MOXIE, 2: Abilities.UNNERVE, 3: Abilities.MOXIE, 4: Abilities.ADAPTABILITY }, + [Species.DIANCIE]: { 0: Abilities.SOLID_ROCK, 1: Abilities.PRISM_ARMOR }, + [Species.HOOPA]: { 0: Abilities.OPPORTUNIST, 1: Abilities.OPPORTUNIST }, [Species.VOLCANION]: { 0: Abilities.NEUTRALIZING_GAS }, [Species.ETERNAL_FLOETTE]: { 0: Abilities.MAGIC_GUARD }, [Species.ROWLET]: { 0: Abilities.SNIPER }, + [Species.DARTRIX]: { 0: Abilities.SNIPER }, + [Species.DECIDUEYE]: { 0: Abilities.SNIPER }, + [Species.HISUI_DECIDUEYE]: { 0: Abilities.SNIPER }, [Species.LITTEN]: { 0: Abilities.OPPORTUNIST }, + [Species.TORRACAT]: { 0: Abilities.OPPORTUNIST }, + [Species.INCINEROAR]: { 0: Abilities.OPPORTUNIST }, [Species.POPPLIO]: { 0: Abilities.PUNK_ROCK }, + [Species.BRIONNE]: { 0: Abilities.PUNK_ROCK }, + [Species.PRIMARINA]: { 0: Abilities.PUNK_ROCK }, [Species.PIKIPEK]: { 0: Abilities.TECHNICIAN }, + [Species.TRUMBEAK]: { 0: Abilities.TECHNICIAN }, + [Species.TOUCANNON]: { 0: Abilities.TECHNICIAN }, [Species.YUNGOOS]: { 0: Abilities.TOUGH_CLAWS }, - [Species.GRUBBIN]: { 0: Abilities.SPEED_BOOST }, + [Species.GUMSHOOS]: { 0: Abilities.TOUGH_CLAWS }, + [Species.GRUBBIN]: { 0: Abilities.SHIELD_DUST }, + [Species.CHARJABUG]: { 0: Abilities.POWER_SPOT }, + [Species.VIKAVOLT]: { 0: Abilities.SPEED_BOOST }, [Species.CRABRAWLER]: { 0: Abilities.WATER_BUBBLE }, - [Species.ORICORIO]: { 0: Abilities.ADAPTABILITY }, - [Species.CUTIEFLY]: { 0: Abilities.TINTED_LENS }, - [Species.ROCKRUFF]: { 0: Abilities.ROCKY_PAYLOAD }, - [Species.WISHIWASHI]: { 0: Abilities.REGENERATOR }, + [Species.CRABOMINABLE]: { 0: Abilities.WATER_BUBBLE }, + [Species.ORICORIO]: { 0: Abilities.ADAPTABILITY, 1: Abilities.ADAPTABILITY, 2: Abilities.ADAPTABILITY, 3: Abilities.ADAPTABILITY }, + [Species.CUTIEFLY]: { 0: Abilities.PICKUP }, + [Species.RIBOMBEE]: { 0: Abilities.TINTED_LENS }, + [Species.ROCKRUFF]: { 0: Abilities.PICKUP, 1: Abilities.PICKUP }, + [Species.LYCANROC]: { 0: Abilities.STURDY, 1: Abilities.INTIMIDATE, 2: Abilities.STAKEOUT }, + [Species.WISHIWASHI]: { 0: Abilities.REGENERATOR, 1: Abilities.REGENERATOR }, [Species.MAREANIE]: { 0: Abilities.TOXIC_DEBRIS }, + [Species.TOXAPEX]: { 0: Abilities.TOXIC_DEBRIS }, [Species.MUDBRAY]: { 0: Abilities.SAP_SIPPER }, + [Species.MUDSDALE]: { 0: Abilities.SAP_SIPPER }, [Species.DEWPIDER]: { 0: Abilities.TINTED_LENS }, + [Species.ARAQUANID]: { 0: Abilities.TINTED_LENS }, [Species.FOMANTIS]: { 0: Abilities.SHARPNESS }, + [Species.LURANTIS]: { 0: Abilities.SHARPNESS }, [Species.MORELULL]: { 0: Abilities.TRIAGE }, + [Species.SHIINOTIC]: { 0: Abilities.TRIAGE }, [Species.SALANDIT]: { 0: Abilities.DRAGONS_MAW }, + [Species.SALAZZLE]: { 0: Abilities.DRAGONS_MAW }, [Species.STUFFUL]: { 0: Abilities.SCRAPPY }, - [Species.BOUNSWEET]: { 0: Abilities.MOXIE }, + [Species.BEWEAR]: { 0: Abilities.SCRAPPY }, + [Species.BOUNSWEET]: { 0: Abilities.SIMPLE }, + [Species.STEENEE]: { 0: Abilities.SIMPLE }, + [Species.TSAREENA]: { 0: Abilities.MOXIE }, [Species.COMFEY]: { 0: Abilities.FRIEND_GUARD }, [Species.ORANGURU]: { 0: Abilities.POWER_SPOT }, [Species.PASSIMIAN]: { 0: Abilities.LIBERO }, [Species.WIMPOD]: { 0: Abilities.REGENERATOR }, + [Species.GOLISOPOD]: { 0: Abilities.REGENERATOR }, [Species.SANDYGAST]: { 0: Abilities.SAND_SPIT }, + [Species.PALOSSAND]: { 0: Abilities.SAND_SPIT }, [Species.PYUKUMUKU]: { 0: Abilities.PURIFYING_SALT }, - [Species.TYPE_NULL]: { 0: Abilities.ADAPTABILITY }, - [Species.MINIOR]: { 0: Abilities.STURDY }, + [Species.TYPE_NULL]: { 0: Abilities.CLEAR_BODY }, + [Species.SILVALLY]: { 0: Abilities.ADAPTABILITY, 1: Abilities.ADAPTABILITY, 2: Abilities.ADAPTABILITY, 3: Abilities.ADAPTABILITY, 4: Abilities.ADAPTABILITY, 5: Abilities.ADAPTABILITY, 6: Abilities.ADAPTABILITY, 7: Abilities.ADAPTABILITY, 8: Abilities.ADAPTABILITY, 9: Abilities.ADAPTABILITY, 10: Abilities.ADAPTABILITY, 11: Abilities.ADAPTABILITY, 12: Abilities.ADAPTABILITY, 13: Abilities.ADAPTABILITY, 14: Abilities.ADAPTABILITY, 15: Abilities.ADAPTABILITY, 16: Abilities.ADAPTABILITY, 17: Abilities.ADAPTABILITY }, + [Species.MINIOR]: { 0: Abilities.STURDY, 1: Abilities.STURDY, 2: Abilities.STURDY, 3: Abilities.STURDY, 4: Abilities.STURDY, 5: Abilities.STURDY, 6: Abilities.STURDY, 7: Abilities.AERILATE, 8: Abilities.AERILATE, 9: Abilities.AERILATE, 10: Abilities.AERILATE, 11: Abilities.AERILATE, 12: Abilities.AERILATE, 13: Abilities.AERILATE }, [Species.KOMALA]: { 0: Abilities.GUTS }, [Species.TURTONATOR]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.TOGEDEMARU]: { 0: Abilities.ROUGH_SKIN }, - [Species.MIMIKYU]: { 0: Abilities.TOUGH_CLAWS }, + [Species.MIMIKYU]: { 0: Abilities.TOUGH_CLAWS, 1: Abilities.TOUGH_CLAWS }, [Species.BRUXISH]: { 0: Abilities.MULTISCALE }, [Species.DRAMPA]: { 0: Abilities.THICK_FAT }, [Species.DHELMISE]: { 0: Abilities.WATER_BUBBLE }, [Species.JANGMO_O]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.HAKAMO_O]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.KOMMO_O]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.TAPU_KOKO]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.TAPU_LELE]: { 0: Abilities.BERSERK }, [Species.TAPU_BULU]: { 0: Abilities.FLOWER_VEIL }, [Species.TAPU_FINI]: { 0: Abilities.FAIRY_AURA }, - [Species.COSMOG]: { 0: Abilities.BEAST_BOOST }, + [Species.COSMOG]: { 0: Abilities.FRIEND_GUARD }, + [Species.COSMOEM]: { 0: Abilities.POWER_SPOT }, + [Species.SOLGALEO]: { 0: Abilities.BEAST_BOOST }, + [Species.LUNALA]: { 0: Abilities.BEAST_BOOST }, [Species.NIHILEGO]: { 0: Abilities.LEVITATE }, [Species.BUZZWOLE]: { 0: Abilities.MOXIE }, [Species.PHEROMOSA]: { 0: Abilities.TINTED_LENS }, @@ -430,125 +836,223 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.CELESTEELA]: { 0: Abilities.HEATPROOF }, [Species.KARTANA]: { 0: Abilities.LONG_REACH }, [Species.GUZZLORD]: { 0: Abilities.POISON_HEAL }, - [Species.NECROZMA]: { 0: Abilities.BEAST_BOOST }, - [Species.MAGEARNA]: { 0: Abilities.STEELY_SPIRIT }, + [Species.NECROZMA]: { 0: Abilities.BEAST_BOOST, 1: Abilities.FULL_METAL_BODY, 2: Abilities.SHADOW_SHIELD, 3: Abilities.PRISM_ARMOR }, + [Species.MAGEARNA]: { 0: Abilities.STEELY_SPIRIT, 1: Abilities.STEELY_SPIRIT }, [Species.MARSHADOW]: { 0: Abilities.IRON_FIST }, [Species.POIPOLE]: { 0: Abilities.LEVITATE }, + [Species.NAGANADEL]: { 0: Abilities.LEVITATE }, [Species.STAKATAKA]: { 0: Abilities.SOLID_ROCK }, [Species.BLACEPHALON]: { 0: Abilities.MAGIC_GUARD }, [Species.ZERAORA]: { 0: Abilities.TOUGH_CLAWS }, [Species.MELTAN]: { 0: Abilities.HEATPROOF }, + [Species.MELMETAL]: { 0: Abilities.HEATPROOF, 1: Abilities.FULL_METAL_BODY }, [Species.ALOLA_RATTATA]: { 0: Abilities.ADAPTABILITY }, + [Species.ALOLA_RATICATE]: { 0: Abilities.ADAPTABILITY }, [Species.ALOLA_SANDSHREW]: { 0: Abilities.ICE_SCALES }, - [Species.ALOLA_VULPIX]: { 0: Abilities.SHEER_FORCE }, + [Species.ALOLA_VULPIX]: { 0: Abilities.ICE_BODY }, + [Species.ALOLA_NINETALES]: { 0: Abilities.ICE_BODY }, [Species.ALOLA_DIGLETT]: { 0: Abilities.STURDY }, + [Species.ALOLA_DUGTRIO]: { 0: Abilities.STURDY }, [Species.ALOLA_MEOWTH]: { 0: Abilities.DARK_AURA }, + [Species.ALOLA_PERSIAN]: { 0: Abilities.DARK_AURA }, [Species.ALOLA_GEODUDE]: { 0: Abilities.DRY_SKIN }, + [Species.ALOLA_GRAVELER]: { 0: Abilities.DRY_SKIN }, + [Species.ALOLA_GOLEM]: { 0: Abilities.DRY_SKIN }, [Species.ALOLA_GRIMER]: { 0: Abilities.TOXIC_DEBRIS }, + [Species.ALOLA_MUK]: { 0: Abilities.TOXIC_DEBRIS }, [Species.GROOKEY]: { 0: Abilities.GRASS_PELT }, + [Species.THWACKEY]: { 0: Abilities.GRASS_PELT }, + [Species.RILLABOOM]: { 0: Abilities.GRASS_PELT, 1: Abilities.GRASS_PELT }, [Species.SCORBUNNY]: { 0: Abilities.NO_GUARD }, + [Species.RABOOT]: { 0: Abilities.NO_GUARD }, + [Species.CINDERACE]: { 0: Abilities.NO_GUARD, 1: Abilities.NO_GUARD }, [Species.SOBBLE]: { 0: Abilities.SUPER_LUCK }, + [Species.DRIZZILE]: { 0: Abilities.SUPER_LUCK }, + [Species.INTELEON]: { 0: Abilities.SUPER_LUCK, 1: Abilities.SUPER_LUCK }, [Species.SKWOVET]: { 0: Abilities.HARVEST }, - [Species.ROOKIDEE]: { 0: Abilities.IRON_BARBS }, - [Species.BLIPBUG]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.GREEDENT]: { 0: Abilities.HARVEST }, + [Species.ROOKIDEE]: { 0: Abilities.DEFIANT }, + [Species.CORVISQUIRE]: { 0: Abilities.DEFIANT }, + [Species.CORVIKNIGHT]: { 0: Abilities.IRON_BARBS, 1: Abilities.IRON_BARBS }, + [Species.BLIPBUG]: { 0: Abilities.RUN_AWAY }, + [Species.DOTTLER]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.ORBEETLE]: { 0: Abilities.PSYCHIC_SURGE, 1: Abilities.PSYCHIC_SURGE }, [Species.NICKIT]: { 0: Abilities.MAGICIAN }, - [Species.GOSSIFLEUR]: { 0: Abilities.GRASSY_SURGE }, + [Species.THIEVUL]: { 0: Abilities.MAGICIAN }, + [Species.GOSSIFLEUR]: { 0: Abilities.SEED_SOWER }, + [Species.ELDEGOSS]: { 0: Abilities.GRASSY_SURGE }, [Species.WOOLOO]: { 0: Abilities.SCRAPPY }, - [Species.CHEWTLE]: { 0: Abilities.ROCKY_PAYLOAD }, - [Species.YAMPER]: { 0: Abilities.SHEER_FORCE }, + [Species.CHEWTLE]: { 0: Abilities.SOLID_ROCK }, + [Species.DREDNAW]: { 0: Abilities.SOLID_ROCK, 1: Abilities.SOLID_ROCK }, + [Species.YAMPER]: { 0: Abilities.PICKUP }, + [Species.BOLTUND]: { 0: Abilities.SHEER_FORCE }, [Species.ROLYCOLY]: { 0: Abilities.SOLID_ROCK }, - [Species.APPLIN]: { 0: Abilities.DRAGONS_MAW }, + [Species.CARKOL]: { 0: Abilities.SOLID_ROCK }, + [Species.COALOSSAL]: { 0: Abilities.SOLID_ROCK, 1: Abilities.SOLID_ROCK }, + [Species.APPLIN]: { 0: Abilities.STURDY }, + [Species.FLAPPLE]: { 0: Abilities.NO_GUARD, 1: Abilities.NO_GUARD }, + [Species.APPLETUN]: { 0: Abilities.WELL_BAKED_BODY, 1: Abilities.WELL_BAKED_BODY }, + [Species.DIPPLIN]: { 0: Abilities.FILTER }, + [Species.HYDRAPPLE]: { 0: Abilities.PARENTAL_BOND }, [Species.SILICOBRA]: { 0: Abilities.SAND_RUSH }, - [Species.CRAMORANT]: { 0: Abilities.LIGHTNING_ROD }, - [Species.ARROKUDA]: { 0: Abilities.INTIMIDATE }, + [Species.SANDACONDA]: { 0: Abilities.SAND_RUSH, 1: Abilities.SAND_RUSH }, + [Species.CRAMORANT]: { 0: Abilities.LIGHTNING_ROD, 1: Abilities.LIGHTNING_ROD, 2: Abilities.LIGHTNING_ROD }, + [Species.ARROKUDA]: { 0: Abilities.SPEED_BOOST }, + [Species.BARRASKEWDA]: { 0: Abilities.INTIMIDATE }, [Species.TOXEL]: { 0: Abilities.ELECTRIC_SURGE }, - [Species.SIZZLIPEDE]: { 0: Abilities.SPEED_BOOST }, + [Species.TOXTRICITY]: { 0: Abilities.ELECTRIC_SURGE, 1: Abilities.ELECTRIC_SURGE, 2: Abilities.ELECTRIC_SURGE }, + [Species.SIZZLIPEDE]: { 0: Abilities.HUSTLE }, + [Species.CENTISKORCH]: { 0: Abilities.HUSTLE, 1: Abilities.HUSTLE }, [Species.CLOBBOPUS]: { 0: Abilities.WATER_BUBBLE }, - [Species.SINISTEA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.GRAPPLOCT]: { 0: Abilities.WATER_BUBBLE }, + [Species.SINISTEA]: { 0: Abilities.SHADOW_SHIELD, 1: Abilities.SHADOW_SHIELD }, + [Species.POLTEAGEIST]: { 0: Abilities.SHADOW_SHIELD, 1: Abilities.SHADOW_SHIELD }, [Species.HATENNA]: { 0: Abilities.FAIRY_AURA }, + [Species.HATTREM]: { 0: Abilities.FAIRY_AURA }, + [Species.HATTERENE]: { 0: Abilities.FAIRY_AURA, 1: Abilities.FAIRY_AURA }, [Species.IMPIDIMP]: { 0: Abilities.INTIMIDATE }, + [Species.MORGREM]: { 0: Abilities.INTIMIDATE }, + [Species.GRIMMSNARL]: { 0: Abilities.INTIMIDATE, 1: Abilities.INTIMIDATE }, [Species.MILCERY]: { 0: Abilities.REGENERATOR }, - [Species.FALINKS]: { 0: Abilities.PARENTAL_BOND }, + [Species.ALCREMIE]: { 0: Abilities.REGENERATOR }, + [Species.FALINKS]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.PINCURCHIN]: { 0: Abilities.ELECTROMORPHOSIS }, [Species.SNOM]: { 0: Abilities.SNOW_WARNING }, + [Species.FROSMOTH]: { 0: Abilities.SNOW_WARNING }, [Species.STONJOURNER]: { 0: Abilities.STURDY }, - [Species.EISCUE]: { 0: Abilities.ICE_SCALES }, - [Species.INDEEDEE]: { 0: Abilities.FRIEND_GUARD }, - [Species.MORPEKO]: { 0: Abilities.MOODY }, + [Species.EISCUE]: { 0: Abilities.ICE_SCALES, 1: Abilities.ICE_SCALES }, + [Species.INDEEDEE]: { 0: Abilities.HOSPITALITY, 1: Abilities.FRIEND_GUARD }, + [Species.MORPEKO]: { 0: Abilities.MOODY, 1: Abilities.MOODY }, [Species.CUFANT]: { 0: Abilities.EARTH_EATER }, + [Species.COPPERAJAH]: { 0: Abilities.EARTH_EATER, 1: Abilities.EARTH_EATER }, [Species.DRACOZOLT]: { 0: Abilities.NO_GUARD }, [Species.ARCTOZOLT]: { 0: Abilities.WATER_ABSORB }, [Species.DRACOVISH]: { 0: Abilities.SWIFT_SWIM }, [Species.ARCTOVISH]: { 0: Abilities.STRONG_JAW }, - [Species.DURALUDON]: { 0: Abilities.STEELWORKER }, - [Species.DREEPY]: { 0: Abilities.PARENTAL_BOND }, - [Species.ZACIAN]: { 0: Abilities.UNNERVE }, - [Species.ZAMAZENTA]: { 0: Abilities.UNNERVE }, - [Species.ETERNATUS]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.DURALUDON]: { 0: Abilities.FILTER, 1: Abilities.UNAWARE }, + [Species.ARCHALUDON]: { 0: Abilities.TRANSISTOR }, + [Species.DREEPY]: { 0: Abilities.TECHNICIAN }, + [Species.DRAKLOAK]: { 0: Abilities.PARENTAL_BOND }, + [Species.DRAGAPULT]: { 0: Abilities.PARENTAL_BOND }, + [Species.ZACIAN]: { 0: Abilities.UNNERVE, 1: Abilities.UNNERVE }, + [Species.ZAMAZENTA]: { 0: Abilities.UNNERVE, 1: Abilities.UNNERVE }, + [Species.ETERNATUS]: { 0: Abilities.NEUTRALIZING_GAS, 1: Abilities.NEUTRALIZING_GAS }, [Species.KUBFU]: { 0: Abilities.IRON_FIST }, - [Species.ZARUDE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.URSHIFU]: { 0: Abilities.IRON_FIST, 1: Abilities.IRON_FIST, 2: Abilities.IRON_FIST, 3: Abilities.IRON_FIST }, + [Species.ZARUDE]: { 0: Abilities.TOUGH_CLAWS, 1: Abilities.TOUGH_CLAWS }, [Species.REGIELEKI]: { 0: Abilities.ELECTRIC_SURGE }, [Species.REGIDRAGO]: { 0: Abilities.MULTISCALE }, [Species.GLASTRIER]: { 0: Abilities.FILTER }, - [Species.SPECTRIER]: { 0: Abilities.SHADOW_SHIELD }, - [Species.CALYREX]: { 0: Abilities.HARVEST }, - [Species.ENAMORUS]: { 0: Abilities.FAIRY_AURA }, + [Species.SPECTRIER]: { 0: Abilities.MOLD_BREAKER }, + [Species.CALYREX]: { 0: Abilities.HARVEST, 1: Abilities.FILTER, 2: Abilities.MOLD_BREAKER }, + [Species.ENAMORUS]: { 0: Abilities.FAIRY_AURA, 1: Abilities.FAIRY_AURA }, [Species.GALAR_MEOWTH]: { 0: Abilities.UNBURDEN }, + [Species.PERRSERKER]: { 0: Abilities.UNBURDEN }, [Species.GALAR_PONYTA]: { 0: Abilities.CHILLING_NEIGH }, - [Species.GALAR_SLOWPOKE]: { 0: Abilities.UNAWARE }, - [Species.GALAR_FARFETCHD]: { 0: Abilities.INTREPID_SWORD }, + [Species.GALAR_RAPIDASH]: { 0: Abilities.CHILLING_NEIGH }, + [Species.GALAR_SLOWPOKE]: { 0: Abilities.OBLIVIOUS }, + [Species.GALAR_SLOWBRO]: { 0: Abilities.NEUROFORCE }, + [Species.GALAR_SLOWKING]: { 0: Abilities.INTIMIDATE }, + [Species.GALAR_FARFETCHD]: { 0: Abilities.STAKEOUT }, + [Species.SIRFETCHD]: { 0: Abilities.INTREPID_SWORD }, [Species.GALAR_ARTICUNO]: { 0: Abilities.SERENE_GRACE }, [Species.GALAR_ZAPDOS]: { 0: Abilities.TOUGH_CLAWS }, [Species.GALAR_MOLTRES]: { 0: Abilities.DARK_AURA }, [Species.GALAR_CORSOLA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.CURSOLA]: { 0: Abilities.SHADOW_SHIELD }, [Species.GALAR_ZIGZAGOON]: { 0: Abilities.POISON_HEAL }, + [Species.GALAR_LINOONE]: { 0: Abilities.POISON_HEAL }, + [Species.OBSTAGOON]: { 0: Abilities.POISON_HEAL }, [Species.GALAR_DARUMAKA]: { 0: Abilities.FLASH_FIRE }, + [Species.GALAR_DARMANITAN]: { 0: Abilities.FLASH_FIRE, 1: Abilities.FLASH_FIRE }, [Species.GALAR_YAMASK]: { 0: Abilities.TABLETS_OF_RUIN }, + [Species.RUNERIGUS]: { 0: Abilities.TABLETS_OF_RUIN }, [Species.GALAR_STUNFISK]: { 0: Abilities.ARENA_TRAP }, [Species.HISUI_GROWLITHE]: { 0: Abilities.RECKLESS }, + [Species.HISUI_ARCANINE]: { 0: Abilities.RECKLESS }, [Species.HISUI_VOLTORB]: { 0: Abilities.TRANSISTOR }, + [Species.HISUI_ELECTRODE]: { 0: Abilities.TRANSISTOR }, [Species.HISUI_QWILFISH]: { 0: Abilities.MERCILESS }, + [Species.OVERQWIL]: { 0: Abilities.MERCILESS }, [Species.HISUI_SNEASEL]: { 0: Abilities.SCRAPPY }, + [Species.SNEASLER]: { 0: Abilities.SCRAPPY }, [Species.HISUI_ZORUA]: { 0: Abilities.ADAPTABILITY }, + [Species.HISUI_ZOROARK]: { 0: Abilities.ADAPTABILITY }, - [Species.SPRIGATITO]: { 0: Abilities.MAGICIAN }, - [Species.FUECOCO]: { 0: Abilities.PUNK_ROCK }, - [Species.QUAXLY]: { 0: Abilities.OPPORTUNIST }, + [Species.SPRIGATITO]: { 0: Abilities.PICKUP }, + [Species.FLORAGATO]: { 0: Abilities.MAGICIAN }, + [Species.MEOWSCARADA]: { 0: Abilities.MAGICIAN }, + [Species.FUECOCO]: { 0: Abilities.GLUTTONY }, + [Species.CROCALOR]: { 0: Abilities.GLUTTONY }, + [Species.SKELEDIRGE]: { 0: Abilities.GLUTTONY }, + [Species.QUAXLY]: { 0: Abilities.DANCER }, + [Species.QUAXWELL]: { 0: Abilities.OPPORTUNIST }, + [Species.QUAQUAVAL]: { 0: Abilities.OPPORTUNIST }, [Species.LECHONK]: { 0: Abilities.SIMPLE }, + [Species.OINKOLOGNE]: { 0: Abilities.SIMPLE, 1: Abilities.SIMPLE }, [Species.TAROUNTULA]: { 0: Abilities.HONEY_GATHER }, - [Species.NYMBLE]: { 0: Abilities.GUTS }, + [Species.SPIDOPS]: { 0: Abilities.HONEY_GATHER }, + [Species.NYMBLE]: { 0: Abilities.HUSTLE }, + [Species.LOKIX]: { 0: Abilities.GUTS }, [Species.PAWMI]: { 0: Abilities.TRANSISTOR }, - [Species.TANDEMAUS]: { 0: Abilities.SCRAPPY }, + [Species.PAWMO]: { 0: Abilities.TRANSISTOR }, + [Species.PAWMOT]: { 0: Abilities.TRANSISTOR }, + [Species.TANDEMAUS]: { 0: Abilities.FRIEND_GUARD }, + [Species.MAUSHOLD]: { 0: Abilities.SCRAPPY, 1: Abilities.SCRAPPY }, [Species.FIDOUGH]: { 0: Abilities.WATER_ABSORB }, + [Species.DACHSBUN]: { 0: Abilities.WATER_ABSORB }, [Species.SMOLIV]: { 0: Abilities.RIPEN }, - [Species.SQUAWKABILLY]: { 0: Abilities.MOXIE }, + [Species.DOLLIV]: { 0: Abilities.RIPEN }, + [Species.ARBOLIVA]: { 0: Abilities.RIPEN }, + [Species.SQUAWKABILLY]: { 0: Abilities.MOXIE, 1: Abilities.MOXIE, 2: Abilities.MOXIE, 3: Abilities.MOXIE }, [Species.NACLI]: { 0: Abilities.SOLID_ROCK }, - [Species.CHARCADET]: { 0: Abilities.PRISM_ARMOR }, - [Species.TADBULB]: { 0: Abilities.STAMINA }, + [Species.NACLSTACK]: { 0: Abilities.SOLID_ROCK }, + [Species.GARGANACL]: { 0: Abilities.SOLID_ROCK }, + [Species.CHARCADET]: { 0: Abilities.BATTLE_ARMOR }, + [Species.ARMAROUGE]: { 0: Abilities.PRISM_ARMOR }, + [Species.CERULEDGE]: { 0: Abilities.PRISM_ARMOR }, + [Species.TADBULB]: { 0: Abilities.LEVITATE }, + [Species.BELLIBOLT]: { 0: Abilities.STAMINA }, [Species.WATTREL]: { 0: Abilities.SHEER_FORCE }, + [Species.KILOWATTREL]: { 0: Abilities.SHEER_FORCE }, [Species.MASCHIFF]: { 0: Abilities.STRONG_JAW }, + [Species.MABOSSTIFF]: { 0: Abilities.STRONG_JAW }, [Species.SHROODLE]: { 0: Abilities.CORROSION }, - [Species.BRAMBLIN]: { 0: Abilities.SHADOW_SHIELD }, - [Species.TOEDSCOOL]: { 0: Abilities.PRANKSTER }, + [Species.GRAFAIAI]: { 0: Abilities.CORROSION }, + [Species.BRAMBLIN]: { 0: Abilities.WANDERING_SPIRIT }, + [Species.BRAMBLEGHAST]: { 0: Abilities.SHADOW_SHIELD }, + [Species.TOEDSCOOL]: { 0: Abilities.RUN_AWAY }, + [Species.TOEDSCRUEL]: { 0: Abilities.PRANKSTER }, [Species.KLAWF]: { 0: Abilities.WATER_ABSORB }, - [Species.CAPSAKID]: { 0: Abilities.PARENTAL_BOND }, + [Species.CAPSAKID]: { 0: Abilities.FLOWER_GIFT }, + [Species.SCOVILLAIN]: { 0: Abilities.PARENTAL_BOND }, [Species.RELLOR]: { 0: Abilities.PRANKSTER }, + [Species.RABSCA]: { 0: Abilities.PRANKSTER }, [Species.FLITTLE]: { 0: Abilities.DAZZLING }, + [Species.ESPATHRA]: { 0: Abilities.DAZZLING }, [Species.TINKATINK]: { 0: Abilities.STEELWORKER }, + [Species.TINKATUFF]: { 0: Abilities.STEELWORKER }, + [Species.TINKATON]: { 0: Abilities.STEELWORKER }, [Species.WIGLETT]: { 0: Abilities.STURDY }, + [Species.WUGTRIO]: { 0: Abilities.STURDY }, [Species.BOMBIRDIER]: { 0: Abilities.UNBURDEN }, - [Species.FINIZEN]: { 0: Abilities.IRON_FIST }, + [Species.FINIZEN]: { 0: Abilities.SWIFT_SWIM }, + [Species.PALAFIN]: { 0: Abilities.EMERGENCY_EXIT, 1: Abilities.IRON_FIST }, [Species.VAROOM]: { 0: Abilities.LEVITATE }, + [Species.REVAVROOM]: { 0: Abilities.LEVITATE, 1: Abilities.LEVITATE, 2: Abilities.LEVITATE, 3: Abilities.LEVITATE, 4: Abilities.LEVITATE, 5: Abilities.LEVITATE }, [Species.CYCLIZAR]: { 0: Abilities.PROTEAN }, [Species.ORTHWORM]: { 0: Abilities.REGENERATOR }, - [Species.GLIMMET]: { 0: Abilities.TERA_SHELL }, + [Species.GLIMMET]: { 0: Abilities.STURDY }, + [Species.GLIMMORA]: { 0: Abilities.TERA_SHELL }, [Species.GREAVARD]: { 0: Abilities.UNAWARE }, + [Species.HOUNDSTONE]: { 0: Abilities.UNAWARE }, [Species.FLAMIGO]: { 0: Abilities.MOXIE }, [Species.CETODDLE]: { 0: Abilities.REFRIGERATE }, + [Species.CETITAN]: { 0: Abilities.REFRIGERATE }, [Species.VELUZA]: { 0: Abilities.SUPER_LUCK }, [Species.DONDOZO]: { 0: Abilities.DRAGONS_MAW }, - [Species.TATSUGIRI]: { 0: Abilities.FLUFFY }, + [Species.TATSUGIRI]: { 0: Abilities.FLUFFY, 1: Abilities.FLUFFY, 2: Abilities.FLUFFY }, [Species.GREAT_TUSK]: { 0: Abilities.INTIMIDATE }, [Species.SCREAM_TAIL]: { 0: Abilities.UNAWARE }, [Species.BRUTE_BONNET]: { 0: Abilities.CHLOROPHYLL }, @@ -562,29 +1066,34 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.IRON_MOTH]: { 0: Abilities.LEVITATE }, [Species.IRON_THORNS]: { 0: Abilities.SAND_STREAM }, [Species.FRIGIBAX]: { 0: Abilities.INTIMIDATE }, - [Species.GIMMIGHOUL]: { 0: Abilities.HONEY_GATHER }, + [Species.ARCTIBAX]: { 0: Abilities.INTIMIDATE }, + [Species.BAXCALIBUR]: { 0: Abilities.INTIMIDATE }, + [Species.GIMMIGHOUL]: { 0: Abilities.HONEY_GATHER, 1: Abilities.HONEY_GATHER }, + [Species.GHOLDENGO]: { 0: Abilities.HONEY_GATHER }, [Species.WO_CHIEN]: { 0: Abilities.VESSEL_OF_RUIN }, [Species.CHIEN_PAO]: { 0: Abilities.INTIMIDATE }, [Species.TING_LU]: { 0: Abilities.STAMINA }, [Species.CHI_YU]: { 0: Abilities.BERSERK }, [Species.ROARING_MOON]: { 0: Abilities.INTIMIDATE }, [Species.IRON_VALIANT]: { 0: Abilities.NEUROFORCE }, - [Species.KORAIDON]: { 0: Abilities.OPPORTUNIST }, - [Species.MIRAIDON]: { 0: Abilities.OPPORTUNIST }, + [Species.KORAIDON]: { 0: Abilities.THERMAL_EXCHANGE }, + [Species.MIRAIDON]: { 0: Abilities.COMPOUND_EYES }, [Species.WALKING_WAKE]: { 0: Abilities.BEAST_BOOST }, [Species.IRON_LEAVES]: { 0: Abilities.SHARPNESS }, - [Species.POLTCHAGEIST]: { 0: Abilities.TRIAGE }, + [Species.POLTCHAGEIST]: { 0: Abilities.TRIAGE, 1: Abilities.TRIAGE }, + [Species.SINISTCHA]: { 0: Abilities.TRIAGE, 1: Abilities.TRIAGE }, [Species.OKIDOGI]: { 0: Abilities.DARK_AURA }, [Species.MUNKIDORI]: { 0: Abilities.MAGICIAN }, [Species.FEZANDIPITI]: { 0: Abilities.PIXILATE }, - [Species.OGERPON]: { 0: Abilities.OPPORTUNIST }, + [Species.OGERPON]: { 0: Abilities.OPPORTUNIST, 1: Abilities.SUPER_LUCK, 2: Abilities.FLASH_FIRE, 3: Abilities.MAGIC_GUARD, 4: Abilities.OPPORTUNIST, 5: Abilities.SUPER_LUCK, 6: Abilities.FLASH_FIRE, 7: Abilities.MAGIC_GUARD }, [Species.GOUGING_FIRE]: { 0: Abilities.BEAST_BOOST }, [Species.RAGING_BOLT]: { 0: Abilities.BEAST_BOOST }, [Species.IRON_BOULDER]: { 0: Abilities.SHARPNESS }, [Species.IRON_CROWN]: { 0: Abilities.SHARPNESS }, - [Species.TERAPAGOS]: { 0: Abilities.SHIELD_DUST }, + [Species.TERAPAGOS]: { 0: Abilities.SHIELD_DUST, 1: Abilities.SHIELD_DUST, 2: Abilities.SHIELD_DUST }, [Species.PECHARUNT]: { 0: Abilities.TOXIC_CHAIN }, - [Species.PALDEA_TAUROS]: { 0: Abilities.ADAPTABILITY }, - [Species.PALDEA_WOOPER]: { 0: Abilities.THICK_FAT }, + [Species.PALDEA_TAUROS]: { 0: Abilities.STAMINA, 1: Abilities.ADAPTABILITY, 2: Abilities.ADAPTABILITY }, + [Species.PALDEA_WOOPER]: { 0: Abilities.POISON_TOUCH }, + [Species.CLODSIRE]: { 0: Abilities.THICK_FAT }, [Species.BLOODMOON_URSALUNA]: { 0: Abilities.BERSERK } }; diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index d172173e9df..2f182494fb1 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -2086,7 +2086,7 @@ export function initSpecies() { new PokemonSpecies(Species.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.9, 34, Abilities.ADAPTABILITY, Abilities.DOWNLOAD, Abilities.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.GALLADE, 4, false, false, false, "Blade Pokémon", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 56.4, Abilities.SHARPNESS, Abilities.SHARPNESS, Abilities.SHARPNESS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 56.4, Abilities.INNER_FOCUS, Abilities.INNER_FOCUS, Abilities.INNER_FOCUS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), ), new PokemonSpecies(Species.PROBOPASS, 4, false, false, false, "Compass Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.4, 340, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", PokemonType.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), @@ -2357,16 +2357,16 @@ export function initSpecies() { new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, new PokemonForm("Normal", "", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.NONE, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), ), new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, new PokemonForm("Normal", "", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.NONE, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), ), new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), - new PokemonForm("Ash", "ash", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), + new PokemonForm("Ash", "ash", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.NONE, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), ), new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, PokemonType.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), From 938f1b8756c1fe54ab2d29777ce8f135a877e389 Mon Sep 17 00:00:00 2001 From: damocleas Date: Wed, 26 Mar 2025 18:57:30 -0400 Subject: [PATCH 27/48] [Balance] G-Max Form Re-Evaluation (#5545) * Update pokemon-species.ts * Orbeetle and Drednaw adjustment * Cinderace, Corviknight, Drednaw, and Coalossal adjustments * Fix Urshifus * Butterfree, Orbettle, and Drednaw adjustments --- src/data/pokemon-species.ts | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 2f182494fb1..15c60d28969 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1383,7 +1383,7 @@ export function initSpecies() { new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 122, 90, 108, 105, 80, 45, 50, 263, true), ), new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", PokemonType.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -1391,20 +1391,20 @@ export function initSpecies() { new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.FIRE, PokemonType.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.FIRE, PokemonType.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 84, 93, 139, 100, 100, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 99, 88, 134, 95, 100, 45, 50, 267), ), new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", PokemonType.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", PokemonType.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 83, 135, 115, 110, 68, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 108, 125, 105, 110, 63, 45, 50, 265), ), new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 80, 40, 75, 120, 95, 85, 45, 50, 198, true), ), new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", PokemonType.BUG, PokemonType.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, PokemonType.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), @@ -1485,7 +1485,7 @@ export function initSpecies() { new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, new PokemonForm("Normal", "", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 120, 170, 85, 75, 90, 65, 45, 50, 253), ), new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1526,7 +1526,7 @@ export function initSpecies() { new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", PokemonType.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 70, 70, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 92, 145, 140, 60, 65, 73, 60, 50, 166), ), new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), @@ -1570,13 +1570,13 @@ export function initSpecies() { ), new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 85, 85, 105, 130, 60, 45, 50, 187), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 97, 85, 107, 111, 65, 45, 50, 187), ), new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", PokemonType.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), new PokemonForm("Partner", "partner", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 95, 70, 90, 85, 85, 45, 50, 65), //+100 BST from Partner Form ), new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", PokemonType.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), @@ -1592,7 +1592,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 210, 135, 70, 90, 115, 20, 25, 50, 189), ), new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", PokemonType.ICE, PokemonType.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), @@ -2232,7 +2232,7 @@ export function initSpecies() { new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", PokemonType.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 115, 121, 102, 81, 102, 53, 60, 50, 166), ), new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", PokemonType.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", PokemonType.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2707,25 +2707,25 @@ export function initSpecies() { new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 170, 158, 158, 95, 75, 44, 3, 0, 300), ), new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", PokemonType.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", PokemonType.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 140, 105, 90, 85, 85, 45, 50, 265), ), new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 141, 80, 95, 80, 134, 45, 50, 265), ), new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 117, 67, 147, 67, 137, 45, 50, 265), ), new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", PokemonType.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", PokemonType.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), @@ -2733,13 +2733,13 @@ export function initSpecies() { new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 118, 112, 135, 63, 90, 77, 45, 50, 248), ), new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 75, 50, 140, 100, 150, 90, 45, 50, 253), ), new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), @@ -2750,7 +2750,7 @@ export function initSpecies() { new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", PokemonType.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 137, 115, 61, 83, 74, 75, 50, 170), ), new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", PokemonType.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", PokemonType.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), @@ -2758,7 +2758,7 @@ export function initSpecies() { new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 100, 132, 95, 100, 43, 45, 50, 255), ), new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, @@ -2772,7 +2772,7 @@ export function initSpecies() { new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 102, 137, 140, 70, 80, 81, 120, 50, 179), ), new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), @@ -2790,7 +2790,7 @@ export function initSpecies() { new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 130, 125, 75, 94, 100, 101, 75, 50, 184), ), new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", PokemonType.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", PokemonType.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), @@ -2853,7 +2853,7 @@ export function initSpecies() { new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 177, 155, 79, 90, 79, 20, 90, 50, 175), ), new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), @@ -2882,8 +2882,8 @@ export function initSpecies() { new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, new PokemonForm("Single Strike Style", "single-strike", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), new PokemonForm("Rapid Strike Style", "rapid-strike", PokemonType.FIGHTING, PokemonType.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275), ), new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), From 0b1f324f97c7c6e6fcf2b17a2d8c2901c9f0aad9 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Thu, 27 Mar 2025 02:47:16 +0100 Subject: [PATCH 28/48] [Sprite] [Item] Weather/Terrain Extender Item Sprite (#5542) * Terrain/weather-extender item * Fixing indexing for the sprite atlas * Re-export item atlas, fix extender item's name Spaces in names use underscores instead of hyphens --------- Co-authored-by: Madmadness65 --- public/images/items.json | 10133 ++++++++-------- public/images/items.png | Bin 59627 -> 57986 bytes public/images/items/ability_capsule.png | Bin 257 -> 274 bytes public/images/items/ability_charm.png | Bin 556 -> 308 bytes public/images/items/abomasite.png | Bin 241 -> 243 bytes public/images/items/absolite.png | Bin 234 -> 236 bytes public/images/items/adamant_crystal.png | Bin 1034 -> 317 bytes public/images/items/aerodactylite.png | Bin 245 -> 252 bytes public/images/items/aggronite.png | Bin 235 -> 252 bytes public/images/items/alakazite.png | Bin 236 -> 247 bytes public/images/items/altarianite.png | Bin 228 -> 242 bytes public/images/items/ampharosite.png | Bin 250 -> 253 bytes public/images/items/amulet_coin.png | Bin 293 -> 270 bytes public/images/items/apicot_berry.png | Bin 290 -> 282 bytes public/images/items/audinite.png | Bin 240 -> 261 bytes public/images/items/auspicious_armor.png | Bin 2013 -> 695 bytes public/images/items/banettite.png | Bin 245 -> 247 bytes public/images/items/baton.png | Bin 653 -> 596 bytes public/images/items/beedrillite.png | Bin 247 -> 260 bytes public/images/items/berry_juice.png | Bin 390 -> 327 bytes public/images/items/berry_pot.png | Bin 275 -> 277 bytes public/images/items/berry_pouch.png | Bin 354 -> 328 bytes public/images/items/big_mushroom.png | Bin 273 -> 263 bytes public/images/items/big_nugget.png | Bin 275 -> 258 bytes public/images/items/big_root.png | Bin 347 -> 313 bytes public/images/items/binding_band.png | Bin 218 -> 219 bytes public/images/items/black_augurite.png | Bin 374 -> 318 bytes public/images/items/black_belt.png | Bin 258 -> 246 bytes public/images/items/black_glasses.png | Bin 248 -> 243 bytes public/images/items/black_sludge.png | Bin 285 -> 286 bytes public/images/items/blank_plate.png | Bin 308 -> 232 bytes public/images/items/blastoisinite.png | Bin 243 -> 247 bytes public/images/items/blazikenite.png | Bin 238 -> 252 bytes public/images/items/blue_orb.png | Bin 306 -> 302 bytes public/images/items/blunder_policy.png | Bin 261 -> 259 bytes public/images/items/bronze_ribbon.png | Bin 400 -> 324 bytes public/images/items/bug_memory.png | Bin 396 -> 349 bytes public/images/items/bug_tera_shard.png | Bin 349 -> 266 bytes public/images/items/burn_drive.png | Bin 303 -> 242 bytes public/images/items/calcium.png | Bin 295 -> 280 bytes public/images/items/cameruptite.png | Bin 247 -> 266 bytes public/images/items/candy.png | Bin 402 -> 259 bytes public/images/items/candy_jar.png | Bin 511 -> 316 bytes public/images/items/candy_overlay.png | Bin 263 -> 289 bytes public/images/items/carbos.png | Bin 287 -> 280 bytes public/images/items/catching_charm.png | Bin 322 -> 296 bytes public/images/items/charcoal.png | Bin 253 -> 251 bytes public/images/items/charizardite_x.png | Bin 240 -> 248 bytes public/images/items/charizardite_y.png | Bin 243 -> 248 bytes public/images/items/chill_drive.png | Bin 303 -> 242 bytes public/images/items/chipped_pot.png | Bin 856 -> 785 bytes public/images/items/choice_scarf.png | Bin 404 -> 350 bytes public/images/items/choice_specs.png | Bin 283 -> 268 bytes public/images/items/clefairy_doll.png | Bin 329 -> 296 bytes public/images/items/coin_case.png | Bin 245 -> 255 bytes public/images/items/cornerstone_mask.png | Bin 392 -> 320 bytes public/images/items/coupon.png | Bin 253 -> 262 bytes public/images/items/cracked_pot.png | Bin 823 -> 752 bytes public/images/items/dark_memory.png | Bin 411 -> 358 bytes public/images/items/dark_stone.png | Bin 298 -> 235 bytes public/images/items/dark_tera_shard.png | Bin 349 -> 266 bytes public/images/items/dawn_stone.png | Bin 274 -> 262 bytes public/images/items/deep_sea_scale.png | Bin 235 -> 239 bytes public/images/items/deep_sea_tooth.png | Bin 274 -> 268 bytes public/images/items/diancite.png | Bin 239 -> 256 bytes public/images/items/dire_hit.png | Bin 335 -> 302 bytes public/images/items/dna_splicers.png | Bin 293 -> 275 bytes public/images/items/douse_drive.png | Bin 303 -> 242 bytes public/images/items/draco_plate.png | Bin 308 -> 232 bytes public/images/items/dragon_fang.png | Bin 289 -> 275 bytes public/images/items/dragon_memory.png | Bin 378 -> 341 bytes public/images/items/dragon_scale.png | Bin 233 -> 239 bytes public/images/items/dragon_tera_shard.png | Bin 349 -> 266 bytes public/images/items/dread_plate.png | Bin 308 -> 232 bytes public/images/items/dubious_disc.png | Bin 298 -> 291 bytes public/images/items/dusk_stone.png | Bin 269 -> 266 bytes public/images/items/dynamax_band.png | Bin 907 -> 834 bytes public/images/items/earth_plate.png | Bin 308 -> 232 bytes public/images/items/electirizer.png | Bin 282 -> 269 bytes public/images/items/electric_memory.png | Bin 397 -> 345 bytes public/images/items/electric_tera_shard.png | Bin 349 -> 266 bytes public/images/items/elixir.png | Bin 303 -> 289 bytes public/images/items/enigma_berry.png | Bin 295 -> 277 bytes public/images/items/ether.png | Bin 300 -> 289 bytes public/images/items/everstone.png | Bin 258 -> 241 bytes public/images/items/eviolite.png | Bin 6019 -> 601 bytes public/images/items/exp_balance.png | Bin 632 -> 341 bytes public/images/items/exp_charm.png | Bin 386 -> 362 bytes public/images/items/exp_share.png | Bin 380 -> 341 bytes public/images/items/expert_belt.png | Bin 289 -> 267 bytes public/images/items/fairy_feather.png | Bin 448 -> 254 bytes public/images/items/fairy_memory.png | Bin 386 -> 347 bytes public/images/items/fairy_tera_shard.png | Bin 349 -> 266 bytes public/images/items/fighting_memory.png | Bin 391 -> 341 bytes public/images/items/fighting_tera_shard.png | Bin 349 -> 267 bytes public/images/items/fire_memory.png | Bin 390 -> 341 bytes public/images/items/fire_stone.png | Bin 347 -> 320 bytes public/images/items/fire_tera_shard.png | Bin 349 -> 267 bytes public/images/items/fist_plate.png | Bin 308 -> 232 bytes public/images/items/flame_orb.png | Bin 367 -> 243 bytes public/images/items/flame_plate.png | Bin 308 -> 232 bytes public/images/items/flying_memory.png | Bin 381 -> 342 bytes public/images/items/flying_tera_shard.png | Bin 354 -> 300 bytes public/images/items/focus_band.png | Bin 366 -> 338 bytes public/images/items/focus_sash.png | Bin 291 -> 268 bytes public/images/items/full_heal.png | Bin 276 -> 288 bytes public/images/items/full_restore.png | Bin 313 -> 293 bytes public/images/items/galarica_cuff.png | Bin 1217 -> 1122 bytes public/images/items/galarica_wreath.png | Bin 1399 -> 1304 bytes public/images/items/galladite.png | Bin 246 -> 256 bytes public/images/items/ganlon_berry.png | Bin 336 -> 295 bytes public/images/items/garchompite.png | Bin 244 -> 253 bytes public/images/items/gardevoirite.png | Bin 249 -> 253 bytes public/images/items/gb.png | Bin 317 -> 302 bytes public/images/items/gengarite.png | Bin 235 -> 248 bytes public/images/items/ghost_memory.png | Bin 393 -> 342 bytes public/images/items/ghost_tera_shard.png | Bin 354 -> 272 bytes public/images/items/glalitite.png | Bin 247 -> 261 bytes public/images/items/golden_egg.png | Bin 390 -> 249 bytes public/images/items/golden_exp_charm.png | Bin 441 -> 348 bytes public/images/items/golden_mystic_ticket.png | Bin 338 -> 242 bytes public/images/items/golden_net.png | Bin 561 -> 266 bytes public/images/items/golden_punch.png | Bin 518 -> 276 bytes public/images/items/gracidea.png | Bin 403 -> 354 bytes public/images/items/grass_memory.png | Bin 385 -> 346 bytes public/images/items/grass_tera_shard.png | Bin 339 -> 258 bytes public/images/items/great_ribbon.png | Bin 408 -> 328 bytes public/images/items/grip_claw.png | Bin 318 -> 305 bytes public/images/items/griseous_core.png | Bin 1026 -> 307 bytes public/images/items/ground_memory.png | Bin 383 -> 341 bytes public/images/items/ground_tera_shard.png | Bin 349 -> 266 bytes public/images/items/guard_spec.png | Bin 329 -> 302 bytes public/images/items/gyaradosite.png | Bin 252 -> 252 bytes public/images/items/hard_meteorite.png | Bin 363 -> 297 bytes public/images/items/hard_stone.png | Bin 269 -> 261 bytes public/images/items/healing_charm.png | Bin 347 -> 311 bytes public/images/items/hearthflame_mask.png | Bin 378 -> 317 bytes public/images/items/heracronite.png | Bin 246 -> 252 bytes public/images/items/houndoominite.png | Bin 247 -> 252 bytes public/images/items/hp_up.png | Bin 301 -> 291 bytes public/images/items/hyper_potion.png | Bin 305 -> 289 bytes public/images/items/ice_memory.png | Bin 375 -> 332 bytes public/images/items/ice_stone.png | Bin 378 -> 322 bytes public/images/items/ice_tera_shard.png | Bin 343 -> 260 bytes public/images/items/icicle_plate.png | Bin 308 -> 232 bytes public/images/items/icy_reins_of_unity.png | Bin 421 -> 351 bytes public/images/items/insect_plate.png | Bin 308 -> 232 bytes public/images/items/inverse.png | Bin 413 -> 284 bytes public/images/items/iron.png | Bin 288 -> 280 bytes public/images/items/iron_plate.png | Bin 308 -> 232 bytes public/images/items/kangaskhanite.png | Bin 238 -> 252 bytes public/images/items/kings_rock.png | Bin 367 -> 316 bytes public/images/items/lansat_berry.png | Bin 322 -> 297 bytes public/images/items/latiasite.png | Bin 250 -> 254 bytes public/images/items/latiosite.png | Bin 249 -> 254 bytes public/images/items/leaders_crest.png | Bin 694 -> 319 bytes public/images/items/leaf_stone.png | Bin 364 -> 329 bytes public/images/items/leek.png | Bin 230 -> 230 bytes public/images/items/leftovers.png | Bin 285 -> 273 bytes public/images/items/legend_plate.png | Bin 343 -> 271 bytes public/images/items/leppa_berry.png | Bin 287 -> 285 bytes public/images/items/liechi_berry.png | Bin 347 -> 310 bytes public/images/items/light_ball.png | Bin 6544 -> 633 bytes public/images/items/light_stone.png | Bin 309 -> 249 bytes public/images/items/linking_cord.png | Bin 795 -> 290 bytes public/images/items/lock_capsule.png | Bin 305 -> 290 bytes public/images/items/lopunnite.png | Bin 243 -> 261 bytes public/images/items/lucarionite.png | Bin 246 -> 252 bytes public/images/items/lucky_egg.png | Bin 198 -> 211 bytes public/images/items/lucky_punch.png | Bin 275 -> 273 bytes public/images/items/lucky_punch_great.png | Bin 468 -> 273 bytes public/images/items/lucky_punch_master.png | Bin 469 -> 273 bytes public/images/items/lucky_punch_ultra.png | Bin 466 -> 273 bytes public/images/items/lum_berry.png | Bin 256 -> 247 bytes public/images/items/lure.png | Bin 588 -> 305 bytes public/images/items/lustrous_globe.png | Bin 1054 -> 359 bytes public/images/items/macho_brace.png | Bin 372 -> 366 bytes public/images/items/magmarizer.png | Bin 290 -> 280 bytes public/images/items/magnet.png | Bin 272 -> 276 bytes public/images/items/malicious_armor.png | Bin 1983 -> 686 bytes public/images/items/manectite.png | Bin 245 -> 252 bytes public/images/items/map.png | Bin 746 -> 357 bytes public/images/items/master_ribbon.png | Bin 408 -> 328 bytes public/images/items/masterpiece_teacup.png | Bin 305 -> 244 bytes public/images/items/mawilite.png | Bin 241 -> 251 bytes public/images/items/max_elixir.png | Bin 295 -> 289 bytes public/images/items/max_ether.png | Bin 298 -> 289 bytes public/images/items/max_lure.png | Bin 596 -> 310 bytes public/images/items/max_mushrooms.png | Bin 1096 -> 1012 bytes public/images/items/max_potion.png | Bin 315 -> 293 bytes public/images/items/max_repel.png | Bin 277 -> 273 bytes public/images/items/max_revive.png | Bin 255 -> 258 bytes public/images/items/mb.png | Bin 312 -> 296 bytes public/images/items/meadow_plate.png | Bin 308 -> 232 bytes public/images/items/medichamite.png | Bin 247 -> 248 bytes public/images/items/mega_bracelet.png | Bin 302 -> 283 bytes public/images/items/metagrossite.png | Bin 242 -> 266 bytes public/images/items/metal_alloy.png | Bin 327 -> 264 bytes public/images/items/metal_coat.png | Bin 233 -> 238 bytes public/images/items/metal_powder.png | Bin 6500 -> 681 bytes public/images/items/metronome.png | Bin 252 -> 247 bytes public/images/items/mewtwonite_x.png | Bin 243 -> 252 bytes public/images/items/mewtwonite_y.png | Bin 237 -> 247 bytes public/images/items/mind_plate.png | Bin 308 -> 232 bytes public/images/items/mini_black_hole.png | Bin 187 -> 182 bytes public/images/items/mint_atk.png | Bin 567 -> 532 bytes public/images/items/mint_def.png | Bin 576 -> 543 bytes public/images/items/mint_neutral.png | Bin 556 -> 517 bytes public/images/items/mint_spatk.png | Bin 586 -> 568 bytes public/images/items/mint_spd.png | Bin 602 -> 578 bytes public/images/items/mint_spdef.png | Bin 581 -> 541 bytes public/images/items/miracle_seed.png | Bin 227 -> 231 bytes public/images/items/moon_flute.png | Bin 336 -> 257 bytes public/images/items/moon_stone.png | Bin 324 -> 287 bytes public/images/items/muscle_band.png | Bin 347 -> 318 bytes public/images/items/mystery_egg.png | Bin 252 -> 248 bytes public/images/items/mystic_ticket.png | Bin 261 -> 252 bytes public/images/items/mystic_water.png | Bin 238 -> 249 bytes public/images/items/mystical_rock.png | Bin 0 -> 697 bytes public/images/items/n_lunarizer.png | Bin 341 -> 261 bytes public/images/items/n_solarizer.png | Bin 346 -> 267 bytes public/images/items/never_melt_ice.png | Bin 274 -> 255 bytes public/images/items/normal_memory.png | Bin 405 -> 339 bytes public/images/items/normal_tera_shard.png | Bin 349 -> 266 bytes public/images/items/nugget.png | Bin 220 -> 222 bytes public/images/items/old_gateau.png | Bin 240 -> 240 bytes public/images/items/oval_charm.png | Bin 437 -> 243 bytes public/images/items/oval_stone.png | Bin 251 -> 247 bytes public/images/items/pair_of_tickets.png | Bin 255 -> 261 bytes public/images/items/pb.png | Bin 258 -> 260 bytes public/images/items/pb_gold.png | Bin 513 -> 360 bytes public/images/items/pb_silver.png | Bin 556 -> 360 bytes public/images/items/peat_block.png | Bin 380 -> 315 bytes public/images/items/petaya_berry.png | Bin 375 -> 336 bytes public/images/items/pidgeotite.png | Bin 242 -> 266 bytes public/images/items/pinsirite.png | Bin 246 -> 253 bytes public/images/items/pixie_plate.png | Bin 367 -> 294 bytes public/images/items/poison_barb.png | Bin 200 -> 217 bytes public/images/items/poison_memory.png | Bin 385 -> 341 bytes public/images/items/poison_tera_shard.png | Bin 349 -> 266 bytes public/images/items/potion.png | Bin 305 -> 291 bytes public/images/items/power_herb.png | Bin 314 -> 249 bytes public/images/items/pp_max.png | Bin 287 -> 285 bytes public/images/items/pp_up.png | Bin 290 -> 286 bytes public/images/items/prism_scale.png | Bin 199 -> 215 bytes public/images/items/prison_bottle.png | Bin 422 -> 344 bytes public/images/items/protector.png | Bin 293 -> 275 bytes public/images/items/protein.png | Bin 289 -> 280 bytes public/images/items/psychic_memory.png | Bin 390 -> 344 bytes public/images/items/psychic_tera_shard.png | Bin 349 -> 266 bytes public/images/items/quick_claw.png | Bin 217 -> 223 bytes public/images/items/quick_powder.png | Bin 6525 -> 681 bytes public/images/items/rare_candy.png | Bin 300 -> 270 bytes public/images/items/rarer_candy.png | Bin 538 -> 270 bytes public/images/items/rayquazite.png | Bin 428 -> 271 bytes public/images/items/razor_claw.png | Bin 262 -> 401 bytes public/images/items/razor_fang.png | Bin 226 -> 394 bytes public/images/items/rb.png | Bin 869 -> 659 bytes public/images/items/reaper_cloth.png | Bin 317 -> 289 bytes public/images/items/red_orb.png | Bin 335 -> 317 bytes public/images/items/relic_band.png | Bin 302 -> 238 bytes public/images/items/relic_crown.png | Bin 340 -> 295 bytes public/images/items/relic_gold.png | Bin 178 -> 192 bytes public/images/items/repel.png | Bin 277 -> 273 bytes public/images/items/reveal_glass.png | Bin 369 -> 346 bytes public/images/items/revive.png | Bin 163 -> 183 bytes public/images/items/reviver_seed.png | Bin 670 -> 315 bytes public/images/items/ribbon_gen1.png | Bin 642 -> 339 bytes public/images/items/ribbon_gen2.png | Bin 666 -> 345 bytes public/images/items/ribbon_gen3.png | Bin 702 -> 361 bytes public/images/items/ribbon_gen4.png | Bin 675 -> 361 bytes public/images/items/ribbon_gen5.png | Bin 702 -> 365 bytes public/images/items/ribbon_gen6.png | Bin 633 -> 338 bytes public/images/items/ribbon_gen7.png | Bin 636 -> 338 bytes public/images/items/ribbon_gen8.png | Bin 627 -> 343 bytes public/images/items/ribbon_gen9.png | Bin 642 -> 332 bytes public/images/items/rock_memory.png | Bin 383 -> 332 bytes public/images/items/rock_tera_shard.png | Bin 349 -> 266 bytes public/images/items/rogue_ribbon.png | Bin 407 -> 331 bytes public/images/items/rusted_shield.png | Bin 730 -> 670 bytes public/images/items/rusted_sword.png | Bin 532 -> 460 bytes public/images/items/sablenite.png | Bin 251 -> 262 bytes public/images/items/sachet.png | Bin 336 -> 264 bytes public/images/items/sacred_ash.png | Bin 297 -> 293 bytes public/images/items/salac_berry.png | Bin 345 -> 307 bytes public/images/items/salamencite.png | Bin 250 -> 266 bytes public/images/items/scanner.png | Bin 285 -> 274 bytes public/images/items/sceptilite.png | Bin 252 -> 271 bytes public/images/items/scizorite.png | Bin 245 -> 252 bytes public/images/items/scope_lens.png | Bin 411 -> 354 bytes public/images/items/scroll_of_darkness.png | Bin 329 -> 248 bytes public/images/items/scroll_of_waters.png | Bin 335 -> 255 bytes public/images/items/shadow_reins_of_unity.png | Bin 421 -> 351 bytes public/images/items/sharp_beak.png | Bin 261 -> 248 bytes public/images/items/sharp_meteorite.png | Bin 318 -> 258 bytes public/images/items/sharpedonite.png | Bin 243 -> 266 bytes public/images/items/shed_shell.png | Bin 298 -> 276 bytes public/images/items/shell_bell.png | Bin 362 -> 319 bytes public/images/items/shiny_charm.png | Bin 466 -> 263 bytes public/images/items/shiny_stone.png | Bin 311 -> 289 bytes public/images/items/shock_drive.png | Bin 303 -> 242 bytes public/images/items/silk_scarf.png | Bin 308 -> 288 bytes public/images/items/silver_powder.png | Bin 242 -> 252 bytes public/images/items/sitrus_berry.png | Bin 303 -> 280 bytes public/images/items/sky_plate.png | Bin 308 -> 232 bytes public/images/items/slowbronite.png | Bin 242 -> 266 bytes public/images/items/smooth_meteorite.png | Bin 322 -> 257 bytes public/images/items/soft_sand.png | Bin 287 -> 272 bytes public/images/items/soothe_bell.png | Bin 296 -> 278 bytes public/images/items/soul_dew.png | Bin 241 -> 241 bytes public/images/items/spell_tag.png | Bin 242 -> 249 bytes public/images/items/splash_plate.png | Bin 308 -> 232 bytes public/images/items/spooky_plate.png | Bin 308 -> 232 bytes public/images/items/starf_berry.png | Bin 320 -> 298 bytes public/images/items/steel_memory.png | Bin 387 -> 342 bytes public/images/items/steel_tera_shard.png | Bin 349 -> 266 bytes public/images/items/steelixite.png | Bin 245 -> 261 bytes public/images/items/stellar_tera_shard.png | Bin 408 -> 330 bytes public/images/items/stone_plate.png | Bin 308 -> 232 bytes public/images/items/strange_ball.png | Bin 885 -> 968 bytes public/images/items/strawberry_sweet.png | Bin 457 -> 390 bytes public/images/items/sun_flute.png | Bin 347 -> 270 bytes public/images/items/sun_stone.png | Bin 368 -> 318 bytes public/images/items/super_exp_charm.png | Bin 510 -> 362 bytes public/images/items/super_lure.png | Bin 582 -> 310 bytes public/images/items/super_potion.png | Bin 311 -> 289 bytes public/images/items/super_repel.png | Bin 276 -> 273 bytes public/images/items/swampertite.png | Bin 248 -> 251 bytes public/images/items/sweet_apple.png | Bin 539 -> 469 bytes public/images/items/syrupy_apple.png | Bin 434 -> 370 bytes public/images/items/tart_apple.png | Bin 658 -> 588 bytes public/images/items/tera_orb.png | Bin 391 -> 329 bytes public/images/items/thick_club.png | Bin 6191 -> 609 bytes public/images/items/thunder_stone.png | Bin 306 -> 289 bytes public/images/items/tm_bug.png | Bin 364 -> 335 bytes public/images/items/tm_dark.png | Bin 360 -> 328 bytes public/images/items/tm_dragon.png | Bin 349 -> 326 bytes public/images/items/tm_electric.png | Bin 364 -> 330 bytes public/images/items/tm_fairy.png | Bin 362 -> 332 bytes public/images/items/tm_fighting.png | Bin 366 -> 327 bytes public/images/items/tm_fire.png | Bin 364 -> 327 bytes public/images/items/tm_flying.png | Bin 358 -> 329 bytes public/images/items/tm_ghost.png | Bin 356 -> 326 bytes public/images/items/tm_grass.png | Bin 360 -> 329 bytes public/images/items/tm_ground.png | Bin 352 -> 329 bytes public/images/items/tm_ice.png | Bin 344 -> 320 bytes public/images/items/tm_normal.png | Bin 334 -> 316 bytes public/images/items/tm_poison.png | Bin 360 -> 328 bytes public/images/items/tm_psychic.png | Bin 361 -> 327 bytes public/images/items/tm_rock.png | Bin 356 -> 320 bytes public/images/items/tm_steel.png | Bin 354 -> 326 bytes public/images/items/tm_water.png | Bin 353 -> 325 bytes public/images/items/toxic_orb.png | Bin 408 -> 256 bytes public/images/items/toxic_plate.png | Bin 308 -> 232 bytes public/images/items/twisted_spoon.png | Bin 222 -> 224 bytes public/images/items/tyranitarite.png | Bin 246 -> 252 bytes public/images/items/ub.png | Bin 312 -> 297 bytes public/images/items/ultra_ribbon.png | Bin 406 -> 329 bytes public/images/items/ultranecrozium_z.png | Bin 341 -> 282 bytes public/images/items/unknown.png | Bin 159 -> 186 bytes public/images/items/unremarkable_teacup.png | Bin 312 -> 252 bytes public/images/items/upgrade.png | Bin 303 -> 299 bytes public/images/items/venusaurite.png | Bin 251 -> 253 bytes public/images/items/water_memory.png | Bin 381 -> 341 bytes public/images/items/water_stone.png | Bin 306 -> 290 bytes public/images/items/water_tera_shard.png | Bin 349 -> 266 bytes public/images/items/wellspring_mask.png | Bin 354 -> 290 bytes public/images/items/whipped_dream.png | Bin 359 -> 286 bytes public/images/items/white_herb.png | Bin 314 -> 249 bytes public/images/items/wide_lens.png | Bin 259 -> 259 bytes public/images/items/wise_glasses.png | Bin 222 -> 232 bytes public/images/items/wl_ability_urge.png | Bin 280 -> 258 bytes public/images/items/wl_antidote.png | Bin 272 -> 251 bytes public/images/items/wl_awakening.png | Bin 281 -> 251 bytes public/images/items/wl_burn_heal.png | Bin 275 -> 251 bytes public/images/items/wl_custom_spliced.png | Bin 580 -> 280 bytes public/images/items/wl_custom_thief.png | Bin 402 -> 251 bytes public/images/items/wl_elixir.png | Bin 320 -> 265 bytes public/images/items/wl_ether.png | Bin 278 -> 251 bytes public/images/items/wl_full_heal.png | Bin 276 -> 251 bytes public/images/items/wl_guard_spec.png | Bin 276 -> 252 bytes public/images/items/wl_hyper_potion.png | Bin 276 -> 251 bytes public/images/items/wl_ice_heal.png | Bin 270 -> 251 bytes public/images/items/wl_item_drop.png | Bin 274 -> 258 bytes public/images/items/wl_item_urge.png | Bin 267 -> 258 bytes public/images/items/wl_max_elixir.png | Bin 320 -> 265 bytes public/images/items/wl_max_ether.png | Bin 320 -> 265 bytes public/images/items/wl_max_potion.png | Bin 278 -> 251 bytes public/images/items/wl_max_revive.png | Bin 277 -> 252 bytes public/images/items/wl_paralyze_heal.png | Bin 272 -> 251 bytes public/images/items/wl_potion.png | Bin 279 -> 251 bytes public/images/items/wl_reset_urge.png | Bin 276 -> 258 bytes public/images/items/wl_revive.png | Bin 264 -> 243 bytes public/images/items/wl_super_potion.png | Bin 284 -> 251 bytes public/images/items/x_accuracy.png | Bin 331 -> 302 bytes public/images/items/x_attack.png | Bin 333 -> 302 bytes public/images/items/x_defense.png | Bin 331 -> 302 bytes public/images/items/x_sp_atk.png | Bin 324 -> 302 bytes public/images/items/x_sp_def.png | Bin 330 -> 302 bytes public/images/items/x_speed.png | Bin 325 -> 302 bytes public/images/items/zap_plate.png | Bin 308 -> 232 bytes public/images/items/zinc.png | Bin 291 -> 280 bytes public/images/items/zoom_lens.png | Bin 289 -> 280 bytes 403 files changed, 5077 insertions(+), 5056 deletions(-) create mode 100644 public/images/items/mystical_rock.png diff --git a/public/images/items.json b/public/images/items.json index 9d84476a8a0..64265382dea 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -9,6 +9,27 @@ }, "scale": 1, "frames": [ + { + "filename": "mystical_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 32, + "h": 29 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 29 + } + }, { "filename": "galarica_cuff", "rotated": false, @@ -25,7 +46,7 @@ }, "frame": { "x": 0, - "y": 0, + "y": 29, "w": 29, "h": 30 } @@ -45,7 +66,7 @@ "h": 27 }, "frame": { - "x": 29, + "x": 32, "y": 0, "w": 32, "h": 27 @@ -67,7 +88,7 @@ }, "frame": { "x": 0, - "y": 30, + "y": 59, "w": 29, "h": 28 } @@ -87,8 +108,8 @@ "h": 28 }, "frame": { - "x": 29, - "y": 27, + "x": 64, + "y": 0, "w": 30, "h": 28 } @@ -108,8 +129,8 @@ "h": 27 }, "frame": { - "x": 61, - "y": 0, + "x": 0, + "y": 87, "w": 29, "h": 27 } @@ -129,8 +150,8 @@ "h": 28 }, "frame": { - "x": 0, - "y": 58, + "x": 94, + "y": 0, "w": 28, "h": 28 } @@ -151,7 +172,7 @@ }, "frame": { "x": 0, - "y": 86, + "y": 114, "w": 22, "h": 31 } @@ -172,7 +193,7 @@ }, "frame": { "x": 0, - "y": 117, + "y": 145, "w": 22, "h": 31 } @@ -192,8 +213,8 @@ "h": 26 }, "frame": { - "x": 59, - "y": 27, + "x": 122, + "y": 0, "w": 27, "h": 26 } @@ -214,7 +235,7 @@ }, "frame": { "x": 0, - "y": 148, + "y": 176, "w": 22, "h": 31 } @@ -235,7 +256,7 @@ }, "frame": { "x": 0, - "y": 179, + "y": 207, "w": 22, "h": 31 } @@ -256,7 +277,7 @@ }, "frame": { "x": 0, - "y": 210, + "y": 238, "w": 22, "h": 31 } @@ -277,7 +298,7 @@ }, "frame": { "x": 0, - "y": 241, + "y": 269, "w": 22, "h": 30 } @@ -298,7 +319,7 @@ }, "frame": { "x": 0, - "y": 271, + "y": 299, "w": 22, "h": 29 } @@ -319,7 +340,7 @@ }, "frame": { "x": 0, - "y": 300, + "y": 328, "w": 22, "h": 29 } @@ -340,7 +361,7 @@ }, "frame": { "x": 0, - "y": 329, + "y": 357, "w": 22, "h": 29 } @@ -360,7 +381,7 @@ "h": 26 }, "frame": { - "x": 90, + "x": 149, "y": 0, "w": 24, "h": 26 @@ -380,27 +401,6 @@ "w": 22, "h": 28 }, - "frame": { - "x": 0, - "y": 358, - "w": 22, - "h": 28 - } - }, - { - "filename": "ribbon_gen5", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, "frame": { "x": 0, "y": 386, @@ -444,7 +444,7 @@ "h": 26 }, "frame": { - "x": 114, + "x": 173, "y": 0, "w": 23, "h": 26 @@ -465,7 +465,7 @@ "h": 22 }, "frame": { - "x": 137, + "x": 196, "y": 0, "w": 27, "h": 22 @@ -486,7 +486,7 @@ "h": 21 }, "frame": { - "x": 164, + "x": 223, "y": 0, "w": 28, "h": 21 @@ -507,7 +507,7 @@ "h": 21 }, "frame": { - "x": 192, + "x": 251, "y": 0, "w": 28, "h": 21 @@ -528,7 +528,7 @@ "h": 21 }, "frame": { - "x": 220, + "x": 279, "y": 0, "w": 28, "h": 21 @@ -549,7 +549,7 @@ "h": 21 }, "frame": { - "x": 248, + "x": 307, "y": 0, "w": 28, "h": 21 @@ -570,7 +570,7 @@ "h": 21 }, "frame": { - "x": 276, + "x": 335, "y": 0, "w": 28, "h": 21 @@ -591,7 +591,7 @@ "h": 21 }, "frame": { - "x": 304, + "x": 363, "y": 0, "w": 28, "h": 21 @@ -612,75 +612,12 @@ "h": 20 }, "frame": { - "x": 332, + "x": 391, "y": 0, "w": 26, "h": 20 } }, - { - "filename": "cracked_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 358, - "y": 0, - "w": 26, - "h": 20 - } - }, - { - "filename": "legend_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 25, - "h": 20 - }, - "frame": { - "x": 384, - "y": 0, - "w": 25, - "h": 20 - } - }, - { - "filename": "ribbon_gen6", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, - "frame": { - "x": 409, - "y": 0, - "w": 22, - "h": 28 - } - }, { "filename": "exp_charm", "rotated": false, @@ -697,7 +634,7 @@ }, "frame": { "x": 22, - "y": 86, + "y": 114, "w": 17, "h": 31 } @@ -718,7 +655,7 @@ }, "frame": { "x": 22, - "y": 117, + "y": 145, "w": 17, "h": 31 } @@ -739,7 +676,7 @@ }, "frame": { "x": 22, - "y": 148, + "y": 176, "w": 17, "h": 31 } @@ -760,11 +697,53 @@ }, "frame": { "x": 22, - "y": 179, + "y": 207, "w": 17, "h": 30 } }, + { + "filename": "ribbon_gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 237, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 265, + "w": 22, + "h": 28 + } + }, { "filename": "ribbon_gen8", "rotated": false, @@ -781,7 +760,7 @@ }, "frame": { "x": 22, - "y": 209, + "y": 293, "w": 22, "h": 28 } @@ -802,7 +781,7 @@ }, "frame": { "x": 22, - "y": 237, + "y": 321, "w": 22, "h": 25 } @@ -823,7 +802,7 @@ }, "frame": { "x": 22, - "y": 262, + "y": 346, "w": 23, "h": 24 } @@ -844,13 +823,13 @@ }, "frame": { "x": 22, - "y": 286, + "y": 370, "w": 24, "h": 24 } }, { - "filename": "choice_scarf", + "filename": "cracked_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -858,2200 +837,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 3, + "y": 6, + "w": 26, + "h": 20 }, "frame": { "x": 22, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "draco_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 22, - "y": 334, - "w": 24, - "h": 24 - } - }, - { - "filename": "dread_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 22, - "y": 358, - "w": 24, - "h": 24 - } - }, - { - "filename": "earth_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 22, - "y": 382, - "w": 24, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 23, - "y": 406, - "w": 24, - "h": 24 - } - }, - { - "filename": "ultranecrozium_z", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 9, - "w": 30, - "h": 15 - }, - "frame": { - "x": 29, - "y": 55, - "w": 30, - "h": 15 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 28, - "y": 70, - "w": 20, - "h": 16 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 59, - "y": 53, - "w": 24, - "h": 18 - } - }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 39, - "y": 86, - "w": 16, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 39, - "y": 110, - "w": 16, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 39, - "y": 134, - "w": 21, - "h": 24 - } - }, - { - "filename": "flame_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 39, - "y": 158, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 39, - "y": 182, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 206, - "w": 24, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 230, - "w": 24, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 45, - "y": 254, - "w": 24, - "h": 24 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 278, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 302, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 326, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 350, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 374, - "w": 24, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 47, - "y": 398, - "w": 23, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 48, - "y": 71, - "w": 24, - "h": 15 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 55, - "y": 86, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 55, - "y": 110, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 60, - "y": 134, - "w": 18, - "h": 24 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 63, - "y": 158, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 63, - "y": 182, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 68, - "y": 206, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 68, - "y": 230, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 69, - "y": 254, - "w": 24, - "h": 24 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 278, - "w": 24, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 302, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 326, - "w": 24, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 350, - "w": 24, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 374, - "w": 24, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 398, - "w": 24, - "h": 24 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 137, - "y": 22, - "w": 24, - "h": 14 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 86, - "y": 27, - "w": 17, - "h": 24 - } - }, - { - "filename": "silk_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 103, - "y": 26, - "w": 24, - "h": 24 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 127, - "y": 36, - "w": 24, - "h": 23 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 103, - "y": 50, - "w": 24, - "h": 23 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, + "y": 394, + "w": 26, "h": 20 - }, - "frame": { - "x": 83, - "y": 53, - "w": 20, - "h": 20 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 127, - "y": 59, - "w": 24, - "h": 18 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 151, - "y": 36, - "w": 18, - "h": 24 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 151, - "y": 60, - "w": 23, - "h": 21 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 169, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 193, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 217, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 241, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 265, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 289, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 313, - "y": 21, - "w": 22, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 335, - "y": 20, - "w": 24, - "h": 24 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 359, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 383, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 407, - "y": 28, - "w": 24, - "h": 23 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 169, - "y": 45, - "w": 16, - "h": 15 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 185, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 209, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 233, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 257, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 281, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 305, - "y": 45, - "w": 23, - "h": 23 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 328, - "y": 45, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 350, - "y": 44, - "w": 18, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 368, - "y": 43, - "w": 23, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 391, - "y": 43, - "w": 16, - "h": 24 - } - }, - { - "filename": "golden_net", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 21 - }, - "frame": { - "x": 407, - "y": 51, - "w": 24, - "h": 21 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 174, - "y": 67, - "w": 24, - "h": 20 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 198, - "y": 67, - "w": 24, - "h": 20 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 222, - "y": 67, - "w": 24, - "h": 20 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 246, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 270, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 294, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 318, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 342, - "y": 68, - "w": 23, - "h": 21 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 368, - "y": 67, - "w": 23, - "h": 21 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 391, - "y": 67, - "w": 16, - "h": 24 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 407, - "y": 72, - "w": 23, - "h": 20 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 73, - "y": 87, - "w": 17, - "h": 24 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 73, - "y": 111, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 78, - "y": 134, - "w": 18, - "h": 24 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 79, - "y": 158, - "w": 21, - "h": 24 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 79, - "y": 182, - "w": 21, - "h": 24 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 90, - "y": 73, - "w": 23, - "h": 23 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 90, - "y": 96, - "w": 15, - "h": 15 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 95, - "y": 111, - "w": 22, - "h": 23 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 96, - "y": 134, - "w": 20, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 100, - "y": 158, - "w": 16, - "h": 24 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 100, - "y": 182, - "w": 16, - "h": 24 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 92, - "y": 206, - "w": 23, - "h": 23 - } - }, - { - "filename": "leek", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 92, - "y": 229, - "w": 23, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 93, - "y": 252, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 94, - "y": 275, - "w": 21, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 298, - "w": 22, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 321, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 344, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 367, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 390, - "w": 22, - "h": 23 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 94, - "y": 413, - "w": 23, - "h": 18 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 105, - "y": 96, - "w": 15, - "h": 15 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 113, - "y": 77, - "w": 23, - "h": 19 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 136, - "y": 77, - "w": 15, - "h": 23 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 151, - "y": 81, - "w": 23, - "h": 19 } }, { @@ -3069,8 +864,8 @@ "h": 17 }, "frame": { - "x": 174, - "y": 87, + "x": 23, + "y": 414, "w": 23, "h": 17 } @@ -3090,14 +885,917 @@ "h": 17 }, "frame": { - "x": 197, - "y": 87, + "x": 46, + "y": 414, "w": 23, "h": 17 } }, { - "filename": "douse_drive", + "filename": "ultranecrozium_z", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 30, + "h": 15 + }, + "frame": { + "x": 122, + "y": 26, + "w": 30, + "h": 15 + } + }, + { + "filename": "legend_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 25, + "h": 20 + }, + "frame": { + "x": 152, + "y": 26, + "w": 25, + "h": 20 + } + }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 177, + "y": 26, + "w": 23, + "h": 21 + } + }, + { + "filename": "choice_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 200, + "y": 22, + "w": 24, + "h": 24 + } + }, + { + "filename": "draco_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 224, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "dread_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 248, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "earth_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 272, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 296, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "flame_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 320, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 344, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 368, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 392, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 416, + "y": 20, + "w": 15, + "h": 23 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 416, + "y": 43, + "w": 15, + "h": 22 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 392, + "y": 44, + "w": 24, + "h": 23 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 416, + "y": 65, + "w": 15, + "h": 15 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 417, + "y": 0, + "w": 12, + "h": 17 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 29, + "y": 29, + "w": 16, + "h": 24 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 29, + "y": 53, + "w": 16, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 29, + "y": 77, + "w": 21, + "h": 24 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 45, + "y": 27, + "w": 18, + "h": 24 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 63, + "y": 28, + "w": 24, + "h": 23 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 45, + "y": 51, + "w": 24, + "h": 24 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 87, + "y": 28, + "w": 24, + "h": 23 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 69, + "y": 51, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 50, + "y": 75, + "w": 24, + "h": 24 + } + }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 74, + "y": 75, + "w": 24, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 93, + "y": 51, + "w": 18, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 98, + "y": 75, + "w": 18, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 111, + "y": 41, + "w": 24, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 135, + "y": 41, + "w": 17, + "h": 24 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 152, + "y": 46, + "w": 24, + "h": 22 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 176, + "y": 47, + "w": 24, + "h": 22 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 200, + "y": 46, + "w": 24, + "h": 23 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 224, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 248, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 272, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 296, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 320, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 344, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 368, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 392, + "y": 67, + "w": 24, + "h": 14 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 116, + "y": 65, + "w": 24, + "h": 24 + } + }, + { + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -3107,14 +1805,770 @@ "spriteSourceSize": { "x": 4, "y": 8, - "w": 23, - "h": 17 + "w": 24, + "h": 18 }, "frame": { - "x": 220, - "y": 87, + "x": 116, + "y": 89, + "w": 24, + "h": 18 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 140, + "y": 68, + "w": 24, + "h": 24 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 140, + "y": 92, + "w": 24, + "h": 18 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 164, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 188, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 212, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 236, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 260, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 284, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 308, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 332, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 356, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "golden_net", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 21 + }, + "frame": { + "x": 164, + "y": 93, + "w": 24, + "h": 21 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 188, + "y": 93, + "w": 24, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 212, + "y": 93, + "w": 24, + "h": 23 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 236, + "y": 93, + "w": 24, + "h": 23 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, "w": 23, - "h": 17 + "h": 23 + }, + "frame": { + "x": 260, + "y": 93, + "w": 23, + "h": 23 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 283, + "y": 93, + "w": 23, + "h": 23 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 306, + "y": 93, + "w": 23, + "h": 23 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 329, + "y": 93, + "w": 23, + "h": 24 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 352, + "y": 93, + "w": 23, + "h": 24 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 416, + "y": 80, + "w": 15, + "h": 15 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 375, + "y": 93, + "w": 16, + "h": 24 + } + }, + { + "filename": "leek", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 391, + "y": 81, + "w": 23, + "h": 23 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 414, + "y": 95, + "w": 17, + "h": 24 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 391, + "y": 104, + "w": 23, + "h": 21 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 414, + "y": 119, + "w": 17, + "h": 24 + } + }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 50, + "y": 99, + "w": 24, + "h": 20 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 74, + "y": 99, + "w": 24, + "h": 20 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 98, + "y": 99, + "w": 18, + "h": 22 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 116, + "y": 107, + "w": 24, + "h": 22 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 140, + "y": 110, + "w": 24, + "h": 20 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 164, + "y": 114, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 188, + "y": 116, + "w": 24, + "h": 20 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 212, + "y": 116, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 236, + "y": 116, + "w": 24, + "h": 20 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 260, + "y": 116, + "w": 23, + "h": 21 } }, { @@ -3132,8 +2586,8 @@ "h": 22 }, "frame": { - "x": 243, - "y": 88, + "x": 283, + "y": 116, "w": 23, "h": 22 } @@ -3153,8 +2607,8 @@ "h": 23 }, "frame": { - "x": 266, - "y": 88, + "x": 306, + "y": 116, "w": 23, "h": 23 } @@ -3174,8 +2628,8 @@ "h": 23 }, "frame": { - "x": 289, - "y": 88, + "x": 329, + "y": 117, "w": 23, "h": 23 } @@ -3195,35 +2649,14 @@ "h": 23 }, "frame": { - "x": 312, - "y": 88, + "x": 352, + "y": 117, "w": 23, "h": 23 } }, { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 335, - "y": 89, - "w": 23, - "h": 22 - } - }, - { - "filename": "abomasite", + "filename": "iron", "rotated": false, "trimmed": true, "sourceSize": { @@ -3232,19 +2665,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 4, "w": 16, - "h": 16 + "h": 24 }, "frame": { - "x": 120, - "y": 96, + "x": 375, + "y": 117, "w": 16, - "h": 16 + "h": 24 } }, { - "filename": "bug_memory", + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -3253,19 +2686,82 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 22 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 117, - "y": 112, - "w": 22, - "h": 22 + "x": 391, + "y": 125, + "w": 23, + "h": 20 } }, { - "filename": "flying_tera_shard", + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 414, + "y": 143, + "w": 17, + "h": 23 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 39, + "y": 119, + "w": 22, + "h": 24 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 119, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3279,12 +2775,306 @@ "h": 23 }, "frame": { - "x": 116, - "y": 134, + "x": 39, + "y": 143, "w": 22, "h": 23 } }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 39, + "y": 166, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 142, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 39, + "y": 189, + "w": 22, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 165, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 39, + "y": 212, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 188, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 211, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 44, + "y": 235, + "w": 18, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 62, + "y": 234, + "w": 21, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 44, + "y": 259, + "w": 18, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 62, + "y": 258, + "w": 21, + "h": 24 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 44, + "y": 283, + "w": 18, + "h": 24 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 62, + "y": 282, + "w": 21, + "h": 23 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 44, + "y": 307, + "w": 20, + "h": 24 + } + }, { "filename": "focus_sash", "rotated": false, @@ -3300,12 +3090,33 @@ "h": 23 }, "frame": { - "x": 116, - "y": 157, + "x": 64, + "y": 305, "w": 22, "h": 23 } }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 44, + "y": 331, + "w": 24, + "h": 15 + } + }, { "filename": "ghost_tera_shard", "rotated": false, @@ -3321,8 +3132,8 @@ "h": 23 }, "frame": { - "x": 116, - "y": 180, + "x": 45, + "y": 346, "w": 22, "h": 23 } @@ -3342,12 +3153,75 @@ "h": 23 }, "frame": { - "x": 139, - "y": 100, + "x": 46, + "y": 369, "w": 22, "h": 23 } }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 48, + "y": 392, + "w": 22, + "h": 22 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 69, + "y": 414, + "w": 23, + "h": 17 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 68, + "y": 328, + "w": 19, + "h": 20 + } + }, { "filename": "berry_juice", "rotated": false, @@ -3363,8 +3237,8 @@ "h": 21 }, "frame": { - "x": 139, - "y": 123, + "x": 67, + "y": 348, "w": 22, "h": 21 } @@ -3384,12 +3258,33 @@ "h": 23 }, "frame": { - "x": 138, - "y": 144, + "x": 68, + "y": 369, "w": 22, "h": 23 } }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 70, + "y": 392, + "w": 22, + "h": 22 + } + }, { "filename": "ice_tera_shard", "rotated": false, @@ -3405,33 +3300,12 @@ "h": 23 }, "frame": { - "x": 138, - "y": 167, + "x": 83, + "y": 121, "w": 22, "h": 23 } }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 138, - "y": 190, - "w": 22, - "h": 19 - } - }, { "filename": "never_melt_ice", "rotated": false, @@ -3447,8 +3321,8 @@ "h": 23 }, "frame": { - "x": 161, - "y": 104, + "x": 83, + "y": 144, "w": 22, "h": 23 } @@ -3468,8 +3342,8 @@ "h": 23 }, "frame": { - "x": 183, - "y": 104, + "x": 83, + "y": 167, "w": 22, "h": 23 } @@ -3489,159 +3363,12 @@ "h": 23 }, "frame": { - "x": 205, - "y": 104, + "x": 83, + "y": 190, "w": 22, "h": 23 } }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 227, - "y": 104, - "w": 16, - "h": 24 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 243, - "y": 110, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 266, - "y": 111, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 289, - "y": 111, - "w": 23, - "h": 21 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 312, - "y": 111, - "w": 23, - "h": 21 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 335, - "y": 111, - "w": 22, - "h": 22 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 161, - "y": 127, - "w": 23, - "h": 19 - } - }, { "filename": "poison_tera_shard", "rotated": false, @@ -3657,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 160, - "y": 146, + "x": 83, + "y": 213, "w": 22, "h": 23 } @@ -3678,33 +3405,12 @@ "h": 23 }, "frame": { - "x": 160, - "y": 169, + "x": 83, + "y": 236, "w": 22, "h": 23 } }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 184, - "y": 127, - "w": 23, - "h": 19 - } - }, { "filename": "reaper_cloth", "rotated": false, @@ -3720,8 +3426,8 @@ "h": 23 }, "frame": { - "x": 182, - "y": 146, + "x": 83, + "y": 259, "w": 22, "h": 23 } @@ -3741,14 +3447,35 @@ "h": 23 }, "frame": { - "x": 182, - "y": 169, + "x": 83, + "y": 282, "w": 22, "h": 23 } }, { - "filename": "blue_orb", + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 86, + "y": 305, + "w": 21, + "h": 23 + } + }, + { + "filename": "big_nugget", "rotated": false, "trimmed": true, "sourceSize": { @@ -3762,96 +3489,12 @@ "h": 20 }, "frame": { - "x": 207, - "y": 127, + "x": 87, + "y": 328, "w": 20, "h": 20 } }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 204, - "y": 147, - "w": 22, - "h": 23 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 204, - "y": 170, - "w": 22, - "h": 22 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 160, - "y": 192, - "w": 23, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 183, - "y": 192, - "w": 23, - "h": 20 - } - }, { "filename": "dawn_stone", "rotated": false, @@ -3867,642 +3510,12 @@ "h": 21 }, "frame": { - "x": 206, - "y": 192, + "x": 89, + "y": 348, "w": 20, "h": 21 } }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 227, - "y": 128, - "w": 16, - "h": 24 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 243, - "y": 131, - "w": 22, - "h": 21 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 226, - "y": 152, - "w": 22, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 226, - "y": 175, - "w": 22, - "h": 23 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 265, - "y": 132, - "w": 22, - "h": 20 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 248, - "y": 152, - "w": 22, - "h": 23 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 248, - "y": 175, - "w": 22, - "h": 22 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 287, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 309, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 270, - "y": 152, - "w": 17, - "h": 24 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 287, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "electric_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 309, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 270, - "y": 176, - "w": 22, - "h": 22 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 292, - "y": 176, - "w": 22, - "h": 22 - } - }, - { - "filename": "fighting_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 331, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "fire_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 331, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 314, - "y": 176, - "w": 17, - "h": 23 - } - }, - { - "filename": "flying_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 331, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 226, - "y": 198, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 248, - "y": 197, - "w": 22, - "h": 20 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 270, - "y": 198, - "w": 22, - "h": 19 - } - }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 292, - "y": 198, - "w": 22, - "h": 22 - } - }, - { - "filename": "ghost_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 314, - "y": 199, - "w": 22, - "h": 22 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 336, - "y": 199, - "w": 18, - "h": 22 - } - }, - { - "filename": "grass_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 116, - "y": 203, - "w": 22, - "h": 22 - } - }, - { - "filename": "ground_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 115, - "y": 225, - "w": 22, - "h": 22 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 115, - "y": 247, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 115, - "y": 269, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 138, - "y": 209, - "w": 22, - "h": 22 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 137, - "y": 231, - "w": 21, - "h": 23 - } - }, { "filename": "leaf_stone", "rotated": false, @@ -4518,617 +3531,8 @@ "h": 23 }, "frame": { - "x": 137, - "y": 254, - "w": 21, - "h": 23 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 160, - "y": 212, - "w": 22, - "h": 21 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 182, - "y": 212, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 204, - "y": 213, - "w": 22, - "h": 22 - } - }, - { - "filename": "moon_flute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 233, - "w": 22, - "h": 22 - } - }, - { - "filename": "normal_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 255, - "w": 22, - "h": 22 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 180, - "y": 234, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 180, - "y": 256, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 202, - "y": 235, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 202, - "y": 257, - "w": 22, - "h": 22 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 226, - "y": 217, - "w": 22, - "h": 20 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 248, - "y": 217, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 270, - "y": 217, - "w": 22, - "h": 22 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 224, - "y": 237, - "w": 21, - "h": 23 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 292, - "y": 220, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 314, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 224, - "y": 260, - "w": 21, - "h": 21 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 245, - "y": 239, - "w": 22, - "h": 22 - } - }, - { - "filename": "sun_flute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 267, - "y": 239, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 245, - "y": 261, - "w": 22, - "h": 21 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 267, - "y": 261, - "w": 22, - "h": 21 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 289, - "y": 242, - "w": 22, - "h": 22 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 336, - "y": 221, - "w": 20, - "h": 22 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 289, - "y": 264, - "w": 22, - "h": 21 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 311, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 333, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 311, - "y": 265, - "w": 22, - "h": 20 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 333, - "y": 265, - "w": 22, - "h": 22 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 137, - "y": 277, - "w": 23, - "h": 17 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 116, - "y": 291, + "x": 90, + "y": 369, "w": 21, "h": 23 } @@ -5148,14 +3552,14 @@ "h": 23 }, "frame": { - "x": 116, - "y": 314, + "x": 92, + "y": 392, "w": 20, "h": 23 } }, { - "filename": "sitrus_berry", + "filename": "mega_bracelet", "rotated": false, "trimmed": true, "sourceSize": { @@ -5164,19 +3568,124 @@ }, "spriteSourceSize": { "x": 6, - "y": 5, + "y": 8, "w": 20, - "h": 22 + "h": 16 }, "frame": { - "x": 116, - "y": 337, + "x": 92, + "y": 415, "w": 20, + "h": 16 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 105, + "y": 129, + "w": 23, "h": 22 } }, { - "filename": "tm_dragon", + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 105, + "y": 151, + "w": 22, + "h": 23 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 105, + "y": 174, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 105, + "y": 197, + "w": 22, + "h": 23 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 105, + "y": 220, + "w": 22, + "h": 23 + } + }, + { + "filename": "dark_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5190,14 +3699,14 @@ "h": 22 }, "frame": { - "x": 137, - "y": 294, + "x": 105, + "y": 243, "w": 22, "h": 22 } }, { - "filename": "tm_electric", + "filename": "dire_hit", "rotated": false, "trimmed": true, "sourceSize": { @@ -5211,14 +3720,119 @@ "h": 22 }, "frame": { - "x": 136, - "y": 316, + "x": 105, + "y": 265, "w": 22, "h": 22 } }, { - "filename": "tm_fairy", + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 105, + "y": 287, + "w": 23, + "h": 18 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 107, + "y": 305, + "w": 21, + "h": 23 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 107, + "y": 328, + "w": 22, + "h": 20 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 109, + "y": 348, + "w": 22, + "h": 21 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 111, + "y": 369, + "w": 21, + "h": 23 + } + }, + { + "filename": "dna_splicers", "rotated": false, "trimmed": true, "sourceSize": { @@ -5232,14 +3846,224 @@ "h": 22 }, "frame": { - "x": 136, - "y": 338, + "x": 112, + "y": 392, "w": 22, "h": 22 } }, { - "filename": "gb", + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 112, + "y": 414, + "w": 23, + "h": 17 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 128, + "y": 130, + "w": 23, + "h": 21 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 151, + "w": 22, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 173, + "w": 22, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 195, + "w": 22, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 217, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 239, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 261, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 283, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 305, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5249,18 +4073,60 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 20, - "h": 20 + "w": 21, + "h": 21 }, "frame": { - "x": 116, - "y": 359, - "w": 20, - "h": 20 + "x": 129, + "y": 327, + "w": 21, + "h": 21 } }, { - "filename": "tm_fighting", + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 21 + }, + "frame": { + "x": 131, + "y": 348, + "w": 20, + "h": 21 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 132, + "y": 369, + "w": 18, + "h": 23 + } + }, + { + "filename": "ganlon_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5274,14 +4140,14 @@ "h": 22 }, "frame": { - "x": 116, - "y": 379, + "x": 134, + "y": 392, "w": 22, "h": 22 } }, { - "filename": "upgrade", + "filename": "wise_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -5289,20 +4155,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 136, - "y": 360, - "w": 22, - "h": 19 + "x": 135, + "y": 414, + "w": 23, + "h": 17 } }, { - "filename": "tm_fire", + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 150, + "y": 369, + "w": 17, + "h": 23 + } + }, + { + "filename": "ghost_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5316,8 +4203,8 @@ "h": 22 }, "frame": { - "x": 138, - "y": 379, + "x": 156, + "y": 392, "w": 22, "h": 22 } @@ -5337,14 +4224,14 @@ "h": 17 }, "frame": { - "x": 160, - "y": 277, + "x": 158, + "y": 414, "w": 20, "h": 17 } }, { - "filename": "tm_flying", + "filename": "coupon", "rotated": false, "trimmed": true, "sourceSize": { @@ -5352,146 +4239,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 159, - "y": 294, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 316, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 338, - "w": 22, - "h": 22 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 4, "y": 7, - "w": 21, + "w": 23, "h": 19 }, "frame": { - "x": 158, - "y": 360, - "w": 21, + "x": 151, + "y": 134, + "w": 23, "h": 19 } }, { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 160, - "y": 379, - "w": 19, - "h": 22 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 180, - "y": 278, - "w": 17, - "h": 16 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 181, - "y": 294, - "w": 19, - "h": 22 - } - }, - { - "filename": "tm_ground", + "filename": "grass_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5505,14 +4266,14 @@ "h": 22 }, "frame": { - "x": 180, - "y": 316, + "x": 149, + "y": 153, "w": 22, "h": 22 } }, { - "filename": "tm_ice", + "filename": "ground_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5526,14 +4287,14 @@ "h": 22 }, "frame": { - "x": 180, - "y": 338, + "x": 149, + "y": 175, "w": 22, "h": 22 } }, { - "filename": "tm_normal", + "filename": "guard_spec", "rotated": false, "trimmed": true, "sourceSize": { @@ -5547,14 +4308,14 @@ "h": 22 }, "frame": { - "x": 179, - "y": 360, + "x": 149, + "y": 197, "w": 22, "h": 22 } }, { - "filename": "tm_poison", + "filename": "ice_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,14 +4329,14 @@ "h": 22 }, "frame": { - "x": 179, - "y": 382, + "x": 149, + "y": 219, "w": 22, "h": 22 } }, { - "filename": "tm_psychic", + "filename": "ice_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5589,14 +4350,35 @@ "h": 22 }, "frame": { - "x": 117, - "y": 401, + "x": 149, + "y": 241, "w": 22, "h": 22 } }, { - "filename": "tm_rock", + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 149, + "y": 263, + "w": 22, + "h": 20 + } + }, + { + "filename": "magmarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -5610,35 +4392,14 @@ "h": 22 }, "frame": { - "x": 139, - "y": 401, + "x": 150, + "y": 283, "w": 22, "h": 22 } }, { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 161, - "y": 401, - "w": 18, - "h": 23 - } - }, - { - "filename": "tm_steel", + "filename": "mini_black_hole", "rotated": false, "trimmed": true, "sourceSize": { @@ -5652,14 +4413,56 @@ "h": 22 }, "frame": { - "x": 179, - "y": 404, + "x": 150, + "y": 305, "w": 22, "h": 22 } }, { - "filename": "leftovers", + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 150, + "y": 327, + "w": 22, + "h": 21 + } + }, + { + "filename": "n_lunarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 151, + "y": 348, + "w": 23, + "h": 21 + } + }, + { + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5669,13 +4472,559 @@ "spriteSourceSize": { "x": 8, "y": 5, - "w": 15, + "w": 17, + "h": 23 + }, + "frame": { + "x": 167, + "y": 369, + "w": 17, + "h": 23 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 178, + "y": 392, + "w": 16, + "h": 24 + } + }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 178, + "y": 416, + "w": 16, + "h": 15 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 171, + "y": 153, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 171, + "y": 177, + "w": 16, + "h": 24 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 171, + "y": 201, + "w": 16, + "h": 24 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 171, + "y": 225, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 171, + "y": 249, + "w": 16, + "h": 24 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 174, + "y": 137, + "w": 16, + "h": 16 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 190, + "y": 136, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 213, + "y": 136, + "w": 23, + "h": 19 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 236, + "y": 136, + "w": 23, + "h": 21 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 259, + "y": 137, + "w": 23, + "h": 20 + } + }, + { + "filename": "moon_flute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, "h": 22 }, "frame": { - "x": 358, - "y": 89, - "w": 15, + "x": 187, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "normal_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 187, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 187, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 187, + "y": 221, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 187, + "y": 243, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 221, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 243, + "w": 22, + "h": 22 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 282, + "y": 138, + "w": 23, + "h": 19 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 305, + "y": 139, + "w": 23, + "h": 20 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 328, + "y": 140, + "w": 23, + "h": 21 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 351, + "y": 140, + "w": 22, "h": 22 } }, @@ -5695,13 +5044,13 @@ }, "frame": { "x": 373, - "y": 88, + "y": 141, "w": 18, "h": 20 } }, { - "filename": "metronome", + "filename": "sun_flute", "rotated": false, "trimmed": true, "sourceSize": { @@ -5709,18 +5058,543 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 5, "y": 5, - "w": 17, + "w": 22, "h": 22 }, "frame": { - "x": 357, - "y": 111, - "w": 17, + "x": 231, + "y": 157, + "w": 22, "h": 22 } }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 231, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 157, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 231, + "y": 201, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 157, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 231, + "y": 223, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 201, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 223, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 201, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 223, + "w": 22, + "h": 22 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 231, + "y": 245, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 253, + "y": 245, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 275, + "y": 245, + "w": 22, + "h": 21 + } + }, + { + "filename": "black_sludge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 391, + "y": 145, + "w": 22, + "h": 19 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 159, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 181, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 203, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 225, + "w": 22, + "h": 22 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 297, + "y": 247, + "w": 22, + "h": 19 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 161, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 183, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 205, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 227, + "w": 22, + "h": 22 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 319, + "y": 249, + "w": 22, + "h": 19 + } + }, { "filename": "tm_water", "rotated": false, @@ -5736,8 +5610,8 @@ "h": 22 }, "frame": { - "x": 353, - "y": 133, + "x": 341, + "y": 162, "w": 22, "h": 22 } @@ -5757,8 +5631,8 @@ "h": 22 }, "frame": { - "x": 353, - "y": 155, + "x": 341, + "y": 184, "w": 22, "h": 22 } @@ -5778,8 +5652,8 @@ "h": 22 }, "frame": { - "x": 353, - "y": 177, + "x": 341, + "y": 206, "w": 22, "h": 22 } @@ -5799,12 +5673,138 @@ "h": 22 }, "frame": { - "x": 354, - "y": 199, + "x": 341, + "y": 228, "w": 22, "h": 22 } }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 341, + "y": 250, + "w": 22, + "h": 20 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 363, + "y": 162, + "w": 16, + "h": 24 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 363, + "y": 186, + "w": 16, + "h": 24 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 363, + "y": 210, + "w": 20, + "h": 22 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 363, + "y": 232, + "w": 20, + "h": 22 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 363, + "y": 254, + "w": 20, + "h": 20 + } + }, { "filename": "x_attack", "rotated": false, @@ -5820,8 +5820,8 @@ "h": 22 }, "frame": { - "x": 356, - "y": 221, + "x": 379, + "y": 164, "w": 22, "h": 22 } @@ -5841,12 +5841,54 @@ "h": 22 }, "frame": { - "x": 355, - "y": 243, + "x": 379, + "y": 186, "w": 22, "h": 22 } }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 383, + "y": 208, + "w": 19, + "h": 22 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 383, + "y": 230, + "w": 19, + "h": 22 + } + }, { "filename": "x_sp_atk", "rotated": false, @@ -5862,54 +5904,12 @@ "h": 22 }, "frame": { - "x": 355, - "y": 265, + "x": 383, + "y": 252, "w": 22, "h": 22 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 374, - "y": 108, - "w": 17, - "h": 23 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 391, - "y": 91, - "w": 16, - "h": 24 - } - }, { "filename": "x_sp_def", "rotated": false, @@ -5925,14 +5925,14 @@ "h": 22 }, "frame": { - "x": 407, - "y": 92, + "x": 401, + "y": 166, "w": 22, "h": 22 } }, { - "filename": "zinc", + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -5940,79 +5940,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 375, - "y": 131, - "w": 16, - "h": 24 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 391, - "y": 115, - "w": 17, - "h": 23 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 408, - "y": 114, - "w": 23, - "h": 17 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 375, - "y": 155, - "w": 17, - "h": 22 + "x": 401, + "y": 188, + "w": 20, + "h": 20 } }, { @@ -6030,98 +5967,14 @@ "h": 22 }, "frame": { - "x": 375, - "y": 177, + "x": 402, + "y": 208, "w": 22, "h": 22 } }, { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 376, - "y": 199, - "w": 21, - "h": 21 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 378, - "y": 220, - "w": 19, - "h": 21 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 391, - "y": 138, - "w": 16, - "h": 16 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 392, - "y": 154, - "w": 21, - "h": 21 - } - }, - { - "filename": "oval_stone", + "filename": "metronome", "rotated": false, "trimmed": true, "sourceSize": { @@ -6130,250 +5983,61 @@ }, "spriteSourceSize": { "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 402, + "y": 230, + "w": 17, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 405, + "y": 252, + "w": 17, + "h": 22 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 7, - "w": 18, + "w": 22, "h": 19 }, "frame": { - "x": 413, - "y": 131, - "w": 18, + "x": 187, + "y": 265, + "w": 22, "h": 19 } }, { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 150, - "w": 18, - "h": 18 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 168, - "w": 18, - "h": 18 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 397, - "y": 175, - "w": 16, - "h": 18 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 186, - "w": 18, - "h": 18 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 193, - "w": 16, - "h": 16 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 204, - "w": 18, - "h": 18 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 209, - "w": 16, - "h": 16 - } - }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 222, - "w": 18, - "h": 18 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 225, - "w": 16, - "h": 16 - } - }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 413, - "y": 240, - "w": 18, - "h": 18 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 200, - "y": 279, - "w": 21, - "h": 21 - } - }, - { - "filename": "lum_berry", + "filename": "metal_alloy", "rotated": false, "trimmed": true, "sourceSize": { @@ -6383,13 +6047,13 @@ "spriteSourceSize": { "x": 6, "y": 7, - "w": 20, + "w": 21, "h": 19 }, "frame": { - "x": 221, - "y": 281, - "w": 20, + "x": 209, + "y": 265, + "w": 21, "h": 19 } }, @@ -6408,8 +6072,8 @@ "h": 18 }, "frame": { - "x": 241, - "y": 282, + "x": 230, + "y": 266, "w": 21, "h": 18 } @@ -6429,14 +6093,14 @@ "h": 18 }, "frame": { - "x": 262, - "y": 282, + "x": 251, + "y": 266, "w": 21, "h": 18 } }, { - "filename": "altarianite", + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,16 +6108,79 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 6, + "w": 21, + "h": 21 }, "frame": { - "x": 200, - "y": 300, - "w": 16, - "h": 16 + "x": 272, + "y": 266, + "w": 21, + "h": 21 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 293, + "y": 266, + "w": 21, + "h": 21 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 314, + "y": 268, + "w": 21, + "h": 21 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 335, + "y": 270, + "w": 20, + "h": 19 } }, { @@ -6471,8 +6198,8 @@ "h": 18 }, "frame": { - "x": 216, - "y": 300, + "x": 355, + "y": 274, "w": 21, "h": 18 } @@ -6492,8 +6219,8 @@ "h": 18 }, "frame": { - "x": 237, - "y": 300, + "x": 376, + "y": 274, "w": 21, "h": 18 } @@ -6513,12 +6240,33 @@ "h": 20 }, "frame": { - "x": 258, - "y": 300, + "x": 397, + "y": 274, "w": 20, "h": 20 } }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 172, + "y": 273, + "w": 15, + "h": 11 + } + }, { "filename": "mb", "rotated": false, @@ -6534,8 +6282,8 @@ "h": 20 }, "frame": { - "x": 283, - "y": 285, + "x": 172, + "y": 284, "w": 20, "h": 20 } @@ -6555,8 +6303,8 @@ "h": 20 }, "frame": { - "x": 303, - "y": 285, + "x": 192, + "y": 284, "w": 20, "h": 20 } @@ -6576,8 +6324,8 @@ "h": 20 }, "frame": { - "x": 278, - "y": 305, + "x": 172, + "y": 304, "w": 20, "h": 20 } @@ -6597,35 +6345,14 @@ "h": 20 }, "frame": { - "x": 298, - "y": 305, + "x": 212, + "y": 284, "w": 20, "h": 20 } }, { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 202, - "y": 316, - "w": 12, - "h": 17 - } - }, - { - "filename": "power_herb", + "filename": "quick_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -6634,36 +6361,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, - "w": 20, - "h": 19 + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 214, - "y": 318, - "w": 20, - "h": 19 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 234, - "y": 318, - "w": 20, - "h": 19 + "x": 172, + "y": 324, + "w": 19, + "h": 21 } }, { @@ -6681,8 +6387,8 @@ "h": 20 }, "frame": { - "x": 254, - "y": 320, + "x": 192, + "y": 304, "w": 20, "h": 20 } @@ -6702,8 +6408,8 @@ "h": 20 }, "frame": { - "x": 274, - "y": 325, + "x": 232, + "y": 284, "w": 20, "h": 20 } @@ -6723,8 +6429,8 @@ "h": 20 }, "frame": { - "x": 294, - "y": 325, + "x": 252, + "y": 284, "w": 20, "h": 20 } @@ -6744,8 +6450,8 @@ "h": 21 }, "frame": { - "x": 202, - "y": 337, + "x": 191, + "y": 324, "w": 19, "h": 21 } @@ -6765,54 +6471,12 @@ "h": 20 }, "frame": { - "x": 221, - "y": 337, + "x": 212, + "y": 304, "w": 20, "h": 20 } }, - { - "filename": "white_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 323, - "y": 287, - "w": 20, - "h": 19 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 343, - "y": 287, - "w": 19, - "h": 20 - } - }, { "filename": "candy_jar", "rotated": false, @@ -6828,33 +6492,12 @@ "h": 20 }, "frame": { - "x": 362, - "y": 287, + "x": 210, + "y": 324, "w": 19, "h": 20 } }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 318, - "y": 306, - "w": 19, - "h": 19 - } - }, { "filename": "hard_stone", "rotated": false, @@ -6870,12 +6513,96 @@ "h": 20 }, "frame": { - "x": 314, - "y": 325, + "x": 232, + "y": 304, "w": 19, "h": 20 } }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 229, + "y": 324, + "w": 20, + "h": 19 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 251, + "y": 304, + "w": 20, + "h": 19 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 18 + }, + "frame": { + "x": 272, + "y": 287, + "w": 20, + "h": 18 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 292, + "y": 287, + "w": 20, + "h": 19 + } + }, { "filename": "wl_ability_urge", "rotated": false, @@ -6891,33 +6618,12 @@ "h": 18 }, "frame": { - "x": 337, - "y": 307, + "x": 271, + "y": 305, "w": 20, "h": 18 } }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 333, - "y": 325, - "w": 19, - "h": 19 - } - }, { "filename": "wl_antidote", "rotated": false, @@ -6933,12 +6639,75 @@ "h": 18 }, "frame": { - "x": 357, - "y": 307, + "x": 291, + "y": 306, "w": 20, "h": 18 } }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 174, + "y": 345, + "w": 19, + "h": 19 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 193, + "y": 345, + "w": 17, + "h": 20 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 210, + "y": 344, + "w": 19, + "h": 19 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6954,8 +6723,8 @@ "h": 18 }, "frame": { - "x": 352, - "y": 325, + "x": 229, + "y": 343, "w": 20, "h": 18 } @@ -6975,75 +6744,12 @@ "h": 18 }, "frame": { - "x": 241, - "y": 340, + "x": 312, + "y": 289, "w": 20, "h": 18 } }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 372, - "y": 325, - "w": 17, - "h": 20 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 377, - "y": 307, - "w": 18, - "h": 18 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 389, - "y": 325, - "w": 17, - "h": 20 - } - }, { "filename": "wl_custom_spliced", "rotated": false, @@ -7059,8 +6765,8 @@ "h": 18 }, "frame": { - "x": 352, - "y": 343, + "x": 332, + "y": 289, "w": 20, "h": 18 } @@ -7080,8 +6786,8 @@ "h": 18 }, "frame": { - "x": 372, - "y": 345, + "x": 311, + "y": 307, "w": 20, "h": 18 } @@ -7101,8 +6807,8 @@ "h": 18 }, "frame": { - "x": 392, - "y": 345, + "x": 331, + "y": 307, "w": 20, "h": 18 } @@ -7122,33 +6828,12 @@ "h": 18 }, "frame": { - "x": 378, - "y": 241, + "x": 352, + "y": 292, "w": 20, "h": 18 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 398, - "y": 241, - "w": 15, - "h": 11 - } - }, { "filename": "wl_full_heal", "rotated": false, @@ -7164,8 +6849,8 @@ "h": 18 }, "frame": { - "x": 377, - "y": 259, + "x": 372, + "y": 292, "w": 20, "h": 18 } @@ -7185,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 381, - "y": 277, + "x": 351, + "y": 310, "w": 20, "h": 18 } @@ -7206,8 +6891,8 @@ "h": 18 }, "frame": { - "x": 397, - "y": 259, + "x": 371, + "y": 310, "w": 20, "h": 18 } @@ -7227,8 +6912,8 @@ "h": 18 }, "frame": { - "x": 401, - "y": 277, + "x": 392, + "y": 294, "w": 20, "h": 18 } @@ -7248,54 +6933,12 @@ "h": 18 }, "frame": { - "x": 395, - "y": 295, + "x": 391, + "y": 312, "w": 20, "h": 18 } }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 415, - "y": 295, - "w": 16, - "h": 16 - } - }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 415, - "y": 311, - "w": 16, - "h": 16 - } - }, { "filename": "wl_item_drop", "rotated": false, @@ -7311,14 +6954,14 @@ "h": 18 }, "frame": { - "x": 406, - "y": 327, + "x": 411, + "y": 312, "w": 20, "h": 18 } }, { - "filename": "banettite", + "filename": "baton", "rotated": false, "trimmed": true, "sourceSize": { @@ -7326,16 +6969,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 7, + "y": 7, + "w": 18, + "h": 18 }, "frame": { "x": 412, - "y": 345, - "w": 16, - "h": 16 + "y": 294, + "w": 18, + "h": 18 } }, { @@ -7353,12 +6996,33 @@ "h": 18 }, "frame": { - "x": 221, - "y": 357, + "x": 184, + "y": 365, "w": 20, "h": 18 } }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 204, + "y": 365, + "w": 18, + "h": 18 + } + }, { "filename": "wl_max_elixir", "rotated": false, @@ -7374,8 +7038,8 @@ "h": 18 }, "frame": { - "x": 241, - "y": 358, + "x": 194, + "y": 383, "w": 20, "h": 18 } @@ -7395,12 +7059,222 @@ "h": 18 }, "frame": { - "x": 201, - "y": 360, + "x": 194, + "y": 401, "w": 20, "h": 18 } }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 214, + "y": 383, + "w": 17, + "h": 20 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 214, + "y": 403, + "w": 18, + "h": 18 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 222, + "y": 363, + "w": 18, + "h": 19 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 231, + "y": 382, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 232, + "y": 400, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 240, + "y": 361, + "w": 18, + "h": 18 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 249, + "y": 379, + "w": 16, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 250, + "y": 397, + "w": 18, + "h": 18 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 250, + "y": 415, + "w": 17, + "h": 16 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 267, + "y": 415, + "w": 16, + "h": 16 + } + }, { "filename": "wl_max_potion", "rotated": false, @@ -7416,8 +7290,8 @@ "h": 18 }, "frame": { - "x": 201, - "y": 378, + "x": 251, + "y": 323, "w": 20, "h": 18 } @@ -7437,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 221, - "y": 375, + "x": 271, + "y": 323, "w": 20, "h": 18 } @@ -7458,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 201, - "y": 396, + "x": 291, + "y": 324, "w": 20, "h": 18 } @@ -7479,8 +7353,8 @@ "h": 18 }, "frame": { - "x": 221, - "y": 393, + "x": 311, + "y": 325, "w": 20, "h": 18 } @@ -7500,8 +7374,8 @@ "h": 18 }, "frame": { - "x": 241, - "y": 376, + "x": 331, + "y": 325, "w": 20, "h": 18 } @@ -7521,33 +7395,12 @@ "h": 18 }, "frame": { - "x": 241, - "y": 394, + "x": 249, + "y": 341, "w": 20, "h": 18 } }, - { - "filename": "beedrillite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 201, - "y": 414, - "w": 16, - "h": 16 - } - }, { "filename": "wl_super_potion", "rotated": false, @@ -7563,12 +7416,180 @@ "h": 18 }, "frame": { - "x": 261, - "y": 345, + "x": 269, + "y": 341, "w": 20, "h": 18 } }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 351, + "y": 328, + "w": 16, + "h": 16 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 367, + "y": 328, + "w": 16, + "h": 16 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 258, + "y": 359, + "w": 16, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 274, + "y": 359, + "w": 16, + "h": 16 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 289, + "y": 342, + "w": 16, + "h": 16 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 290, + "y": 358, + "w": 16, + "h": 16 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 265, + "y": 375, + "w": 16, + "h": 16 + } + }, + { + "filename": "beedrillite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 281, + "y": 375, + "w": 16, + "h": 16 + } + }, { "filename": "blastoisinite", "rotated": false, @@ -7584,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 363, + "x": 268, + "y": 391, "w": 16, "h": 16 } @@ -7605,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 345, + "x": 284, + "y": 391, "w": 16, "h": 16 } @@ -7626,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 379, + "x": 283, + "y": 407, "w": 16, "h": 16 } @@ -7648,7 +7669,7 @@ }, "frame": { "x": 297, - "y": 345, + "y": 374, "w": 16, "h": 16 } @@ -7668,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 395, + "x": 300, + "y": 390, "w": 16, "h": 16 } @@ -7689,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 345, + "x": 383, + "y": 330, "w": 16, "h": 16 } @@ -7710,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 217, - "y": 414, + "x": 399, + "y": 330, "w": 16, "h": 16 } @@ -7731,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 233, - "y": 412, + "x": 415, + "y": 330, "w": 16, "h": 16 } @@ -7752,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 412, + "x": 299, + "y": 407, "w": 16, "h": 16 } @@ -7773,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 411, + "x": 313, + "y": 343, "w": 16, "h": 16 } @@ -7795,7 +7816,7 @@ }, "frame": { "x": 329, - "y": 345, + "y": 343, "w": 16, "h": 16 } @@ -7815,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 363, + "x": 345, + "y": 344, "w": 16, "h": 16 } @@ -7836,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 379, + "x": 361, + "y": 344, "w": 16, "h": 16 } @@ -7857,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 395, + "x": 377, + "y": 346, "w": 16, "h": 16 } @@ -7878,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 361, + "x": 393, + "y": 346, "w": 16, "h": 16 } @@ -7899,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 361, + "x": 409, + "y": 346, "w": 16, "h": 16 } @@ -7920,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 377, + "x": 313, + "y": 359, "w": 16, "h": 16 } @@ -7941,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 361, + "x": 329, + "y": 359, "w": 16, "h": 16 } @@ -7962,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 393, + "x": 345, + "y": 360, "w": 16, "h": 16 } @@ -7983,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 377, + "x": 361, + "y": 360, "w": 16, "h": 16 } @@ -8004,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 309, - "y": 393, + "x": 377, + "y": 362, "w": 16, "h": 16 } @@ -8025,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 377, + "x": 393, + "y": 362, "w": 16, "h": 16 } @@ -8046,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 325, - "y": 393, + "x": 409, + "y": 362, "w": 16, "h": 16 } @@ -8067,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 411, + "x": 316, + "y": 375, "w": 16, "h": 16 } @@ -8088,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 409, + "x": 316, + "y": 391, "w": 16, "h": 16 } @@ -8109,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 409, + "x": 315, + "y": 407, "w": 16, "h": 16 } @@ -8130,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 409, + "x": 332, + "y": 376, "w": 16, "h": 16 } @@ -8151,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 341, - "y": 361, + "x": 348, + "y": 376, "w": 16, "h": 16 } @@ -8172,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 341, - "y": 377, + "x": 332, + "y": 392, "w": 16, "h": 16 } @@ -8193,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 341, - "y": 393, + "x": 348, + "y": 392, "w": 16, "h": 16 } @@ -8214,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 409, + "x": 331, + "y": 408, "w": 16, "h": 16 } @@ -8235,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 412, - "y": 361, + "x": 347, + "y": 408, "w": 16, "h": 16 } @@ -8256,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 357, - "y": 363, + "x": 364, + "y": 378, "w": 16, "h": 16 } @@ -8277,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 357, - "y": 379, + "x": 380, + "y": 378, "w": 16, "h": 16 } @@ -8298,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 373, - "y": 363, + "x": 396, + "y": 378, "w": 16, "h": 16 } @@ -8319,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 373, - "y": 379, + "x": 364, + "y": 394, "w": 16, "h": 16 } @@ -8340,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 389, - "y": 363, + "x": 380, + "y": 394, "w": 16, "h": 16 } @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 389, - "y": 379, + "x": 396, + "y": 394, "w": 16, "h": 16 } @@ -8382,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 405, - "y": 377, + "x": 412, + "y": 378, "w": 16, "h": 16 } @@ -8403,8 +8424,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 395, + "x": 412, + "y": 394, "w": 16, "h": 16 } @@ -8424,8 +8445,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 395, + "x": 363, + "y": 410, "w": 16, "h": 16 } @@ -8436,6 +8457,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d91a46c431ace3f09f5ca68916a2171e:1e84369d9a13e1416fa58028d629d116:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:22a2cc3d3e531d383cfd9c9c6d0ae90e:cf2116762e9ba52acbac985ed04a7bd6:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 191766f520e852149c71b728781f7feb401f4514..c510ecebd147b619feefdd0d58cd80fbde7d4170 100644 GIT binary patch literal 57986 zcmZ6xWl$W?7dDE!1po1 z6clt6ZH@Pe8V(+Oe0)z&PtWn^{&{0yU|5)+J32Xg9;+y8v$L@K2c+KL-0JA--kp{1 zY;V`p*7o%DK5m24)6({D?nWm^|JEsiz=4ks^TC0EbDO&gsBL(q+~nKaQ_oU;GQwkbHY%WIC-P@8;zh9TVRiF4{OSv3hWQ+Xk9sW!zhX zW&gY1Lg)_cpO(}^G>>ZI{WDGGPk@*B~7*?=;rot$9n@TCM%fT7Fkpdgltg zPm#D=5{0GMe-gEQSFRnUSDoOYkYSbU+A^6c^LDQKwD8O)r=+Up_x4>&$ea)7&`HSe zlV90@m++FJ9&3FT@d!Cd8_$LN06m3w1x;@S$i&}4>%0r!<>&P`S6vr7S^4}k3;+c- z*01tUSG-ecKO3uP=q?aoy*|~ZjaZTR;BdKcS1@wBl2Y~;VOI}gzwDL1pRP;z3@sn7 zdG%}dX}RCOplHai(aJNi$#!+pF!t#&BA~cGz4d|DQ*iew+nw!VMNL`MPIG|ez}0-P#tt$%T?5H3_d+V;;9~z)wsRV*?Fu(S1!HV=+*&o zi=O=RBYGz8yMA0z@@-h7{7v%j?yOBiBb(sajn=u@k6-PskCrXUc5ZKp+FDHwq=D=_ z`hIQ5yTiNu4Go1UYpsTdh};;-VjNe$u8bdEjLv|SBI`t}8J~0>>iAk2@acCqJxY2> zvJ9sRo>;419(rYJArgkrl3CW9c}uCumoHx~i&}&ayeykc&?d(1pobp#uk3xI;doAc zypOu?^#1z*cZG!IGjZc)So?Hmc4Z5{>t=%N?9^)?NnDeTTt68svntzt-+zy#;HVN zU|U+0j+JI3^iD}nA)QP-OZd`2G-iC}y}(MK%;$zYJ6e*etefSlyCcG!vH2Pc=*sQN z)stAI9VW*8({(;o)Z}~1ea&hD z!S0U~KF$?>0y#Y;?>M!{SOkCSUv}F(uKPu}^?KNiAB|Vj;qd9w8wVHnAIh3n$;EX3 zqu`r2I;?-WBqiZO=D06jbmD*LVjeqvdZIdd|w>~E{M6s<@yTGs|(7ISWRWgd- zp%H03MBYo0`ushU;b)C(?kKG-+Tj2gx47=4J&uWxRy*S6>%9M1StJ>9Z*8N~obfY& zmNL0FKkE8G?d-;!%jRY}-`K>z?{ZJEx)=Y5X}4@U44>(D04BfxK+@mWJ`VC3xS+d- z?$Y`4JnVqM8j^{X1<1fV=+5A%iLGDz_PxXoP4&9*X-1;R!pG41^Ss_DE-B_i8hiv@ zmZ73fUv17X7v~pRF5p!PImsN_3sR)sJy8=LzjVmphjl=0R&QTlL!-ZtHn{@kr|fXU z0=)R|s8I0JZ4nKBPbaNA2f43UNbL^qcQk1E(FE0-POjdKD<4$ox1)*VU!6{+15Qz> zK!CYY!2RUKeq#Rsjj%Bte7AzJ`i2yW%=v;^Zsm@cnzGb_N~82zlh@f$_ogQi#cQZw z#{rbpI_k$qxE*k#IpsIE|qF}U+%0v5x$An?IpJic4dpO2xt~?+8HN4m>7%Ti+>QHu^o4=krAQq=A#&! z$d{2>ac4b1Jr%^NZtEv0m{wte~KiJ#5;fIEJdJ^a~)WbouQ=UhX zQnCd2MobEF9;kdu+hwG@AIwf7W#s(C&KP61Uh`NS7$q>qtuB%ZW>nI#`zE)BBK!f# z&y7ZjjQ{ORfdb52R?|;r(-FK`SwGw3%Lg5%|C9sYRaI3ie3u4v_e27I-=g>?(B5s0 zH-Di2af@c$>98Fxa5VuhDU_Q5{6>3swh|mXc`tExMjrTrb0`CgfRYbO8hi1Ldbs~R z>eTcQzByV|eZ&&UKL*~;*Joj1M~9)dtNR>NO{*X~) z&wwLfDVjal5ifog61wT9V;-`vo}kbBf)~CDu!cO`w#BgnwLkRi{$!L;nl9t58b3e_ z9nDtr)6kh})-g21uPt|-{sXAkYy4KXMlI}2iGC@sB4Xoa>dWnPMEhwmbpF<}AA9dO zIg7AKmf_b!lVGlk4oE=e=^c)BBfCs+kID@~S8s#R>fts6bn8BdJ<&U`QmcMvG;Kf? zW~h~w@#1Do#0gPt1Dnz|C5ihUob2qHWkxi)xVR`E^Ub8$V?#-S*CK{?6*kL9N0dk; z_@D~QtmI^X4QiOzassFDby;i%w<6Qg(LKuHnK^84(-Bahuqj52oarkm>w$wgoY6rH zO}ROFYfUMNjI&!t_ZgR;OZB)(nt`=PeR{)QIF94FBySCFi4m2<@oq^YVtxE5gv`D4U%$! z#}5wjIx&zP*}~r)&J`p13C!Q;8O$%5f|lPNn>ZR!xKzSe{CkOF-Vbzgy?N{45DM2e zBOj9TV=-j0EUNdNJ6FWujRWWzpwQnJ*ad4dc)$f!FMfs;XX(EX|<=;3iBm15E>d( zFId0miSPFXTalbOgRVr$>hT_Q6L$nBqi=s|=csi_UeJ9|E(<=HQV-c@H{dhqK*=1g zK=Ea)<~1vb4n3U>besg9_&=&?*AJ^Jqj9-YQ}c1TIr7RF=+xJl)?S2I5@4kBrvZLZ zhZz=ib5ZD;I|GRlR+*2sgjP$uOivWI`rLKQ4HldPJ%3U^EJN4me3!ln=NM5?Kl)5x zg|8-|8=EC%T1Z`y|K_|q=mU(j&%ZZ}>;1m7JxVqGNAPF;N1pcrEEG&q*hq2x#-kCS z7HUc@6(kDVGr`&!yjtkIA*tz6l|jj$;k#T^JX|9Z=+$R`be%M@NSs{D*^PtrnjQB) zw5szXa{&!;-iWhg*D)JN8@i#CpF2iY~IhyJfKa}n z){<;B>q#IkB2%N2g+A>VZ8cM9#NM4DZTT&Sy)Mr3!||fV>0+|rx;-tW{kMs9fd{pJ z{zx3n3iF5EK%&$g^WRdOA9vW2kkGv4nmr=#D5&-Sq6$%yV%->L!HmHDxvO~{lA1qm{u{Q$|n`)S*`ukJ_!*t?b2?8Ai1n$XHq6m?TV zCq)R#{f?QYo*Uk17yjcRST`}Uy` zxG)9@&Hi*ee%A+NhlZr5jU?&|TI7r@=J0?=T~$FGXGs0)w{etoKbQ20WF`)ArfHLUXFr9K*`2D5R1 zAKjh7ls~Jm4N8)zL6drkag~czQ-{mJk7r5g01?9(|YO_{W7D_tWGY!zg zUH&>64K}RK9LQJ;ce8hUDcBGjr0a1oi>3g(JL8GmF^Sy-AYXqf$qg|=OexFTd1b%M_Uf+HH79=v7C$%ud?WP1xzi4L4tK?kvP=46PFw8kF7nV6Yh zAkOt#pJHI*m-#PndqWT++p~z_v;hN4;s^K^xPJ5zEv1k!Lj=fKgU8T6%KZB$39{%x zE5hXMp4iL4NuN5pE|<^pEG!Wm@xBCmVR!Dd?;UI^ub%RDss-QDLC$}mTzU^I(Mnt% z%UJajXwTYN@{RrwZG2T2+CLs%KmIM;+Q|1Y*J8lt)Dx!?O_G_=*L*1M(!O9anp|8j zMDcAjk>9W5-^$85Xdh~kuX0#iGO12vJ}oP4PI|Z2D&tM9BWM}_zR&yKDNWXihC|t# zrl?51gWn;V_=91*p17s2##5LV42{Jj6EXkio3s=2qq%9 zKYIdEFO%tvhW{3AaW(4_$0@kHppMo{W7E<#mp32a6m~Ujud}?lIlE%wVo}P4iL#V+ zvh!@8&M}t@WR`V{4#-lve2Q6nsRu5o>XZSa^NvwGRUd*J*^d5&nrw}ZY7D>_{{5|5 z@IgJ;bw$A{aauw+y_1vmkrHE`+Qg(foqfgd>=$Cd+bS(O z`OuHMZxX}*R^!Y~gm+fw?&H)R61%7;E^O^~fwdOej(Nl`V-ClxT+^-MXWMTtc|8|- z8`3mqP zY`2nzfgF;_f!?(CWx3Dku8QRm@@2mC{kc}8R4WY&fD|QotJ&|Y&SdF#%%upOq(`cDZZg_ZX;4)QU<2_IwrEtToo=0 zqTt4cru13A(IsP2Fr5@UfG3gtOPRymima!sKFm#z#}B2&)LjYi8oL|%z8Y0L!xn69 z8mJYFSMM2hE%R_LxHD5czz~VBY|p z9RFN%r8=}nD!@e=I)X(oY%oNTB33@a((7}y*c`{r_4rRKl>(wra)++{AeuM0&u$*w zwoT;Z;o+g%E$H!0GSF|3q!37sD4@FtGYn2MELru=A9ku*ol)3&4Xc1vkC<|t8Rz1@ zuEfA>%-mBH@tE^Xv-TNcF=N#X^T$Ey_jP$9Tdy11-&gZKNMv@C@imiEOJ%rR%h4LSPu zLcCAbF=J{*(o^c|c}@5y8IccNzFY05N=KJY^ILB<&OF_iN9!sbOh9=wg_#yTEx4Aw z{aliKe1eiM;{)sqR&5;B;tYLJtF<_)smf#y{l#~_gHwTN2!?+A;f&!5nGMV>^(}Au z|LywDIR884oeStTCh)PkSl4)~NHOjI)zGrY^H2CRibsiy*2qB^6W36x@78ioj{h-@ zuzA#^r;S*$s+lXaoJvx3GcvUI0lUwGu}l;wm0}SwNlg*OiW9TON(Nwyd_hg;y2r&U z3ftqq?uV^jUypRD77Gbb1>JHy7a#9}v%ID%0z5!pkbMxbVZhE7J2*F^IN%LP1wXZc z`k;Tk?+@|~Xfk3gTZDL!qm#8n4&|5NU`){qrAEL5?$$*=%|dJWxBHz5H&>5YnUw37 zguG__xW89|{51#hfwLjWtz5pN>qRjQ{o+tyAMS`M!Rw zZ}tV<`BXI{E-nso8~SR{5fR^RE{0M4q)P=xdd=E`D)9@FDZQn9}1IRPQB=Wpp^o#Ed zf6dIyw78~FerQw{tnYEu@(FS#SFkY`Q=Z3y}%0A-{e@_E3&wHsrlYqLj2-T6$*Tj(55 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 literal 59627 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 X1m@~7!j6GBz~zy~6ZIN3n^*q_+l|+J diff --git a/public/images/items/ability_capsule.png b/public/images/items/ability_capsule.png index 06b6b3e173d30ed3e2c1cc04c7e1ec5dbfd8ce93..ee8aec6b34689dd9a70c73d591997bfb6644c3d0 100644 GIT binary patch delta 257 zcmZo1hFJ8zonXn=V8Fvtm0UFO@WcQ6j|S=#IWenVewUHER=_@ wJeg@vxX-!%WVxm(O@<=tx7W=1^;}oo`Zdd|a~syZ1v-Gi)78&qol`;+0FI-22mk;8 delta 240 zcmVnU*r;m1%vlPnJ*;5D;?B`Ae^%;6E^87$g#jL{bo?6x7hYczkVHrpbUY4!j4V ziwGAx0AgO#V7YT|2my##`40000z@UOk` z?f>U>-H-k+d-;FG$8TGH{lE9%=KpU;|Np;w>DT{npT2!IWEKZ%5GV=q3ugF_3JwHx zI|JpWdAc};SoEHqvILG1Wl;8Kw9JbZ%%Gqz6caM3_!N)%i2P}E?Y%5_T{Ee&@Ymi?LPeeKSnZ-*z&Tq$*LL-=Y@n`qf7 f@s@Id596P+mG!e0*k_8lfqd-g>gTe~DWM4fzBP@M delta 542 zcmV+(0^$9%0;~j(8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00GQNL_t(oh3%HTN&`U@ zg+IkY3yY|QDTG-I#faKlNg4|qEi6*`0LDgA_z+^FK7*YB(IQPql?U(#iA8o$BoV|w zlwA$TSj5?EmPB^5ZW=u>%rXOW&OP_e?1g{)bqs_(KnS6{YkyM8(C7Llx9V1#0IO~( zA%yBAEOK%;%CZ!#2rZy2OQA#z^(sJ0IgnUPC@lscU&t{nX8V)>PSCm6u0)=OpM>}& z?>PnCu3ujw7DA}YhH4w<4W)z-N~s&AUQc~nKiCWT*_{c%b*(va)#l#Oorz(r1v)QK z#d^sB9zR<9bAOY~IXz?eehqy);3ZFu76Hgie9y5gw=O3lOM#C3-dwxM_kWfW(cA*lydXVe04*oNkb_SL z^p!HN4gfF~cF|6_3oa;mHvvir(YBB;01jnXNoGw= g04e|g02c@V00000007cclK=n!07*qoM6N<$f&nq;*Z=?k diff --git a/public/images/items/abomasite.png b/public/images/items/abomasite.png index 09177d97a44e3a284a6a9ba561034d7c05057652..0758786bb0f06dd4340d004c0eb49288c277120e 100644 GIT binary patch delta 226 zcmey!_?dBnWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP%!MN4q7@Td+pIF z*S1c%wzp^L`*ZiM9liGb|NsB@FHV&ND&j5)@(X4F@}Z!%toABUIMdU`F~p+x?Ztz9 z2NXD%FK9L^{r`WEdGg&g-euda?=x{(|2q1Ke^gp@w}eGzz*Y$c!JFW)fDD5wfaSSRIKynODGyF++_lBf8s>%p@->;D|vX7{j?!SEc@ VCkNq2%Ye2rc)I$ztaD0e0sy`jWx)Ud delta 224 zcmV<603ZMJ0r3Hl8Gi-<0047(dh`GQ0Jup+K~z}7?UgYKgfI|AJxZ?NRlLR?VXt7B zE2OmC($dy4rB~R}GV*0dh9R(xKg+^A_z*<+k1>N?=Qxh@uY?eaPV?d+#WOL_WlZlj zA}Byv%&$-80+zg=&qah@F05O=&UA^I07^9?al3$&BmMZiK3M_I7RnT?fR5Y)D?t-@ zOv_gZih!&eg7vc!8oW!r2enDaMo`LYQ?QeO074Vc5?Tc15TTcA2`wV!Kl>*%FLoTq axtjw~FOuCtHf}ut0000A(G+q)oGTq@-8B^>*H}b+-M>GaEz1Sh6l9iWxRKZAh;b&|h$)iH~QqqrmS@ zmL9!8hT5ZY77Cgid#sXjGcK<0ymKLvfoqat+}EF1-Yt^fU$`d!mCb$|rd=6nVvay7 O89ZJ6T-G@yGywn^a$Y?E delta 217 zcmV;~04D$J0qOye8Gi-<0047(dh`GQ0I^9#K~z}7?Uk_!fG`w99VN3^I)W>>hNWdn z+l=4{X)P^X!O}8vfyfa8HvWk4AAA%M?&VCdX%t0K{)#as@Kg`(2N&k$2mseAA_zd3 zbz7Xox}WiR5)lvQ;A#?20xa>mKnlmS-E@Bf+~0QG!~_udBq1W;X_Mgy z<`N9v72OA=CQ=I`;iVSxCLn-QASS>PEP`-|cyv)TD;5PkLpJ-)B3+^J7tehXiZI?s@}z2Ekqioo6XMb?gS|LVA7;<#r6oCbM=} zzIeBkwN2nNS9&n4DhFEwj#pSLAkAve7+{$Ek{8jr8P l?EV|bSnzlJmaVson|GOIg@}2~M4%@aJYD@<);T3K0RU%?gO&gQ literal 1034 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsBLCw>H0 zuWeXyO{HpiKV7|B9QuX-9?FTy)ngzrA1~%dzcD5_xd&Ex{b4dOZ+prE4Q=YDVF6*2U FngB)Wg;)Rp diff --git a/public/images/items/aerodactylite.png b/public/images/items/aerodactylite.png index 1cf5e028d6fbbb100966d3437d14c40d56c650f5..4feb04f3702bd30ac1dd64f20db753190f2251b6 100644 GIT binary patch delta 235 zcmey$_=j-Wmg)WTPvenwhX Z${kq8bYTxuVGz(-22WQ%mvv4FO#mOIX0ZSO delta 228 zcmV=K~z}7?UgYKgfI|AJxb0pN3h&$Y-ww0 zxmQSOxuw@gxmQTJB`9U)iQM+~# zLBTs0E?ecC*H(^9&!s&_+$40l&{g6{Kuer1Amzx5K1~9_ypIw*giOJ87w9S2Nk9N``Fbm%MNlrMqHDQ5ibX`qFZ(BS eFAjnrIGZ25qGt$_YsA(7000070(s;;h{0|IN8 zE?s)`=+SfM&Rqk6|L@# zx=@wRrZKM|;h~~XfuA5V>ycK*vvP)J7IGEpHO-cC1&K>MZ~a~wnp*hk)6YojN;y6w Wrq9;g{7-?_GI+ZBxvXF delta 218 zcmV<0044wY0qX&f8Gi-<0047(dh`GQ0J2F$K~z|U?Ug|a!yphva}>|zRlJH@mpz7C zmtMmoO!KAFex#61#!{FEpM((j&q0&pa2&_^S3(HF*+H5?roqmADdMiQ5G}<#LwfDS_ag1rU=dtO6X}h*PVCnLw@eQo=-FjPaJh z5nLr$0PmXagKv}2DVUxDp29i_2p}e_UnN)s<@!}LEoTW9(ej`D6SfySj^o_T6RyUE U56Iu(UH||907*qoM6N<$f_Zsi$p8QV diff --git a/public/images/items/alakazite.png b/public/images/items/alakazite.png index 02d8ff580f41e2c450df5a2d8c95ce3e9af742e2..ed6acab02ca19f083c812d5baa1a6082a886f896 100644 GIT binary patch delta 230 zcmaFE_?>ZrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DPSu@#2 YKd_IPYn$TNNT96@p00i_>zopr0RC5J{{R30 delta 219 zcmV<103`qS0qg;g8Gi-<0047(dh`GQ0JBL%K~z}7?UgYKfG`Y2JxW)vU_1Z- diff --git a/public/images/items/altarianite.png b/public/images/items/altarianite.png index 8d2436bc24a76f8bab78914c8e6fedf9dd183222..0bb6be2381941f3659527d962df7826c0500e9c3 100644 GIT binary patch delta 225 zcmaFD_=$0XWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP{_LazkBbucWdrF z+k0=yz5jckeS3EF-m_=V{{R2~?omq@P!V@YkY6wZkPij5WwlpgA0>{uUcvh;Z(h-oe=T>=46dr$X1cTrSsN6+#g0=E3WfWQd#ei-=QE&E-jX1{UFVdQ&MBb@0GTOhvH$=8 delta 233 zcmVPBw!$g|n6opb5kkfP|c75mo$RdAIA`2{olhk?3IkuacWho_5Uh(+(+OQ-o-6?j+z z*k8Q_%*5d9VVW6WJJYD@<);T3K0RUPhYd8P^ delta 277 zcmV+w0qXva0;K|w8Gi-<0047(dh`GQ0PIObK~z}7?Uu0(gD?<98H3U-Wk$#vStDa) zjg%?VW(2R05h&AMbeKcO89|Op413ylSM?$33UjzUbjRcVCQz5dC0U`Jb*3AE%_wLImC#CMDe@rHm bDOF#;zmH^{#||ni00000NkvXXu0mjfc$Iil diff --git a/public/images/items/apicot_berry.png b/public/images/items/apicot_berry.png index 2cfa66acdfa66ec4347db53b2de05488f858e782..4719671eaf39dd24552bcc6eb3c90483046ab669 100644 GIT binary patch delta 266 zcmZ3)G>d71WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP^eClh-y|So@3a( z#cS`qtg~m6-o2}~^lA>uT9VbgcgmV)N3XtXTAMiusG6@N$S;`TKQajSx-9~fY4LP% z46*2addX9$L4k+G;qbiH|Mk}!>OZC&*v)tRrB`6f;~()3o8LySE_G)xUE4a9apFDJ zY~G`y3rfWkLng>FUf^ws*&}Fn;6O3Uhdqr<$0CY~4z5r?p_ec-o%h{5Ls#}5K{3`$ zZjRUj&ZI@67nUm-J^a>uL9}P})I%yeVlDUlot6KL<;6a>iz`DLfbL;n@O1TaS;y>@ G&;$S+J#$q6 delta 274 zcmV+t0qy>p0-^$t8Gi-<0047(dh`GQ0O?6YK~z|U?UkVp!Y~+w_ZY~&0+LslL?S0^ zk&}~HBoc|lP9i6;rQGYwlL4pE@Yp*B4StUFr z064%9P+cMS^*I5R74QN8Qg<%}D6yMNfbUOheSsL95&&FXK*Cb+;sU?m6abVGDgyBe zxk>??)djZp9IioC;F|=1JlSFblt2l~NvOkP5ebaT6^i~L<259_`tLc_D)5$;7OlJi YDJv@B{y2Mz01E&B07*qoM6N<$g1|s@i2wiq diff --git a/public/images/items/audinite.png b/public/images/items/audinite.png index 51fdc9310b09a9343d5d7528450310fcc479ecca..f7c21bf8e3b66d20ccc071affb4fb16bbe2f4b21 100644 GIT binary patch delta 244 zcmeys*vd3PvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gH^3*v6-X;6DD2IuewWq#Y{`;m zd-r}jyZ76cqwmfh{dV;1w`W(sy}SDV+tvT~p8fy-KWQ&Z4NwDrNswPK1CWmdp7zdL z29(P7ba4!^=zV+9k?(*42aAJXRCKQBzyEiddd)X@o_|-WF1<+e?H|sJX{G09Bs0Zu zJvuAH@jz>nknoBEMuYEByP3YI^JJV;WGe7|$ed{BqcPz{$41A02dopNUH&z2s_t#w kYrEBBasT~@Yu1Hw>%X#i{ByoD8)z?sr>mdKI;Vst03P^tTmS$7 delta 223 zcmV<503iQ`0`LKl8Gi-<0047(dh`GQ0Jlj*K~z}7?Uk_&!yphvJqq)Ag^Z9jJVIJZ zN=n+4l$5j={wYKk+mRa|k)?am7s$LYMaj?@tOJEA7>DbI;ILnV#`q{Qh0y`0njJtSD9?WF*sGFXMRfJ}{kS3*so#BeB~ zBLLnK+53&emq0`J9_&maFN@CUe@$UM2?!u6r{73O5!`{2^vk7$6zS!EdlQBi8-`(= Z%?l?UyjQ=!=&t|(002ovPDHLkV1kKZWVQeR diff --git a/public/images/items/auspicious_armor.png b/public/images/items/auspicious_armor.png index e3620bb605435da839a0e447bdb21998b4fda3df..27c40ae0bd0c369443170dd44fdc79aecb857a2f 100644 GIT binary patch delta 671 zcmV;Q0$}~!54Q!7B!7fyLqkwWLqi}?a&Km7Y-IodD3N`UJxIeq9K~PLN<}ITb`W*Q z&^lQV6>*d*7QsSkE41oha_JW|X-HCB90k{cgCC1k2N!2u9b5%L@B_rr$w|>gO8j3^ zXc6PVaX;SOd)&PPgl3hgW?%wPHOojR;$kkpDh6K>!UzJ0Vt+_trk>0!X5l%$?&0I> zU5saWpZjz4D+QAQK9P8i>4rtTK|Hf*>74h8!>lYR#OK8023?T&k?XR{Z=6dG3p_Jy zWYhD+VPdh=#c~(3vY`@B6Gs$PqkJLfvch?bvs$gQ_C5IvLj`Rm!*!aYNMH#`q#!~@ z9TikzAx5i4ihqeT?Z-X*!;U{iE}2{vFmf!Q1{IRy2mgcL-I~RzNjE7J2YOy?`y&bj zcY#*Jw!e>UyLAHipMfi_9F0002ovPDHLk FV1i_aF5mzF literal 2013 zcmZuy4^R|U99~8WI5NRhEX~zzgU6Lk;h5CoZ6V7HaPC#v0v6X37yt>?c&khpp=H`iH^n~ORX$s_szf@E}W z*|a1hzIf)b1)=qOm5zi9M8a>jq_2w$-)ix<|9JG!$+oJ;ygp-QTK>IR>=c{#dyQE?=Lqc zohiaoAF28F)Dp+W^cHr0;GN>%92-vzJhf}iXP34)cO^|~ta}^nM6>sm9nU;B_1?z9 zm5==G+Sj`&S=XQ0m+{9718v=LTka1{{v-85N5|Io<-6)nr5~F-E9L6qr5|5Rcsac& z^U-qO&t<2YR<)+Bopz-`+}-v2^6g2@>vnP-Cn$?<==ftV3`~A?q0i4C?;g$`>fAFsasHQUs{YzDg}YQW z)c!$F9dc@h9IEWu@F3IwY|nF@S1%o$^2+_kh4VLT2j|>{pFPc#U%ujP8hprZFW+3= z@yVpB%CFzpbN%Yt6X*WP9=w@9G-I<{*_(`FAHhwT54Bpn5Sjb&P?y9 zs5tL*?sy3e+wBk%5)-DuhfXaiD!m=MkPlAI>xQ#Qvb{2hAj$V>cO0^9`*Z|}zbv{c z)C$L9mY4i`PLSL{ANI=-jUd?z!ZOFN04nMRUNKpd^hnx$lMf*wx zl&&mt@heyG76Dr@f1)ls%t8h~P&qX0_XUD%*osAnS@^C^8!$8iQCC>83WpQTl@x%| zdRkB5d0{a`VUPqxvlYR^me>|WN#MweRjaDZ8Vt3ywfb74UQ)aU(qgd~2+BZFI7HyV zx`4`s@j!6)C`pvY27q&zOEsz$gL#Z5=$9RiG4?<(ssmKS5awh9sV5A6 zzm|0b9aQr|FgTja9nnEooeT^mASl%+Jje@yfI2%CF7RWqa*g7PR3Y#N-~)aL3&PdN zv8D109L_PcR<&33%aI7E@EA%JJ^yL*zkIYWk@RDW!>}>F{~=>_YCtFkYm@jIEuR9L z71I`F1&J30Hu6dt-6UsryKy7WQ#j3-DV(9rJWf(VmdC^sCLr)Jo`OJ75kM?{i6TPlalY~SXgmVsG0`4|&N7>E zh9XQjZ84HKlf@A@ZDx#+nX!<7#!!K07fFhrgIgy0IWI8C0WXGX%CZZc1y+pG6Vaj5 z$Eh9&h5i-;f>axf&bvfEC{;O4I?|j)k)(++TL=?LP*fCA29zN5mPSSrdWykNO?eh3 z4<+O@+riLCNo=kHI8{!|*AF$ht0k&}Q%uE=>P1&@!Lin`k; zq7hHB96!2LkP86;i%#;@T)+$9p@n`Kg^73C6OZ7r7y*ZKln3B6;7quiG?{S=Fq=RY zLkjSFEIufC)LKpf3%#&9SOm03qzE)4s@t3xvbGv%qClabIdCe=MUt#Bi={0XY8Y2X zwn00T<7>+{+)0K}+_=L$+9)E?uv5ShjEglNZ8X-vKmZD$!1mPpTE*|MwRIKP7P^=v zeI;imABO*UQ`&CdKAb#l%YnWtbzL`fIf=^)N0Oi1@bJ*4&iW(s);}0pb)=;A;iGHT zh0}_#^eS!bWu^gwf(yy1km{_L531IL;^OgdaReAhRB&iLn<)5FOh Xj?5hHk@|LMExRDE$o5{&^7?-P)5qQ> diff --git a/public/images/items/banettite.png b/public/images/items/banettite.png index 20704d624c237ba0962d7161b3ba9fcfd1589a0e..b6bcadd72fce4380e32f5f9a2cd367da9ab47681 100644 GIT binary patch delta 230 zcmey$_?>ZrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP;hc`3JMCkH;3c@ zIm!Q9i?2oXyua78cki|DQ_lVW|39{<0H}Iw2F`?$c+z#G}H3}>q&o}i4&;I!6%9o#!)}?Ys W+L=y;^ET;&oa5>0=d#Wzp$P!tJ7d`Z delta 228 zcmV=K~z|U?Uk_&gFp;LDOrK;X1NirWR0vr znKElovH~R~E2K>6#1=+BRwNpHD3YJ_1wx4bu5^e%Z zKO9Q92u#zmOYj!75-7m;x~_v?lh7%+?gE^GodgSTT;ASFpa_@iSJAZ`B~V1mFZ(A{ eFAjnrIGZ=_$X`@UNmqRU0000E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|4MnW<(+ z6i_wGNX27fHn$=MUeQIfA48asn5iey3mJHhuY36Teiz|c-hXv}j$S2iGQcMiN11L| z#OuT}o0iUbpE$%yl0tk=JZ{hhi66NxyZpwv=&-;uLq;YwM;sy+i)}2oF)JA=@icK* zQ8mgJvMwu}w>YciDr?@8zc85BmeX9PHG()6kw6k6WK^+%GAu-B*GMsuqVt%Cf7tOS z$t9C(1B@K=sDD6(pURz9|O`+yXtTZr_^cIDG&z z)T^Z%;NTD#D^m8F$Gf}R`}S{5vwuIgT5`hT!J>}<0Dk}*P)t-s2mk;jB_($v9-B5P z)n7*QdQp0YinYPT-RbQVZdv01000SeQchC<|NsC0|NsC0Hv*f~0000^Nklzb0000;vxAeOiAMub+K6bnh(m)iJ;U4MdH z3b{7G$T5#HG=IphAN&n|cWdRRCcUJf1a!VQ&c`Sa*ahlU$N4^Xocamie+I7froUVR zWSslwHYBQ^@Cm_cMB?EHH2j^sIWlHTH4(0Hmp_ zr5oVj5Ev^^_F9{JcenQT=RaEdQo>G9@Sq) zdWMSK>Fu?_#hW%M0002(cB3Nz000SeQchF<|NsC0|Ns90Q%`sj00009a7bBm001r` z001r`0jlENk^leza!Eu%R5(xN(Mt}%AP5A|5wLpy6BiRx5omh=*(j42zvw@88~{@M zgeZkFVOju_Bw|G%sfjQNE~#-B8$cQdvGw4_&56AQ6SIrvI19SOE*yx$gCGLX_h2$7 vjbI3Kmjn#)4OFc6N`Zd;oV)>3M}XdM55FECB~e#>00000NkvXXu0mjfTdNN$ diff --git a/public/images/items/beedrillite.png b/public/images/items/beedrillite.png index 3dd1444bf767b474e2854dd28fda1172b0432114..99e516446d7cdf1d8494c47c4d9a839d180b8019 100644 GIT binary patch delta 243 zcmey)*upeHvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gH^3*v6-X;6C|FurMnxqxXDLjn z);zm}gw*jd-vWu+Wh}n_tCx2-aY&F|NsAlaNQ3;4g4iRe!&btJ`#A^J8v0K zD$CQwF~p+x?Ztz92NXD%14??T&kUfo44$rjF6*2Ung9c)Y)b$D delta 230 zcmV4n$IOl}Zy*R}z)5Xb> zj^*1$q!z~*Me2CO zKnU}ugo?m3FK>x)Jby{B0RB}y2dzomZwI~d))dy0fB>QUKwftvq gLib|BFpRx<0p&As@ybpL`~Uy|07*qoM6N<$f-Ws*6951J diff --git a/public/images/items/berry_juice.png b/public/images/items/berry_juice.png index 127fa458906bebb2c3c9ede5314ee6dbea6a2a07..2f6272eca7c9f0387a376a3e16a2e959fd7668b5 100644 GIT binary patch delta 287 zcmZo;KF&13u-+iRC&ZPXfx*zwFe+OhIY_am+NouV)zT?ZYxgFfYw>!&xA@%NmaW&8 zp1arb?An}X|F6CO|KC;l_$CGh27!_wzhH*{sNg_Aw=+;~rKgKyh(+(+iH<^t6*w4J znbbIb{l70Z>80weFY|0G3d#eH2gULHtN+Y9?{CA$kQV*ZO&mftci(VE`5!WmIBn5__n5;;e7P(JO0=9{-(oK;>e`DntF6#u;AHo3E_uv0#r>D0(Wh|5Km?$DS|! g``h#-vj1k;-RfXF{KRTyH_+J(p00i_>zopr0C&cXGynhq delta 350 zcmX@k)W$r)u%0E|(btiIVPik{pF~y$1_pxwpAgrmY=N!UmKquwzW@I}IY{x@|7+*& zwJeSM-0T8XP-+AmaMHd5s^>#XsU)us-%o!->o->r3xCoMYpy^3H85aWHe?{gt6! z$oNRWoaOJfqX$mw#yIVNpHbP0l+XkKr%{|; diff --git a/public/images/items/berry_pot.png b/public/images/items/berry_pot.png index 5841ef1c3240040033e6d8c5adb16d6c3d3dcdf6..3cb9b90dc53685d3a3fde8d6d14a6690ce24c95c 100644 GIT binary patch delta 260 zcmbQtG?i(BWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP_Rr=2+As6Q|%bk z?U;4cF>B76CEuE-9DR58-M9b$|62*ZISo|DQxfDC%mC!W0OyeaHK2IAr;B5VMep57 zj(mp|cvv>duJHZ$|9;-wHn&$+-^=)FIWpZEgtmWc=h$)8dWG-{NyCXDb!m+);@TW? z2afy1%P3asoO&=ZHb z!}*)^yXqG%Uv3`Lb;|taw(Bm5x=m$gF1@|*SHoZE0c%Fo)U}~NH!*m+`njxgN@xNA D_Azrt delta 258 zcmV+d0sa1!0+Rxe8Gi-<0047(dh`GQ0NP1JK~z}7?UpeP!Y~X)dz4&*F<0mj7_%}m zGO{uk}RRA^zd^6Un9s@RRvHDARIKI6X%ysGj<28QFA+@o_ zU_)T@-NzWu*In1(aJbdJUKjR?oP+=yDoT`t$2UfJYX3$QZ{*8l(j07*qo IM6N<$g5ND}C;$Ke diff --git a/public/images/items/berry_pouch.png b/public/images/items/berry_pouch.png index 878ef60023928c39a462ed2661989ac48994473b..d14d71358a9beb3ca1681da5ea69e27e847fb6bc 100644 GIT binary patch delta 312 zcmaFFbb@JuWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE08uYFtA8qhzPLg$gsFk zVDVsu#g7vfD`q$xSP}5zLcoU?9Une?sF=ht5vY{6B*-tA;Xe}4WpP{!l-TC!;uvDl zdw0@Jp+g274Bm}Xl>h(V>vU<=A!vCo3k}(71?2u}ys1ff?r~HKndNal-tBpvRXZMr9uF z-l?VgM7KSN^Xg=plq~mHh+)>Ag4v4xX57c#ZH${Q#Nh6{mThlK?Z#uf6|^0*dPClp z8{TMM-&68S@mpkvmdKI;Vst E0GY>)TL1t6 delta 338 zcmV-Y0j>VX0^$OY8Gi-<0047(dh`GQ0VzpDK~z}7?Uo@D!Y~j;d!))pj!=n2A~{Bn zz!7>3Boc{4R#xK5eDO1%odgQmR%K`YFhINi?Kat_X=>D{u`t@Uovk)CA8*}!KZU6N z7`A~)nJWafT6YMr@ABppuE8h%cLPC^%g{v#n&bddkIAhI5Px7&5Z0V324E`*z)pN> zzgq`zGpj%{?E+09g;S{Ey!#)3l>-2YEP$Ho@3@vKuHHU>R%HRKF@cM!SMzD?qww9D zSru(YrqaH7XXf7c0#vVZXxo1z!X6cV49{k z({BLb(D?0yUrPaC>I#4)0D!d0)GXk3B!DhvHwX)pn+1Sy0bl|JSvrK=04xaK4NHty kJ1wQoh?|}hYt-lFzvFLp}$&v4X z0tZX$x+&lO^Xmod)z!~1m-9($k}mDZU+-pQD;Q|XZtP+xc=~Qkr-EZs`{Q#gf%=S^ zUzi*695^cYXH5PiWcJ)CXbW$UL#WTWR;xu^a_X;Fu-$m{{Ax^d`u->8f;okr=UQ5m n-78D3+}&6C<{kf^%FhhT?=#PQ_`}s1=n@7`S3j3^P6Is#@1$l!NZy}&dI8)PXE!yEuoOEm|83_`X9*>YsZz~!mw z0JzVQ49D<2ngi(Kdkjnq-=jDH38M!+oKJ1bu{nT{AIEXaN9?HXb8Tt{sU00000>98C zXTAPEOZxx+f1X|GRG=J3NswPK1CS2_S5Ji)0mWK8T^vI!dY@i$WICe2!R&Bw!TbP0l+XkK>Y-`o delta 258 zcmV+d0sa1h0+Rxe8Gi-<0047(dh`GQ0NP1JK~z}7?Uqpu!!Qg)3t07*qo IM6N<$f@F$r1poj5 diff --git a/public/images/items/big_root.png b/public/images/items/big_root.png index 37eeb5c2f9354def96d3f1cfd2f071b88fd2f7e0..24b863ee238492e12a53dff38044d1faae20ab67 100644 GIT binary patch delta 297 zcmV+^0oMN80=WW^8Gi!+002a!ipBr{00DDSM?wIu&K&6g000$GOjJbx001B$Ad6ZM zw1YX-q*~_9ga78F6yF)r00007bW%=J0RR90|NsA`f2R8Y006&9L_t(Ijn$G%4#Y4B zLt}pTKXPp{T}(swGgMWj@G#(Jt^W(?RlKBO%z0+|K|twrMt^4T83?d2L*@FO1bA5P zshKx`WxUq)9;r2snLg0qh+IfEgXjrVZHRe?ry++%Y)cq|j4ygmz(_#0})OaFSRb vg>B)qM+@X_;UaYD`hUJ%#!bB5)t`?GbIAkE63KUx00000NkvXXu0mjfpqGI1 delta 331 zcmV-R0krb1m{CSx=0Z^TE&j@=nX@+ZvSfIIPQ8@Zw4HGn=U7?b-wP~eLg(S z)g(9ofDoJ=ppRub{n|(Xm_0x=Ykh7Z0dNG|x8=xOGmf&v^M5$QZ3MWs;Q-52VS-fz z7@UJEDb5z;K){kcvITfJvS-N|oXJ}1k6;0ywdc~{ooWJE?GYSmKn2b|1OJ!=fLLN) zKHPlT8%&~!{Je}nBqM-#E#rq^tboqC60mH*EPGZ)N6$upK{T)~pb`Nl{51jXWT?Uo z$PH&zAnRhTe?&I_JV8|?-VxAGvVOL0DrEn$0;O$dorWy?lJuo3ngv`pU(N<#G?1*Sdl z9ckk1*2-nyFR*<~nedrMRpt4nEeyd-_c-|0a5?YzJ-whnjpaOdQ)XrCyNvsV+&^aJ zywb0mHKobsfI#GeC(#|VCeBHeysZCX_HH%)pIVGXl}VOiKwB9+UHx3vIVCg!0LU^; Ak^lez delta 201 zcmV;)05<>I0onnO8Gi-<0047(dh`GQ0HH}lK~z}7?Uk_&z#t3+8HJX07$K{$2CFav zGbNQ3%d$n|x1z`|eUlXTfp=U=DwX=9YOObSICx&K*Jv>zBsesLgv*nF2GHR0-JU%r zfP_E-$c9^ucZU;T&u*Frp=U1le*$Y>qv7D%(G!r{9d6w-A3{CXKOhfaHQbs2DEu^j z@Br|yC&(I2Egc-r15lf_B?I4bR*29&4;imiD)l8jpqX2FGk#e}00000NkvXXu0mjf D+Idpd diff --git a/public/images/items/black_augurite.png b/public/images/items/black_augurite.png index e8531a1a8cf3587388fe209ca575ae09feb4ea82..b34127e29420860f8b90326ef8c8301b95930fe5 100644 GIT binary patch delta 278 zcmeyyw2x_mVZBy>Plzio0|;0d7)IFnM1qiSfLBC*PECGpOjr(pk z1U>jVBiXrI&cf_Z!X_^6!!KuWWd#V?9^Am&{36F9n)C1%licW SGfJO8e)n|sb6Mw<&;$V7lYu4x delta 334 zcmdnT^o?nPVLeN_qpu?a!^VE@KZ&di3=CQUJ|V6^IzOkz%E0j4xogv>F6fIbjkNQL zu=Dx<|No%_ry}iq^K)wgydr?gB%eyZ15$h?L4LtNSp;BkJ#gm)P=>R>BeEE%;4la? z9?xHq0uEak-;eT|JW4%y|0uRe^4i4@=|94wEifwWD_CiKy>1>r1C+a`VYuIKd zzF{rviG3mp2HcDS2NyAIJn=7vahl9|r-yvEpNKqta%yhziNy@r3m*&mw+8Kcw6oyg zAwjto=Zz6RPEN?0GvjQ+Aq|-*=Z(KRItvB7IPaeA{(5YS`PJ5VPPHQ!s!SG6bHAX_ za_@ z$M+4k--TzM-~PDppdI_ewA?@3o7k4!{j>I~fa--E&-Q4@KmWKw;=SXe4HJvQr4Uaxt zgGm$I6ezNyF*NCs?oeRMF!bp0<#5jJlCOwQ<8-DKAOx<4E&&k1ZQU+e1t9>-yd(=D zC>6kqOKQbJaRIQby9I%TG;u3c6o^k6*+A<7j(__Abr&00000NkvXXu0mjfLmzFm diff --git a/public/images/items/black_glasses.png b/public/images/items/black_glasses.png index 52fe0e60a1e42254de8a9777386bd5d0e08793b2..4b18d828964b9f1733df2db45563945271da185b 100644 GIT binary patch delta 204 zcmeyt_?dBn1SbbG0|SH0lCEPD4W;Y#85my0GcZ_9XJ8O7s1e=82$bUw@Ck7R(h3R+ zUXET#QAuado-Ofc1xc}%1o;Is{09P=3u-|?fh12C#}JF&w->$n4k&Q21h7^8Hx@U# zxTQ`ZHe5{aNiUnI<=4FoB5!#%>}J*7!~F9hqYt~GO2N!m$^08w157QXwy87h*kItZ z-|^0aY?&t^%NlL&9ITStC*)|A%No$|$-X|ueC{WPJGs?n$AH!`c)I$ztaD0e0suoq BM^OL( delta 209 zcmey&_=9nRgd__y0|P^2NcwRg#ggvm>&U>cv7h@-BI`s&>3RbOhF1v;3|2E37{m+a z>y# zamOKmp|@X6LF0r%!!dWk1Q+v$z(@f#=B0Cc4rWQT3NRh(YErOM_Bjx6!^2ZRgI_qn zEF~n+%qT^-fm@=Pg@<**U0xxFtx+7Y4g#?Zhj%mcG05&^Pc%F{YaY-Z22WQ%mvv4F FO#o+rJzxL; diff --git a/public/images/items/black_sludge.png b/public/images/items/black_sludge.png index 37aa31de43eaa5314563d42550b2fc912c1a4210..fe308586dd38bad839e7ed8c686611c3b4c37803 100644 GIT binary patch delta 237 zcmbQsG>>V5%0v^1dVL0lSMdxCR?`_6#0zRfcQGo~Iz3$+Lo9mVPTVbez<`HIx$#@PWyg|F`3-w6 z?0Aqfp(b{Jn(L99Yy}QXYm_!BD;-o8^x?8(I_e{=?UKwnA(r(+r#MAD zIAs@Sx;uS;*>v{ca}I^qigQdDXF0meoXC4l@QTzfr-v_%>>k8a`jj7;q3~!egHG-L lEq1FPm#;SYoRwK0Wv6&KJ|44$rjF6*2UngCX1TRZ>& delta 234 zcmV-K}|sb0I`n?{9y%=Asc@%008P>0026e000+ooVrmw0000I zP)t-s0001-q_m5RtaEdVN=jNFARvaU<&ppZ00DGTPE!Ct=GbNc004bSL_t(|+U=7; ziUUCm#Kw~R|1a-hA&2y2K9J~Ig2INne%!FT&$0TTtjvJ>DNi1aC4@&|D8SwO28#jg zPFYeDm>JBDo(-!UN)KZV0K)|1U9bVLgj2W{n;8I5&I*WfMyuTG5KN;|<+#EDFg@~r kc2@>{z4ByVeBToO0GUw(1yB8B?EnA(07*qoM6N<$f+P@KegFUf diff --git a/public/images/items/blank_plate.png b/public/images/items/blank_plate.png index ec82203340cc57d4ff45107ae92ad230fa8ef2cf..c08d25aa3c33cf79564034e34bd25eb75c8d47b9 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~Eq!JI{l_8&g7@AUbzSFc@v@ZipqCkcXC+Zh-bI7)*2 zf*Jlpz|~VBMnJJFPZ!4!i{7h~9Qh6?aIm;0{{7#-w0+qjsoC>x^|`C12x&fz_h@?7 zW!Id;;q!Oyfflit%S#y|1f)2{T6c+0VD;~4N^KPKusFe4{qQTxUe6Eu(JDTdlbO}O raHwvPI>EhXp{pEs$%c}R_tO}HF0*ZIb@iMLw3fls)z4*}Q$iB}z$8-0 delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_t|1pTGX#!JQ{h&R)H?|L~DH zixvSTTU5kO11XM@Aiv=M5WsM+d2b|8jI+QavY3H^?=T269?xHq0u-F+>Eak-;eU3L zCtr&J56fh=)Bo#x0&ks5VtQl}EHmLnP)L0c$JbVS;X_ROw@nvN>J!|ODKKG?4c8^5 z6O6T@dl(9`6s#M$9V^8)a7{X}vT+NS-a*b7j#HZxIJI(weQv0hG;(ijiB{y}6j{cy zbJM&9O>eKap5mOAz*Nt4R4C*`>LU3B-pXg2AJj$M4!!ZYdf_$UDKka)HcpoZI+KCH N)76jFWt~$(697xTZ6p8y diff --git a/public/images/items/blastoisinite.png b/public/images/items/blastoisinite.png index 6b8310610e84d21122b6906c8dad0c61bfc8f57c..ea2ddef0640e2111df0cf707c97be7ecf962121b 100644 GIT binary patch delta 230 zcmey&_?>ZrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP^gYFoYPYrRovp# z@;!OZ_q}`f_N=|P_1ybw*RK8l|KIv-W;;+FPf3tpFawYe1DrdtxPBq*`W zt?b}o7Vx*&@IZ)j$M%j!qsiRNvuu-c6Kp>C{a{P7d2r~&f-T>JR|gfo`t~zYy;81p WF4O9wFd?9&3=E#GelF{r5}E+5_G8ch delta 226 zcmV<803HAL0rLTn8Gi-<0047(dh`GQ0J=#;K~z}7?Uk_!fG`k69VIKcf@9b^f~9Rr zM{os8%dB9T(iJQ%BR_C*9Dv7f;N?V7i6;Rr@wxz&BaJ_MGD;9k}5;BFE$1=Ur+rywT*0Yv5Lr34p2Iqiz7<#H<~5i0-epHRHm cFbv~uPOkEBL5p$4uK)l507*qoM6N<$f>%ggSO5S3 diff --git a/public/images/items/blazikenite.png b/public/images/items/blazikenite.png index f14b108de608a4318198999002853ab54dfeba20..9b6e9e59212f0cf2f55556c40a0635e8774c6853 100644 GIT binary patch delta 235 zcmaFI_=jDOM?7@8Gw8^&}DI43zW$6ba4!^ z=zV+fAm0H64(0&Xn{4m??=L@kRC-5BN_zEM@8k_r=Gw13u}Mtroafa#LD^NE4)yo7 z4H;cHR%N~3%NStukl~@CP=TKybFip5!!+BZoC2E5N@2SCh2?QL&{_shS3j3^P6YMUqw~8l=u7c63PB|NUQFo>0vFt085TO{um>&?)&gCH6JE6X!Y=w>>!3 zcK)BlB*}x-;ey8Jc#8I2V-kOu-#AOFBL19lbI8}K#V!Ra=WvPNlFqx*Yj7aP!k^`f zz;s`!-8Gi-<0047(dh`GQ0QpHoK~z|U?Uua_gD?<<8HJWIYfxqk)}YJ^ zDO0inWk$#flqqR1c}P!szL<(LQY4@BB>v>@Gd>xbrdF+5|5$C?S}v!7Zx6F!Ow$i* zSrH7puC^s7;6;kTk!jwSfIz534$eS=!0}~UF8woBLInucQhzwXlsGJa0q|NeQ$*oB z_V7>%c099ufp1HfAO}afZrUWm1rTkv*?uJeFD5Ws3IklP5gsO>J&>C%&+#09;R1eb zwdr`wa{yK1umB}EFgx3Wbq`R9uzf&hryGrbGuOK%&xG!VUP9Lz(fh@|2ZVUIN)&;s o1hOY^`hUUcKN}>qYSk)HA3Eibd<=w|Z2$lO07*qoM6N<$f{mYgZU6uP diff --git a/public/images/items/blunder_policy.png b/public/images/items/blunder_policy.png index c1e2e3806488c72eb221380b821b645f7a9d97c3..8d5b11cb3f65a641ccc358f9d45842448c4588ef 100644 GIT binary patch delta 242 zcmZo=YG#@sSllz?EDmyaVpw-h<|UA$9^ez=3ZykvH1}>}*t?72=JkwQ zH?qHfuYNvd%JXSczW=`V=kK-u|AFZJ=C`k9fJ%8wg8YIR{v!ch7RR+fi9$~o#}JF& zr;{A{8Wea~TDK{1|F2)q8`v!JCHqmYr+>*N6`kALM9y7!yZK-#lVJM3_7fa&47Tf- zJItF@9(b`&l4zX$I`rv8fgdSqf2K5?GEw~89Uy*cUh*7n#T7;(FK)KfX1!f>uq^PG hk@x-Y$Lk~JF+cjlnXs+!)m)(M44$rjF6*2UngE@Saa8~S delta 244 zcmV_2?aMy9Y_yIFU1ak1uL-_*`YAKRBdy>_wUv4xWVVM@ zz~^IhO!E+c$F diff --git a/public/images/items/bronze_ribbon.png b/public/images/items/bronze_ribbon.png index eb9b926c50c5687e8b8562d8c2448e2b32be810c..cab218e09f52c6d72c3d6439c80a7f3aa4776f3c 100644 GIT binary patch delta 309 zcmbQhe1vI&L_G&H0|SH0lCEPwim^Dz-HBn{IhmJ0j!J+}h%1ox@CevnZ$HUDYfDDi ziwK98D>FMfX8gao`NoY0|G&Na@#Dw0$IPifbvz|Oe!&d?5rFeZfErMIo2QFoh(+(( z$(($L6?j;Z`Pd)*|G(YNLuBi{Rcm+EGqr4LPBzH7E$^CQd+g4B?XCQ;kI%AE{#Get z5@L6(D&dmw%ydcmNwGsqCa;m$$NTN8@>;Qp zx}~BF8S~0K=7a?|?wY^#UUt+wtMnhm*Ggvl-U$ehVo+gdJYdo+)sZk!*K*az_4D$@<{F%`Fm0{aHww>p_2 zG7;7;`JBm6d2t((z~Y?@CD)JzzNIm&T!;`5?-h>t*mYjLAD4h2msL#sM=7hAg!ecF zzAXR>d|Ln)07cSAP-MXc-U|W+-ZKckhetLe|4050*kd060=Io3z95A!00000NkvXX I1g=70g0$hlN1N-JULvAr`%NCwYt2HyiLU8=k$da_+BxwC2*;0ynnbJ7=RjGv~H_Ur*(M zdsX@W+ypguI=$dM)%854gkzh@0e{9l*SZz--)GK{Ea3Q^(@|`&#WeSTrt3^`3yH2j z)*qc1%1>noIqEYBSJ+SDOz?4^(Q<~*m+iPrA(!S-k*jH+o+kE92+dAr7dycI%x#)e zUaYsI=rfi(4(F7wO%UVW(KIKV&wHQeh2RUdM-$(K`1}-q7suRJ({F$3aq;h`mCWw? WoUR>pdp7_*!r4eX(KUf4@YMo+--lGZ zU4WpI8-w#c@OSsu_^d=^6Zqne;q0bx^MC&YD4`-R6To7CB7Y!o_2;Aj?n@+!;Y$Jv z$2&x|02Vmh_c0rUl>n5X;Bh>}*zK09kR>p?eGHWVoZ0eP!P9(-@$)-v7hv`jpag*0 z?a0!CUnZb%gu?ZI04cOu!0tUG)mXS!AO+^jb4xZ0Xy>!>u-7(wTXw=BvbhO4a2O~( zn++Y${a=EwWp$rb0fJF_?RZ|>j@Qz!Wxpz5;T$@6#>%8RKWFc=D`4Sv>hasR@SN^DsBQz az{Ud{9qwyM>m{}T0000N-WjfTAs)E{-7dd7AFA4E9>pg2?#kwKlckhSICcyCI4s%qS(LX| z%WPuPr&SKzevQ`a<0lofJQ8BgVYE@HD{EQ$Wlx1U-0o_yw^`1SHl W%*;70S7%QKdBfAy&t;ucLK6T)k7+~z delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}kKecKe0y%@(|s2n9?V|i zJo~|myxa4EQk9`fK$3y0B*-rqs0;!aHl5Kq4;1Ar@Q5sCVBk9p!i>lBSEK+1H+i}^ zhFJJtop@2`umT6mL!FjC|M|aPx~P#=fBX70o0LQA+NCV_UwO}U>9)0_%hz}MO#+K+ zgtjc0(!>__Fz~>pX@=a3&T%{r?)4O~y)%`u*S{%ahw;3tepZ|v3hcpB9!%y1g6kT}wPM0OKc@8J-)5fzcl0@&(e_&XYW7iviWD2JJ<2kge?yxYj%@s( z_d!pc{qyVa_17LU=*9n3$oZ)7rcnIeHF=KbKUuy?%X>Af4`K%S)zj6_Wt~$(69AOO BhzbAz diff --git a/public/images/items/burn_drive.png b/public/images/items/burn_drive.png index 47ad9cc8f38c8fb8106bf3f270bad7b786655eca..02ee18c02bdc54444ab695dfa59fb95ec0e034c8 100644 GIT binary patch delta 201 zcmV;)05<=x0`dWnF@F_MOjJb%001yBFnCBn&?petSU})dQ23aLN7sCo00007bW%=J z0RR90|NsA`f2R8Y004MNL_t(IjqQ;^4uBvG1Z|h?|DSB37$X%-yy~6^GqeS^?a!Nt z$P%l;=89tvRPU9*rY%|NI4Y>7M&d`!N^#~ZRL?GkkXFFf;6kW03XW@70wW7><;0@^ zwoTSqfGqe6Y75#jJ4A^<2O zC)~FYNU@g$`33(60|qH?W;dV^XMsm#F#`kNVGw3Kp1&dmC^*5>#WBRf|Luf8vBL@+ zERCV>>!0XN*tY9swXK7-yx?8O-fjCnh}TOAp4swv#%y+{DY?gH9QYd$S9<*6(Pc4L zMTOrz*e82s@kY}mp0qU+;%uUSTc`7!v07lxwc>!q%*AXE^cqfChcRj{IkY=Ol_~y0 zap5E{#d^mxQ5KJVSHwpB_%o^VX=;B&OGt`itF^u2ny(DE7K`lVuem1$bR2`HtDnm{ Hr-UW|DW_@Z diff --git a/public/images/items/calcium.png b/public/images/items/calcium.png index e98416f6280833020cc8fc66ec7edece89354c80..4c42228d72419a2fa54e526c0a744437a2099f5a 100644 GIT binary patch delta 264 zcmZ3^G=ph^WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP?!>Bxh2c+np z4b>e1vwZIq&Hw+87K7P@FjXCa>;PnpZYi=D)g7?r=o)wkfPXN$BarzZwN!V&(R)Y# zKl}C!Od~r08G|ea$!fs;!&*c8`w~$HVi}T~2Otd-i5> zN0p&`gYuI1wW?|YiA@|!q9!wJQy1~rrYKY3m)OkqMvKMdeaA+}ZwHJQO1pe(;8I+< mW3OFlc57T+a^(My#msU^%uimfejN|An8DN4&t;ucLK6V#BW~UR delta 230 zcmVwAPvf|fT#CAI{p#O?yE9It zCJ--SQ-Vbx=lqd4`}s?P3g9m5cd)jJ3az(g7Pp4lv4>R(#j9} gCx{m-ilXez8}CzQiT{`&L;wH)07*qoM6N<$g4d~P$p8QV diff --git a/public/images/items/candy.png b/public/images/items/candy.png index 9a68bdab6063e4ec775495e94b921311aedbfdfb..81cf5e19ee2e70cd561729d686f9ffc544c19147 100644 GIT binary patch delta 242 zcmbQl+{`pVvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gF~BFp6-aApYOY_u{?MUAhYue< zdi3bovuE$!yZ7wbvv1$N{r~@8fyKtOsb;<1C8 z27)>J4Aa;{Rdkm`KQsubK01@5tZqM3dQtlU?`FTW;9Z6%i-jBB6*`(NmTu*U2#b%D lSW^@~&Aj5qbF;cm?v`%mHWQxnvw^N)@O1TaS?83{1OO4WYQg{j delta 386 zcmV-|0e$|10+Iue8Gi-<0047(dh`GQ0a-~zK~z}7?UgZ(gD?<9KdTh!Ek(GrlEzh( z3W*DFk%&Y1030IX4z9TX5+|TS>2MTLP=PzA0xcogg^+Bs{*nuiK>y8nJO-?+tgNj5 zyPQ{ls}3w8d!cH)Ug_MA&Lr{ z*l;enhqY72Sh##X*M;)yG6&+~oKDZ$v2tVCJY&H1*34mhKJu>5>HpCD<2u+;T3lS7q4fU-jp$ j+~z7FhWNNM=g$etuV-hQ_{pvU=tc%lS3j3^P6n?MwO+*HIy#(_*-afz%< zT+VT>$V$%9DyVB*>Uu6GgCaPPhhk6NAcJDvwTi>N3PLWKX*-1EuG1NwVfnkvd;9;} z{Qw<0boj?m+J302D(i8UWy-4wsEIe5%`T>C+Q~v1lm89-S$}zT^0p!_j#(^(IBCAM z0992vb|ZMP{3D4F0$waJb|V~<1*Hl3& z!l%9P88$TJ#eYc(gA^EE!;}N8=d+hNdLc=M1!*Nrw!6=lq;D7GgHdI|O6V63o!qEm zkIOS>AV{%x0tE63`n7;ap8$Ifw-4aM9I#X1iv=^ft=7xnJjXE0GR4$1L|=8>|4g@z z9Aa9g&+mJLV&=l_1JT=Cn3{IJQvd*^XJ91X17$`0?rGb1Ov@DOUL|Nc0q}W(dnRzqUqNF0000qiA*KTt>qe55b+4%d!F~sK)$4j>TLYC8k(E`z z1j&+QuA|~JwT`lrCAqZJwsxQfZ~}1DsUlczdId#V4L^v;_ALT|1O_5QHl3U$JW607 zF~vD1JQ;o0bucQD*+)Y)ID7SrrHG^)#TkJ8#PUu=Zm~5T=fAlF27`zdQ_7t900000 LNkvXXu0mjf@o#KU delta 235 zcmVK$j~}(3^szP~;YF zD52y8L$i?#u@O!jX!c2~{FKaSw7UTe!!Qiv&&b#pNj5JZ61o4xfC{goTh}Q@78Avh zxSl70j5tzBl%!CSKv!VaS4|*lxSJj~nFKmbU|n@oNVX&!Eo9FjL96Y}l3dnIAOJW6 zI3*fyFa;`p6p>xcCJcHS8+m8joBKw*cn?G-a$HKpr}jjM%9C`n?`@Lq(};~RGG-M! l0Ef)uy@)*Q7i$Bxp#`@|D(l@ z-Q7`p_i8Trw&v)XCEvasy?6B4w`bq}f0HaO3jr$SEeY}qX84Z;bXgqN0wvl!T^vI! zdaq9M7CRuoFVdQ&MASh F2>^kja&Q0u delta 271 zcmV+q0r38q0-pkq8Gi-<0047(dh`GQ0Omk24FY9&@Tgh`C+H5P#h3crK|bga*)xP4&0x z0Gr#+3_vl2e#hME0PgL=?)RhD09r7{I2FKu8~T)*07x6xpEOi605KOe1&GZxMAI$M zjh+E4dT9o5zOi^I12CsnLev1+j`;XdE1|AJSd-Pz$2RJL@ V?IN3yn*aa+00>D%PDHLkV1gl$bI$+( diff --git a/public/images/items/catching_charm.png b/public/images/items/catching_charm.png index c220ff70c03408c81c400f715fa3d94f0da43788..575456221310463f868f662a31eb7afefcc2cbe2 100644 GIT binary patch delta 17 YcmX@aw1R1aJR>KAr>mdKI;Vst04?JMIsgCw delta 43 scmZ3%bckt#JfkvSYJ_K+uP=iZ0|NsG5QD&_;K?A$)78&qol`;+0L%diQUCw| diff --git a/public/images/items/charcoal.png b/public/images/items/charcoal.png index 4d2511773efd510bf6f910389484f6962493a439..e10f8f20fd688bc9d188b449ec6ef8e677ba2544 100644 GIT binary patch delta 234 zcmey%_?vNpWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0P=HT}E09)DP;hi~OiD`X?(W{Z zcW>J*10$d)TS<^#FvEWksH%MM4=B>=>Eak-(R+82qtIam9_EcH|NcK+*KVe6ZMod1 z?X;c{%e7zE1wS@iF87MCF7IPI-JNZu_b$#N`Df9swT$YH_X686s zliPP&9FqNh;OVRO)la!RBfnl|H0Uua5E43P^C6Vg(dTx()~jh7+pK@&F8WmdKI;Vst0QQ+=Jpcdz delta 236 zcmVGfrN6`4Epd?Pa(L3T=#VO7TemUhAlx z{opeEMF9F4YVclpboQx$TtQ;86&_^3j)UKV_jn+%PJ{QH7kE&@_<2o53q0upB)6{g mpji4)+C9CABd%xtUjz^1&&Jy0zF+wO0000$(3u@Bafq>zt(#Ky^GNL4LsuAOR@gJQAP=6wmT>aSXBOeS6W7 z?|=dai^IeqoqzxL$C}(bpk})}{8&P7W02p!mI-fnY%1{cxUF2YT8-)Rz49c+4gmqV zZEg%g;T8@R9V{{4M-GIn=4Lo;XJ}=iH$(K^K^gHK3bk%i!ti=d#Wzp$Pzz+G4i= delta 223 zcmV<503iSP0q_Bk8Gi-<0047(dh`GQ0Jlj*K~z|U?Uk_&gD?<98O3v?bm=u%#brjI zbxD~rE3isN_{kZWd|i-eI7dkLq%R~3@gFA}hQV$AYz7Qc%|=W)fW9=qhn2KoX}5wDR_Fk&x8&tRyU^pjZVs+eTCpW&$x!#}XC- z_t$s4as+=QNI>p2-3NP<*rs543U~^75>?<6legCrEW%$!({h$zkyie{(VSVbf$D{%k-002ovPDHLkV1i!UURwYF diff --git a/public/images/items/charizardite_y.png b/public/images/items/charizardite_y.png index 784eed51acebcb13621bbd04c75f98d342b472f9..5a3ea59d0915e6aebce21894586d7c158c72bc95 100644 GIT binary patch delta 231 zcmey&_=9nRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP&g;aa8Fao*dAc};SoFTV z=*@RPfrBMrYLMN%|NB^_%N-`KoBMW8f)CHOvQO%FgRV8SSiW52Rbs4u=$EDT#>P&8 zl4lF8cmix59%%Abd2maK?GTS1kH@!;t&JZKSU;5R_}IX$%zWvdzb@0!mA9X#&wWzK Y;9$Y@)7kH2A<$X|Pgg&ebxsLQ0Lr&znE(I) delta 226 zcmV<803HAM0rLTn8Gi-<0047(dh`GQ0J=#;K~z|U?Uk_&gFp;LJwjT#YqLU1R$&Cz zVGT-3TFR8HzzF7SapdQSM1wCv@{_(m27M&d`!N^#~ZRL?GkkXFFf;6kW03XW@70wW7><;0@^ zwoTSqfGqe6Y7WvY3H^?=T269?xHq0u-F!>Eak-;s16*px9vr z4wlBy_w`ToCT!dFvf9?cT3+z3WACh$}t*@aVFb ztD?g19_*97vUsCu5>MKi32`>jzpc}G&R8ul=UQ>VV&-DD2YL;stiu>JmmJz1qRJG1 zp}268mtwu+nJA0LzAIv*e*Br#`82gZq9r87vDMmMam`nTTZ={Z^4Hvx0y>Vt)78&q Iol`;+0DB&7%K!iX diff --git a/public/images/items/chipped_pot.png b/public/images/items/chipped_pot.png index a2f35f9aed9f362131b0c53a5a3461cf01c6f0f2..969c3dc3c16c53807626aaf89ae9e63f26ada030 100644 GIT binary patch delta 653 zcmV;80&@M>29XAkFn<9rP)t-sWB>p$C>Sv;7#JiW7$7MjBq1pzAt@v&DJUs1C?PR0 zF)=hTIXF2OMM^0}LOE@7LP0`DNJ>gcN=i#gPft%zQBP7(Pf|@%T1`??QBqn}Qe|I3 zWqVq9lXJ44TDPKFx~5&Sv1+8JcDK26|JQT(-*f-pbN}aiIe)UHUXYA?gM)L5jBlQp zNvokxs-jA&rAn@)V5_BNx35paxKzcvTF1Ro*T!1Y#!}YERMyK<+s<&xz+=t_wUHs*v{MD&fnhF-`>vm z@80+K-uw6G>+k3L_lP&gsQ>@~Wpq+bQvj2J0c3w-rcjUo00AFKL_t(IjbmUKk${~Y zzdU2GIxk-B!AgoUxDDYuue$e#3Apgl8^)h2`ZkPK*LbXVP#`uU|2rsiM;@<S81-R8v zear42lPE5sX=`g{22>CURG@&Sz{xMp)j`V4%*e>mF(Sg3$DIj16rFs0;vIm&U?d_U z>BYl?E)P_}>Y)`NA|fg(EG+1PJ+xVcgd9B`V`F251v#+F1AQ(p2?Ww|o;V_dfrCQ@ n2-H|`$%71GXD5_oh9>|3iySMhdic#T00000NkvXXu0mjfguymz delta 728 zcmV;}0w?{E2G|CWFn<69XF*Lt006O%3;baP0003mP)t-sDI_T|C>Y-7rT^!97)45? zr*^WjYGr#`F(@I<_wR7Zz&Wy|y0@SI*K^+c_aP)9DI_5nBq4F*Gs%-*b$Qkb{kk-uL%ltEHv$=XjHIIc;-m)84h&v43x#n7XE2F)%Ub>+k3L z_fkz#N=Zsm+s;qIxJs_2QczD%QBTg>-kkIATF1Rgs-;xLyGg5|DJUtYw6d?hz)z~8 zRMyK{)5f==TB^FbfQ5-#O;Tgi#&e2{bNA<@@#a$2$WqtFz31LSK|;vd*j|u~bJECx zh=#4Ywa(w(hEt1-gM)xtRZ?ZQuZD((z31nry0i_@%Wpq+bQWLNGAv`nM7!27Q(stR0_iM0xv)q z%<%;-vnT?P&E|4T%PXran_lDdg#w=QEr4}N5{vT2=2oessN3b8-93PSp#2C4X!~MC zKB!i)pfKe_U#NuyoJUgSxZXH9)%9l6FwV|-fqd&fJ>fzu)-PKv!@z=$g>`&HxVpZ% zZQmJ&XF3SVoQRJ722*ZqmfY28i8B}^wN(6cU0000< KMNUMnLSTXb0$nZu diff --git a/public/images/items/choice_scarf.png b/public/images/items/choice_scarf.png index a83fd1f4b30f3e3d1c4bb9373a11df856a78d784..2ddf7d3be16a5d992a4c7885734b39c6e3f3d3a4 100644 GIT binary patch delta 334 zcmbQje2-~@WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ1A+haxBg=ES_W8 zz1M5by`(Mog4TSiKKibC@BcaX{-1sK|K4i;c%V|=k|4iehW|)Fm&I`{P~wcIi(`mI z@6}1xOot6PoSl6P^Xct_-_1b b|Lg2u`#FNmKM1S@`i#NT)z4*}Q$iB})2NmJ delta 388 zcmV-~0ek-50+a)g8Gi-<0047(dh`GQ0b5B#K~z}7?Up@`!Y~wsIZCcTx#hN$l$2Z2 zQf^7f6*vMVEhQya;0To4dKrr^j4THbwpUsymPUd+#oxRiCz(vfHLm}@x~>b4)Eqq9 zp2K|i6TXj^DE*f{SIaP)FWMNKpcLcRN+@1rz~KxWJqLce+*?A0sEABd zDLXwCTynS@5d33v=nWKSpZ470f?|L;+0&}G4d_NM=}^xF?|Xh5$ZBwg&d<3F=vr>* zcm`07w+uMkdwtFs_o2f8WmoUHx5&Vd$UdF=6kh!ah_T$%d(Vl@-5#ZSa0mAvns$bPk_YuWtN_>Au}oJ(eE uK4Q#zcEP;5Vp3UkWZ$>ub;o}c?qOIyhpENlBabT3NerH@elF{r5}E)|*lhm* delta 267 zcmV+m0rdWi0-FMm8Gi-<0047(dh`GQ0OCnRK~z}7?NzZ2!ypj!2q`I9#cO1QtdY{I zWDQ10n-Nmde)5SAJp@|<8zM`8(n~aO$KUY`gF>ND92M4D;`$r$(~a!~NCHU=@}>g# z@W<8A8gX+0>`3)zyHqWwX@G?I6D5r0eTl$iGx2NoN>F`wc! z@{rmiv$8~7*MUR;6XL+g9?_i~aaCS|0B--=hKLNs_OL*g7qa%Gi$tLC3ix(WcV>aR z4<x^sl_*33yS0E&2>IKT3!rOQe}e)WE0^idP|` z51`wjz7aao)Jne_Y delta 313 zcmV-90mlBQ0?7i98Gi-<0047(dh`GQ0T4+kAN*Ok6Sf@?XR9Tk>Gu8F=)%sYfw zZP`#q*dNSE4?t^1045BfXMiVeO&-tKM0Y`Id%pjB00000 LNkvXXu0mjf8?u07 diff --git a/public/images/items/coin_case.png b/public/images/items/coin_case.png index 14f9878e5c432dd86d7bbc6549957d8df3eb9b2d..3c17c2b13f8241d8ffcf4edcea3d4b785a7e0010 100644 GIT binary patch delta 238 zcmey$_@8ltWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP^cCVaCCI6uC88V zX?Zp(>gXEFckinI|Np;JJMJ`41y@OsUoZoZ4*_+ZB4I$$N>3NZ5R2ZslRWtv6a-ju z#SZ?jzromc;!?qflr<9ivBtc|9{kc+ delta 228 zcmV=K~z}7?Uum}g&+__Ex{6KgClL&%C=-1 z9&N=IFmoW;sH_4DKl#~7CK?l%#|Xx0GMP+Da?Zu%5JDUtD!E%Y&2wD67mYT$Kwwe? z075bVxvLkS2wWgI(gb`s}^xSFj{lwf34| zHGtY+RRAIqoeSpx)qCLzz*j6m@Gx944sHhEAy3brRteyABD%Z+I9IRAF|7U5X{ugB eP1T!Bzt9PQIX@523Hmkw0000CL_t(Ijm?tF5``cPLruZ*|9@;!%0emYd+UhIK!xtiVcu~>QqQS z0Mo-*pHChERh&w@jpfX>$VGrMWuYu em(f}NQ9Otf1rcztr<1Ax00004CfZ<;A-bkPrXMsm#F#`kNVGw3Kp1&dmDEQRV#WBRffA54q zzQYPU&ca+@{+X|P%dpgYX>IN_t`&8Lob_dO7w0n?f3CdXm)kIvsX@)p(P=)zv_<(s z(hpW}^LMKscp+NZq-Mxy&ByP?WFmddYyYR`A6Bv$Ffc3&xFi+%n%AXm;YsxeUq4)n zkY?;_Do}gC@ax0I)B_GBZYFF8*K@9rTKx5%!1h1V2QFurWqoFEV6ZW;a_~#N^+~*8 zrxkmoi|yer;ZY7RML2$Z7G24hU^7MdVXQtwPG7v$yMXn-d|4Hmc*5W5JIttYn`6|l wJ?;OhdS8y0b+@+vXK}lbrmpb%`GLx~W%q>R*XD3s0(zOj)78&qol`;+0GD-YBH1 zs~ER-LUl!}LyxFOH-~f$r#3^y41WgE^RW||4^6!}|3cwZ@c=JFZgbxzgU9t7YZ-bh oKUsgZOiy3(BD*{(uRg{)cR!2h<+M|ifDU2sboFyt=akR{0G70EQ~&?~ delta 236 zcmVF5M9Biw-)cRqDaOnb9d}XxOEw3;Q;BZ}c?*aqZ zYQ=n80PezHLkSQzOaXN7gSv;7#JiW7$7MjBq1pzAtop$DI_T=C@C>0 zAu%v9F*GqeJUl`?IT%GsDMdm#VOl~&LP|+WM^aBxP)|}#Qd&(?Qc+T6UqNMiTC$&7 zx1w6Qrd_hJYNV%j|JQT>-*f-xdpWYDUXYA?gM)j9gnosFWq*{8XqS<1o|t!&kZq)& zNvokxs-jA*q)M)(U#_HJtEErExKhKlQrE^(*2q-W%Tn9UaLT}A)5e5`gn@{LhKGrU zh>3=YiH3`egN=-sm4l3rkh-^@r?j%FwY9CfwW_(es=B(Yy}h-zz24`gufD*i#lX7U z*@W-sl=ttg>ow=E@8-Sl=cV)KwfFD6`}fG&*v{YH&iC)$_xIlW_vh>H=kxF9`}c4= zF!=xg0AO@dPE!DrfdNpHkO2>WHnVUP0003JNklCq7W4W1W^huTtLH6%wc6?V_;woP=JCk0UkvK1tfD=ogJe& zIE;)!Lu0@oOp8aBo7)AUf+IFQK3YuJ!q^}@JSHYk#Lz^SgMmYl6Uq61oUYNn!g}WB zf*ShzIwERd1u{qqfJ!{${WL{I?d;5eKwKq=k4F*Jw;Y}kaX3TaPfu%W?4ivn zENpLYYpX6H#EMlO=yMq`2_TS^cEJ%D44j;xfL3I|B@Z%$gM(0#8J++DcFZc^V!LBn P00000NkvXXu0mjfm75}I delta 700 zcmV;t0z>`q1-Ax}Fn<69XF*Lt006O%3;baP0003XP)t-sDI_T|C>Y-7rT^!97)45? zr*^WjYGr#`F(@I<_wR7Zz&Wy|y0@SI*K^+c_aP)9DI_5nBq4==ll0kO;SopN`F$@&QHR)O0K27`}dUh z??+NkU#_H5!?j7Pp(!XSr?j%KzQ9kaqEyz)Ibm95l#WWRq-~_1dxnI!qFSoDx~Ij! zXqS;vP)~-4iBi_cT1`@3kc_SC=R!O=$lBQF^Y2noQe)G`caxBTh=#4Ywa(w(hKr0+ z*T%2!=DqLdxL9(A(7$7MC001J9ls^Cf0AO@dPE(U{0a25H0SpGG)Y83R5(xFlG#?mFc5|#ZVk{B#TE;KwJM@kMNz6n6pd>Y6&Dt_ zy#HI6w4;V{Jl^wN^lxUq&N)en*gp)XfCdVXz({O#3|@gg0ioFV#AN>vd7)q&PbA_P zD^L(ff|7q!G2vh}sqkUY2}4Vz7@L|_f%J@SsA@PT5VXv!iBLA1%ZUkur04W}p}^;S z3uxZ5%msUKX}MS=WTmvawvHGwoF9Q9XT#jIx60-1ol0f5v=<0fN#N;P`v;y^s~vLc zN5>7_fNz7R5Kd0HKm*~de%{dY5#i$U>Y7r|^L=Rl=C(=i?jN8LhA>(!LOf6GqWMUl zp#Li{q-CC82x+%nx6_fzkOIxNyWL*zmA+|E;m86qs+9Bo5gt*9EHK9r2W@=*aajU> iN0DD9A`CJN0%Kp%@<4eHcU8pz00006~uPD-loj*8k_ z3c;li+O1m96LCRwpDmGd@foucY{0o@>3I&-?ga-27YylKlhhoRhFFWBL4$LAF@Tx zoL;H4_0Yw71(tkoGd{aDoNl(NIWsRV`0vP}bC1RQFvD4ofP$_)%WmIpP+ecsKKoO} c-8#$s(_)-YT00lL2Kt7<)78&qol`;+09*2&0{{R3 delta 396 zcmV;70dxN50-FPn8Gi-<0047(dh`GQ0b)r+K~z}7?Upf)gD?<9ISNUjBH35a= zKRlByfCjqp=Rd3jpbUZ$eLsZgx_(t6O5p2z451Q$v$s4~@Z?;GL))ecC|o4~#4n2y zy|m!n1Qf2%0i@7u0Xy~#q}euzYXwqZ9tQ8+kS?H=&%(o4+uqx>6AqE&A`EH00U1a= ziwzae@n3_ZCV!HrAzmbub6zW+=eFW0fctIhUL!y_7aiPVW|k_S0$EG33MkyJdYtZ1kFIII7W0J6ZvXbU|4TX1ijBKoz%ee{|s-(^FxwB!P+ qW4#rewIRvbf|Xry5hwyS{s7F7#(p!=bN~PV002ovP6b4+LSTYO6SD09 diff --git a/public/images/items/dark_stone.png b/public/images/items/dark_stone.png index eb8eaa13ba82de1940ac9a7fd9c425a3d1317cee..c28a93ecabcf41b3488db77f8a4dc1309b64985b 100644 GIT binary patch delta 194 zcmV;z06qVz0_y>gF@F_MOjJb%001#DF+xH@Qc_Z5V`Fo3bBv6Pn<|v000007bW%=J z0RR90|NsA`f2R8Y0041GL_t(IjqQ<93cxT3LmM@{|Bl<6p$&hyVZp07*qoM6N<$g8!LOI{*Lx delta 257 zcmaFOxQc0lVLeN_qpu?a!^VE@KZ&di3=E;@F#EbxddW?G>#$EvQmIu^o##oH}Jx?H!i@IJr0H?5YZbV0l0 zMTV?4yR{Q|6+|BPJ37S`UbR*X6Wzlh=iRwxdy_L`WFD($s`LFy_M8vp!6|B2?Tv2D z)(PpZVlhu(WOHjw+{4TL;7y^-oXErKEtd5=T17UUKcmnDbQgoCtDnm{r-UW|NEKgO diff --git a/public/images/items/dark_tera_shard.png b/public/images/items/dark_tera_shard.png index 4060f9142f63b552d6de93a261298dcefd059ec8..ca24664b74e2655863d870e659c1b8c41a583294 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R(h)3{QAirsOQ2Id$fWC97Vpn!j=D<^TWx->h0OA1KXL z666=m0OUhJU8hJGP_)I<#WBR9_v$1^v7-tc%-l|#-}is;e|zo2^`lRp@HWL=Pe1*J z|J^lCWjEhOy%5oqL+_Zhryjnw(qmrnp{kwcQEYPWu53OxSxV`IW4FMM!;)Q}MR|LD z%qBK{Ipe_X*J!lBSEK+1H+i}^ zhFJJtop@2`umT6mL!FjC|M|aPx~P#=fBX70o0LQA+NCV_UwO}U>9)0_%hz}MO#+K+ zgtjc0(!>__Fz~>pX@=a3&T%{r?)4O~y)%`u*S{%ahw;3tepZ|v3hcpB9!%y1g6kT}wPM0OKc@8J-)5fzcl0@&(e_&XYW7iviWD2JJ<2kge?yxYj%@s( z_d!pc{qyVa_17LU=*9n3$oZ)7rcnIeHF=KbKUuy?%X>Af4`K$opTX1B&t;ucLK6Ut CeugUm diff --git a/public/images/items/dawn_stone.png b/public/images/items/dawn_stone.png index 0e3da086649b4ce7f122a497a52111ec3bf98184..b29d2016a568752a1b791ae3d132050330ad46ed 100644 GIT binary patch delta 245 zcmbQl)W$SHvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gBEToa6-X;6C`fEs!f|hlz}ce` z|L;xt|L*_)|0)ZucL3!$N`m}?8Gw8cxOytY2q@O!>Eak-(ff3gBi|7P9%k=3OaA}= zc&u?=){gaAihOe?c4}PzdbH;pV|w~>f%b5(yo+;AY(M5vaj#tZf|HHYj-#g^Fbc{j zb>+883Lo~kL5v= rMcS_xmDN|DskX73@woce<39}30+<)R6j+)7bQFW9tDnm{r-UW|oTq41 delta 257 zcmV+c0sj7m0+Ird8Gi-<0047(dh`GQ0NF`IK~z}7?UqXp!Y~X(yJX3-%N&{`aD-lg zC0FPXxI(~46FGy!20Id!M;fU=WuB&1n`KF*Qva$_O0_&K_);IHLqRxrt$RJ+Z=E$r zNH_;EKnMiFPy5yaAPYjC3jsjo-vIE;x?SJLKSOZ!vZ$En0D9M3cr?J!2=@SJ)xQ?w znz@CKaBl#y3>SyPa!(teE&!Np*lM5)_H4kamO;_76mIV0)GyI1FbEer>fP%T6E{-7@6423r|Z9Wp` z#wK#*0HYN157if+SWYlVJv(}<`w+t{hOfVi?YW}%r2O>BdVQ~b@v)WmbGc8nu=xMa SxWEdunZeW5&t;ucLK6VZH)6H` delta 218 zcmV<0044wL0qX&f8Gi-<0047(dh`GQ0J2F$K~z}7?Up+ZgfI|8If~E3`6xNUwv-%! zmXb0httk+Y@Y!T1AuQ5ZvQqkurAbm0DwXQ30zliJvSQX?_9WYJK6?@X^947<9Bu({ zyb;2gxEb;SIN=_E*mY`2{olhlAR(+N(g}CQlc~5R2ZYlf1=_ zC~&Y`e)#?`zf9*%-br8g>{z=^;Dd!-bqT|l8#}oh=5FQOQ&bvsi@iW7Q@P>D1owba zrf$QgOAI3O_Sh@=JeRq$y5a7f6SZZZeqYj=aOcR5N172aEjykBZ`d(qvd6(gW$&VT vo}_)%+xUaeo^_iAt9kCWhUxiVoIb?p&)6~%qdOOz zq$q)oFyDu10YELBWD0kJ+q9v$KXE|55xicGR000000NkvXX Hu0mjfegbbD diff --git a/public/images/items/diancite.png b/public/images/items/diancite.png index 6fff500867356520c44600671cf7ac92b0acc3a3..293d327524ec38d7c4a6c4075179abb4d7a790ec 100644 GIT binary patch delta 239 zcmaFQ*uXSFvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gE5Ikj6-X;6C|sQr^lVGk)#C1F z-D|$>UGi?p-fu^n|G!)EZp+bcN3VW+_U!-v|I?1Rn*dewl?3?(GXVJr5bkwb1Spf` z>Eak-(fjt|LB0bD9LyIqcb(Mv|9^J|vv~f4Nps(B)#ttV_{Pu4OCqnGn3Fu|f^;!6 z)55(cynGfMV&z=1H=Om2zr=+(&MXh+9b#vSQ4{efIdVgx{=wW0yh`;4S|&vux;HOs h$%W(jI;hGAd1jiJP0#`J_=t~JUfqAlz5-b9E z=UGCVlf-Tc0P8!roW#`doc?YKr%8YSN^qS1C_zP1xodm=aw Y0Q8EvdYK425dZ)H07*qoM6N<$g5OVJKL7v# diff --git a/public/images/items/dire_hit.png b/public/images/items/dire_hit.png index 5917fd02d9901845acbca0ed13536877e7aa9461..0c060710ff2c8852f700946cd96ea53c4b70f892 100644 GIT binary patch delta 286 zcmX@lw2oLk@DUZi=!`HY?xjyCGI3Teb*t;VVFp=&HuG~{YP7nuRa)&MaaztwaeLSru0UA2W|kU<|>W0<^JCk__k{?lPB*X;#N4!L|In z9+_Yt;2e{j`B4R!Z79EFuH{F+8+=##FPYPX%idQ=fUgG7A4A!8J$R0?*A>n-O`K<7 z4TW<%(g4p1S2zQDtj2K8HQxo?E$%NJ1;zoWd+C2Qk@YJmhGqZkDk}PGy#cg_t5ozU RQ?&p9002ovPDHLkV1n>qi-Q0F diff --git a/public/images/items/dna_splicers.png b/public/images/items/dna_splicers.png index 5a3c7fed75b313b29355eefc4231c94fdd9a8507..51c1524076efe17851c2560cef278390679cbbca 100644 GIT binary patch delta 258 zcmZ3=G?{6FWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DPzVZ&sxA(SN-AD6 z$E&(|&bMdHTlQW(d-d7>|Np(VCFMGaV$pl|(m|oa z3LGpKauhiJ{bw&fIx~*z+nsl%@iR2ys;|eh9oV^@Lq_6EGt*;BhKYvr*bbb%du&44 z0k%tg7g*k?dO1#T3f&{L!~BNk!ME#H-Mp=SKqVl#V~do-1l!i)eZRyLy(ACxTr<`+vZW2B(Yj|#Zv_hDJ zG5r46z5s-PU;7en>*Y9rdGgT+X1EyuiXxZ*Tr(UX=G~V77=Lcs{dk?S02+>Ux-qK* z7M&d`!N^#~ZRL?GkkXFFf;6kW03XW@70wW7><;0@^ zwoTSqfGqe6Y7$hWieMp zh2K5cCwpb_M$;sov^5jrY@&Z#r}Lb#T42t#;(*1>#cU7s8ctbb#76!2GpX}wYJWsaNQz^twY}n+uMD>qi|pmExhDm59D}E;pUXO@ GgeCx7J#2gc diff --git a/public/images/items/draco_plate.png b/public/images/items/draco_plate.png index b25df530171dac336fff67579abf75d18be97e4a..b4702aadba3091dc58ec5ad808f3fd3f8220656d 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqL4$$C42OUX9sws3G9FYk{FpF9LHPU~1_lO>k|4ie zhW`+7^;C!vP%O*S#WBR9_v$1^z5@yzEUt-v|MxF#Uv@}p_Pkqt?rJGQnor|Bnx1vp zHRo{n{GEHCMJ(p>QicctDNeE0UE&j1{X3dc8-+Y9PH0W$<+Mb6Mw<&;$T~EKS1z delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_m2E0v=Q}{FpG~L_)?4hkynH z3!r530gWUe#ZeOE7yKUr816OijRcBu7I;J!GcfQS24TkI`72U@f)hPm978Pp&rb5> zYcb$qnXGpDe|=Bjt#e6Ck4%DPCcFp=sSo1#+G;O+h-v?}=>kf9f?F~LCM>eyx}Y0uTg`7xTB%i=r`E2upx`^AMH$GP{ye2$lrs&?r>GD8lGB9|$ M`mwsKb4q9e0IyYN_W%F@ diff --git a/public/images/items/dragon_fang.png b/public/images/items/dragon_fang.png index 33659e5030775fbb07b68e95652e2a987e21059e..4a9904e0ef3755a19307d0cb4d959b2d796906e8 100644 GIT binary patch delta 258 zcmZ3;G?{6FWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP-xCdn$q38cgdVB zYnI%*diL4bqu<^=`~UyHK*{O zw6;IBOr6i_Q8!^d{`hOEOH0$nH-+etZ6p&A%8fXff*+iL3zmjKR~@&t;ucLK6VZ CnRSK$ delta 273 zcmV+s0q*{j0-*ws8Gi-<0047(dh`GQ0O(0XK~z|U?UbPo!axv2`ziNrNPeRdi$qo; zu}EYkwz3k5Eg6zWHYcif?+`o5r1VJc&F)@r7*eTJkV+|ASGd$I#NPzCU8nXT1YDkT z-vIB|+9!a8>p30|?E(mNpDr6(=g0RwJb(be1*LkuhX$y@vVU#A`}_f7opgX!TGM}S z0W5G&0%KSB`859KiLE$nz}>26z6yW|pw9~+0kkH&R<8|Jk!*v=1hAcP{qAYMHr3_? zp(}KOHTO%0g9i*-AoC8n@#+!S%Jmc&hg>#$Bd~`p^r|I<9fN*{gX<8rn}AcPR{8+5 X3J3Bo1og`R015yANkvXXu0mjfU9x%l diff --git a/public/images/items/dragon_memory.png b/public/images/items/dragon_memory.png index 15a3cd170cdf83c13a86115fc613374f9386c972..01a14cadf3e9fbc2869c9926a35cdca4e0b75a67 100644 GIT binary patch delta 325 zcmeyxbd_m>WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0L4Z$)E09)DP)JIuZq7}?y#O;D7z@$!p>S_PjrLa@D&-o(Ylv3`Hsr-V&Ir z;S#!KZpWz;3m)%iNmFhGTPUHudaiC>;y0-cPb~jwtv~;E`e()`LL8-w6lLRq Po?!5F^>bP0l+XkKH)owJ delta 362 zcmV-w0hRvM0{Q}w8Gi-<0047(dh`GQ0YOPbK~z}7?UpePgD?z5ISN;*NTWkgsMuZWR+6Hd$AoWRns)pFQX~~Mc}Um>biEJI9-6C zd3A1keh2QQh#UeBcjv~%eFXFe_wm0)A_+dd-;CH3!0*RqmwzzB*LjKx5KaM>BTImA zhL(`^m*B3u`e@s3SHdLV=H7>t0GzAkwFFN?=cB*0#|0!@N&tv&HYHZ6!KVpGxO@&E z3C$MJwP%DH%kK~Yq`-0;eO3+&u;FCmq1Jl!I_-o*(D2a6l@ckdH*LcZT#sD}q{2-Cc;Q|K zm<0}_6u5a5^W`iD1wu3blmkg<+y_UgO6-@dI` z^X}f1tMBIA`@iPh|367Rdx6rNB|(0{4F93PoN4wIpkS`2i(`mI@7syiVh0pBSX^25 z{_kA;!+oCXt(04`VS&%<;+PJpF7@Hq#xxkPPx<&nSAoOX%tFWYM79JRb5)2w zQ7JC9JK%S|)0#sqp^ah@^A!#qsyteI=U!pwd3UM5_c~I&?{BCVQgi#oDtEn+W$VhA SnYBQh89ZJ6T-G@yGywp^C1Ae* delta 216 zcmV;}04M+N0qFsd8Gi-<0047(dh`GQ0I*3!K~z}7?UlU|fFKM;9fkRvhtd&P!4WLe zGD1q)Sb@j|QT_@q-`#g-_g*+K%Oa6TB!7rfinvaL8nm}MXUI7-M&yE000Qoz9v-)g zL=4_6kp^T1IEmF9Z4w@=0co>kfwWBm>C~J+NupXHhL;4MT2UpCJNBsp9Mpfmtp=>0 zzEwa2wjDnw@TFZYU+vUGp57O5mmklYWB1T5VD1UV0Iox}Uv9llU%3*AWJXSUtrqr0 S!c3z80000c;)wO5Ro*NH$-Z*~u_5c6>6R)fn0!nk0 z1o;Is0QnG5*C`SP6m9WzaSXBOy*kNJ?5F|j+0D06FGMuu&^spWsfTZ^^q5zCsA{Kq6r0?;E1SU~QQlr3 zvx!Y#&Ny)UHCnHqKdG4IkqC1Rqm4>kSlrp43x6`nZQr!K{mjbudJYuN*ox}tP>Dv;tT3GxdDDuV!qO=on@14TItJR*x382Ao@Fyrz36)8Z$O`a}} zAr}5uCtegftiZwYP^ab3fBx^6E^1`e-@ZQ0Cgsq&b}7sKSKf17x^3;~^7Wm5lfdE{ zp)CuhG_i#}3_P%Dnj!b1a~zL@dp!kg?@VRv^>519VLb1upA~0^0(-EO2a|b0p;zJe z%?z!Q?Oz&HI%dsgt(b7nk14(Qx7nw_9eoaGw7pipntha^BE^PlkFt#B-_T};BO5>H zeb7^9|NJ_9{k4Y-dhtIMay}}&DHOkVO`hZVPnNIJ@?H(=gP4KtXYh3Ob6Mw<&;$S% CGKZi5 diff --git a/public/images/items/dread_plate.png b/public/images/items/dread_plate.png index 4cdbb76f1805678391dc7a036698124d4890dff6..6537320bc0a1bcde32acaee7113fbfec8d4b115c 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqfkQ-rM@Bk|4ie zhW`+7^;C!vP%O*S#WBR9_v$1^z5@yzEUt-v|MxF#Uv@}p_Pkqt?rJGQnor|Bnx1vp zHRo{n{GEHCMJ(p>QicctDNeE0UE&j1{X3dc8-+Y9PH0W$<+Mb6Mw<&;$VI(oSgr delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_luoGdfnBSa9G$!GsMS84V5* z1wct1fjPT?6h}#rU+{kjV7S-3HxekuS>O>_%)r2R7=#&*=dVZs3QqKNaSXBWKRd~j zuf>3eWwP4o|MfkAx6UOoJu(TFneZYgq&|q_YpcERA*TJ?rVA+b32w<0n6Su(>ypw5 z##+%m3LPB3-uPU-@S5c{G`&MBb@04hXiga7~l diff --git a/public/images/items/dubious_disc.png b/public/images/items/dubious_disc.png index 8bb234974627765cf4fc091db6b5c0cec673a160..122958f955014704c7e6a6068261197ecd4bf5f2 100644 GIT binary patch delta 275 zcmZ3*w3umvWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP^gZ|ni5sLmto76 ztT{`HxBORlw`NN7nmK!qHm^Cl<>trCuqBi0zm@*ML1D)D{>KZMVp=zppo<7rVpf4B;EGr!FwVg9rd9vB@#IO gwXCG1r2e^{XcJ|27g!1t6#xJL07*qoM6N<$f@`vOX#fBK diff --git a/public/images/items/dusk_stone.png b/public/images/items/dusk_stone.png index 12ad19505d0676563c7846c3e0eda88d3488938d..e2cf73d04f3497611fb7ba553082079c510da9da 100644 GIT binary patch delta 249 zcmeBW>SCH8Sllz?EDmyaVpw-h<|U9L7vK}(3ZxYj6oMRslDv|NgQ~lu zrcB9NvZi{?-YI+Et$8;8!Qb;h6NWT2|smNoohMlcakmM;<%fiGnOWAvsg#@oNS(hhk zKa62*iAzYc;bRcq=I+AyG^@nvlfWx!xy1a-EJyY^a1_{Yl$*>YU>nxlr#(w>iNnlE r&*#jT-EZQ2#B5=7>&IO__s_8|f6glF&zWBcbP$85tDnm{r-UW|OWI_> delta 252 zcmVG{=!5cX1=fY-FD%}e$Z;oxW9 z)Ixw-Rf5AYxCOso)1GdRdJ+WZvy<>SE=K{ULc&D=18ZYXmBn7;51Hc1PG1- z6ff~81h@p>f>Q#e*>gCTa22rNB>|V^|5TvLF_Z!XXfpef0ATMvK9>uK3rMgF+}Z-S zGj9oSkk;yO>k^{6y?j!FAoAUJefz)S@298dFY*Eo7KukJ3nd2t0000L2V#Gc_Bf2N=ZsuQ9@EtN=i*qN=;f)O;S=(QdLw^Uu%0~Wn*Y(Xl-q3 zZf$LQXJ~M4YH)3Bb#-cRa&2{TZD?+Lj7dteTwQ}|UH5r=_kVqRfq;9hl6x3Igeg^= zD_^oMU$QY@urXn+F=f3$V1{3AfmC>~F=fUvY0gP`#Z-R7e~XxSld^b}xJrWFex=@f zs_%QM_ne!6pPYc7oPnR6ft;R%l#`58slz`?AHvB-p~@2%ti+uX(5+{oVB&fDD0+uY9H-_G&V z!{_VX@9*CK=hpZ4-ud_5|NGwm|K9Ka=lA#L|NrOz`|q?oVTb?#0Bm$pPE!Drp#fl% zumKBya!>M@0003rNkl2rlfw4RH$zC?Lcrf{L;T zHg5d?yOZ1!67Ia~`?{-ZYHYTt3n64u?VR^9jI|)n4WB%Sj;zEi03ZtxlFbF7{Ub}k zYG`D7$WkQ23;@}gy#O0R##OQM)hEGNyL+f`Qjmnujkk_#rixEGE2F}Z*0^A9KgcDs`t0J zrztEcduM3Hn2`VH){L>p|NrMHBq8^Cd)wU2ZEb2&O;T`eZGXeSsu&2q@Bin(!K%Q)tZr>>#=fQh``)*-q+f1 z+uX%)Zfbj~?=fMmoSuY(YF(|8d*0j5+uY9o|K4?VYG`hIT2VrHld>^oy`P+bpPYd) z93jELslmXgx@fwjgsShHs;!}$fxy0}-rvso_uhDvxG`zYl%9+jL4;pxdl)1+qMd+L ze#1dvhAAi^l#`6->)w8)-kh6&DOH>%L2WBvvPy#9AtWiEoq;i5upmKsAwhcp003A& z{Hp)}0Bm$pPE(VS0b!G%0SbQrmQz_&00009a7bBm000id000id0mpBsWB>pGSV=@d zR5(x7&RZh_K@P)%Y!S(&$R(RLqK%?0bRm)GGT;B*q*>ce4_^7d?94g8 zb9Mm!C4Ub9FfuS)u#8zbjuploSjMfq&F)~t&vgPqhy)0oyjkcsK>B}^0s&J_hv^~u z+2wX~HVCIZA{3B!hE_=^aLvxm+c^jqJP-=PqSshL4@=8FgjUFJNLG1C^7{jW1_fZP z50LZ?_;o0WVvq_7Ha0_{EwUrLy|cR)5u^JDF}hm^heyZg1fg&^9*>;Law5Tiv!tS+ z6hh}0>C3B(s%EohfUkd(%1tVj%jNUw+sqvSG6Mi86tp5jrPBR_O7d8)RB31M>64n~ zBjAb5tLk%^_6>k>{Y5J_UgfN+zBS)ldSeLSdQEG5^g*-P`lK}zAUj04-R^Xac?RHm zRP6P-9b=vaI1r4*D%Ig418@KU{r!WmU?l$lVEhH#WMW%UWoHex00000NkvXXu0mjf DQF(4i diff --git a/public/images/items/earth_plate.png b/public/images/items/earth_plate.png index d40da06f6b6d90ea0c661d0681bbe11efe92f4a0..79fbbad5a844f26d2046af6664d9373f85f92f0b 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqK|_SYgba@b6#+XYWL#L$@Lu(&4v{olW|ec2(Y+4FAoxvQlJX+DkjXnNLV z*PO%Q^LOrn7O|MiOBo^rq&US|cZpA6_3vm(Z4~mbIKf%{@GHw+&ky?1Dn6H!nbp5= qsBV!u!M$gps~mU9hLVl<(-?v-vu$m4^_&f~mci52&t;ucLK6V;RZepN delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_lc%0xqm*c(7x_jtLnPGCUe0 z9DtI7{p+U#DUOmLzu^B6z;Lg5ZzNERv%n*=n1O-sFbFdq&tH)O6rAYk;uvD#e|C~5 zUyA_`%Vf3F|Lc1KZ=FkGdSntTGvP&0NPQ5;*H(MsLrnX(O&3t=6Wo$1Fkz7m*CnMB zjJ2YB7z(l!tQ)xol`;+0D4$x-~a#s diff --git a/public/images/items/electirizer.png b/public/images/items/electirizer.png index 7d4488d0ff3f7ff17eec0dfc74e41fd192e505b5..a5589a27e42d6b0f028cc99a3de06f30d2f97205 100644 GIT binary patch delta 252 zcmbQm)XOwMvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gF2E;+GE#Hk%~Yya!72cf#MIJ#0K*pMoJXI)YMd`VvK;kEEr%R^V%Jz4%X}fawOOV zq$k)E1P|t%VO5)#L=QFtD5b#b z`5@!F2GR;Q0pM`y8bS-^eG>pIND06#sBX`{eM=l}n`|Nr0n|NsAjN9L=5dIU;>{DK*Pd}MGS zpxYTJx7*XjF~p+x?j%Q{!wMX(_055d%oYD{i}~y}yj6Sp)XeW}KVKC7Nj|tjf5(KG zQ+kCW)_h+V6~-oVBznVA#+_553-mq-C_GP`F*Es@iFCodya`$>A79h5*&#iJG3Y_> zgFF6LUpjYi7RgO+JbX)UUdy9auIB34QYoPemdKI;Vst0KXHSIsgCw delta 381 zcmV-@0fPS70*wQZ8Gi-<0047(dh`GQ0aQsuK~z}7?Upf)!Y~j;eT*%0g_L_0O0Gbe zl5*QEDLDddO3J-L$}PFVY-a3lO^hLvm}rG$q){M5dC&Iu$gXW$_n+meKoxjvfu?CF zSDOm}L_eQIza0?`zHTSEw?w22%s_$bPwy*;yi6d1hn=s70)N9I2|N7y;RPU(6;N>g zZ>(a02uGz7Sbx9+xa+>9_WSOsgi*kSQW63Wqs4axzMPLzU&q6Gfhk-`FmSvglsw85 zyq$o8>*pAxp~V7sYmdqVi+^h%1g`yAW@Wtq0;hvFu5~*4blL%Dk<}p-0ql7sJ_c`y z>;DWsH~M)2Kz8Gv@9)x|CSFhd-01BBfTQW~y)ZMm7(zFh_H4@ydq0I+MsM4O zvD?wZo)3YgaFYPPFfTFf`)Ec>;O170m&>|K9>`xq1~hn+14*vsmV%28Bqc|%dMd60 bRUoZDfuiDP!%&9%00000NkvXXu0mjf7|*XB diff --git a/public/images/items/electric_tera_shard.png b/public/images/items/electric_tera_shard.png index e4e1003edbcd45ba76b6d5bcccff8b6a85e0502d..2195be32929308940181ca6c46fc11a24ea9907c 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R$$8GhCd_zV=%3r^o9)e_r?V``$b6p8x;<|H=hrGoUnA zNswPK1CS2^b)6z%K+zUY7sn8b-m8-w#f~a)Fmrowe&7GW|LwI8*N;AZ!rK&gJ^l0> z{&&|nmEC+B^+H5b4!vX2o_g47g~z<&LshOOQEcx7uWUXyS?bP7$8Lcmhb2FK7Uk{r zF`L-bN WdFEN+CmGj*yy5BU=d#Wzp$Pze;AgM^ delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}JMW(V{J!_|=XIYRue&&# zeeJd6$>Bg5h7IYnjshvJk|4iepfU(x*mOqcJW!Ogz$3Dlfr0NZ2s0kfUy%Y7+~n!v z7-Hdnb>c;#!wMWM4|Q7p{OA9E>7qtf{q5`1Y*G%bYnQUzf8{;brQ6nyE??j2Hwi4R z5!$j~N)uby!@vWZrWtZCI>+%ixYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY z-^|b|+5V+LrDN7?)`|)D{Fu^*W@{#|77_pE$`K^K8P9Ueg;ohKbLh*2~7Za CV~Fhl diff --git a/public/images/items/elixir.png b/public/images/items/elixir.png index 694b07f34b6f0faa525ac727cbf75d8c6e80360a..b4bf7834e176b50208be861f177df962147c82c2 100644 GIT binary patch delta 273 zcmZ3_w2*0nWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP{=ZL+>+(EWJ%P~ z=Hh2dn*Z;ebM|cWyLU^zeOvPX-qpxMzVm_VcuIo&f*JlJ0OyeaHK6!pPZ!4!i{7h~ zJeimkIanM69smEo-(fXVX4Xm5m)XEpF>;nJfMtH?tYWP|H=Ax+%&an{ab|)s3dpuX-Y-8LGZ#f z+=;GddZb8~uFV?9l*Q(KA1S4yJ;d7_dO-jL=8!qWt^i-=vwuF#dHbb#cW4~}3f;q; zWfsT`Fq=ZMdkuiUnT>%Lxy4f!%uBO3H3tBj0RqwhTrvO%%of7=*UU{b003T`rFHC@ z0ST}qw+yU>0Dwyd03f$t8-rU0)|k6yVCna}bPt#V;Mhq?0CV$SBhW^&X#i#St}mj} lG2HA;xXWX-Rv0bMdIEa+4U#30O(OsR002ovPDHLkV1g&EevSYD diff --git a/public/images/items/enigma_berry.png b/public/images/items/enigma_berry.png index 26c7f11ee9c7f3b6e1303397e03f634b1f8c7ba6..1a1a20854ed158df46926c707e71a65bad6577f4 100644 GIT binary patch delta 260 zcmZ3^G?i(BWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DQ1J5dYHn`cvZQ;< zmMv%ZE_rtE=(lgr9z8vI0VvH`666=m@E;1ynPy)B3QqQPaSXBOy*tTK=!gOb3-gNy z|Ks;CFWb{`Z}Sw(Qg(sLdHZ=fcRYN^C&ODS`Q(ouo8_598!id(e3{oY?U;5$WeB(9 z8s?LCw-{-Zc%Nh0I$_550M;@`wR8U;9`#k-Y^`H)p^VXP_u>P=TQ*c^R5SGzeq7}c zvO#=X*dBH6go{~S%xel3ZD!mN7v`E|G~M--@9u}|kMrMCVv%1}zqcRgJ_b)$KbLh* G2~7aow{iXe delta 279 zcmV+y0qFjf0;d9y8Gi-<0047(dh`GQ0PaadK~z}7?Uq3b!yphva}>|xwOsZZIYPEs zcG)X*nImMIGQuyPVNwG9+C?20Fa~_j(HN&`#E21JMoQ`M*%iF++p#_GH6QC-v$+Jo z4Cm*j5)3y`DW#^Dus*qj4QNonmu0CL3FMsh5}yRnk9Q_uDSs2Nfed6oY_hreNC2M{4w-Hj50sw|lWw;imiP&H d#E8F&7wm429S~;MM{)oF002ovPDHLkV1f$RdLRG* diff --git a/public/images/items/ether.png b/public/images/items/ether.png index 970c9a27778ff4c600195bb61f43bc94c92a13bc..44a6e79de8e541e7f0dfbe6977a564744913b572 100644 GIT binary patch delta 273 zcmZ3(w2*0nWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DQ1H@BY7Xk2leMIJ z&XT>|NAIn9w&dv1Z&&|cefI3x|NrkMt9b&|@stGl1vC6d0L~);YC!SHo-U3d7QI&| zc``98aI*SV5 zXL$en&Dq}~4C&0CoE1gc_ii(>%{aL9%4vqLM|PgkVXzihE_u7}L}NtC+CCYX8=NwE zPOR1ftLI5J9^TzA^DX#&bwk5i3x?m>EpF>;nJfMtHIje R1_mw$22WQ%mvv4FO#tY4dbR)n delta 284 zcmV+%0ptFm0;~d%8Gi-<0047(dh`GQ0P{&iK~z}7?Uu0(!!Qg4J&M|_k}@Nt%nB(} zdIgs%vqDOb;MS!^NXy^_JP;6);)1jhKm@*V!9SWWTf@++*S}Q=L0WP*Pa;jZL7?$_ z5m}!}UgIo}%b2yKlm+uR&vKulJp|1uLJ)-JlsUwq0NNb-Hh;(K*XHNb)eoRGJE-73BV--gy3!|p8t}$X$A;@=1^&3*9>TY zn%pw56@maR86bdu{iQXyWnhcBYX)k+-`aP;9Dv78O9Pmj|5`z5CA$VtPw#poY8}Jf i?u3V2Mtk-0tQ8Lr#w1AsU+tX$0000V4HY2U}_wA&jvm=5oI5J0vtrC z0fvvjK6_ltDlh^g7%Z=VKWwN7Kj#jR970rpTQBMadG;`1n~vHKV0rf51eYH7y;Cp$ r3-SzzfDE2GkVaE*`Xo%HQh%!ho}gX7qF2Xa00000NkvXXu0mjfkTq(( diff --git a/public/images/items/eviolite.png b/public/images/items/eviolite.png index 8eb195ece2a38d1c86877a3e2667d7011223636f..8591791a5a1d76e6e2f99e8c08854720aa93c898 100644 GIT binary patch delta 216 zcmZqHzsWK|Ql6QCfx%@-*D(eL#@0+{=KxPgpH%?4=@LA16M1c<|%#oBt6&IgXMbzhH*{5ODQWh!IdM z+|$J|#G?1@1WUdH3Ia!NO#c7hVzZ0a(HzGp9V=;*q@L59t8V>1^M>n3$CPvDOX4zO z`JcBs=_T1aKRElUB4@siLxTSDgW(4Ki`){J{&P4!I`r2os`lqW=F}R-iC=`j2LkP2 N@O1TaS?83{1OWB!T&(~A literal 6019 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 diff --git a/public/images/items/exp_balance.png b/public/images/items/exp_balance.png index 56c645b70fcb4a1b5693ce70ed19d9ba08bb0af7..6a03556a3a269f8dbd74168a91fd4cb31d289558 100644 GIT binary patch delta 325 zcmeyta+PUhEdXLS^wivoG26eb9NZ^{(}X+Lp&L0XJCe zST9Tv6S=TSWc5)W(ex|VFD{+nbkiiESd8QS$xy-5d)Edg{^^JbQrR9W=Ad{WydvV` z3iAe)t13GiJ=Iud1TY(X>NwYS%G_YF^o-&yg>ea6-Q4(APsn7o`hJPAJ27-oS=j=^ znRa3CCqCxStm16EtAF+D3V|1s9o_dHk5^CRDts&Fq8A(Y_h%sgqs9NSKePG2WS+Lr Sd431bLkym-elF{r5}E*3GnH-t delta 618 zcmV-w0+s#M0{8@w8Gi-<0047(dh`GQ0zXMaK~z}7?N%X=+b|e?nFFthEX4ItKtkNJuI1Q}(Fq8d_`2@8;kwht@h2 z0RW;G2SigYCGW9tw=?)wGSqdA?RE=g)T=vHgJBo|0BM?H7zT)5oD_6%0Yz3I&-1W( zWGl-1GPpn~#eXwCqpB(xV^Eg#B=KYjV^B&Dl*P7ct)Yy9G73`4ux^Y&krkMlklB=a z-tw?902EmP+I67?@tQIUkO1coAs4<~7f*rKI;gkSCPh}bj(6Da_K;HI>Bm#@x5_vh zMOFZSJJpKWdwTExwbo7<1y(UMRdXs}4if%-CCq*dDdmCM z^+StZ@M8l<&MLs$=YRf8h{@wDc!ho{vMifCV@?*Jck(E~q8CS@8awH{i*LC#T7b1S z@weN1h{g&SBcHqtul=Bjb9C`#bj{b)M~b=OhW{780kmgq+N8;q-~a#s07*qoM6N<$ Eg0Q3{p8x;= diff --git a/public/images/items/exp_charm.png b/public/images/items/exp_charm.png index b42da73301ee451846bc9a6876b05519a40c69db..2635e4d802001a73419c109dd72613f6eb4ccf95 100644 GIT binary patch delta 346 zcmZo-e#JCFvYwfNfx%@-*D)Z)SRCZ;#IWw1%u680FTf|n6-X;6D42y8m_?OZ#@5@! z*SRDW1Z7tLudEJfS)SUpFs*w*M(4teu7yFH{s(RO7qsnv)UN;S{ZpoG+x5S9%D<&c zns5E@zW2ZT(ZB!yzd5$8-U>8PswBuSnBhMJ)I(_`iaqGB0#Ml!PZ!4!i{7=95AroD z2)IO+Zso|isCDW8|BG20J^9Z~GMURf(${SRgCrTSl>-#@>mUYFoUP7pUXO@geCyRC#($s delta 370 zcmV-&0ge9Z0)hjO8Gi-<0047(dh`GQ0ZBJ6F8UBI=jgpd!c-?yh1^7397u8l=SyyW0|0?f z1$Pe+hGAYPP+*cxfHE^<%oafDD9=E=0$lWUl>#RKrbXx^1%KC!7}C4oKL~FCz{i5+ zD+OL>fQ{qdlvM;G34o{00Pznr0F|jN4clF1fUr85d&cJ{>TVGG3p})z!1~<0=4#-r52&8Q%rIf zXb3Xvy)RL1O>015)1Of`3rRKu*FMv&1KjXGum>QmBO2GvWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP;d-#%&N}1cdxj4 zN^^7boHcvbELpO5@7cZo|4%u3^xm^)|M@2NZ2~IgEeY}qX84Z;bXgqN0woT6x;Tbd z^xmC#kngYpk8|NA2gyJGzn?q#;)+xK)!);&h05Z4W?!=B`=Ik+>s{*&wJnch0&cL_ zv0j)UCURku$m*j$qUl$zUtBuD>843Su^7kulc9pA_pS|0{L>K=q_RC$%t7%$ctym= z73K{pS5Z9%X?_7QXPq|-rN5;_4j!;V0W*o1tGfcCMrRR|uN zc6^75$prMny*#=@vV4#_%lQpe%$|s;wXhrO zqy_iJ%Nw&=W`3?2w+7dlkaX92B0Vtrftw9A_kyQ1qos6SPoN~J!CB!V@@!?LdlVyJ zyhBn2DFUQRl_o~f#l)rRUPw9v9tj@Dv^`KG!7{ALr8Qnu@vL=xoAjpsf(;w?S~~zX XDTHvvxAZLl015yANkvXXu0mjfuJU;p diff --git a/public/images/items/fairy_feather.png b/public/images/items/fairy_feather.png index 64cabec7500050a8d57e45c9ab2cad8aba9517ab..44923a1db94ec228859da2066794f5a2c6359943 100644 GIT binary patch delta 237 zcmX@W{Eu;hWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE0EUE&}h<*KBM@p|L;8ZsF@f5RKZme)xO h9{bL^`(gYE&W%f%`6lXZzXWsygQu&X%Q~loCIIp<*F1KH@N&lc1+pg-R3UJgL3z#g?hcf`wW_^Ryfgz~y>0f(^`$r+3o~`@$!n%5M zF;c2R^ycfB9e;OgNpG7l8HLFb>UY+2=M_>R)Mg!B>o}@01aU2Y(0Wf@;E(_mO6bM* z+I~AOLoQ!HGHR(cw%v_ud1-RFHk>RW8AZ*+9Lv?W2WPX%5=$4L4`-S5Mhe zJmu(|Eqj~)f17gkUiZ7RQ~qCF^X=Z=Z_m!Y`*!a?5Jbtb{R8R|C<*clW&jBwfdc{E z&Oo`no-U3d7QJ^Tc?um?;9;rP72C|w`TxI}@|zfgAM?(f485zG{m|l{p~@p>s1a_bO-eA)u{W@^!A;sX?aP;HyC~#v{|Yf>9VDG zZF0*_=GO;*L=<&&Glf0cHHlNZE?~!bm9uLtc+$JNViUhhZFpk4Z_4%O-%kHzxH5wy Ur#h2o70@dTp00i_>zopr0CrcM+yDRo delta 370 zcmV-&0ge9K0)hjO8Gi-<0047(dh`GQ0ZBaDrvA;zR8Hv$^Y>FcAksH&>?Wr{421^!x~EKB3c?g9i| zJ7cC{G5p-Fvl-7zl*rd$fB;`6^Y+0tifkr;n+-=};}gI+Du03BLL{Q$j7xxU3Lwb> zgiq~kqpJWYBjHWc+0=F8l?W18y3s~T08Su}CAdF4)20Y;^c0|kE&t=2O^H!z@MZ!M zj!3xtA3zeCETHH96-Q&?TmmU@IrX+GNdhuxJj}Hoy)HZ95UEot03d_Xv)Rz`oPQsD zZS<=Ggz}k}9c#~H-SM*YYoiaUfP{0=!8KOK)%hWFAKrut?pkuCM9k=e9z%@s(+fun z#KMCFa6{iqhZ0fwKD4^H;T{a}HB{vnEv>{2^g5_Ot7RUlRcNo&~KcM{0 Qq5uE@07*qoM6N<$f*) z{&&|nmEC+B^+H5b4%M-SX|-<+o@n#Din*yH(+s&6o#S{M-0LY|duJ+RuYXg<4&!-O{j4}U6xf5MJebT23cU)y zZ)RwfZ2!`r(lKi`YsG|neoX1bzs)`c?&xzkqwTf&)$F4T6)84cdz57~|Asa*9NG9m z?}MH?`{&o;>#sdz(2M`6kn>UDO`-U`Yw{e=f3kd)miKB{AH)oFKZB>MpUXO@geCwN CLx`3D diff --git a/public/images/items/fighting_memory.png b/public/images/items/fighting_memory.png index 3c152f439006cc94021e28b91a550195cbaacc6d..13789836880445a50238fc4922e203af011de223 100644 GIT binary patch delta 325 zcmZo?zREN~vYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C?q9SKPzUKQk?ay zS>o9g%e~#z@0LWp+frR!J>~40Iq#0n`F3^h|98*+|NpO|#l9b?N1!CgFPH(yM+OH1 zx}AY?+dW+zLo9mlPC6)bSb@W(zWE{t+n4|Uw{>S$8_cTSt)6}_*zxAJdY-Q~3D=@} z#kn?Q->KA7=32kROwL&J1k{N9(qFTTv4798>7Oj}_RkUjdy3T8Gi-<0047(dh`GQ0ZvIoK~z}7?Utbu!Y~X#_Zi6j!X&?foWxF6 zBC(T5BoaG`MDh!hlh{JKri83)S<8;&uH5Aq+ph1WO+&MyD6(HhmIRW(Ukl`Uu6?n% z0D`*XMt7Hk)?I7jerwFVIU?cUvwFelhlzYm00wL8wTX`cWPc{45_0%%B@%G(=QD_C z0RykHUce)PS-YvXV5MpkWvNCb4`Gvlj#$=ZtqFjER2^nAPbIb4#xXd8Or ztnH$}T)0R81~ff?L;#*+GnxYzw_+T8@Zaz0`HLJ#d@VN?9CaXxIfA8AaS})ZJRYHr V!tWjI*}wn*002ovPDHLkV1l5Bul@i4 diff --git a/public/images/items/fighting_tera_shard.png b/public/images/items/fighting_tera_shard.png index 4241a901902a92fe58d4dd9e96876fc6019c5185..8423a41cbe8ddb471be660b09c64d0afbedb1ef1 100644 GIT binary patch delta 226 zcmcc1)Xg-(uwE{}C&ZPL0R%SLGkhyxcsW=7JY(;1!fKvB*DkH}&M2EM}}%y>M1MG8=Glc$Sg zh=u>vi5GAKg0}pJPX2`wh9LM9}UQYqrJ5w2Z{hKm&7|*-vXT{l}z#c5+!DL=g=vDZA zGefIn`$&&wPoB!XN^Z(i2|L^Yo|NsA*G=CRRk3dO~UoZoZj|>h3 zbUOp(wtKobhFJ98o#ZHXSb@W(zWLY!#}EIuzfG9cd-2WfoB#foIBb6_?`*68W5cy6 z;#?Q&LO230onc6O+4S-Z!+)*^TkTkG1s5GY(@@N}*m1Y?A}y{MuO;m5ik%u3aU74X zYBbrgG^(baiB8 zbaixObYyjO^c5T(d4<|*`jg|VaHS!}q$Zbu7{2eW*Rw@cRmCr($O2j5uLa7oG@;mB z03dVQ8#6r3_<7xoxz|x5tH8t6!=IO_02k?ZDv2og2)0?8M}Hd@pnDQfO2otG1UQ_Y z*+>=`;Wir=Qi7le25y?Oi@I)RCDZ~R5(G!KxMtwKZC#uW$MpgnK9L}xUtbE!Qi8V= zU~v9B0&!@vz{lDn0*yuY90-AX*SV^!78o0jH=bQOV diff --git a/public/images/items/fire_stone.png b/public/images/items/fire_stone.png index 7fc77cd5975f0451238a0a16eae6b8de8d23a975..3db1942dfed0d1d791ff82795eb33992cd26b113 100644 GIT binary patch delta 304 zcmcc3bbx7sWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP^hj}xK}LjZHnQ& zvjX4V87^7kb@XV~vuD-+|9Ag?H|PKVcLxtmm*ba4!^ z=)F71oA0m!4{NjH58?a&_tZ9Q=Jcz-9y*_8wj{HWU0=OV=bog{z|!wAnpz!)3>F^I z&=6H@yk?wOAmMVUI{YTfhu1~vX$3c1AB1O5R%iO*!LjJ+N!uR+R_aa(1=YffZt>U% zGJQ{D`bP0l+XkKC$fhV delta 331 zcmV-R0kr6N=jOyGx_G@U`LA2r142#L6(yD&Vj?1ORikGBC0IQC6wggacoTb{${V2 zWwJ>k0+ca8^jPy2=(?*7 z!+A%d1VV7Rp4)280bEUB2X_(@z~|2b7VZ(Sa7REQe~F$z2uyH!^pXmMIuD=Lbit<_!TxgQ d%a!ZQdI4Yxg22D40u=xN002ovPDHLkV1ienjSBz( diff --git a/public/images/items/fire_tera_shard.png b/public/images/items/fire_tera_shard.png index 74a04df16804ee75e7a8a2b7e3735362ea522f1b..5783a5e9720cfde67a0e95372733bac1e1e8c51d 100644 GIT binary patch delta 226 zcmcc1)Xg-(uwE{}C&ZPL0R%Edq;{!kyq}W%_iN?ntrK7D-1+kO_5c6>PYzl<4=Bx5 z666=m0OUhJU8hJGP_)(4#WBR9_v$2Tu_Fc?%!iM=-1&cKbwzadm4i=T@Us2hWfz^M zzav_`N5YhKS3u|l&fVN=0{F6*D^;B1eEsxZv_!?O;PY1gStnH3b)6pYr)!)KH!)GV z;lg!DSxDD{_1&I-x|Z$^?j4NV80HDtTOSJgwx40=vG6C8-1be&+s~|gPd@Wd{CfGr XH<(-Q`3p4wUBuw&>gTe~DWM4fe(GaS delta 309 zcmeBXy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}m&dPv-a7Hc&Yio|G%`h` z{(h}|KP4F`#d6-W3rKO51o;I6l|cZ*rZYO{fufuR9+AZi419+{nDKc2iWH#WCQlc~ z5DWjS6EBJ#R^V_}6kGED|6$+qEYY|1+pg=@ewY%|yy8v#m)#9tJ_#!Ri zY0H8sO=)WmggHc>p1~NH-tuvG2dBW=cc&Vj`8Qk|4ie zhW`+7^;C!vP%O*S#WBR9_v$1^z5@yzEUt-v|MxF#Uv@}p_Pkqt?rJGQnor|Bnx1vp zHRo{n{GEHCMJ(p>QicctDNeE0UE&j1{X3dc8-+Y9PH0W$<+Mb6Mw<&;$TA`%c;b delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_mbzB7Q9B__1TbgN}j?0S+@f zEP#?e-s|Q8DUOmLzu^B6z;Lg5ZzNERv%n*=n1O-sFbFdq&tH)O6rAYk;uvD#e|C~5 zUyA_`%Vf3F|Lc1KZ=FkGdSntTGvP&0NPQ5;*H(MsLrnX(O&3t=6Wo$1Fkz7m*CnMB zjJ2YB7z(l!tQ)xol`;+010queEKTuXKL_pJ@fP(lWGuSv8Rdx$JI$3 z4m0>xd}TOsK*W?G)x%{=L!<212?=X5O50~IkX1a(m(v-uYW63aufHQ7e|@L_nrT5Y W)0RiKPd5Q=XYh3Ob6Mw<&;$Shret^k delta 351 zcmV-l0igc#0q+8k8Gi-<0047(dh`GQ0X9iQK~z{r?UgMagD?!mgX1X3N+d@>a*WDJ z&PN z-{-V}h1;T79Uo~`*|-ac7y#mD+)wA)Ek6>q#WbUI1B4)bvY`BLPP1jqUxloE&IPy^%FTFals~T;{^219JeY0l|gc zLmA+NGWTz1004xuXBdEK1JRj#wj_zD58NDJyERm1Zg4Zg1+2dUAWPVcHE%#J!6^=K ztvO@BAcl2x4_MfD^AN%SdhdD`9y7-dS^e?kW)FM-aP5bL7l*MSWuKrJU;%-Pvqv#! x>Gfwcx7yq9c&+SvW1=S9EAnlB00<5Q2cEkuy&;?!m=pj2002ovPDHLkV1g;xnvnni diff --git a/public/images/items/flame_plate.png b/public/images/items/flame_plate.png index 26a56f1846291ba8094b20e192ada78d0bcec27e..7633773eee19ad3fac33bb0b67686bbe0cd09963 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~Eq!2%AB4H6PJ0vvusMEq!I_%UNf=?udg3=9k$B|(0{ z4F4hE>ZuSTpjeiti(`mI@6}0;dkT{_kJfzU+|H?0L8P+|^QqG@r(MG(GFG zYtG^D`8)SOi&)I%r3?`QQk-I~yTm83`gb&?HVS!IoZzf}_?2a^=Lh|06`#w=%<5k_ qRJTZ-;NG*)RgSx4L&?VbX$(P^*|xU2dd>z~%i!ti=d#Wzp$Pzr&rRC^ delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_n0*9DX!3{FpK0M?}O135f+9 z96(9S9Iq!pilZdRFZe$MFx+e28wnKSEbxddW?0J1h-@gOju;YbxG+2 zW3A{OhJq{w>qc(JO0f-GlMbwG+`^@IkTZtk)aC?EtsG&W8>%IZ+#6e>75O+tma**I zG;cxE+v}~TIHx5r)iWIx3OSLwNIrqL^4aDGbrH8iZ+xy^cujc9OwqlK)8&EAWMJ@g M^<#Be=akR{0Jh&}{Qv*} diff --git a/public/images/items/flying_memory.png b/public/images/items/flying_memory.png index d4b31e2c240f06ad35618f21b5f4d0760ecbe87f..8d3efbf140173a878c24e78cd9a0ac88a38066a0 100644 GIT binary patch delta 326 zcmey%bd70(WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0L4Z$)E09)DP)JIuuCAVvHKn_H z@7_6Q&u%$;Z_T}TbKd=5^X~uNcmIzbJ$m)q|8L*^1HlJ7yL~`C0wqCy!3-b)Byb?0 z+Ziag!_&nv#G?1^BuBBs3LLEU%^4vaPyTJ!osgDn^7~tU`n9MI PzF_cl^>bP0l+XkK3x$>h delta 365 zcmV-z0h0dK0{sGz8Gi-<0047(dh`GQ0YpheK~z}7?UpePgD?yLc?w_PON{+Op3s$% zCuHoJk&%&=CuGc;;s_VZO^G2zRiz+V0=3PZ9oM94nx^_?R7Ic&{Ix(`*FF}P3n0i? z?je%10Opq?B3~1DftTnP@FxMR#D64|5W``ylmLaB_48~2 zSYQ~2AP|#qtOpRRR2QOc)vknC;7!7A+2TC~D`P_3y8C$n3a1hPq}>i#a`0sW6i&Yf zAPUVEz{cYdYbGaoKZDiiB`$=-{bP%}86dWK0H$zJp~+2wXghaq-yupU?bD4kXc$n+eW3kmMY}%Bi>r6agMj*1rg`xkxTC00000 LNkvXXu0mjf0qddx diff --git a/public/images/items/flying_tera_shard.png b/public/images/items/flying_tera_shard.png index bee18637918700d2a9d926235119040bea62dd08..97d3013f70b81e0b76bedc90cc202b66276c88c4 100644 GIT binary patch delta 259 zcmaFFw1#PdVZCC2PlziQ0|;n@EOlylbbbAcWBcE)K6QWfp=Wd7Kfm(n{r~^}cZ$7| z0;=FH3GxeO0P-P#A)sVZ1Wr zZatt?sFiBDgsq~`bE}M1MG8=G zv!{z=h=u>vi5JBVD{wd~@_GIKFTbb0#C>(f_Pu#8o0mV4a(Vh=(S6n>)88`)UR}M9 z!Abh5@B-GQA|}bKa;#If_DBkpx=HN!@@aVSY#mR=KbDR*>&Gk2Ua}}O+0D4r!}5V) zxxdD`Dz*g%$&=+KFa#EFW?+B$lx2f?|Nj1e9CMT%dc&ubU7ec5V6(}VX^(P_=HI1^ z48}>(fA~I3Z2tLm{p!#g4Y$MV8S>sT?$~bqA*`N3=D6^3L8ZwLxL(=gTe~ HDWM4fw{D49 diff --git a/public/images/items/focus_band.png b/public/images/items/focus_band.png index 830e12942135a1ed8e037a3e37c2a8e64f47e4ed..3a04ae17023fedf32068f6824503d612db15748a 100644 GIT binary patch delta 322 zcmaFIbctz#WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ0VsZ+8Y#fHYw>{ zb@kD1foE$B|KF?LySMrOk~LSaE_wHE@B8w7SwN+{B|(0{4F8dUE{o$@pu_=B7sn8b z-m8-y@*P&-XyNXNy7SxqJzv_iEgALo`O~M&xD)Qzar|Sw(u<4YFB%ns6Q9*e8zm~HM?@j-XR$e)Dyt_Mar#LXOfPg#Ebaf{wxhS6wLImCMIqw}gLxC&A3r!E z%5ndBzg6^|W4}|5b$MK#aN|OG<&NBYOr@nNOFm@3TM)HDK3p@%_=0uMrLNVUw$mNB zt>u@lYY5NhtH`uuWNBbDKedzLLh=FWz@P&%^*;5#wVun#$-nJ?#hW&h<=CZ@lNo`& OVeoYIb6Mw<&;$T3Fp?(# delta 350 zcmV-k0ipiV0`3Bk8Gi-<0047(dh`GQ0X0cPK~z}7?Uu0(!axi~8G#Y90&ApX1lFLW zWQ~-pkdl&;mXb0n1RV6xKkE`fa3Ue)Bs`XTGqd=q9|I8+2Qqeo5XA) z4AfSqw%PAH@Ubl4F^ek*umH-g!X|YE7yzCP%08(Gs0gSuh{GV zlA!<3g8nx*^Zd@82$bU}3GxeO_zwYBPlXr(#riy5978O6?@n?QYf#`|l@;9mzqk3+ z7u9Y0)6O1g?$@kc(NG@eCC>52vEl5i%z%mc)I$ztaD0e0syJsa3lZ# delta 275 zcmV+u0qp*a0;2+u8Gi-<0047(dh`GQ0P0CZK~z}7?Uum}gD?z586_*QMvqygBd`i< zbd?@Cc7;@-`jKN9;wmQX!Ipdh$^YTR-%OK-$3I61At8Sv{=DDz)B;f8Zs>0SAefe= z$}R{1q&1!v%I_ZYyeEg~2FT(_sTdUpK+ac;CCwmsAxRw1?SBEbPf`&{+#H}lY&8UL zIq!;@_|bSBjoDdeh8Wf`ao&mC?jhpbaOh>jnO`a{IbG{cn2F;nsjy~*O&}e6tLIdIU;>{DK+&qk;ng-OfO{ zCQlc~5R2ZcmktUYR^V{04_xT$!ua$5eqA-a+PfvYIBr)TkvtwW&vMFVQ}-hdP4Cv^ z@~@k<^P25~jYcn8L)QB&c+Pfp@gr95g6uaBx;THN*!_;XP@yU?@g3s9*-vcvII|h(98LyLS3j3^ HP6u6$ztdT=EL?T{kWD6v}=MTcpwQ6;i^4=$#!@(&%*39Xmm9R72g2&0F zAv%pf4Qjz%pCb{#fB@}*WpD}rhSb1#FN0HnVC2@70@B&<34DZ*!3g?k7JUIV0RZny z%l;Te66+xhrNGdCLO2enOdwu;Apq#~%pqL10suk+p}-rufUyb`kqBU5?l(dhT5f|} zfG|7rCUBg9f&Hfd0pA4pO!_~tv$O&P%dcbGyWdalfvsAds$QjpTn6?K-j4tP002ov JPDHLkV1nK^a8dvO diff --git a/public/images/items/full_restore.png b/public/images/items/full_restore.png index bd3ebfd3022346b705fcf4a111ae9da0bedec74f..ba64f2edad82328d45724af0ec995222df98e80a 100644 GIT binary patch delta 277 zcmdnVw3KOrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP>8BFtUjtRWlGYV zXO3I8G_UzTmrpv($JXX!^@hn-N|MMCmPUqJ!gd+|ADnnsQK=L#VdokPK;My}?9hPtr*n>;tH*z(X_yrCD^Hq>WGH1YgaDN6v##8{=g7X+m1q8qn z*!ddnvJs_`G?d0HqT%|p%LrHmKz+qZn5_b4%FB-fr#AwZRk+NjFA3g=@;%}r@GNl! zumJAe-{%@v0fe7+euWw>VD>8FHDmzfATB0T54kF$YISkwrIUGD{lt+C4DJKM~$yrRU00000NkvXXu0mjfN0)#f diff --git a/public/images/items/galarica_cuff.png b/public/images/items/galarica_cuff.png index 1b3f9c69296c2ce2573269220b99e11a4aca9f06..56523da5230d1aec5d8cf0c17152357392f1b29a 100644 GIT binary patch delta 953 zcmV;q14jJ83E~KlFn0EEp*?5Gy(!7%V9eI3OS( zARr_lDI_2%C?F{$DJdu^IWQ?fAP`C@AVDx7K{h2pH6}qgB}_jnPct+KKnNH>2oO~W z5LFNmSr8Ce7!_s{5M>w`c^Dvl5IK4k5KJH-NFX#_WnbyqffT{Lr5IdfMzbyqoX zXGyvW_ z5Sd03oK+B?T7MOvWfQk)8-q|QtXVmWZZw>AHk@@lpLjW+ct50JG1W*A-b@hQNEpae z9@|2s{(kSKQV*+zH%P>?30Tp<9_V;%%fgG%?jHZB(FDc2zB{j9DCoPeKqqw+P6IB6U ze}86@OQlYUu0ErhPXSlG}|L_}X!rX6)19KK%tu3+(nLBH18SM-r>mh=Ce0;U0 zIVfJ>V{vS3G}n!81DeFjSKH8_t7{d(g5m`h{&3y=XzSWqR)<;moKC@^y6!w6(3HV+t%SjCAuE8TcDJ(Nypi6jm;FN~|=1#m>1Ehk0 bJc$4Rf+}FMCuwMZ00000NkvXXu0mjfh2eM= delta 1049 zcmV+!1m^qV2*C-EFn<69XF*Lt006O%3;baP00057P)t-sDI_T=G!P((5O8=`AV?q} zjSzRE6wSIAN+=*0c^J*M7*BE&DUBF8AP^8ZAY!}ygRS=dl4Vgw05LpBp@p~9!f|UtXVlABp@*?5Gf!SoOL|CjX_sOF1L*|byqo zG^BMwb5%Kea$lixM0Hm-w23*SaY0u`E1!5db5=H5NHL^!N^@5^QbH?gR5YxCKPf06 z00002BVh0V005A5QchEo0Rn-O5CRT=00U*`hX4Qo32;bRa{vGi!vFvd!vV){sAK>D z0scuuK~y+Tm5}>a5*#?+>$gzTeNebN2!}ME?f>G?`UhA^JR{|tbo&Xa~D!y|<48fq<+3 z#(=RjVTPN7vK$;59u5X2??`BW)J%j9gSUKgaLn%?8}dq_(5Ol512BI3jyf_i5e`pI z`sBO!?oT-lA5ShAfACOMr>7rkbvpEb=l$yly5Hegj2fTgON%xwsH1AvMpMDqZE8UJVMAi$zS0LK0Sv1P%x T+)bgn00000NkvXXu0mjf0j8=M diff --git a/public/images/items/galarica_wreath.png b/public/images/items/galarica_wreath.png index 7fe319f20cf48d36aab722d6c517f8cf680eec2e..20356bafd8ab3c4c009a71546e3d7d62bd584934 100644 GIT binary patch delta 1112 zcmV-e1gHD=3YZFzFnw?WgHM~7#MjNF?I?zd<`vO96V+dAbk)# zcoiT>AYWP)M|llIeH&DL6J~E1Rz@*WNHJPSFw{bxmhzc8w3N)1p zIhhC`i4Y)-5HXPuIhhb`lM{EN6m_c*bFvVQmHn5 z42YR=%JTDzRq-=0FXZRPAzxOO>np~}JKOVC}z#Kz__QB#wZm4kzAnxZowU%o$z5+*OU z+3f5re=IdMbsTJLij(x3{gMG?{E0GdW;v)t# zK_|$dLfTWtR9G0u6LjTwbCal5h$zXbf~c^!fA=X4m34K6xtgCrM8rnjQ891Pid=}0 zy-!ABs4K|tFjtGHPne^a7Y0)xmb<(>CsLQ6zn&K&uh!L~v_LDSC?uI5641++FDnm^ z%*|cQ3-Pp?T8mP@mV6Np4_G~KeBPq6%-me>qGjcroIE@&E#0cKRi;hzVuD)8TNsv? zf0^m)o1R{ta)u%GAQ)QZ|sUa64G4T85W)v5t z`{w%k+S;njZEXdbKh3ZSDXzHFmY4bz&kr=2+F>+h$}|f*W5XsPA%r}CTJ-Ye89ss8 zCMJ`uG&L=zO*b~=LXrnrk_$|5W@b!YHs&)LwS|PN+cDBEFja%n5R)>@N+=+fG!2*>@|D9?OGzdRK8?=!zlyxzraX~>iC0a-^ zoN+<4br}DZTAVZpF_93QVL?(nFCWc`Z-gQ4YLlqEE7(p~CN<1kx zF)0vb7%?m)>)Us@H8mpHP)S5VR5(w)lG#_&KorKqEuCPCq-aCf8f{6X zKwV0;fU-zYfi57#r66LdN(u@VQE{ooeJ=<~RS*|YoIlgdBn1vW_~1EyXC7we`~gg2X6XQb0Am20lMA4oH>3ezG$NM4dD~3pe0s4V9oTMUk%1{F;JExP z1O*s_r4XswvD0ehaZwR^kkdXd;Bio15(?G8spg(z7| zoX$O!8lnR>msnL@T~p(B@2wC;Yw5oIl?OZ?LQnue5Nf>#5BYq5b#?U(KA*!O9yXbe zG?Hf_05mm8lDD~~p zdSznLg!WV3=8n^y!9YMgg~H(XcXyrX={;*uU3Enwa$o#$d{bsi>N#B>#GrF%O z03dbXR#t4T)gM3Cc)q-B{mC?dAZoRMZL7c5oS5G{bUKg~WItqGTYx|HuK>os0Uhel Vb>mH}ga7~v002ovPDHLkV1gjF<$(YI diff --git a/public/images/items/galladite.png b/public/images/items/galladite.png index b204209a91c007157e735c32c745be89e5bf281b..15c93cd9c7eb0565d3fd437143886cccfb45af69 100644 GIT binary patch delta 239 zcmeyy*uXSFvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gE5Ikj6-X;6DBMdbo>JW$wPZ@x zmL=6&*4&%3x%KoV+pWY>^Wq9(E|DtFW zffu3SNlYB#DHCs1vntddVhC#EIAGe!AM(V2alu8w{ACnY*xI_+c5Bw- f{`(QvtPACC2QWuIyU23`Xf1=MtDnm{r-UW|$SQ26 delta 229 zcmV*0`>ur8Gi-<0047(dh`GQ0KG{>K~z}7?Uf-8!!Qg*dz74OaBy_6a91cC z3@i-Y5e7p83j;^JeQS{{Z&gX1X_BAx)u`mZxKTO`j^jB0N(g~ux)+~Pq-nfRIiC61 zMFa)47Rt*)b-r;q^0;SykC;iw@P4sl`$1YT#MlY%76Ax f=w9qNjw47;zWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DQ1EgrUNR-BIBUth ztIb!hu9-9C?9sj7E_^Az4V30A3GxeO_zwlxh2v7P#}lU`KO9yB9jO#BdM>eQ zO}GVr!dK}vLM|M$D7EC{{c&Lg&!F950?f#CsI@`bAszbO%2$kgs-yu*o0DmV305pxKC?v4T!SQT> zrG^89CQnNOXVi@>fLFLgX)^rZ3b5M+yabz(3@gSjCsY8dA>9Dd+G8?00I>;m7hsI< zx&dI4)CD$Tx+^%&zR3pAx)Ok5GD~<~&xRrZ)}f>>5MuXE&=ZjL285mimI&eYUEoA) zLd$NoTmjraMmbDk^@2jU9K&mFq@Ax$RJj{ibuVK5R){JqU%Q^Q3u}uO|HcA}pX07}T@VDpzmifCPV?eCjPlqnB4s#^ zO+-*I&8w946_g`ez8=>RHwiAUl-y3@lK@McE}-Se-uLwt;9Q&q5SJ-f0gf(2E8!+^ z`$ED+U|#N30$b2ZumJ9LT?g+bp;K_(1v~{i2?!uAPj4ky1m*fwbS-BI7SZyb{S%rO d2SE^=%@a*8Q1zLd8NdJl002ovPDHLkV1nzHTfYDR diff --git a/public/images/items/gardevoirite.png b/public/images/items/gardevoirite.png index d29ee3eab0322e8f2a7adaf5024133f3335c8e02..66a90b93bce142df0f563ebf1d602e8466322f85 100644 GIT binary patch delta 236 zcmey#_?K~lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP&jIsy|%bIXm4@U z(dxa`YnQH_Gv(aUrO%FTJ^KFIwf{g6pp>ZvRLWZt-Cs;RoidX%Jqx2vwy8} ao>^6e>Gx%=hMz!t89ZJ6T-G@yGywn)&}6d! delta 232 zcmV%t8Gi-<0047(dh`GQ0KiE^K~z}7?UgYKgfI|AJxZ>ySFzkHSX$;9 zmbR8DEiKbpdIVdKF!HmE48wwrlVxE(d<-G*pWh@ljmzb7{i{LCgJ*^X@j(heumtD&M0000ptUdIH`Q$kcQAyi;MEa?-BxSdf^e z+J#9|qQV^(HcVNvYM!g|qHKpwyXMy%8_I+3+p#$vdCh#MeSwbtyP3`h)*Eli>|~5; z>@Yi+*wc7%>*DPCKJkfyp`!kuo@uqG%{Tb^V)p%quIG|BeGdEb@k;gk+ZWWgOMgsF d6tA1bzV-o|I_JG-6M(K{@O1TaS?83{1OR`Gg%|(; delta 301 zcmV+|0n+}i0=)u|8Gi-<0047(dh`GQ0R%}zK~z}7?UpeP!Y~X)dz4-wBO`0aUZ*2h z=n*>h3XF`5T{%YAkRRd5HEDy0BZL%7U#KPZdzezvG_`8g`p0V9*2Yp4cr_+~PNR*c zhzJ_mdA8;}TGKDPaGtg6bVLY_h5^33k`SPYWecEL5O83sJ%0%Z15U{jKm+@S1m5DV z!5S3-o@u)IUjbgdoB+%9D$jypxP*qhB#Z~ws67oI_tgW@R8AlU#(KQ3_P-z{C^#33 zDx6E8@g9`GMJC{KA3z|P;`@T1ZAfa>s#UU{Fr|l~z%(vp00000NkvXXu0mjfy?KAB diff --git a/public/images/items/gengarite.png b/public/images/items/gengarite.png index dcbaf4bf13a3aab6ca12b0c3597ab3598fc0840b..4ccaae6ee8da47a966f9eda8a358fdc93843dce5 100644 GIT binary patch delta 231 zcmaFO_=9nRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP`G9l(2i(`mI@7s&s zdt`+54@E0qjo XubGx*ecmGgw3fls)z4*}Q$iB}de~+` delta 218 zcmV<0044wU0qX&f8Gi-<0047(dh`GQ0J2F$K~z}7?Ulg^fG`Y29i^_(5j?s=SL(5= zcDLi630ckzm3R`660ZwzIkL>{dIdO_0*J{Jw15nMh*Mg^OdzNBC}AQ{D_s&; zf?7ff;9k@3;BFE;1=Cd^r=TYR0mS6#wS*KwIq!<5<$5b-5ibAipD?`GaUADuPB(gO UxK5g_tN;K207*qoM6N<$f_~{;5dZ)H diff --git a/public/images/items/ghost_memory.png b/public/images/items/ghost_memory.png index d3f174de7580908aa746fd7d3294d64dd8b57f5b..cb3c31ea4de93a0e12046f65acc02b8dd0638c73 100644 GIT binary patch delta 326 zcmeBVzQ!~`vYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C?q9SXBAJWuAZ_b z>E6-mcg@Xv=gc{Kb;`GUYrZ|(`|a7;Z}0AX`~U7g5aj8emj~(*C<*clW&jBwfdc{E z&Oo^xo-U3d7QJ^Tc?%s;;9#w97V1@a@^8EBg)_(ezZvJJhL$TXIR3G}ahkYK=+;Ya zj2batw`D|1PT(qaT&l)!;fy$+)5Zx7kEdz#`7#L_b|0Gl_y&`4_(#bahTREsE=|{|G7gkZw10D8 z_Lg6@CufMW{^|SYrL^M-yMn!_#+n_Hj7K-_KlIN0#-#5%wAbH%JN+}`jmsQW4+M7` Q1AW2Z>FVdQ&MBb@05qeUbpQYW delta 377 zcmV-<0fzq80*M2V8Gi-<0047(dh`GQ0Z>UqK~z}7?Up@`gD?RT;o}a$RY4gzkmk?x4-2XzVS#T!N0pn27i{BuL&&o)A)Gjkw}Jb z3Me=uTL1%mwWA2cB$$5-@48;1ZM#hgw}6!Z96*6SuQm939V9+3{c!;e*Af8YpGApT zTJUKC8m_+sNJFy)Sa>#Kg@tWVmsL3|z=G3-hg{p)+hr#lB8Q8RosJ>f?pbW8 zc;nG$^52nkA3+Y=3@X{rlCY?q7TS^Z)<<9Tf+S zfhxF5g8YIRfP5&ZEvvl>6mIi$aSXBOy*kNJ=&%6?bMwN0kN?@j3)hL+vdf2WmU#2J zDtG4JgLkbGkF3zV(7LM0=f?5_UQaiaX-#^bFlR&DyWYlj>#u7*FKOc_x}d~TSKRif z#?@JQvhNZFTjL8&!4J;8u2+4|@xsUOfY<@&N7e2Tr~YvWWY@UrWj@J%`OVtk(cg(` bf4==Sp;C6D%Of37FJ z>6K5$g4BnrPu&N~nq7Kn52UzDg8YJkDxrYE%b)QRP?)p8BeIx*f$uN~Gak=hkpdLl z?CIhdV&Q*v;zhB;3LMUgd|to*%kQZ#abKOWeQ(~&=H*YMT%P_|bf0y}^!E&cS6A<2 zaFTv1ynuD7h)FW59P5;=J(2>YZW8;wd>URnTgQ{}kENr{`teG$mn;fRb~7&ZuzX-x z?ys?~ifw^G@?^OQ41vX)8Q5PwW!YffzrX(<#~fvc-tZ}9SEnX1*le<8+M}GK`FANJ zgK<*yAHEM0n}2>?zdH0r!|m{ThP=0oJGNVY2&-q1IWD|hP-*f5u9vnz4={MT`njxg HN@xNAQF4d^ diff --git a/public/images/items/glalitite.png b/public/images/items/glalitite.png index 83e05f132fab852705aeb31e853f346ab6f95ca5..ed7858c631c0ae22144cd50282b79bc4205b904e 100644 GIT binary patch delta 244 zcmey)*vd3PvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gH^3*v6-X;6C|CkPQn6)Lbyjh) zWAhxxIeU}V9BuBNGH1@5?!8y%oV|DT-n;+*|GTVZ-U-yeUlQaO%mCygfv3ImmI0-* zJzX3_EPCHw^yE9Bz{Bjo5iOoO=fC}SPSNcxUbc@{yN9tTzWL)hMJHQC%dYc<_(e_& zr>bXDXE?NQDqX0`XF4%2K;fjb#e;c=*mz{LST>X&x#98cfb~LY&D+dcEn8;oiJL!b g=d=F%5!bBi)78&qol`;+0BibbN&o-= delta 230 zcmVq10>4_gBrj^j9YC4`W4suwToCv`C<0N`sC z5h=!bO^C?llwo}GbBdXSE*Gjw90_QN(*>lQ^1x|3f*iWn0$&u9EtCQ}(Dl0#W&-21 z97>o75F*jO-oFw`fG~Xz_BH`+w3+_j7RpVqKt2kS=}QSM!U6-bfN6R8DHgaqPkz}y gp?b07IL_I80npfRzid(pF07*qoM6N<$f~J>Y<^TWy diff --git a/public/images/items/golden_egg.png b/public/images/items/golden_egg.png index bfc517c6632657545eb9627146cba5072a96e369..5727b4cb5137d14e12a685641d524ed711077abe 100644 GIT binary patch delta 232 zcmZo;{>eB&vYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gI>0By6-X;6D9kAqI6BAj>>96c z$G!fa_4@xT>Hq)#ljdyV1WI$31o;Is0Qq2G&NTZ9P_W$7#WBR9_vs~Xp#}vW<^XQP zg8#y|nGUZyxHs*n&%KbJG1v8z=Oy2jTG*O+T`oj5?Y(k~!IpdN8cYSvB`uAgh2Oea zB{4rcz-7VW$(t6y62Zi^eb^-$NlHYwd~z9 c{rxk>KW)s;#=n{!fNo&$boFyt=akR{04ZBxsQ>@~ delta 374 zcmV-+0g3+k0fqyR8Gi-<0047(dh`GQ0ZmCnK~z}7?N*_3gFp~{WHKG!ro<7EQae^ELLwSOOcmQ|z3H1(WqugR z&FIt|Ms5%hT+c@s070}@8b(UfPz;&fb~$Rx-6-B`oe8uKBvaE)=P+VnVev2U1GPPe Ur{eQw%m4rY07*qoM6N<$fi_@$3odhq15FVx3GxeO0P;~lJ%qQRyZAm(%_2`1#}JF&wUcl2wJ7kotc+^i6&sTB z|9|k_2Wr0`OgZw#hT)`)({jyoe}hX-Y^vWb{r?#YgGT_XhHKQn(%av9MdIscWw|V6 zId$_*+Wu#IzFDMuX|~iluJ!VC31tyn@~~FxMR3A5)(^%Ee*zi~F4l5Sa}9ka_&nvM zRbufwmsMxYa^2@2Rq2=}F7w*Cy3wLBD<|Ru^ObGBEV_F-B;Im7JAULAL&{v%(DQd6 QECGd#r>mdKI;Vst0CXOvkN^Mx delta 426 zcmV;b0agCo0=WZ_8Gi-<0047(dh`GQ0f0$FK~z}7 zbXOshL)}CdM?rDwFVM9^L2$4Ci& zB%nWW7Qke-D0CTIr{I-_JWZd@*kk0yb%-r-kMH|QY zQ3*2{V12twKC%wra$jCP+raKg4sa(xlf{u)Pg;a~&m+l4(3K%ahK{0jJi7xQItTaoADI&@n?*Jz;f0)LDl0Zk1w;);vFUcU-$2GB?9e|Ip#c zD+=sd=LMMqI+vf>-t}`0^J`5*#Zw_?Z|CdZ4f~=yslP)w_ptTEwtl(m@piZ5uQOlH WXUe$rUSbl^5e%NLelF{r5}E+)&R_EY delta 322 zcmV-I0loh60n!4H8Gi-<0047(dh`GQ0U1d|K~z}7?UkVtfHAj%c84NZ0v1_Tcjxx*tkb6;cTX1?8j_YS~fu~-a4L^%=Vs^?vk zVgN|^3;^IWG24wSH+ zx>)HNHg}=z7CZD2YwbV~PJqj`w(Wg8)_#bHC@t<807*qoM6N<$f|p^9`v3p{ diff --git a/public/images/items/golden_net.png b/public/images/items/golden_net.png index 5fea1ee7dba10d0544babfa6de08102cdfe621c2..3205d545e272b7d280f546ba276d7110eed924b5 100644 GIT binary patch delta 249 zcmdnU(#14EvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gF2EO)b)k-Ntibgfv|_HZZT+pX+dpR=tw+t+ELESe@H zagtkUbE=?Yd9(4s65EXvr7s*;Xg_5(Me+h~2cxCa%<3h_<{s~=WcNF`OVe;cZV~s9 pj`N2kH`yBe;8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00GfSL_t(oh3%F-Pr^_X zhTj@Tsgn*B;-DsM#Hevm2c0m)4a(rwMJ5t|09a>3!h{Q(gUDKClEICjF%B389SqtS zak{X$cpL}>D7`HOUF@4Qw>=*{PtMIfE#S)4f0tk<=xA+*41czA-BzxZCV9@VPb2_H zX!{+TFq3NCtk2RoKunXvK9SUT003~2s~Y^t(g&!1h~v=NNDyX;^mwv~&nF$lJBIBQ z(GbwKZ>W1CL6~lV*DvAz`VE!$FGLn4gTHcF$I=U-S=OD@?TANBOp^fsN~~aTW-~zm zKuRtC$`$|sg@1iwPqA)wL*;ACF#z`zsPO>2e#x{0Q)?3B)vVLn0Bmf*YgLEWFBw)P zRzNlrglG30k@;!IU6|lG&5FNPb!0O^D6s+>S5f3{m4U-*Q~)8Fe&9l=@c@)q0nM_G zgtqSpg4=<7jR9zNV$j--83lq1007DKgXK%|H72wnl7FR-p&+aPgmxD=a6&gk<0?8- zCoDU_Q$Jk3#so2x8)`eabD&%I*Ka+~%R6&sp@JC75!2+>S2T1+yh&;I?9$D_LXTnV z^w}z(m?p!sdk%Gdb}au7)OXp+VVX?zP2_Y=j6=f!yK?2~@AU(NFYFA&05b;w000hU lSV?A0O&kC!00008000000002eQ>98C zXTAPEOX}|Ke)jCy|NsA|ZPz{tRKZmeGRr$`u3w9nJUF~p+x>I6rj!v-A8 zYZIJ*{BP&B$mD0emAra#dYSt)+hg^t6KmL38|km&(a=9Vr}bfto7Tf;t&FvwoF1%a zUG!z;gU+-4hp&_$W@XtvU*S}b`1WKY=InTZm`S1=i;4qnH_t3HJ$R2}E89t)e#@w` zH*#}Ik6%@;ZMO_}Pj+!vu4u3D*6i`Wv%PQH|0ua9Yna#lH?U3tI*q~8)z4*}Q$iB} De>QK( delta 503 zcmVcfv3f zz3fa(GB@0-Mb0fhW4Ki!BNvIRYwg@DvVUQ2mEb@oisFjIy$MJ^pv}s+;hxjelcdeP z@4ojE;Ep?Pj85ARiHPgwjWMnFsKaAhVy*RNA{}nuOC-|_et!TyMTGN5B4VxehBRGP z)+Sp$>s1CnNRM`+(ScoZOL%TPI9FScKXsom9`zb)=Ii58TWW^@3mx~HyP$?#N(n#sI!J&!1-%!%dc`o0 zervlWmr_D&4W$&4Bsq_OZ5k^11%M##?zy6rg6DaNq6k6=NGV&_finfhn2sM{ZzC%P z*j!Sc=T*i4;QKy=5GP$!jUXca{eEL2;>BXYM8rhI%y7&^#9C^= diff --git a/public/images/items/gracidea.png b/public/images/items/gracidea.png index 0552d11b01bfaea693489813e8fea9bbb44c1958..6e464390f1776bf49626bdd540fcee679b4b02e9 100644 GIT binary patch delta 338 zcmbQt{D^6SWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP*`K=b+p{G)o8SNd delta 387 zcmV-}0et@A0+R!f8Gi-<0047(dh`GQ0a{5!K~z}7?N%`of$-SRxI;FE$h0hh$*BTSI!5K;D1c9fm@Dyp zaF)2(Y<+DQobp0W-L{UMWAE&Kztno>(ghq8g z5-Y!BFB)LRKVZUGW&$bcA?0%{DJhQSchC=!b^ zXiyfKj69w}qBnt<2Sdn6&SN`9BFX)4C!=jXTe{@`2Tk`wn|jF!bp3>MDVc->E}%*O h1N$^-w%B5Gwl9yW7X*op)b{`Y002ovPDHLkV1j#^v)BLt diff --git a/public/images/items/grass_memory.png b/public/images/items/grass_memory.png index 28ffc343c663a98e7bb1bdab366d7ba17d80db68..9d7d27de770fb5ba9bf86af4f406e8eb1cd98690 100644 GIT binary patch delta 330 zcmZoh8{Z zx1{>rn&vHAy5DVCa`fn&cSpB;JA3ro)vMp0z5Dj<|NsA9g&eU!Jpv^`e!&btJ~B8E z(CrMA+vDlt7-G?Tcapcz5d{v``euu)AC>=a^UXMQEaRK;nxLy|D;th~>}OpZXW;qX zNt$)R#EAEIr-ZR>aoeuI&3sCC#;Oy}4MB$zjP3P1GR+=*E^H2sl)XOd;laBPm?kjg zvpoMdb*^2DN5Cl$HojupLZPTF3k-H#pSgU3gUgw$g5o*K2Aea!2=M;kf2OCnqg2gV zO7{$>(vti2yppdUH5oJ=pHg^||3Ji-2F67K+2lXT#h-dz{QK!IrbFr+ VIZOF?7XW?2;OXk;vd$@?2>|(qn->58 delta 369 zcmV-%0gnFK0)YdN8Gi-<0047(dh`GQ0Z2(iK~z}7?UpePgD?z5ISNhAZ<%Q?TK39>i2@p(pNI+I2S$_bFwB{ZZAe;h-WC6k% zQev!X>AK?r5-ueG#3!2)S!(cU0uuiA zy#*wp$pU)s8NSBCvjkG0A4gY}!vbtL+4x z1qel;^s?i5uWCD9mOhkyv;g58I(Wy*_&Psk@1vVgmi^Pnl@fchkNO!xLc{ggrNCZz zoWQc6{@eA`cA#MtI> P00000NkvXXu0mjfG#;$& diff --git a/public/images/items/grass_tera_shard.png b/public/images/items/grass_tera_shard.png index 01bf4bde64043219f681ad59d5c18679f37ab708..30e8762b5b66ea21a20540447b072a2e73cfbbf3 100644 GIT binary patch delta 217 zcmcc2)WkHwuwFXAC&ZP50Sp%UFTdUW|9#7;mupu)JbwA*q5uE?pZB=A6)4GB666=m z0OW&#In(SbK*0u27sn8b-m8{iFxsfZmA8a^3vW2_Q&ib)-pbqW4|IHYpY`GXYsSJZ=1BR}rOF`Z Nd%F6$taD0e0s!m9VVVE{ delta 299 zcmZo-y391eu%0E|(btiIVPik{pF~y$1_tQ>pAc6d{r~^}%P$X|dbxJ>!{ZDK{r|sj zS$?}4DBfs)%pFK^mIV0)1J!^5L$H5^5J<4VBeIx*f$uN~Gak=hkpdK4kkLJw3%t8>co^T(Nnn)FHV;A+<>*fqAa;rrq;d69bP5@OvUiYUvDgFgCQthH*WWzI qprUiXQlQU*BmK>x+rO9>ZdE^|A$=?)VId#Ta6K5PbXb|HqFX|IZvw0V?G!3GxeO_>Tm1Ssd2_CAN9GIEGmC zuASV=cSwP!C0ufi!~Or2Z~2Y8>%a9#={uZww^&)Wa;-}t9ioNzka^rdD zj1@JL7#}a1-*|i7uDy(9;%ryuT;}9Bb4`t9Ms#$qBTHJGbJesQMIWn^T@P<3#M@uW z61*7{&fM@UbNPu(Q&ElMk*^mod8)U!{eHFQ_Q<2WtV@|3m;^XVj8`;qh~1pDSm?je zFQE>RtUEtvseBZCaF#J&|G>|LPuo9#xYjUVzG%a{cy{)iAJQ7tfqr1{boFyt=akR{ E036tor2qf` delta 369 zcmV-%0gnF20+<7k7+wSe0001iRA^(^DA4f%?iV42P=?k2?jr=m3W4N*%lQZa0d{EyzX|^l0yE2j70(@=6K{Do!e% zQr$dfPWO^2Q`W56d+*-=|Nn)i&a4J1;w}mD3uXZFp`f;`_9{?#xu=U`h(+(!Nw>vX z6*yR*7M%X~zuEc1Rj-ZD`TEc9VBRvtzFzyq)}zZqMGwX_N=3AA2p{h6mT?#E5IcNc zTJF#!M)UH-K8FAGkIh)r1(gr{=2sR~n6^>$h#iwsQ(nut;Dv1oFSi{Rn8q4!K~z}7?UpePgD?z5a}>_gk&%%rFm~+N zm65R{SLju^3YC$*WLb_QVTTGSmOOxf_w2+#N-bL4DY~xPt*j1~@!hulwJb+I#=edS zJ&-^-FtVSVJZSW6dR;Prx)k22- zL0fwgfCR6e3jpjIN0QLip8zBPsDwj|u5rB;>Bijn5hMo()GfegJ$Ie}7CiI|X$kTi zh9RcPx#8&FJCMF0Q*F)=ZFV@lEDtcAPhrE zY?A%|7cZvTq&2j=PK(3^KZtP{<1fp<>1p>mlXrwM9=ssj&40`VfTrrrCrjr70B?XX z!^udB@C|@cgPEmo0QU)CMig*daRxF(kh1^>8eqsckh1Eq-eVD=he)q=CM=c(R~aGQ zKJ{{@?K)ac*q^CvV3m&ya+A~0w#><&Z*p2)h$S|IFQ9^4;%*WGRO$}j%<@gusB!zJ fY+RrI-FgDa!4d;j_FU^*00000NkvXXu0mjfpBH|F literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsAgZmZ_KW0v2a z_snTg+&f3JI$6=s&=4pNlpO`5Aux?qW1z{4DzbMn{!?(A0QAl5~A$2BapWrG!26q?k=VIZChuJE(1RPM}kX(K#kUOf{N4ZAe zbKSbOBsY!e9L0M-`#pPFw{>!X?Xq;{uQf6gW?S;=ThIA?HO+4`x1r*;J*{$2T6WLg s@Sv#t$}_$AaJ7fuW?!06_ujpVX?F_S&Q`ttZ=iVcboFyt=akR{0CkUbdjJ3c diff --git a/public/images/items/ground_memory.png b/public/images/items/ground_memory.png index 8ab042c02ffffb731e75cabb8f9b2cbf558f191f..808a4e13eeb5038feeac9d896ec2c4dd7dc8c9a7 100644 GIT binary patch delta 325 zcmey*bd_m>WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0L4Z$)E09)DP)JIuZZ6KcchvFO z)u3Fb`~UyF|NsAcdKcXQ>Jcaj@(X4F@{z%TfNp1? z+;&eF#}JF&yOSJ+jwo=j)I0Yyv3>c!|E{C9_~PpObF<4|Hpm^fZ>!q(V9DC0I|3VA zv$JC(KTfIOxSEp~P{UGib-F|N8@IKh7SD^#UKBZ>Inv zxOjQCV1h>Zyq1;?fzMCKE}L}Zj8fRkhn4FX);u%*!LTD?-lT}DS;Eik4&7N`$89!k z%}yP@57Yim-SBkJ6ZWSm&KHW0Ce8`)nY{ndJM)B-)izVs-+w#(GvkLP9DDZO48H>O O1cRrmpUXO@geCy#zoWwd delta 367 zcmV-#0g(RH0{;S#8Gi-<0047(dh`GQ0Y*tgK~z}7?UpeT!XOYubCg^mNAL=kmX@}b zl(|Am${fL#(j(YXT3XuTEV#*rAX$PL#~CuS1*7sF@Uv1iO;i1{sv=MX{#u}}YZI!? z1rYRn9E>s2-~;3PZJ#8P0Tyq#HvU6Jz9xWR2agHBSlQx8uz%q&*|NY0cc0080hmBv zcUB-Qp-GKkAv#;fqlikd1$+qy$JL4fj^Ms)ZMEmqdI1Wj5&)!WhgJIE%>*c%eh)wt znk|6A^D7iA7*ik$TzYpTs|7G{)8MJu>ium;IEbtcA^gYzY2q<#dN}_Wd};Me0YTn* zHA}yrc)ImVt7vBmNCL;EBZi#`C7*Nli2^Fpa^*xKW%aDr(1maQheO*g3Z%kW0x+SI zP#*jgIt=0sT?&?W!? N002ovPDHLkV1jJwq4xj) diff --git a/public/images/items/ground_tera_shard.png b/public/images/items/ground_tera_shard.png index 153bbd9058cc171b42c70e44aa7a38a33e6b6d4b..d7760f7dc1b2c0d984c9d6d8acce9cea49d2abd5 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R-k}FzngZcjMT)i)S}JJiq?TrE4#)UHSk2|4Y}?T|jBB zk|4ie1|S~->N-WjfTAs)E{-7y|J!RHt{;8+gtsZ~div=% z{O_)DD!chL`lYC)9D2vHddlHjD>dd7AFA4E9>pg2?#kwKlckhSICcyCI4s%qS(LX| z%WPuPr&SKzevQ`a<0lofJQ8BgVYE@HD{EQ$Wlx1U-0o_yw^`1SHk Wic;#!wMWM4|Q7p{OA9E>7qtf{q5`1Y*G%bYnQUzf8{;brQ6nyE??j2Hwi4R z5!$j~N)uby!@vWZrWtZCI>+%ixYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY z-^|b|+5V+LrDN7?)`|)D{Fu^*W@{#|77_pE$`K^K8P9Ueg;ohKbLh*2~7a+ Co``G! diff --git a/public/images/items/guard_spec.png b/public/images/items/guard_spec.png index 3efc9448404f127dd037dc9be0be56eba0ec6780..95a37d0d28e61b4b2064c3eb5206fdacb0b46509 100644 GIT binary patch delta 286 zcmX@fw2oZ8{Dv`-w?!3Eb+|atWKKH+5VqT?zdDjs+L-!cTC+~{S?JzjOSoGcR z!P5zWG9qEl4`wb)KIapm*R5vdsi%uzI3r+dbyOilbHFo3t1avWjr>mdKI;Vst05$%H&;S4c delta 313 zcmV-90mlBW0?7i98Gi-<0047(dh`GQ0T4+{{{R^_N>c3r0O@FNoByEi65U&wR00000 LNkvXXu0mjfUH*(J diff --git a/public/images/items/gyaradosite.png b/public/images/items/gyaradosite.png index bc8e6d6b115671b3384d946c354487f6818fe0e1..e4cae1366abf5afbe567ceaf9f535cdbb63c111b 100644 GIT binary patch delta 235 zcmeyv_=jG{s#h8&dFDSN_k6y{DK)k0x+P<;%;)7-G@; z_ToXl0}33>0kX`A@BZ&EKYCPpM@mY1^;_@c4O8aYuRO6SOzoWK)H=brN}Ue%_q7cf zT{u>Gyxz+gVDpgSp`uWMk07&fpg6-c+oYTVn-6|J*oti)FfGZv^?T*nlEPP?enwhX Z%DuE^x_=+TqD4>S~$N^wS(8BlVjzD$@$Z~k8NK4Dni(;5VV3rS9 loj`YsN5Lo<1*3r4000onM`&z3UIqXF002ovPDHLkV1ghZUs(VE diff --git a/public/images/items/hard_meteorite.png b/public/images/items/hard_meteorite.png index d8f3490c581c8db2f35102652baa5d8ffd4fee9e..8e8a2b5688bdc1b6d4398aa49802342df3c3b681 100644 GIT binary patch delta 256 zcmV+b0ssE%0;vL!F@GCSOjJb(001yBFjzP^fKX7FXlTfQc(915(3r^JxX2y^u!jHu z010$bPE!E?|NsC0|Ns9t0-MwT005^+L_t(Ijop$#4g?_x1eFHq|G#(}likC}%zc)` zQx(t}$N1N>`HU@n-YM?FNi6RT&rlKW3)XS~WFmS2)#?%mczGw7grMjS(F)p6))bBC zRwNk=SJZ`OMRA3U$Vg3bTo=^(8ZSc$&Je~DltOsd^{FI8-9i|3jt~Zo=H{`)kGHm5 zs-3Ro!+un_;bWrip!mZ5hbRNp-L-#>jqm@HO;z^~-d`V1_yl;16mU5J0000DOlTjn`vhW5FHIk4z>% diff --git a/public/images/items/hard_stone.png b/public/images/items/hard_stone.png index 604b44f99156fdb87663e20ecdc11fcb1f17caad..571d96afaa87e3a0879801201ab23525a0a14738 100644 GIT binary patch delta 244 zcmeBWYGs-rSllz?EDmyaVpw-h<|UA$7~m7)3ZxYj6ucZAgS@RiJRSr;B5VMeox~j$#c8 z9IkHUwzKJ&&i?t~+*KP{4hDG{Is@Io;OXk;vd$@?2>=~DXea;x delta 252 zcmVjI!d8i3+Q zfcr4`0f3Nk3qWyq0IiH`0K`K8bo2$V6`W}&Bx zV~9oX-Amp=M-(_%0z_F|_xvwqulHTEgss&6^6k3T_~-w$_dUPT?ICQxbYYyw~URTy7VjGvI`H^?Y|eip1J(5a@k*9vEK^S koELt5S$pT_^}l&`t4^@jdQJEq1#~Whr>mdKI;Vst0QkXx^8f$< delta 331 zcmV-R0krE<+TB3KeQX2_Y&otHP`N-lQxm zc{C+#lFp)pmxoh3kT_;75Wc6NjJkHVgoM|S4&0E)cj*USe}C5FEHNseVuHO%V8LyF z=>X9&vPrixgA&@`H(NlL063|6h< zybIt5bb)62m4Gf`6X06stw;fR7u0a!NP$<8SOqw+ZUSnO0peXCfZf{!oVzzAFlgKX zkN}_$?xlNEfJ73265I#()_tFZ9>5lb+a&lb(6cCfs>Gu3Aqj5-_l*Rh1h4v*M2Vk( dLxuXgdIJLcB64Il%|8GD002ovPDHLkV1mqtk^cYy diff --git a/public/images/items/hearthflame_mask.png b/public/images/items/hearthflame_mask.png index cd2ecdf1949cf082230017390048737b95969012..deed3d0cde891ab376a67c75900403e07008e05f 100644 GIT binary patch delta 277 zcmeyxw3lguVZCC2PlziQ1B0QVVK_g(w~xJ Y#5!*(BVX`spa&Q{UHx3vIVCg!01ifXPyhe` delta 338 zcmdnX^owbNVLeN_qpu?a!^VE@KZ&di3=E0^J|V7#hKAlgK8L#P{+{%lDJ~w)&;Qn1 z|L@xQm<;J4#tp|ZVMt7toY5vnDB$|080(COT-n%9b3<}8(nY>UD~>L z(vhxtJPa)@cAn}D)*9tC%WO_DJ!9c*iFt}%bmz!vwB=e>kwbHhdENT?MONEE}g+^?R354 fyZBlbF(LHmQl7^SoNuIcHU;L;Zbi zLq->lRavk1GJ4oNWO%43RNy1X9IPtNFwHh8r@-ce-w(E8n+Hrw0&o3Zc{Zc))u*44 b)|GM}KQrArS+h9K~z|U?Ulg^gg^{M=V%$@(H1;z3Dbfl zYzte4SC3o5wBd1E*b*W?5Q#zXVrE&$gO4J@e-majr634`e--o~J-h!A=4Kh|B7&gcd=$d=*{GwS*Rt@}K<^ fnimH_5ZuiM#GzW5+_C3>00000NkvXXu0mjf!yjc` diff --git a/public/images/items/houndoominite.png b/public/images/items/houndoominite.png index 9e2e5f2eacd669df2d8888b5978070c41095e70c..c9ea1954dfaab27faea9ded6e8af113adbd688ba 100644 GIT binary patch delta 235 zcmey)_=jh(#zu(Ta0H~C=B*-tA0mz2~T^7f+K#43*7sn8b z-nSPI@*Pm%U=Endc=+xA{pClGO7BQXNw0qEoxEYnT>F(LHmQl7^SoNuIcHU;L;Zbi zLq->lRavk1GJ4oNWO%43RNy1X9IPtNFwHh8r@-ce-w(E8n+Hrw0&o3Zc{Zc))u*44 b)|GM}vzRWmY+LFAw3fls)z4*}Q$iB}7-MCg delta 230 zcmVbYFzW@LL diff --git a/public/images/items/hp_up.png b/public/images/items/hp_up.png index ff456d2528996ffadf90a7ca9645acbb0074c03d..5c6baff067394bcf9f1d6e3332f631c8ce8865ea 100644 GIT binary patch delta 275 zcmZ3>w3umvWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP?!>B>DcWUwKr<- z6wUufi?f!zTXS^Hl5b0m%N$> P=rjgTS3j3^P6Y3SpfDV1K@99Pg3))y)Ls5tI;PpgnyZj-Nk!%57$RZ3c&!Z zwJASK4luZ3nE_}G!T0E!9KgMtpXMpl48Vdh+NA*Vx1f$G3xJjG>4O+58-SUcvI6j% z^L|-4zT4|Z$D`!Sa1A&%8@pyQ5M!^N2Nj28++<$*tZD z)%hk9*%?}r4jGy%@NBpx#}vqN8=_pKWAy?@UB%oL-{GK)QO=2->? PE(QiqS3j3^P6+R0qsNeuo{bQ;xz|)7gHC#N4NN^JY{(l`O79bcT2r6qMkib%a zmfsvMB?t_-6u@;;0Z1%j7hq~ymFQ=C3B46DeG>r*kK*Oi0#q{rf+AS{O<>F)g~?9P z`@JZTT3rHPLMf2J*U7a+bpieot{@VjX7F^ciNJ1JTvPXK1b#_at-zr~;n|zOcZZS! n6yPSuGkqRxei|<9>8X`3+KidPTUg+J00000NkvXXu0mjfZ7_Rx diff --git a/public/images/items/ice_memory.png b/public/images/items/ice_memory.png index 01e68c08f821b86200526fcced196cfa33de6f28..812548cf36ca190c43d8019f56c20f4055519217 100644 GIT binary patch delta 316 zcmey)bcShyWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Zh%jSE09)DP)JIuuCAVv)!p5^ zWy_MYN1Ly{>wfla&b$9>-u*xN?f=zp|DS#P4+MXoMH~QX;4caC3uXWbAi&e!dCP!O zn><|{Lo9mlPC6)bSb@W3bD(r;{l)+P?=<-q8_cTSt)6~Qnx*9SKf@Q52XfYGigPKr z&R$-Wwm{^e<{6$R-YY`Csy#Syw_u&rAv-CHI}1eDw*`0YC^VkYc=w}|LEiF=FKP*$7ydGS9#U9Ud`X2y8fek<)6I$bIj-Vak#zWIUfadKZB>MpUXO@ GgeCwtXPb5a delta 359 zcmV-t0hs>G0`~%t8Gi-<0047(dh`GQ0X|7YK~z}7?UpePgD?z5ISNWD0)H)#=lSfb%LN!@ zrg<~$@|&)Oh@1j<<2<+H8|WJYh19YSt69VDK^MuVUK9{gzahXM@ccODbZ z-(}))>yK8i7GSWjavF4vcgB}|&9hevNVu=@phU>(Rj;A>0QU)m!c_t^p*h$A`k$Lo z2wdHYd2$22-a-fwe93{t*K%XQQ3sNkBUm~WCxIj&>jlPc5QZV|%|!qJ002ovPDHLk FV1ht+m;(R+ diff --git a/public/images/items/ice_stone.png b/public/images/items/ice_stone.png index a0fc0c12c5dd8dfb458c06b6ba2de4bea3e5a2b7..945714b759c79ef6d469104cdb3b6e6986cac779 100644 GIT binary patch delta 306 zcmeyxbckt!WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP>{%)VmW6^(%!RE zuHM`G?%UOO-|l_;|L*_)Z~y;y2s)nyD&j5)@(X784+phnwO4_{J3L(+Lo9mlPI6>A ztiZwI8p-tU|G`+FYQfpnr%Tm#MCQKLuXn#@lfZoD?`)+GPiCuQ7X`X4=gwi`Ym0ee ze5SZL)X}7J-UD~Xl7NH*su_YOG-tS5^eB3@sm?ebEfH|jax!aCV>C~XlELhyAD-0; zyY$-3=$B!x)$bCW=)P{}r_Z&HlaDfQtGIq?3(N0N^Nde%N}E!-5{?IaDmtL6u>FbB zS{v=wqo(U0{g7xWpYi`e`W-v}w=cK;{j`UH_c-g7?i`T^KwmI;y85}Sb4q9e08VR* A^Z)<= delta 362 zcmV-w0hRv30{Q}w8Gi-<0047(dh`GQ0YOPbK~z}7?Uu1^!!Q&DHAYIUpfc;E%sehL zMp}=MQmsc|>6Z2rbigw~SQIJ42*Bcj0t?>p^NZ3jP1Eqs3|*iL{Ck0M9Ahpo7XWk) z*La#QOZ0rX#wDd9)o=krjPcHTkWjwPfARC@cgdDS6$zG0xHpzyl-l76ZwGLWp-I3S41fzfgMWOV>IK+6T@C;NBpeP{qu@;!kzY6tcLBua zRnm7|vinVe9Ag{-&FA2NOLku*;Mc1{$(c{#l)hy5n*y_efcbUH=zw;w``riIAAEZI`uYF={~1nZ{RGN!mIV0) zGXVKuV9qrA3Q(}g)5S5wqW9_~Z?OXk9L%TB7yK7C-x}?F{piytyiIY}^H0BFE`Qx3 znC#ma7m@9#)-yr$RN~tZmh+a0bKmtgPPhKLCgk&yHm#xyN-X~h+FsSTIx9E%E>W;q zbfGEu!MWG%Ph=V`jxapAc6d{r~^}x38aXfAGm?^){=@_RhHv zw%>gK6fby?5e=j`OM?7@foi~jA=tk{2qakG5n0T@z;_sg8IR|$NC66N@N{tuvGBh- z@u1LQ1r8TR$3Oq|&n;W*cxBu5X);Fj4{gOwuk5?>o=fEIWQQYvzL+;QEUgjR;i2iu zc7xSnN?%W?f|-lPygVJILepdxo_!og^4cn{SiDr~u->7N+MtraY~KFF-=6!>qAo?j z2`ovbq2e+sw>%HzsqWullPh9Tj&gIDVY$`}0p! u!_-Qm;i>if7Ug*@#(WQR|2AH@#d__J^jR0{!#zOPGkCiCxvXCp@KVJO!QRVV_Hv22>Eak-(R+20Bi{i94i?wMzyJG}wl6y*HGAHzK6kYgA z?3!~peE!Zo&>|Ldc_~ALfE1@#>n`yLto|KMsf|J&7AH8XAAV)o>-j-HTE*vbGPC*@ r4%IDEC%E@4bd}>S*-*0aei}p2Wwx!YuAZ}j)-rgy`njxgN@xNAXw6b# delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_m=uoVf7g$BQ37cD#7uuwaHm zLj_RsO?1XiAjMG<Opi>0WhT4`3aJm`_}XeOe28iPw&?;&eS%vu1tu)A;ku-B zg0WU~4?{tgf^{ReW2M*zu1N=0Hg4h4JIEQsacXk{r&f-z&kfa*M(&L*(TaSWBFk8I zZko5C>FxE_Q=HQhnCh913Wc0VT_m5tTlsABgSv>@p*KEPFT5r^Wv1xf#_94vXEHE& Ny85xYtaD0e0s!{$Y{~!t diff --git a/public/images/items/icy_reins_of_unity.png b/public/images/items/icy_reins_of_unity.png index 84ec94a1d87e8f911b49df11f397cb3f0ac583c6..b7af48d6a812cdd03eedcb3194b33e17a9fbea44 100644 GIT binary patch delta 311 zcmZ3=e4lB8VSPw|Pl&5D1A~Hqp@N8^ri7uUil&5!qlAiMOUwVB=KuX||NA@tPwf1^ zX#M{s>;5m@_J7Ha{~M0~-*Wo@&eQ+*pZ$O4)Z25n-k-no|H94x4`2U(^6~$(Pye5P z`hUc{U5kN%L8c_gFPPy!E>Qpf|H|^Ufk1^5JzX3_EPCHgyeQVBAmE~#KGk94)n1?f z|LwiyY!r9dmHT~WD^EyYpz-gNtHr}bQVfbyx34{=@B3m4W5&FNSM(IpOc^=ve`z@; zVS147_;?}vSwT|^{irueev2<<-y+jK01e2PyZ3h;B(I2v_13LZ_xsSb3fgu xnk!{j%DF!~8t~REw#oJ32S<)T_aD>0vOV9)TGQZkelyT@44$rjF6*2UngD=3rnmqA delta 381 zcmcc5w3K;*VLeN_qpu?a!^VE@KZ&di3=AOwJ|V6WB959WnrBYEU9#@Kf`H+o_5aV` z`M+ex{|h(&Yf2byIsL!C?SD`6|NhSZ`_KM=_UZr5)Bjsq{x9A3|H;Sy&p-X&aQwf5 zh~dP}|L1PKmr!wh`1(K4;B(2GestSz(gfBVeGoX4d0 zp*|~+wX|IXZ3Wb+oC$Zyu;yKrt})7GRg9w=Sl~v*XJrU znH@JyShy;lg^69s#F{bX$vLOQ+s5mS?d6;V=3l-P7q$717DJt}c%#qVl6O_izxMHe zSNwW%cSz_uY4_)8i4O|Wf@Q>`AG}WvQ*_#Bf5<#dd&Qpy17H4y5{cP&6Tj*KozLLu L>gTe~DWM4fjoi3g diff --git a/public/images/items/insect_plate.png b/public/images/items/insect_plate.png index 75b44640a1b978c194a8435f9da9be356057d041..5bcc0eebaf501a3e24e84ec46eb035918341892b 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqLB$M>2^%a{Tu3c#R<;phhJItdVbK4R`I!<%&h)} qLv@SP3GO`$UFEn-Hk53wG5uFelF{r5}E)g%1~AS delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_moGB)s^s;KPp{Cq6Vx*kDmH zLjx$eUn^P!NO6<|`33)n0ETanMpx{JL7sn6_|Fe@k z`C1HkSSG8T{$Jk{czopr02w@Lq5uE@ diff --git a/public/images/items/inverse.png b/public/images/items/inverse.png index b1ad5d2c00ef54f1323d947921363faf1381aea3..0d77ce77dde9a01c93f406a5b0a2c55d5cf01e2a 100644 GIT binary patch delta 268 zcmbQsJcnt5WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP^jZpUoL5ILErpA zpf7twj;aV6b90wFFnsaUjzFUvR$@k^bvYJw2))$4*ujOGs3I9k1ci0BQ@g)3Ez1Ch$BX}E-8?-b4M zZpXcQqy8T)UUPKKw{J_1-aGp2+p}-~zeQ|b_y?$zwijLy?!~O}j@pE~2=CAX-C2hBsMaQQh zp?t;ytEDz#xxD@pGdCLh7(|&eIVu$!=bR3^u;`A{A`PJ|$%KX11YQMl9P{Lu`&f|8 zXTo-tOH&nAOkVSM;)==F4qwzzxZz?K-@5EmZifA7Uao%DzgOnP-3B^|!PC{xWt~$3 GV-o<^LUQr| delta 272 zcmV+r0q_2p0-yqr8Gi-<0047(dh`GQ0Ov_WK~z|U?Uu0(!yphvJqm5glqs`@*T@)d zJ%UTGK*<^@JpwJsM>^|-0yKQANF4gYHi-Xph%?hPV#L3NF(#BmH@9{U-fusJF&YFG zUY2LpT!c9k2mz>NpbJ1rGys990Z`4?`Eh0;*JDm|2r;+oEq?^}iqADQh0p+6sj2?f z9AJ0*nE@z;(C?Vr9KgL@IQ$WN4WI>Mj8g&px1rCe3xKryHbrTuZUAB~>I#sWYlyB} zpc_2{SoG2i;Cy58S_WWFt%RrnvK{I1qgFy)@p6TT1|Sd`r1TS_-VHCkl#Up|h!5C9 W(lM}d?1BIQ00{s|MNUMnLSTaZQFF5Z diff --git a/public/images/items/iron_plate.png b/public/images/items/iron_plate.png index ee89275566025bda0b3f849bf9d33ffdbea86721..65d660e34ebc144603ff72ec4a79b4682accc357 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqK}JSKMMXtNN5_T@8!lY9@Z!abOd)qU1_lO>k|4ie zhW`+7^;C!vP%O*S#WBR9_v$1^z5@yzEUt-v|MxF#Uv@}p_Pkqt?rJGQnor|Bnx1vp zHRo{n{GEHCMJ(p>QicctDNeE0UE&j1{X3dc8-+Y9PH0W$<+Mb6Mw<&;$U8L{C)! delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_m7+9TzTKc=6)Jh7B7kDk?HE zGJul$Dn4vLilZdRFZe$MFx+e28wnKSEbxddW?0J1h-@gOju;YbxG+2 zW3A{OhJq{w>qc(JO0f-GlMbwG+`^@IkTZtk)aC?EtsG&W8>%IZ+#6e>75O+tma**I zG;cxE+v}~TIHx5r)iWIx3OSLwNIrqL^4aDGbrH8iZ+xy^cujc9OwqlK)8&EAWMJ@g M^<#Be=akR{02@PTe*gdg diff --git a/public/images/items/kangaskhanite.png b/public/images/items/kangaskhanite.png index b7eb6849729cbe71c70b51ab1a21b32f7847d316..3d65d2cc5ca093e873e297b10302c2667381a696 100644 GIT binary patch delta 235 zcmaFI_=j<=73a#nQ#8@FF$%zdPho1di7iHUD{k1eYsaC9VWm;&uTom!!B<35lGufW%}9tyTa>H)1PcCQx#^l&}%_ zf~J6j#7%qP{l%pE-p^IsjNLOv}#!|IIO1ERHafQSxrpk|7<6rO|y@EY$&@ygMU=XUcnSta~FR;`kxj6 z;6`hz01(gtnCqE?D5?hKN0_HFMl`m8jCo&vKqf;V=FeCKZ$Z2jy&`&V@~tUi1(z5i zW1G-}d*6YeDpdgRjRCN4I2pd443HCYUj#r*KEEHBR|nuIdVAypz-=}FyWS09#JK(3 zC-eENziuyKELgqP63AH;F9Pt*7^@IPz5iZ%{a*C(LJ+@zT$qew)_xp||CFdk%-V0k xSb^%FYyf!HWEqd#V&98Y!Y%rnee7dP;{&ONxGVD>$Xoyb002ovPDHLkV1gu;ph*A# diff --git a/public/images/items/lansat_berry.png b/public/images/items/lansat_berry.png index 6b2a8fb47601d96e5a665bf3ddf9646a3577b75b..223bff3eb26306e3ec12b062093dd819f1d1e436 100644 GIT binary patch delta 281 zcmX@aw32CpWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP%td^YPM83n&p+W zr21ZW*0;S&y3a0I@@((7qig0oNnZ|B#9b2P7tHV<4rSbu(FV`(M{p<-G7X` zUM}mB)XFoq3&7FqzG{eA@WIv!zPE z6mxGRxh$!CI_qH9gN4VOkDSkEyf?e{uNqV8oN&`w9AztH!x*k*&B~2++^xUy_w@Hy a*u#~CSmp+&f5-qjmci52&t;ucLK6UnPk!zI delta 306 zcmV-20nPrY0>T228Gi-<0047(dh`GQ0SQS&K~z}7?Uu0(!Y~j;Gm2NBWQB}DnU<20 zGHbYGg_J2-fszqujXvmGKc^@{$^{GLlfE1)(fxPli;||PQRCMlgpi7w$NP|qLBP1b z#_|BgyKso73_%cHTe+E1yJMROfo||f9^>V$A-;6$yLA9+%74U23S)=^2>|Q?#%G|h zYu5v4RZNOK%xF##!o_?7Ayp9wMrzCzTHSgJpe?lk)|_2%?Z9~-Cgwa6HQf{-SC8qI zDTmQl05}6QR#}KmhL8yfVPRlOxxIpOGmzf|fzVZj=Qr!Zr{?Yen%tVs-FJadb0)=+ zEL9A-bwS&2zbkUKdNp$UA}%FSh@$@nMgI|N)cA{d0#>7Mpc`pgx&QzG07*qoM6N<$ Ef-ua80ssI2 diff --git a/public/images/items/latiasite.png b/public/images/items/latiasite.png index 6b92d1851cc19eceecdef37c2c26eaf39685a9cf..486a542576fa800e8f55cc18ed104db4306f9a9e 100644 GIT binary patch delta 237 zcmeyx_>XadWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ21|Xbu?(sz3MqV z$=9Z|+*`Wz``*3(|1Z6^_vruc@4x^5|G&LL`x#IvZ%L3}FawYe2f8edYk?9uo-U3d z7QJsTI`SP*;9zkOTq^SCe>Jz+y#s1#w!6dCq?wk^`NJ8pE%{KFC1cXMt)AX29Q}p6 zCq(EZD6uG9nz_4CD%@hj0};+0(>fZvCU7&)(lxX;(5uki!)&Nmkhmn+>U;3&OV6%6 e{T!)YDaYN-^!>`G%aK5f89ZJ6T-G@yGywqr>1c2O delta 233 zcmVO$Qykf_-J^~y|0mNhqT0n+h zL@i+^5M#cSFcHXmt`gV@T0#ooT+{d9+a!1jrn^8+K~Dk#h{@e+2`Ped{wkW5O9?5$ j$GMvWuIq_uFM4&b00000NkvXXu0mjfg_~h) diff --git a/public/images/items/latiosite.png b/public/images/items/latiosite.png index 0d2af34781ffb53309143c9ffb47adddd8ef85ee..69708835c7bd3b1cf03c9a756205b1ff371affd3 100644 GIT binary patch delta 237 zcmey#_>XadWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP>3pi){}fqv*mm7 z(*ILh?zQZFzjW#My?g)fJ^KIq`|tn%|L6U$Jq4(gwx!wLpm+PZ!4! zi{7^v9r+F@aIiSIE@A!izna_Z-T}2V+uh-6(o9R|{PEnHbDV|4a^;bp8%xy}arGDO zoDiXtpu`fo#L%2sBHUub0TIp}(>ofwCU7&)(lxYJ(5uki!>piJkhmn!>U;3&OV6%6 d{T!)YDX02~>5tfD6>Xr!44$rjF6*2UngHjzX3YQq delta 232 zcmV%t8Gi-<0047(dh`GQ0KiE^K~z|U?Uk_&gD?<98O3c@qRj}b;4&pE zcnp_WAthy6N|zVDr6Z>UiH0*mx-WehONjscv7zf+E|=@B3L%hm^WZT~)DK^J#8Ss5 zARL@CRU;f8(lUQj9nB!{V1yu;74y7-fK4Ed03^ie0BiW-*J1Osz5-lJ0NA7j4Is@M zQA3ykq*M+eOaRLKuNNmlLr4JJYq}5in&1{pPl0SfHvs_HWc3Eak-(R+5X zqtHzkqrZvOOJt`}F|A$aTg&(o?(A0JICx~i76s&*+?V0OhBg$mf$e0M{uGpG?=@F<(0>er4n32Oo46D%2!% zUp%~ZGxIk7fVbj(OHY^w`&n5mw!G}foq494R0DhP2XZRjFM1{GQ;lu~dgsQf4Ie}BEn%S&EfUO{L+c)XjN zmwe}(d+$l4&#~u(b?=#IH2T*XO08DY?=|NL-y?wp08!!gc^!ZL{#zD4ZtM8Vi?~$Q z_H_KZa$4@?CnbM>rXh%sb@vVBiP4D4uU$B$;!N_azK?m6^6E-MWqJ+(m=cWVm$qao zea@PxXP>;9kbmme4Qu9*o&rE7n~PT@G8k4VvNt)C$ms=QV{w_t+>+Gz&0v?ngxNoR z_Rtom@4nTwcf)r8%pN=`{Lt(nfBfpb&Uq!U3UD8s+%4;Ur&7}Fx%R_D7aipXz5?i! zJ>*{Lx(`qu9>~hK7oVA`3x%1|aW)E6zK7Zn?0+17y-joyU{7!UL0c8K} z)0~dY?9DR|kUe+4+u9S)6@a{2UAJD!=8>zN(;JE?}0K5F)*E`w!d0_W> zfNlp&c`P>4Rt`J`&@4Cku)JfpT9SV-?MV(gE&+FaXfxL!M+I;-Q!JG{%RyJCfKrOF z1pJu=kbgt$RSw!di0tvxO4_Y?r`_&`>%(qxin-=E>we{+9UT^Y*}g$gqSpZ0p!J(^;S#JPza6}2trI80W`N; zNh3MwN3SkfIHPD2P$_RokY6yveH98TDniS8l8FPS%qZl_GEtUu=B?|U-L6jDr_Qjy$Dz?fNHXcX=zAt{(U6da)aJ#9K1=;&3ux)I zVml#PaDRgQhP4bFjNce|jzqmkJ|lY}MK->U^~`4114j?l-S3zvw){}r8sq5)o+{5X z+WF&tOO)B^vekc79xS$LJe#fHmw5l%QNh~E3HGbSyI-?E>H6F93g`(2Pgg&ebxsLQ E04FbsZ~y=R delta 348 zcmV-i0i*uO0_*~i8Gi-<0047(dh`GQ0W(QNK~z}7?UpSL!ax*+dz4y^P>HQXRw8SW zE0MKGWF?X-a0Je?Fq=#=d0EngeOt9JnY3wvZ{E+c+jT8kv?z?e@1xbO;MaRix<5kF zG!J!6C>X%7OmR3539Lq{n8<>!r#Ro{7}k)keD7|6aDo9GFMr1bg$dl_iue4Sn+eUF zSu31X;4{}YSU57b1{CgI1uZ=wkTqeeK?B8A*eX5efX}rBt_F1Q2;zN>8ZMKfUk<+KHwy-KqOyx0JTi9ebfJencAssU7it*}|=;I0Os<+&si zoDGHQ;8DdZfK}Px3OF)WuqqAe7m7^@ayRe`t|cejZA)ew6u^7iYc=4y6Vimjwa?Z- uwQ~TZCDvZE-_?&}x%1zy=fD;%YQzV>@WJaOKckNT0000!7Xx diff --git a/public/images/items/leek.png b/public/images/items/leek.png index 7ef3fb989a4c2ada712a784fdfa7bc24bf905a00..1cb136aa78c1473b3340bce3e48fe980efe44957 100644 GIT binary patch delta 213 zcmaFH_>6IaWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09(If+Pm7DGb$nIksH& zI{PkZ%a-nE&yN28|1C6a0~b&QS4ogxFvEWssOuC71Bxbix;Tbd^xnPXD0D!9gV{k@ z;mdz{y{CRVte)NFkL!H7n78ixo-i>cAD5f1tAUm=c)I$ztaD0e F0su)wTj&4) delta 213 zcmV;`04o3H0pe9FBwD`+l{~UMaO%9jjohTCiAD%S_KV*f4+k}$486=pnY!A-es?= z1mSpkEud>IaDop<@kuCVDnWreFvZLSG@L*UHlGRH7=Syt`A!UQ`1C8+V3)}!oGa+E zet;~?bb`D6fCv{^_bVC-@BNkVgd6Vp21DK9R{_@jprIu~k6K~yOvWoeCiqK~k7^A` P00000NkvXXu0mjfdf8pV diff --git a/public/images/items/leftovers.png b/public/images/items/leftovers.png index 48ff07fbed3b8b0cfd8346cce6bd80d4bb7a9013..4732d149b648f4c6095790be6057066875f519ae 100644 GIT binary patch delta 256 zcmbQsG?8h7WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP^k9u+7cD@EGXz( zQd0F4g*n|p|GTr!K3ntd|JDEh|9cqym(Uj{8C6@^qqAe(evuCc_wzGEy_;a1aQT73=I<`Qn|TX3 zm;{S+d^y+5(5*b$deE%bx$TRL%H^kv98#ZcT*D@dG3&FgUE>aP4}+(xpUXO@geCy1ig5n` delta 269 zcmV+o0rLKl0-XYo8Gi-<0047(dh`GQ0OUzTK~z}7?N%`k!Y~Z%Q}UjU89R353w=UY zMxMaPHyHUsM@CkovwD%qifp9flTK+}slFu6#lw(DB)&u`MZljWU(SI7I9u|vR;7)( zCf{n6*F5V;0gRI_B5d+y9OX7m9|G`>xSI(4P}Y-@B6@OVe18Q1y9i77Eoc?LFTYI) zatqvx5PN>#u1yGu80#VA7(V5pNy%_C>P3V*;r|M-H9!FzL#!CEGq)m0S08{0F}W4P zXMA@RfHU75v0Dwqc}KV!5t6`uc{k9S5qCEuHXywns})BzCVf*9(u^b$hsGOm)1veG Tsw$5F00009lGR8JSj5R2ZYlN^PPDsVVw3-9!s^#)A2^Z7y5ozVCUhH$Id58g5qYl-rKba`H%#ASpUCG_NuZ>~p9Q!Zj^$k306RgA)y3Q2xoxgCpib-tYvV+EE4$Gzn zZQk4TVJg!TH-VMD%NakGd`uU;-S9BI*!9Ln<~z|03(Fh16;2l0l%M}|^AXdB;2)3K z-f~M#m^UG3$*wEpRkZ_>N+r_W2M+N2QofyZotKxFVucVg$rQ$wrlfBGu+zOS zA~2+CfHsd~YJyF==U^BydG8z!FipcWbh2wRI5!}JCQpK@0e?R7+G+S{9%NVC0H1~o zbs}*cx2jfP~egX5e}mzD&rq`b|ebDZr=xVDq`fBp_P<{a4Eb?B!)uFBB=e Vaj$abivR!s00>D%PDHLkV1gdZcuD{O diff --git a/public/images/items/liechi_berry.png b/public/images/items/liechi_berry.png index 492ef7e86f1a5c1e8b0a08f32b61512a76a2b9c2..192d8f001ef618cc8e41139cbc1d2abac42025d7 100644 GIT binary patch delta 294 zcmcc3w2f(kWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP*@WraJAU*{~E6) zbDFQ7o$~+Ll5g*h{{R1N{>`R%pbD;%AirRS|1eP3DG~-0-Qels7-G@;bkae-!wNjk z($klm{Qv($PFD!$i+7ic9z1F{Y3XG~*mEfCtpB5iHnuxd${H}9J-fo5-? o{{M7OUhVbTzs)s&1MO|(Z{25AeCzvO8R&WjPgg&ebxsLQ00;kvhyVZp delta 331 zcmV-R0kr$0RA@3j%bOtUv_$&)+^nRh1}F;@2XC5U27Z!tM2xvcFwo zjQx;!zZwW03X%GJd=qZ=o0NJlD+C?}Q6vFyMJC~9mlChxOn+7g6{i@4#~dIOA#im= z-~n1GtyTyEayAIT?<|I})!RPv9zUZ===QMn18CoM0M!)>KnGk9V*nImj|Y+Gu~hNc z)k6yw15jLtP$4MDzBBc7xEz=Rn6jKFg7&)r?4V6Syx9Ioh-Mi=T`(44uJ3BSYZuT3 zic!e+e5~)T>O}1vP*4|+o&a4|6wd-+x1oyCa(mvhiqEZNwcOgi+E21pXe-WM_1FC) dDpBHZ;|`ya7#B7{t(^b>002ovPDHLkV1hB@k#_(9 diff --git a/public/images/items/light_ball.png b/public/images/items/light_ball.png index cd421446608b2268e3cf7b30030ad70e619084ca..7748f735d37d88adf6cac66ccd4fa528eb3e906f 100644 GIT binary patch delta 232 zcmbPW{F7yZBnLAC1B1(wu49uIu!%BhOx(Pkt&Fk$q`cS$ptxLsPlzj!HZU+~Xkgf} zgJHn}fd@AF zEq2&|gN606m`|-K-Zp$g3)0Rg}n&EL%YMPd!QpY`mFrTUV zET)HY7Oa}8kS?CcX`%O$i~q}^H62&1AKq{(Ia+rjvDo_it#vz<4p_)!Nm|YQ^)vGE d$GiK_uzxCLj^fG6%Ldxb;OXk;vd$@?2>|VYW>NqE literal 6544 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 F{{psh2qORh diff --git a/public/images/items/light_stone.png b/public/images/items/light_stone.png index 2b2be8240208a0527b9ae94fdf37ec0c7aad523a..97258cf3970b24fd8caabaf64de54b5402b5ce35 100644 GIT binary patch delta 208 zcmdnW^pkOdVZC&KPlziA1B0QVVRCYEOH0d~IdhI4J$mihwP(+s{r~^p{`s2&3=9mM zB|(0{3_v~@m^0130u(Iwba4!^=zTlkATP5a2TN~c#P|5ZhG0K+)=LgX_a)bExc=+& zNxgj;hj{j-en??0$?iT|oWa%boFyt I=akR{06N85o&W#< delta 269 zcmey#xRq&wVLeN_qpu?a!^VE@KZ&di3=Gl%J|V8j$;r>2J)1LU&e5YsuU)%lXlVHV z|NoYj7NGo0rR82ginAohFBm8Y1`NUe6+$4v0*}aI1_r*vAk26?e?BVfmBMKaDfpKEr_djCX@-n^cq|Sox_4A*$%<}l`zn&%J?O`r|7oAl}Cg0k57!1V| zf(7^$_UT>g;Aec$6`}HNi-I`I3Lkk!h5Ewt(gr!ci{%}11y5IUn|MrlEVg5P;In_c z0S9CnJFeFiPvpDOwTng1!Qgnu@{Z#Y2KEkV!Z diff --git a/public/images/items/linking_cord.png b/public/images/items/linking_cord.png index ab695ae1fc873258c32c15946ae17c9f091fdd38..4cde9da3f14164c5320b4a11cb02b7f3561c740c 100644 GIT binary patch delta 274 zcmbQuwuothWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0P=HT}E09)DQ1Ec@NQg*isAxEG z;)LYka(AF8TS<^#FvEWksH%MM4=A$6)5S5wqWA11Z=oX!94>F!-q$~6nAO>}F)Pei zCurK=jGs%U)N@Ws-+Qe}Wrd0#gUgfZ1Rd@(_5KdWH#LYF1pBp|W5`(F=ee3$>~4O7 zp@?ck(3O~}bDQR;*{)lWG(%S9CCg*p;G8up)!FBK)IYptO@o4w^(x5={_~=r?%aLr z_a`H>*_(HVMVV~4S!;4ps?$k0Ac}j{_F%T8r#H^LP&^cS@4xN+R=F>?AIJWWjk#jQ W_$rG3iZcT@(CMD8elF{r5}E*(lyg=9 delta 783 zcmV+q1MvK!0-FYq8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00O&7L_t(oh3%FxYui8^ z#eYf@BNVHcLc$SBIWh@D_8T?kBV_a!=#nX;y5(bJ?AXzxM~wj&qw$6kL}QAnf)GjJ zI@ouWWjj$EGBpo8+)2Lo?*HEZPVk2R9bR+d{PQ`J@x<71|9_y}mRfpk8v+D=;AJ{9v5Fa`qouMPe>(QUAl%p; zWmTF;M&x;p5Q0%U0_OHM|Ff|R%Bplb0*GWptYQXd1AjU@9aEHrVUcdY9337J1|i-3 zF7VGjOAdHNS*%oUr2;lU3j#-OgBj%!N-4LqNJa=D$n)IX{Ja4mRxxRs*8TQiy>0KB z6TM!K`-giI$%yG}N_AHugh2n8|9Lu_a{c`p`BCEU`eZu8-}O;SQQcKcXHz#H_<{HE z=i$pH@_)4zXri84o9awwZuj--49*7bdEf_LS(O`!EjDJLo?u{Q@kL0N-bvHcdEbWo zQ33U~Q%X5c?as=oq%Oi%q77*)0d`TC`?v07>~uQ7JapS)tpIT-ysNKQ&IWrYL^7hR zO4EDa17P-hW?~h)L#F<2Tde)iSd`z`7PGzF9Dg@a4=LcavE#{;&@NoRpll$u)~*}u zGke^&{f5~1sb#BR1z0q*(6qpkw+-V{0-T5@YA4`QcfjUD=UD=pA}pbu(^@axaL?Iw zYXMe7^KPi)CFE~-1HfOaWs&jHp7;j<000hUSV?A0O#mtY000O800000007cclK=n! N00>D%PDHLkV1f~nX%_$h diff --git a/public/images/items/lock_capsule.png b/public/images/items/lock_capsule.png index b2e64dfdbfdb93e828454e357a2def62bd054371..25d0cc14cffc889e66978de4da571c4ff6e67b46 100644 GIT binary patch delta 274 zcmdnUw1{bfWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DP{_*4lGrlG^4--b zQ>JX$vgPdAv(KJA+da)T6DZAD666=m@E;1ynPy)B3NG+;aSXBOy*r7K@2~*}Gq-Qf zzyFT}Cwb1!lG~uTH0$WmgMRB@?>`k5oBp)^^Tqbvhb3(Cc^e#r*e!B-pfWe9 z`fGZg|5uK4eha!hH4bojv@#v(*~hUxv9j&y^bMUdbv+x;tdO~6o$!4}FON9aW$orS z?k)DUIjkvs5e~}(mWuYBWj?WDKf}fQf%y(BQ3ceA5(_f z&@nCem=+Yq@Pe|)!cKN?S{Q`HnwkCLX&N?c*a@5Gxmeiup5Nc(DW$S3%LlsaJ?C7u zZQIYDUzh-$5>VgW1stVTQHubO1@{uPvO%OG1>D`DZjrC+`hOL5ooJp(U*|&=TO*fFiIWc)P!z1s??9i;vqF(qKU3z)pzk9;oLU=>3)+JGoAXDFxrS z2vApB0o1uBrvwOanTDebAOf%zYXPAdXdxs6y)o~W;t3G2RSx- zSvF@yElCR6(wwzqPW6&GbIz{mKD%bg|8IN$|NmdHv;GxO1Aj@7UoZoZj|86f&RYhQ z%Jy_|46*2ad(oTkfC2|gKx@?R+`=9I3%SkS9Z-w4zFj#}z&G=$|E9F4`3m)%=9}^c3ztmWuzk6h h=AVz!m#b9IF*ABIKbE{5cnfGRgQu&X%Q~loCIIRlW|#l~ delta 226 zcmV<803H8@0`mco8Gi-<0047(dh`GQ0J=#;K~z}7?Uf-8gfI|AIZCgA#3GR^k+mz4 zm0Y2+5{ca-aGkZY%!DSh6oO%9v&p>VhX(Usrwvq^5kNMHIru{2OJGIx9vn@=H$uBVo5Fq)D1Z^!eIda_uspO1<;ACXBbWc|pP*iB c7>02-AJ*G!FX>I6MF0Q*07*qoM6N<$f{=4z2><{9 diff --git a/public/images/items/lucarionite.png b/public/images/items/lucarionite.png index 82d3b19129d7472681eda4cc98701e2f636532a0..b97161df68c471c109b78d129c248a7e599f4fb5 100644 GIT binary patch delta 235 zcmeyy_=jEak- z(fjt|LB0bD9Lxc&hBM#%-(P<8sPvAMl=SMi-pL!L%(Y*6VpCYsDbJ~OM)FFX4)yo7 z4H;cHR(ZVM%UEFZkYS;sP=T)?vv8m|!!+BZoB*2-em~d(Z5}W!$-MP@<=K+LSD$`H bT35=oax!g8dmTIrXf1=MtDnm{r-UW|WItz6 delta 229 zcmVK~z|U?Uk_!!!Qsk<(hb1YUxB7C>C4Uzopr0MYtX82|tP delta 181 zcmV;m080PU0mcE48Gi-<0047(dh`GQ0F6mRK~z}7?UpeLz#t3&eTt8Fbo3h;v*rmM zyS7tAL`wye(2|49cNMe=!Eu}~6JxyEQ5Vy3)&V4)h+eE3@gx_IXywc-!aN}5vNz(* z(f>DKRSrnD0Vx-|0RDQDfL6Xe0FajCBDY`^0Z8(44oJCF;VwwZBl;B2q~h}aH#`%o j?F9WIqPmPYj74yvw6a3WW`^EOr#q5Yj~pm?agz1wp^C@-tP?-1 zmFPO#-~4L%Lng83{v9sIx<5;takww8lXtLdYf8-UT|IYSplm18Pt=D6oD-yJ{4(KihPgg&ebxsLQ0Fh&H Al>h($ delta 258 zcmV+d0sa1w0+Rxe8Gi-<0047(dh`GQ0NP1JK~z}7?Ulg|gD?z5GXf)Ig&sL}jgHW3 z#>gtn#4&56B+^I5N>D4=rd9JL3l2!{@iE}s$jGn6d!PB3g7f-3&JyzSxao=830$c)c`aQsiO1ulF z*NW{!ZK1IPyFddTW0c#4)*|-c1&pMWWS5aXUqI=rS4Fqb25?mS3sM=tRh#HFQ;q#eUUr?O8k&$oC3o|8Gu_GQq$^ZZW07*qo IM6N<$g5u0`eE}VkGpxPgGy7+E zcX!vm-;)mge)jCy|NsA+%$LgmRdAIA`2{lo`4CXoDG~-0?e=tW46*3FI^iJSVFe!N z!pROl|I4pqo@$oqS@t6JGv`ZNN$2eUqLmd|cV;Tibh44Sdc>jp#YxtyhbkWTvrhc5 z_C?p({^nQ9A2NwO_wR5y*8N%H%z+!?I(Y}XwiXr7{@j!HDU0!b$4Rzs9{#yA%ihS% zsXTr+xs-kG?!^XS?ur%dmEKxg^6zZlHtBzq-g7tRr6Gz5+CXugK~z}7?NvQb!cY`F#SW~_Cgyf9EG(}5 z0fzrTSR8$EF=a4>kqKr;Ng(kz5ZRd=O_UJwUPxdvadj|W7caJ@mI5s}^eoN$NYA4tbcXnLR_?iXOH7A0Kj~v zcM@T*BNt*JOdEwHm*U7zP8}TA29X}wT7W)O(ZPQngCFNk`a8E`>!1`E|XyoCkt(W4w`wNCCze>+bT513!%+ml6N~ zYJ>DVaMPParhh*?2?a{2pqO0+e0%~IrNT<|_1k8ETqy;uH9XJ5Xf#Skz)u;_9Zr{S z2Y{oO-pXw7JP(fJpwsEVbzLZ>5_d$b35_up`W24q0D;yTj^hN@08p(~;kquT@nS|! z%Jb$c6A>>K3nn5aB4%bLB5t?afo~=gOh|=D$o*?(UOo!UbeyisM4X6J-U4HcCFToz vVz2N=E7AKivNsV2BM%#N+ZQrNj=ka=n7$|@a_ZA100000NkvXXu0mjf`vS#a diff --git a/public/images/items/lucky_punch_master.png b/public/images/items/lucky_punch_master.png index d48fdf04bae7811056442f81a0beb2ca0c776d6d..89fc1b67cf433c717a28aee30fcbd08c5d857bd4 100644 GIT binary patch delta 256 zcmcc0JdtUFWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP$&{eIxMsNvDvY= zHMhFEyWh3mdG_qt|NsA2{a%y^RKZmeGRr$`u3wA<6gF~p+x>V$)QhZT67 z3x%D2{+D0JJk>1Iv+PCcXU>0~2u^@v0Hi<7KZ4^=$wXPx+A z?TfCn{mrkIKV%Yn?%&~ZtoyUXnFBY(b@C2&Z7nLE{kbRYQx@a>j+1QNJp6NKmc5ai zQ+fPuaw+@V-HQ#v+!ZU@E4{V0m9qi#v+C76RSH;OXk;vd$@?2>{2^ Bb(a7D delta 454 zcmV;%0XhDW0@VYM8Gi-<0047(dh`GQ0h~!hK~z}7?Nu>P!e9`6B`n0niGi4S{S9tS zSY6#gMyJoQB%wu_wMf9 z9gri(AHzs`k%&0_PHSysE>u{4!u%UQR8(wqL}1TScH&YonLtKKrpHd))EmZKx=Ir-5h)Aj3bv406^bu zCk!ir2c~Dk$ba;QC!s(o6*zA#fZso{cT!%8{ zZU=z7{pY3GVB0oK(?qx1g=JY#N+s@ymDSQ(8x3l4R0jwg$AM{@finQq>vdR`#c6EJ z$VoXmxMd<@*L9hQn24B}nTWX4=>(pcOfVr8A|dymnLpVRnCUo;%fu=Xsq6x+wISvU wdt#^XM=R0$GqN)ge?}fQ=%yPoM~(^b diff --git a/public/images/items/lucky_punch_ultra.png b/public/images/items/lucky_punch_ultra.png index aee27600f5c6db6d60f3594a844039ba6220c403..a95c23666bbe001cc52312e759787c01f7e9fdcf 100644 GIT binary patch delta 256 zcmcb_JdtUFWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP^in2y|LBs=T)EX z?(W}@yM8~N^z7NQ|NsAg=)Lg;sDi5`$S;@y$cKQsPLVL6Xt$?}V~9oX)d>gr4lD3D z7fyEg`Con=^Hj4;&$1V(pE+OJN;+r%7p<(&x-(O8rjw1t)gun&FHW*vJyh|ypLODg zwJ*BP_BX#;{*X!RxqpYtvF^_jXAayD*U3BBwY8{t_UE3oPg#ujJ5I87^YG7|S@uS5 zPUZ2t$))UbcP};wb62cruk_a1l7DCWwn_h^^q#vhFAY&l&<47T!PC{xWt~$(696U_ Bc8>r6 delta 451 zcmV;!0X+VZ0@4GJ8Gi-<0047(dh`GQ0hvieK~z}7?Nu>P!ax-MS{WF1c6m1#78chg zu7-r4z(4TfV#;8QzW`QTNgVtKHN@4x%-|p)DEd^R|=(n`jyY&0s zd*6EplqhjvI9U%85y!u2t)0RJ7~<*cRdmCxVm9uhAwPE#;(x3ox5REWvbX$t0RSjH z-$_JeE%`68AYXRZti;8@s4E$RGO3$qc|7z8(O=xOgYrbI; z)Dy{{f)4<|blA3~sx`rzbVMb~p|}V`et&yy=Yhc_sBa`9QGnLkIlFk^@K4joO$h*C z(96*S)8S2G`hVk-&_GHVS?_Mb}FoX3rsI4R$Q zb0#8QEEY^eOhnAgOhnx2bRy3}CYT{LM20-PW@am}&^&RvE)!`Ya=8n%){Ze>+!K36 tI9d~ZI3s%#aWL|@LASjjOO)6vegJHZC`{Zua6141002ovPDHLkV1oFd(RTm< diff --git a/public/images/items/lum_berry.png b/public/images/items/lum_berry.png index 8feb811e4114f52efd45f33f9066c45b3ee5c2df..d19c4fba5834471e7079232511543c9f783b0870 100644 GIT binary patch delta 230 zcmZo*`p!5(vYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gG{7gs6-X;6D0n4#1ugL^KI%2) zp4XE9UTdEna0E)Qmjw9*GyDgGrS;2x1BGfmT^vI!df!fpla1dxTp1>0<+F%oyF?v~-??H{_FbjfvlI4)?XWbyF4Q7WV|80C zP5DQ~6#n%(NrxtHKNQoHx=8o|8$0Wcye2`0nN{aR%<}ag?LDA1@z6ud&No~?JAym^ be>fUbWX~*_DA#@*=n@7`S3j3^P6v8L6|?@R%~JpX002ovPDHLkV1k;+Xr=%F diff --git a/public/images/items/lure.png b/public/images/items/lure.png index a148aa70db9376c9dcb284e7bb2212f0b6f04faa..1c3ea6cc8e81de83f68288e8df5a7e0095997a0d 100644 GIT binary patch delta 289 zcmX@ZvXNS;U0?Y)E8Gi-<0047(dh`GQ0uxC@K~#7F?N%#r!axvRIu*zwEtX3%3Iz!s zZZtSF1GI6HwvQk*h#t&ukLI7xD(~(OH0l2nv{; zZ(7tA0M=50Lm(1D&?uCBPLrM>(>R=jP@w6Wa>Z@KA=8w8DhXWzN8qnUmA*os7MoQp zv0W&WiX*5?f?Wd&1S3FTYg)Ftt(JeyE6U~H2kRCwS3}m2A&1~S4)GlDx z0KfqfOwW&8t8VPcm9Eh{k8>12wp8KGbtrG`e@K#3Zi5Yd_6FLkM=qBDawLfoRp7^_ zT2WVel{c7$0CI2r@ucp%0>{X%f!|~nND}bWXSLyJ@_#%(2;5zPA71{?dTRiltpET3 M07*qoM6N<$g2c@QA^-pY diff --git a/public/images/items/lustrous_globe.png b/public/images/items/lustrous_globe.png index a16cf80c3507713747ddb325c7756182ed504b41..2a854db742b50c81400efc39810996e66a99b4fd 100644 GIT binary patch delta 333 zcmbQo@tkRbayLf?8W(6J>Rv|9QkN=LpWyq56T7SE~%uMfJdB=>@pW7?mOT3@Ip*gqbps#5A*`jFz zN6dC`s{5T;cc7=H74Zxbxwh`$E2xPim4D@WeOfDSTyb z-{W>CM7k+v>&F94AJ?7l>Uvt{zxL3t-KI7R&eT0m^r?)UaY=NeQS^*`MXi-lJDFVdQ&MBb@01@J=_y7O^ literal 1054 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsC0Aai= z^a*20kY6x^!?PP{K+YLY7sn8b(^n@Q6lzxBagjZ9sX^l3|NPwzw-^hna=#x+l%FlI zN$0=XW}lh1Hzo6y%X|_!d1LPPP3s<&J?Zqf4q%^@UbjR_$w-Lp*X@0-OPM&?rI`ej zq}MdK3DvSNbIjp<749gX$k%a7%!JJ-j-l{cxWjIlZ41_Om6+N&cz)2>#mK&}y`EjE zW-I@GcCX1(zE9^>k)9VRdh4KCyXRH47pueSQyt{oYg4=LJiB7I`mSzLqsi}clV|)& sO$>5Avh?PmEmOU(Ts~DBf9w8LX^UR&*ETyBg@dBY)78&qol`;+00s?|mH+?% diff --git a/public/images/items/macho_brace.png b/public/images/items/macho_brace.png index 2085829e1ce7d41377a1fec742fbda815592c1f4..760139cf7f83e838482145cfea1f9a152e74bd8e 100644 GIT binary patch delta 328 zcmeyu^p0tQ1SbbG0|SH0lCEPD4W;Y#85my0GcZ_9XJ8O7s1e=82$a(e@Ck7R(h3R+ zhFO-DL5^NgNnXuCSxbuN%rTs^WKH+cDO=v{J$m-)|Nr-{-h1}$-M3j2pBMu*@RtPn z1vC6d0Z)79Edxqz^>lFzvFN=U_Z#E{&F0!Ysb9ZuT}Kj|9C% z>lqzVrwaTyefss`4^tgKsAoIRxiw2E(Ef0iE61}JO3q?Zn_hmIsCu{b7t8NgCevoj zm3l7YDe%bw8`5>W9_d%gT1Cen0rnvAZ8) V6}8zp=RVL244$rjF6*2UngH+9myrMf delta 334 zcmV-U0kQt>0`vlq7#Rcu0001iRA0026e z000+ooVrmw0000jP)t-s0000WARx5vy*W}rYNT`j|K6OOF^k2NF={!Sq^!lw)k=d> z)!ydr?)FMrV$y6{qyPW_0d!JMQvg8b*k%9#0J%v-K~yNuV_={g5EK+Z;WH{JJE8~( zg%!I9peRUl6m&$=#i)N?A|TPZav@xVvD}eyhvV5(6X60b0@Aw$1Z7vklrU})-0dg8 zz<3s}M_Qu$)jD9FrGRnXe|z&7lidhY86^*H5#B1j1t|;|1%b{*4JAg2 gEduBPOS?z|00XEh)wqhgvj6}907*qoM6N<$g4~mS2LJ#7 diff --git a/public/images/items/magmarizer.png b/public/images/items/magmarizer.png index 0fca34c1e28d63c4d8de7e4e8d667d3e5234585d..4f4d5f45851a3feeb00a81d18ee7f477872e9d0e 100644 GIT binary patch delta 264 zcmZ3)G=ph^WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP{=YgOiD_sPD)RZ||Nn!!ySu+FSrWYC1rtyacS(?6FvEX1s4c6#3KZ`1ba4!^=)HSsw^)k- z2TOpW6VLzu2VV=6_xE>3Yxf?#)6`k-bD7)yiT@kDc|_hMY^`gYEEeH!{o(Ya z*U^jHpH1?M%2AoW==hs{wUc6pXHUo}t_~|I4&zoo8 Fn*iW)Zzuo& delta 274 zcmV+t0qy>n0-^$t8Gi-<0047(dh`GQ0O?6YK~z|U?Uum}gD?z586_*QN=L}iD=z%iI62^jZQ$21ENynoJ-2nV|eNFo~8Okmj` z1$6NQNkr8Fn9{!I_`_r-Qi$!0WQJ!Ys>C7T-a5j1l@rn0qhL3 zF5r_5*EInGcTGZ)kh%dQO+pUt7SKebcY+2s{W?k_QWv=YA8--43ap9T_IoyJ)L+yG Y2y3}8ACxtR01E&B07*qoM6N<$g0w1abpQYW diff --git a/public/images/items/magnet.png b/public/images/items/magnet.png index 7a07f557ec4dc2cbe3e5fe9ce6b828180b4b3914..9ce8b686e9f47413ebf2e3dd70887cd442a65967 100644 GIT binary patch delta 259 zcmbQhG=*t`WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP$;$pf?}^IuQfqI zQBhl_ESa)q@0$N}ru^T#cgmdqN00vhd5Yr!P$_RokY6yve?|XsW0>zW*6%D)G-G6G_5yFta;Pq@Ly}U0UJx!-PpyiB4^y0Yy9xx-vfys4k(|z zUTy#JhO>+klVbdJp;e`A0UuTF46;Ei422t;qGa? z3ir`BrPsNzjRX+^IRW|Ht%hp}dG4`54VUV{%>}ODt8)#o{&)m6T-Kkx_Yi=qXc`g`V%)IrC%hIg z{|V`aA|O=@47rqg0z+>^EieqO=Oe~#Jp67xW@ctSl|Q+%*)gZl3xxmx002ovPDHLk FV1kw=Z#)11 diff --git a/public/images/items/malicious_armor.png b/public/images/items/malicious_armor.png index 495024ced208647a1b1b0d61535f1706c91f2c55..a37e21db2f10b2057f9c3877ff424d4312e43491 100644 GIT binary patch delta 662 zcmV;H0%`rf53U7}B!7fyLqkwWLqi}?a&Km7Y-IodD3N`UJxIeq9K~PLN<}ITb`W*Q z&^lQV6>*d*7QsSkE41oha_JW|X-HCB90k{cgCC1k2N!2u9b5%L@B_rr$w|>gO8j3^ zXc6PVaX;SOd)&PPgl3hgW?%wPHOojR;$kkpDh6K>!UzJ0Vt+_trk>0!X5l%$?&0I> zU5saWpZjz4D+QAQK9P8i>4rtTK|Hf*>74h8!>lYR#OK8023?T&k?XR{Z=6dG3p_Jy zWYhD+VPdh=#c~(3vY`@B6Gs$PqkJLfvch?bvs$gQ_C5IvLj`Rm!*!aYNMH#`q#!~@ z9TikzAx5i4ihqeT?Z-X*!;U{iE}2{vFmf!Q1{IRy2mgcL-I~RzNjE7J2YOy?`y&bj zcY#*Jw!e>UyLAHipMfi_05C8xLPBF&T7+|RoLY0{eUtWtjI}IkQp5lN00?waPE!E?|NsC0{{Z;N zyT1Sc0If+xK~y-6-IBo$!!QU#4P?px|M6_5DkROc)1+y>q>5j`&|-WL{tSSm;|&0F zm;n|TD1Q{H?^GjU5!e9UIpXE3(j-s{1dW!J3UM7O@GvuPe24=8-qR27YQ;1gFbFtb z6OcV_88V~%P{;soEjT^v3WzkZwa_EY^p|B;AS6aOuUa`JYYk_B*)?eQZs!(Uu;g*>rb-fa6h5 zJZ7x*8idjDz@nAHwAyOD>(rZ3Yt>c@)~ofXSRF(=Ui~)-6ldI-J^r`f`~LU7|Gl@w zo;fi_HAICVNKAT~H3z;?4B$>#e);(~&bf3#Pk0y7++;Z|@lPV(-*pA6M_C_l&K1 zF~&rjVh8dsns;8Y)jhuVByrZY=d))%e2&`BRIZ(NHF|A<|HjR1ymI};dmE$9XX3H> z#TOd0Y%50B(uuz9+4pTLPTiQZWz2y)>+M^jdRLWwiS9?ud#0R-Z|>i#YEpUrGsm8* zE2CA{;+x_gExWPvY{Z(uC4C>oUTPH ziaQw3R>&Fxm1QU z4)vGhU0Obzy0+lb;{7dm4)$9;_yqUI6YIe--SErjsN8!G+#7Fxn3k5iD!1YL-UWFl zH`G6FS#+xTmHFn=iLFCdImKPkD7G6O${>4&Bb6WsNvcjxX7lqG%v#m9VEOKR=}-9c z(8Uj4!B-DCCv)=a(1kS5KadA)QU0_%2|=RYRqhC6ef1y&>3WZMOqHkFGH6!tsu@mj z0(HRahiC*bCk6ZrI|In56S#Sw1$(&f5Qg%c12UaeOXcxr$z(PEGU zMa?4TqI0Yh!X$8I!HQ(rPir)#rKRdpomvpx8q#DkX$Y-GtHmJ#m&$xH6Tp4as1Qk* z#tI}> z%UjWsqs$L9IY1JMMHZx%0G~Xn-JN4QeEr3uCzu7tYJdlLAxwh1ksVu2Ot;xP&`Q>B z-s=x~K!rO{GVl6dn>XT7{shBs-yFJi@V$X-&r<KfDa{Ei&(Xn8 zBS>(%I3s~405$>F>k=5;q;qmO!?F~^5*+E$bL~9oK1pVLEKqnLvzmt_1jjI>mU7}O zr`O?nKyf%_BwaYEWwZuB5+-2OxBF*_JS;uN(>Wf6hl4x@oy(Nq)S7UTa`=nw>t1yiCx6`%HMh4mWJKaH0lsw~(EXz&X5!({MjCsVk(JvY{*@(o_Hd diff --git a/public/images/items/manectite.png b/public/images/items/manectite.png index 0dd7406cdc487447ca2ac6d8e089305476b70cb9..c9df61669bcfc669b3165e1962dbb20815ae98d5 100644 GIT binary patch delta 235 zcmey$_=jt=L zoTJHWul=9Xa`ar!|Nkvp&prG8{rms_|3l4tE&!GCmIV0)GXVK;pv&U87ATSB>Eak- z(fjt|LB0bD9Lxc&C)?iq-(P<8sPvAMl=SMi-pL!L%(Y*6Vw0HKInS$gLb9tm9qR9E z8#20Ztjc=5modQRA;UvOp#on)=3r5AhH17*IR!Q!{C=<%+dN=e;(6=$%CjkjuRi^Z bw62u=K~z|U?Ulg^gg^{MEoJJk1l#av30^%~ z!nELVOYrK^5^Q0P+5LemF$iAFEDL$?QAGG}!i+Xe5Cp-$l2Rg_>c#!C(>#oHv@Kt& zh@gOIqStm1<%!EVx#Q=Eo5ZPHs3~zPpd=m_kaDEUD@!1_KV1oY;xYv*pd%a6O1KHE z+k7kGB2Y^CO5g}u2`zwkUH8G&BxDM%r$A4^P67gm%j&I!7D2gu6`Q)?xl?uNq{zM91v`V+0 z#`5%#Hm53s;VE6`#B|05RYu0{(hQ>PA*%#GnoQtc)W!W^<+U9WXPY!a6&yPYPgbhz zayYW;`6X7%=i&}4{R7T6bSU1xJmb6U4ED1okN6Y37b{pl*!cYe+wX0yfeGy9qJI6M zF^0@L*h^MCbCycm@x)JHA#>G_e)#xpK0O|e-RG^FCSLb{ fe*5w7y;V#vEjS9L0_bP0l+XkKWlNW* delta 733 zcmV<30wVq80_p{j8Gi-<0047(dh`GQ0d30D zM6#}3Rn{TFfoo;gfoml)Rol8nM&b&t$hd+7M;x6yVR9ZJA#~}U8iqqM?|bje-1klj zrBaDL(ms78IIxcdjv4s;1`)1|xdp>N$lbRDE4N;!{@-WvhkwriG|3!9VDAjH&mPHH zjHz{BQ9vbeP&W1kO_=&kaMjUnuMFe1tXA1S{4CO zKE$VXVb3^PilYY!m)bNc_82URxc=ourUM+&Us+=s4u1o(%h4|N))LN!7&A+NMdyvE z_RY&HNi_ff3;>PrB;*ux`Y~qqN03DRU`kUX5bf7@8iAE}yPZB0pj=#XCYB;LXaWY| zp%13f_Xk61Ba>;-V=#>Xh0YV%?h~~J6{?=!&}8# zIF<8@4SxaX8OjH+)OsyK_~_%)%GTYA9zyQ=+qK7RSQ-KJ7e<~ZB$y00Epi{OxyGEz zb*)u|sJjs2S*i>BJMj%+%MFUnc3C0kqtv`c)hE4Rk{g@n9%B$+=Po;X%*o0C#$e`= ziT&<{lSw9Y{t(Th^RCA)+A95-mx1(Eo4rCtvsQvE;Mn5Q$x^<#{5=ThenJEvE-;XY z^s|vgog2U3lK?i2OS49Z%N8RhoIDLArspYAl!ne}dDj%%V|VszZ{>e|e2$Is zx1I7=LhVjA)LlM*VB4x~<_BIKYM7!9ea$UzGqV2<}PV2FV+SY1p$e)09HYrO{(sy z|BSw>3TR&0@!8b#k@A7r%=h9NJ|BFN|NPUlhWYYE8|1W4vb&$=xw`}C2L?}9KbLh* G2~7ZlXOIy9 delta 369 zcmV-%0gnF20+<7k7+wSe0001iRAxpdkzpKv@kvBMRCt_YWIzLq*aZaN3o^VHd=D336aWkV{{R(W6kz<%$p1m$14slS zAoNd&;l9Fsgn$xQ%RPJojEW5JJ|GJ)DKPwdfGnT{wB;U(fDr$EWP$Sc0w4bib|R?= z{k=6{HCzP)V>^(^DA4f%?iV42P=?k2?jr=m3W4N*%lQZa0d{EyzX|^l0yE2jjt<0D3U&cA`33?UJxkook P00008NkvXXu0mjf%M_aZ diff --git a/public/images/items/masterpiece_teacup.png b/public/images/items/masterpiece_teacup.png index 36b8c39dcc7b67e429a09a92993c78b001464858..ec2455c07637f7af0f3a7df5beccc05d2db39415 100644 GIT binary patch delta 203 zcmV;+05t!x0`vipF@F_MOjJb%001#DF-$r-X+#^Kmr%jEuIAy}Evgt>00007bW%=J z0RR90|NsA`f2R8Y004SPL_t(IjqQeZ9aLx%nv~8CU&3+5(-&;OXk; Kvd)Pqp$Pz_;c4vv diff --git a/public/images/items/mawilite.png b/public/images/items/mawilite.png index 95ddf987f12fa66cdc47ca5dfa9aa40414b12080..60ea4017f569357968d170ed61f8065cc8db85d0 100644 GIT binary patch delta 234 zcmey!_?vNpWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP;hbzDo!pwx3~D& zz3Tt}ljmgjoU2~@Y;Vujt=EnoJ^KIuf79=)F9DVEmIV0)GXVK;pv&U87ATSF>Eak- z(fjt|L9PP|Jj?-G=bm2m|Nq`>*8F412hTm5<*qU7(#iQL=eLOk7EHPrwU*zZ<@?@v zX~V{D)e{bxYb{p1?qraYZEC3QGBt2;vM?w+awFhUf9H(=)dQ`QmA3RRHxvH*qc^wq b&}Swi8Ky6Pm3#LCZDsIu^>bP0l+XkKH@R&d delta 224 zcmV<603ZMR0r3Hl8Gi-<0047(dh`GQ0Jup+K~z}7?Uk_!fG`k69VN3kf-6{BTDpQG zxPqmnWm-#1%d8Ro2Pa1e*mx1)9()iH{^N{iRT+k1{1xY1lqp`^w>@QBuMBe;5fq@z zdryh6rG#~)`z)ef&V*wqC-Ed8C0-Zca-^=C`xW3?3Lq*|NLdABa0qh}Y64R?K1!$v zEX#gN;PXo*qyU~(JqNi-@Dxo(_B*-tA0VD_ooJRuGfZ~%qT^vI!daq9M zWMWq2U~v?Q`S<^Rht*7(Stm_jW>2pV(sTJQX2g>%ms~wt-&u}>#D=K`S z;r;P9XMc+@q%(VRRupC5yUk=Z+U R7`PZ1JYD@<);T3K0RXDAe8~U+ delta 279 zcmV+y0qFjr0;d9y8Gi-<0047(dh`GQ0PaadK~z}7?Uu0-gD?z58O5uxMn<5`2wB5p zumWXDuRuvj>mb5Up%V^;J{)(}-ES!LpU^kBX=>HFTZIsENp$m^-$l_Nq;Xm-;-c3$ z=CE0! zy#*l8+}0pXp2M&T=B3@cngc-000CJ5lnneJw%tNF|CYIH1^^(g_x@jf_wN6iI5bokfN3 zGra%(=In0~hID36&WfV!d$*a`W*l64ltz%n0PpM)K R0|OTWgQu&X%Q~loCIA4#ddL6( delta 282 zcmV+#0pPPxgWhE(t4XPANe_`-{#y^m*Yt`!CDuf_4xts61ROJSN#*4h= zDG!P3D8tkzZJQ*)e4ZDHak7V?IYkJ9(3~=dxD-H}L*M3j{eRm0HuQb~wdrXNnFSI} zU`pxfa{zc|wgxmAU-u-M*LH7eP5_t@g31B7WPlLdEyeSnGdIlu0ni-EP3)Qh4N#I> z2981yz$F6&(62wY2Dc0xF?Y>C>Gxau4wwV**lB41bMs#-$gSkm0P5*oZ$!0Yc-o!t glFMkTR-W|%uM^fuZtW*J%>V!Z07*qoM6N<$f;UuvfB*mh diff --git a/public/images/items/max_lure.png b/public/images/items/max_lure.png index 384db7d7df89d00eb8168ce50c04c1ae8f6702b2..812229d140af16c2b57ba4287ca362ae8a0fa1d7 100644 GIT binary patch delta 294 zcmcb@vW;niWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DQ0TUl=+-nmYiYS8 zO5t8m_0ew4XL}9*KXZK7z2^V_z5mbN`~UyH{28M;K-GLDL4LsuKt2M5d)*cR$}I47 zaSXBOy*kNSj75=y<*0u*&z=9fxa-fg7|niHmJpO`{~_|!|5l~^IoG3%%`;-BOV5!! zGCf!Ebp@ALy6BPQoOxV*tCQtc9$3xi@4H;)^852s#Ap4k`z6pKReh#wv!j}ja)_X{ zS+w9X|5&A{X!e4UDebM8#p4L$;e|2_TEOYd(kVuo? k`26(z#rgZcnSW+XT+HUg^YZ^(plcaCUHx3vIVCg!07mM7iU0rr delta 582 zcmV-M0=fOR0@MVM8Gi-<0047(dh`GQ0vkz0K~#7F?N%Xl!Y~j$_9iw*WgU^o)eVW9 zq_T6Bo5XFBIV8xsA&Z=h1lLJqWao+l*YQ)*6~-Xf?LExyy)DVLcmL;KE~U|GwdkC7 zaZYex{}VX70++uy1Nnj2#sS|^S6u@6EON+gH_PO+$p;1F6@N&vNHl7+VXkI^$bBxr z(?LlhT`Z{+W>{O3;GO}!^8&nE0#_%Khifbkm8bezIp-3n$S#R0yEhqycV(tlBl`?M zX4wyQ@?f|r#n#}jV{8I4%E$l@{RIUBcLx{GImRY{_)X(|?S{sRp<1f?5gyT)nUKpOG6o@AMoRk5|TJHF62$(hDe_M%0hnJ9hyt zA}Aoekh;ml`af0XhM!#e3;%w{IN$_MIjtsQ6fYd*OhCqX5FS3d4J!y3MaUz~q(7HT7R(>)j)cO8_yN z1bO!a|0Fs8C^`QuIfpJmmMur2Ge@^DOx_$y(|6MD{pJ z|2RtGJX-%WTD?eUw?uooLwLDFd%Z+^tW$NAV|%(~b^k0fI3P-6a5Xy#6J{$q8rKZ~?Hi>yG4w?crNe}}qp zgSvQz-fDo}ZGW8Jah&FKgX40J?rog*Wt8S|l;(Am=5v_lb)1-ii?^Yvy0EwIg`EG1 zr1qJ#|CzM*qp#zvwEm>B|Dm-1rL_O9wEnNU{Ik9Ov%mkkz5lMo|E10LuFe0l#rCqz z|F+HMyVL2u)BnQF|JvsN`u6tr|Nr*?|N8&`|NrSn$_kbM004Y+QchCzl2=#4Fc^lbA|c`cYaJ+R-2(?8?&3n!Dvqj9tB9)xi#Vb< z;Ln>-k5K6G!YkjKoYUvYNxnB_n12@tYioaj5PH1>6LdAD%gY$&a+rkY%N+PNHb#iJ zvm=UPUU@SZ@F~m_oM-yt?S3jYV7Mz!e{`w~8%07TT6b^VVQ)m=Pk3-VoArQ#Q1AZC zc48cf`tcwYf)5&pkJI6IONkXiyWKL^C zG$6|?i7W@A4c79mthT6679>fKeNmg$ylW6wNaDb}Y5El)MM1y}WBmMFQ^Nq2f23T1 zw4Tkuy(zT+z4?CK8%XcMf}0wQiYK-_H#NSLP$AX>mLb)%GbDF p*W@0Svk*zi*@jr?oBYE6lrLENad~>hTsHs!002ovPDHLkV1i#~rCR_1 delta 948 zcmV;l155n$2gnGJFn<69XF*Lt006O%3;baP0004WP)t-sDI_T=C^5H0d$%x5|1?_I zN^t+S&Hw-Z|0p^C+UEZ_O0qwTtU!zZvc>sOV*eyL_8>9-Q)oF982_cT>0fHz6d?X% zb^foqw?cr$Onc%yTL1e0_Bcu@ARv20O#k-({}?g= zx1p)#bC~wB%`qS#{-mHtPB|5ah%gXO#k}!=DX9R1R%v)W$uNX_M@-nb(Gar zd;hMqhb}?YM01#di!mG^|GK^7a*jC|5W29p=5?IaR2gugGe_P$TC@}x0001-6+RXK z004Y+QchEo!2xlT&;bg600C;+F#rGn32;bRa{vGi!vFvd!vV){sAK>D0o6%FK~y+T zy^`x!(=Zr^!<4L0E@D78M-UV!8?=-$I#wv)0JUS_g^L#yad;aJVS-G}Kku8%)=oHw zZ~Q*w&B^oRyh&QbuE_NZ2(`4RsY*ydkVxdlOe#vqfrdew7^jnwY9ec z(K|YHT^CAQoyf7XO9L#JERpU`h2+?EOAtw=&=V4Flit2NcX1>p_XCgLOC1!LnArZqWf+kCriPfc0o#JD6% zU?@GEnQz6Zf<^_Q4exa0Icf^i%XAa&dcY$T$2F;?T;?&`pW9#Cr^oADEMndww}#yYy`sa zv*#GECT#nK6ke`xZf)RXo|E;n6jtj(npWNGj`>_A9Bp|maH7(ORI4JEZ z;nU|Y`(I1n8UhqlF8luB_sUV;Bd!hkaePu0L~sZy`-Pu}r$?UWx^^laKRy#Y5Q@L} z6$v5kdF}U~N~I1O0xR-I;!j=sOKI?52Lha7gOSWt|I%UoOvuE!;d-kpV>8S>wBJPqPzhH*{a8O%Tdle`=+tbA{#G?1=ByX`J z3LGrV5(4k*A7q-$41Ha-tTg=Vlh1qB)!X-k_*L|D+>kmjGcTHX4^uO@etBV5%}(xG zr=lN^4*0d6X}1>Vaq~O3dy2tq<8!CI9X76boWoNX(h;HhLpX|US4gN{Nhrsv?|X%< zL~_@%7%h)jZ}Ox}evM~6%Y%c{(pP+|NnpG6fIMrBJPqPzhDL+9|~&AYOex?+dW+zLo9l)PCCfP ztjOUaF4Oq+zx|G$+lwy*PyVJ_^-)N5S0t z4=ism|HE!9PdxD1ZubET?rr(j23iN->?_{9o~w9OSyRx3s0;2F{5W2>_+)7n zYgIE$cKOczEaGpH^n00AjRLn#f`4Xa)K3+EwTorvt?SY3KsPaXy85}Sb4q9e02O<4 AR{#J2 delta 260 zcmV+f0sH=u0+j-g8Gi-<0047(dh`GQ0NhDLK~z}7?N%`kgD?!_DS2O4#*Q8HjgE|6 z85ukB1wVn6_M#d&R@8}eRVgPOB38tmoy24qIy(LlDW$!|FmYfNsR)FafXHK6b`Qkp z2DH@37=o6FQI|q9zvg_D9q)cjse~7|qF$V00w1#iHhZOA4t6jTs~0q8}QVRyryUP?PU&c+MvjqRrJ#zPPQ0000< KMNUMnLSTZ2PIEB; diff --git a/public/images/items/max_revive.png b/public/images/items/max_revive.png index 25849a3b940c1dec396c8c00277d0298098a54c6..609fd17c3b9b049e2858c551e951b0144a1f757e 100644 GIT binary patch delta 241 zcmey**u*qJvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gBEToa6-X;6D0q1>ELmdt>{<1< zZ%6OFd-wnUe;&SXtw1@Bk|4ie1|S~D0EbTgZaX-8%6)6 z>mBCmvE2NZmKn#+UL7mX9q`5cywkzR2YM}8%!ej33X4oMUT~y2;Xun4F$RYehPev6 z8)U5~Onf^}VRol`nAycYGip`m9b)|!dZw-;BY4K%rUKpvZ)Wac54#_nFyCzMe8zg` nFHhLkuWsmKno|ER{uz6~bLP&)91lx@4r1_h^>bP0l+XkK#ye*5 delta 238 zcmVdCP$MG-A@{5ts0wEF*2$QG@K%!Qz z0xTh=2@!yV%hq67wE#;9)0D0<6F@My6JSgvbZ|?c#p?qpFK44m>53)ReJ@XVErD=G z#I|kjmdkcvWqQG`;dc_I!-xfH_aDLLGXRIM70zSXd;s;r(YdPtcPY0*@42f$?JFlw o76|!22o=y0VFKYls)Ki2wiq07*qoM6N<$f?+ado&W#< diff --git a/public/images/items/mb.png b/public/images/items/mb.png index cfa421d621964cd10288661f676e92c65b791308..d80b3b891086124c530259cb88d02aa440a44cb9 100644 GIT binary patch delta 280 zcmdnNw1R1ZWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DQ1A*0s;+L%GCW#r zcy-c}klB4&|e*1s)KM)8QEH447<|_&E3uXWbz(KgzZ4sc%Bu^K| z5R2ZYlMV_sEAX)THZ(Z=`(OUMo@4EFm+JiM&F9|uNlbYB!}&zThO0X=S8Pp_%je{p zCGecnK0V@u)CYkztWP#G*{O0Y;j`H-VBVDSJJv&BN);=s-EM{J-ApwHG-g!3o^+Fa zL3aA)1MiIuS8L@@ve%HBb&cinV)yi3rKO23a<20EvcJFX-(6U*yf0=({4>_Ox@>|f UY&u)#0Nuyn>FVdQ&MBb@0E*>$tpET3 delta 296 zcmV+@0oVSh0=NQ@8Gi-<0047(dh`GQ0RKruK~z}7?Uua_!Y~kpJ&IRINl8nYF=#1M zvH~My1XghA6;d)nT9apS*4dnuB9|Z}Kj|q7xxDXT<2@rwThN$^^UbdE-WTjvvCtw5Y*@N4I`7eGkuzAude+$seweV>)UKDh=aIA&A| zaE~MIw-C43m!RA#x8g9|Qy^Cfz0}d4r5+?kp*zjY9t#W<>0|Ns`NswPK z!+!|4dMd;SD3;~v;uvDldv%f{-vI><7T3hT|NED=FFPbPd)}=+ceNBD&8P7mP0zaQ znsYdO{?0wnA{KLbDMN&S6sK70F7XMh{vA!JjY1w4CpfDger4I~`9VKg#piM|v-%ef q)h$vdxc4k{mE$hiP_prU8bi=!wymwMp0k10GI+ZBxvX0 delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_lua947pz*zjXU#e)Qo85SND z7C=dJ86QO;#ZeOE7yKUr816OijRcBu7I;J!GcfQS24TkI`72U@f)hPm978Pp&rb5> zYcb$qnXGpDe|=Bjt#e6Ck4%DPCcFp=sSo1#+G;O+h-v?}=>kf9f?F~LCM>eyx}Y0uTg`7xTB%i=r`E2upx`^AMH$GP{ye2$lrs&?r>GD8lGB9|$ M`mwsKb4q9e09qVpiU0rr diff --git a/public/images/items/medichamite.png b/public/images/items/medichamite.png index 4dd57f10bedfd06c85817dd410b3e32eb9b8bd9e..42f22ed6cd68478734f6ff7e05a7c70c4afc0b0f 100644 GIT binary patch delta 231 zcmey)_=9nRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP&lfX{VX}?e~;DC zsGjPr*Y+;$S=zJp|Jt=%&mH~$|Nn3HSv!I1cuIo&f*F8(7~nh-pavAr@^oeH}~zH1RtJlWuMgV23=#}uzac0RAH!o=$EDT#>P&8 zl4puWJP9@r4={PFJh-RCcFISOC*xbkR>qG9tRG4mdKI;Vst0BR>?C;$Ke delta 230 zcmV> zG^*$Sv*e)v|9h;!G+i75vY>kFwg3Ouu7zNr+TqD4>S~$N?Zs6W^md0wp>?4uF=5G_@SPD26!%X8C~C33Ru3 g6pVsVFbb#*0KGkORUPS4`Tzg`07*qoM6N<$f~baFE&u=k diff --git a/public/images/items/mega_bracelet.png b/public/images/items/mega_bracelet.png index e593b9076318f5fc09697995bb963dca150fd48f..5e8ff02be8cecb20209c84607ff62874d40dc302 100644 GIT binary patch delta 267 zcmZ3-G@EIHWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09(If?^5BproX;L3_^z zMHM%DMIGJZHRo#ay{MzlrYzZV_TIg3-@cvQA$Aj}ny)0tFPPy!G6?s&EdrEj^>lFz zvFLp}@gm=01rFElZ42Ul{J$?-ztnfzO5>Z=@0%yxnJg@{?d{3^ii`4IWHl^SU~_Ak zQhZMQ0duzhgs1)rw;5J^lunT5y&(MY?~65}%m@5dxYq3W{?~}5G3e1_dA2E0!eVV# z)@<8iuw?Jn*kx@B5=Amh^S%}`YPkHFDgQW0>GQXfM*0_=S*yNWTHpwD5re0zp9{-6 Hr-UW|Y>0YX delta 286 zcmV+(0pb3e0vp05_Hd7JMU0@p=zS=>ZQ2J@2I3gxAUDedlBa2UD*UMd5P!MZ2JjRp6nEjB0mLGw zNC)sfQD|-?9yp4}!XRfM%K!(9MQKE09P?^mzwUr!0@q!A2$b$IXORw2{N#L~ahs%x zMLGaMJDfw?VE}9F{jCEKYsV%CgIL#gDBl6e1lJJkZ^HduoPtHgrGGq)&;-Tf&#w4+ kkTN4tk8OoQu@^dA0b`*4Z~8Qv-v9sr07*qoM6N<$f^f8a%K!iX diff --git a/public/images/items/metagrossite.png b/public/images/items/metagrossite.png index 445deff40c134e9e2e925009497899a8a546990c..c245368758d8760651485b8b4468dbf6ca2f4f0a 100644 GIT binary patch delta 249 zcmeyw*u^wKvYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6DBPP9v}H;2k|k4? zteLW9%ieo?yWgE%)4ccUoTK-a9KCw>?AfdL-T}e?|Njf8&N>LxBTy3L7t8?UBZC70 z-OfO{98VX=5R2Zo7Y_d_wky9(!uRF*=?!U-(~s$@ z1$;=d>tteV*}MJ-i&hMSi=?4;Lj9qJXA(*bzeVf>7M*Qj>ggTe~DWM4fDmi!L delta 225 zcmV<703QE}0`dWn8Gi-<0047(dh`GQ0J%v-K~z}7?UgYOgD?z5IZDpdD>1S%GJ0gp znvpRhYmVS6xHZVgO{rLLs!D#+7a1b{i-SbhIgaD}D b$GMv)JrS6=W!)!r00000NkvXXu0mjfDq~|J diff --git a/public/images/items/metal_alloy.png b/public/images/items/metal_alloy.png index 1201f58b463948302c4ed106ab3eb52a8e2e91ea..41f22df42541e8129b59873d11f25b4edc8bffea 100644 GIT binary patch delta 223 zcmX@k)WI~tuwF61C&ZPDfx*DQz&o%vvSd%qq|H5@OI9!0viZ=RIp;sUeEEY|0wKykRg4;G)w!!v5#rIDy!v9KU>eR`5YnSv#+XA?yOyZyK&--a}}5MHvC+A z;+ODK&JK@B!VPi`&tFHq*HnAy89aAy^^_?WOkUlJbro^ETxRt`%k_?~?^)0K8Pe@y Wte?AlCTs>eg~8L+&t;ucLK6TUg=bX& delta 287 zcmeBRI?gn~u%0E|(btiIVPik{pF~y$1_s3dpAc6A1B3tn|G#|yef5$pJ)KK7AG$N= z{HMs0JvEaydk6LcRZU7;91f(oOM?7@fhwVZ!ONfV6Hu75z$3Dlfr0NZ2s0kfUy%Y7 zoZ;!>7-Hf7bkaegW(6MB=9UFN|MS1A_jXXY;`jcoTu)j#Tl$nQ-2bHnUTpW{Q4o%p zZCX&xkpC`qKEtgXX3zWE7&TtZ`L6JTXPd&0$C@9)i*v6(ynbNgWn;B^u3JBso{-a+ zDrm6zN;^XYLv7skJKtA^92Kf~QM_ilLze608(+Q{J1AxZUCB& g8$U~MH@@P&JW-LgtoGg}peq?XUHx3vIVCg!07{F2X8-^I diff --git a/public/images/items/metal_coat.png b/public/images/items/metal_coat.png index f016d48bd2ebecbe5ab2fccf1984b7db0a299127..88f055c3fb396e46de6959d2dbf81a078d7c5239 100644 GIT binary patch delta 221 zcmaFK_>OUcWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME09)DPzcJ-&TeVhdi3bM z_wWDz|G%=oBoipXUJ~RN%mCyA!P5F=zkxy}o-U3d7QJ^TUF2&};BaMa`TzgPf=vha ztXn(pl~tu>`ny*-Z}T5c6gBH#m9KP!y>H>>gJGP delta 216 zcmV;}04M+M0qFsd8Gi-<0047(dh`GQ0I*3!K~z}7?UsQFfG`XM9i=n5M%U;{j^G-u z;0Q{DhY-}-_KPTac%%XIM@dVE!R2xlXpC{oxofc1vaW~qI)reT8lDTbHGt5=bHTRO z3;}@BV5k{D8q@?+0j7B_4i?3fcmUE&{3IABrVD_C%39YDrcu8%06^3L(84iHB>?(A z>JZ|VyEA5^`w*T<>UuZ6KZFi|Ml}G`qxjlApdsvTT$%nLu^@Nu_9Sz;eytsrbYr)b SjNV-U0000)E!!0o=iD^`#ifscBvg#?E7Z< zgQJ^~+JYD@<);T3K0RTpNgTVj* literal 6500 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 delta 235 zcmV2euZn4TXEbf^T z)KWcX?a`%sm+n1!Z|l9IM~~jS_w4`w|H*=7|A0z)OM?7@8Gw8^&}DI43zW$6ba4!^ z=zV+9k?(*42aAJihW3~L@82f9;>}69w7EKUQ=mrbbAPQ(GTeqwmt^gq!GF~yq3*u6 zA)^b&s;t+084F?_GAvXSQV2eBAdWHNrt%jV(VO}K4`p2n8@VT_y}T2itJWPl{e1G< bCzT9lUCa!}#0?Gtt!40Z^>bP0l+XkK{iJ2f delta 226 zcmV<803HAQ0rLTn8Gi-<0047(dh`GQ0J=#;K~z|U?UgYKgFp~PJ<47oZH{4?E2KA}pTnqK7X(3YRZ>dAXR({$)p?Pr- c1i{gK0UPpXK`4r!^#A|>07*qoM6N<$f?*D3p#T5? diff --git a/public/images/items/mewtwonite_y.png b/public/images/items/mewtwonite_y.png index eb9b1d0dc550bace2b5fdc8aff3f6d0566f1a917..ff0c53396d2bbca151386faa40925a4db4cd3d71 100644 GIT binary patch delta 230 zcmaFM_?>ZrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP-wBro)grvG^l59 z@!F$v_8wij_ukffM~@!8ckkK%|Nm|HHoXF><0%R93uXZFVSw{UfErLd)6>N<#G?1@ zMMu5^3LGpBq8X0=|KHbJcJF|i?e1{3c3%Wpqk>31|57MzHLB*BkK_ANZc_IKb+$xa8gHcXQ2F>&-uIb@DUA Ydkdyp=~E9a0NTpn>FVdQ&MBb@0B1{QQ2+n{ delta 220 zcmV<203-kR0qp^h8Gi-<0047(dh`GQ0JKR&K~z}7?Uk_!fG`k69VK%(hHF^5f~6za zT3TAB%o-_OBk~VUjzhHZBEmiRC?fpl8DrBpj^q555JHiuUOabWS-PpjVWndg5fr49 zO5QRBYCye`1y$k_JhE5NxFAPI{pXjK6jUWi)4OaQC@Ny0=R z=lxbf3gBMTbwF9-7U2+Da^G%eR#F^h2dXa9ui#g5}RZ*u?z Wr+f4qvh+3p0000uTO9lo8j*=k1 zV21w?aP?G(5l}44)5S5wqW9_~N4^6J94xMhfB*L{ZC`dsYWBQaeeP;0LYhzGJ(`|% z*)`{I`23xFphYa^@=}Hf0Vz(g)?MNgSp7SiQX7RlEKYD%Km5wF*YksZw2IH=WM=g* r9I9KSPH^v8=qkruvY}+-{WON4%WPX)T|H+5t!40Z^>bP0l+XkKp*d2v delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_n1KO!#r(!jBg(er(uqqM+bF zLIO}ST_JT2km4u_@(cbC0Sxz=_eKK6I14-?iy0XB4ude`@%$AjK*5QgE{-7<{%0q7 z^0gT7uuN7v{lC5^@YcB`rbi~hG80||h13Ued~LNCKE$+t+jIe?KEW-S0uvV5a9vV5 z!B{K0hoK-#!Mc&#u~KXU*Q5h08@F)j9psGRIJG%}Q!7W<=Z0!YBlpIZXhl9wk!379 zH_cnn^!9q|Db8sLO!Z7hg+flGE|O2+t$eomL0!b{&>Nqt7hV&dGE;PK<8*nTGZ`2> NUHw>H);T3K0RS7pYsvrs diff --git a/public/images/items/mini_black_hole.png b/public/images/items/mini_black_hole.png index dd7458b8b2ab52befdc84143535a6f942a9d67f0..6edcaad16e36bdb675f5af20671972267a0ab260 100644 GIT binary patch delta 165 zcmdnZxQ%gwWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgPk>K|E09)DP&jIM_L<|et6zfo zfP9vcAirRS|NsAQ)^+Fr@;y9V978O6lM^KB8YFo>co;V_>Zv+px*0HN9n?F|!G0q| z;dF9vqgKBwt0L=*PZC;fElj5lHx>j4_vswE=qqP&&_KYa$XT3$VJ9!+*(rrj?*a{F N@O1TaS?83{1ON!1Hmd*t delta 170 zcmdnSxSMf;WIY=L14D6D)fXVu=L4tL0!V+e;A`{!CXMHNL&1w~CDsiNs5A(1R0;iaM&rJxw3p&6y28LOiiWnehb!fcL>hcbAXX_Mo7~#P~V2^?Oqj-ut+J_jLO1;qo6y zMh1OPj5?i?@IN*AduH>S)eP;N`m}?8UB+41Ugsi0Zq8)>Eak-(ff4LO|d2e9+$%2q(a>;YsS}3 zx?PX{|DV-)oPDcI&GpKZJmbqE$A9{ou8RNjdDWB^Nqqq?7&`xmGP<%bB#AI`m~`A? zJ8_LgL)F0i*1Uk|*>jF8KdNfG^V&}xW0|u(9_;TnpYM)3{Zo%8-%;XQa=z8;0J(k2 zYfsh8VR1B?_oeUNSFe3xuWC7Xrxt14idNhsVah7?_2yJP$$Vpx#e$ROE@l02E?k0M%FqW}E9m@_up7{;qNC{O0SV9u9z- z)1VZ9l`SC$09Vf;{@Sa_9KHsGm0XT%k zA)0He(A?Pui;twMY<5Z1>G16Vgh=sHAjC&H1#nas<|w?zd;M$%tc4V?)4G6Qokt;R zF0SpKQM2JY1!_76Jk6+=WmBZS!XaM|O5z%Y5I~J->3^`C9uS_*qMHmkerSZ|qF3x* z=yNcXV=9d$NKgPT7%`%?%Fjye@!XpqW@%)6H9axWv%qD}rS1<1kl>RrSjq^wGU2gZ zPX?d_WV=Nn8CdNZsa~-NP&*6<;DR6ky4tGyfx)w5Xf~=qk7EiTOQ3rU|Ji{=2N2{S r68b=*OCoQW!%TE2jQ}EmsQ~x}n+j#X7;arB00000NkvXXu0mjfY2^I` diff --git a/public/images/items/mint_def.png b/public/images/items/mint_def.png index 9cd92eac07ee365ee1710a39ed528a43d11e580a..584c610ffd7c279e5104d137f6c2b34f2e1ed1ef 100644 GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|76tf(xB_Vj z8AAyfO9=%_MFmYw6-^0+APLn136)|2g=z+o9s!va35_`#7Hie4HYr=}63{s&VQ@~< z^S?{@1;>zU88w%kLf<<@zV}LeAC&n%s_=bW@%Px`pK-;%qYD4W7XFDZ{u5RDKepsg za>>W++V9oPbE3XwoLloIPquW>Fa z-jTC-J*0ke=hgfVH?}NNT(bP$={x7j%{Fg7x#|DP-|yuA)m`^0nW~;qqM-3(H-m{F zLq`-dN0I0)5e6k`hGdqFn`bZ-l)Tv+zE0`mR?9Cz|6gdWpOUV&apsqEm31pW$BCq# zT)n9#uFvhTV$>1uCCo>2w4auJ`}XDI37MMgGfyWNgq*s5@Nh^+UEj2=b~9hEVQ7B( zWwOh>_No4BgcTG_qt+hR?{=+WnOwSXU9$9JYfZzB;D!^cze;VI;eP6;jjj$;!MU2d oNBI*re!U@>@n6q3Ip6tyfV{+C^|v>Yfu3gYboFyt=akR{08R=GZ~y=R delta 562 zcmV-20?qxO1i%E48Gi-<0047(dh`GQ0tZP%K~z}7?Uuhw!$1_r`zLg8$k3r;l@=Uy zv)wE%Iu=DNv?4A_7fb3?9coKKD1tx6PC^k1UFslo*HHw)Kf~Y@f`w<^EAKeYgeFbJ z4k>&g4axg{?%nq;7Xg6Ce<~6Jga9)I;P=Px&Bs%q#na%m&VN(@Wb;n<3F?<^0Wmdz zaqUCHeSHWIj~3)l0aA&Sr!I^IkndqpS+Y5fS_Y6ICI(QAi~2XIP#Kc=esuYT3~SdG z6v{(-rg~)t1CY&mL|9Y?C|#H&2I%xng5c)@17Ly1&8R3A$M&+Y-8^D6M~L3QhHQPp zefQZ8VGbOZntxXSHfI1dVq>0bghDX@nrkbs!rU!0ZW;TX>{uGA^)}>=4N_4zNoaal z`4az=Ydy%90hTg-l9p_fI18K|6~t2p5CUI9fb5=O7X--e7$my3@2zitKs43>y=lKN z*AktP&GDKuqjqELDp1?W02{k+pe1yO#;b62_D<7)(tj3DVC%pT#t6f~t=(F#5Uycy z3MUH9vGr(v*9DOUG-m)_HE7Hrz5(1|u!!C?#YlOS3z-3=HUSE{MN+3i&csCD0@)m; z?hgo{#a6{su^|gPF%#oculDPy_3EtgZLSXLt_kXHN#4GF>508< zrw_H=JKu8eT*r-bJ@?M{JipxX{Cdm#+f&{@p7Z|U^7l`ce}BF7%gg28UoQU%B3FKY zzxL<*Ro_3a{r-LJ&kt*Veq8(i^Vmkrt zh9yCM!3_UN1g``hT?1-&20l7Tuy&q}R^n1{pZ=LY|D|NmEDUHLh~Yf4ogKGnQ7zBx-^THD66ioW;dzOMK=<%j}L@7DI^ ze_z!+i|Tjsan_jfId_xPrkuOiBfM^e%&^tDnm{r-UW|2oM(| delta 542 zcmV+(0^$9I1gr#*8Gi-<0047(dh`GQ0rN>jK~z}7?Upf1!$1_r`w<+w798x@u^&OP zirMVgevH=1P?dIcbS+>R z_y66?|J_{%05bonObUsa(9~wH7 zj{8-B{nn0Lg{1(xi7NFz&RPXfA$|>@8{3nvRENa(&*~*IM04lenm=P($pBPyo)HeJ z0@%VL`2gf|i2=xbW`Q%cXmFMzF6Wxge?xPGcp9_-(A*wCHoF0Vtriu4%^3hS9GsHS z+=I~oT1PujsekOlPnikJn7;zDt;EX(iAt-8ftqy##Pc~cYP+PSSp{P|2Ok(p`--l^ zyOs|mS_b68LI7R}yI#;xXkIQAToV(@2L*u7F$qo4oI!XZdNr1IfnH7=7|cdi$!?z^gBqQTGD9OK9MGa{&Oe!y)C&pfOhiugL-A3_Sq3 zF!8{8W>{fij0K=V(2Pdm?^a(Ag4TuD+wnpb_#Fpq!+&-l2?B_75J`L>2`X=r!%TW8 gO#xDXwHE;R0#{l6Ah~ECzW@LL07*qoM6N<$f&(J$tpET3 diff --git a/public/images/items/mint_spatk.png b/public/images/items/mint_spatk.png index 191ba6c4a1a7f58a143521b980817d99fc13cf1d..90a57c5608ba8d0e804ed01cb31ee1d38b185c87 100644 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|HU{{FxB_Vj z4NVRWLjfH_2^}D5si>lZ_l1Qqj>6!kOjMfmh8<~x0hknJ&8^CG`HPjSoWM@)pLP$&o#F_)ZF$+ zbNgc*5aYS#uIDzp9(o;q9(4S9(CzQj$nD$W@fLfHQPw?A_-N=_hq&*t!XY4ye5;?xu07>2ID z^U?gT)1oH1hs&5%KK*97qr@OEnWaH{`Nd-lH>WWq?>IHLSN%$x-uHWt=ZF2N|9QLP zpZvSI%QE)g*4+0eXU?xVEB{PQ&D=G2X{P(O+iS(1K2!~A%lTrwNI5?I{k_Tgy*p)` zoLeQ#?b+t+_uR7c+PRo=){H)O_M=N(uIODCJP`3!I(Jfu`sGZHPI0!^r8nHZyK<-; zwQm1VXvZ%0i{oOni=+U9MQK}*<|_t~n2MW>8g+Wtwd>?$8RuC@tz(LNXAbl^gQu&X J%Q~loCIE0b9b^Ci delta 572 zcmV-C0>k~d1j+=E8Gi-<0047(dh`GQ0uf0>K~z}7?Upe}0#O*p-x7!sIJycE3NCI1 z(Nq+U($WwFE`g&slvGQ!G*(cP4PAkdL!g4>QbROGL4$B&4sVGZ8^7N7o$q>{cj$RW z4k!G%cMtFT|L*&~_wF$OVE-xR1NZp84pNm9e5Q-;Y*nc=<0Z`4gY8A3)=O)D1 z00yNG4PzA@>P=49*lcX5EDQut=P;-$)g0ft2S9-s8KBQt2ClRWb>~@5gSfaqdifOd z2Ef7Fmp6bO^R6)kRRB^?oFoCt%??4B|MLnEiZ8%+sZK#LIHp$$4UW5SjOGYY?*QyS zx1n(V0HOIL*ncjyVF8dH%}+&8nOe2J21th_0nnW7-J0f3J>%44eYAmS0x~C}xoX@{ zwM{BFI4ss$=6!HSgHVaXT<(Gt*gPclmQC*i8L9^mf*uqAtf)i&wL@2RjOJ6zX~@2R z16#?MWm3&?EPKY9je)Dcnod^ar0|^%GizJGHu8|Vs((`%P{GwSK}lomA7gcJDyI{K zW3$+<3?Vc}2sGD3ugG3Na|vLGn~jWP*8om1VX*F^8L6d06;cA+6Mzb#0@&5ox*vq2 zhCH1IR5buu0=v)fpB+f-0NflzJReBx((C0g;~z?W03To?0Db_nTb8A`ITFJF0000< KMNUMnLSTa3JNgI! diff --git a/public/images/items/mint_spd.png b/public/images/items/mint_spd.png index 687119f25021d0fc405dd1d2e7b1a492e5439a8e..5420b0997b3d6bc72de7a3cecefca93976a1d6b8 100644 GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|wgmWuxB_Vj z8v#WF2}KP>MIA*=6-`YIO+^DmO#?*47HtA?m^6})(^A#=EtGn-1bl<7&xm(@xxVq(eb<6weme184)0-zO z=vlgbY3IGhIqzGR{_ffOdCJ!BQ?~w}bL5os3!uAgN`m}?8UB+GzW=WU8pH6#)5S5w zqW9^fyJ3e61X`3+wY@qUoTf&tD%pNIKhw4O;`e&}?Q(iKhgW{LQZN6UYCO|r<$lfe zpS%B;WvE)E2%fW25c;ohz>=xK@^npn^1h_UObr<<8p*w8=5HA8KEKnIvEAkG&bqhO zzx$8Zq;|GA?v?xQUs>n2f3Aql(hjzqIDZ{}c}$ delta 588 zcmV-S0<-yYI662uIGnkYOV60n z)+lyJ;Uj5i@B6*)-FtZ<00{l3LIFSk&`|*Ge)xYXtUyIHXn(cNuK-B%%2@^0cUK*V zUjt|s9~$OrS*X5lgK;wsdbi$E3QYmzGb}14&2iKcKtlW&z-^qr&XSDUr}VH+iq7K*be!F11zxkiPt4kvLj5=DB7u0GdY^qKCtyF>PEXuaA^c3Lm&?itqT+6XnU zF8~SQ%tbAlN4{@B?)`vX*Cov2Rj_#UIUiN>i@obvZ3 z&Dowe=WN8B_pWo^crSeKyYzkR+V_cT-b>SyRQA8cJ2GJbHA5d`o8M&$F-L~uD|?!)wQ3iuYKQk?f
    (W+g#>!3_V&0Ro+?^?)Wk_jGX#vFLp|DLVL&fk5ld z62^sYJ3YG7qn}RFQgO?9^#6Z$UV4SVp)2KV@9U1_{f*RtjfY&DA@$xHqWWa<|lmUzfBm z{z(1II`#RP4W>#C6S&$JRa9ijoz>&(S@nv6@z-h9?nh@-_4@Djr9`OB+JC&!lwqz- ruu%TggbTagux0$$n=W|2ua4nms`$H&=F@6{US{xg^>bP0l+XkK;@cMy delta 567 zcmV-70?7TH1jPi98Gi-<0047(dh`GQ0t`t+K~z}7?Uu1i!$1_q`$sr*a7dwpK_{KM z7F{YXP9mtNbP{wZB5fUAEL|+(AYBx7sFXqnBSIF33W`N6#I0+WLJ))?4$s_6?s`cR znlu$Vr0|in(EEP(?t6C^0f5MVDiQ*O0AmH<_e1|D#zhbX5r4dnGZFya96mZAT}ljM zWB`N8M+~*B4Bh88J`u*lWCj9QOh|b-@#bXKJOB?dG=SY$%gKiFhUo9d(;H~`S#2?M ztQmc*sI-DtfSKPkaZoZiDK8byxYnC7Lfk2+$GQwDApwr9 z<`saNQvmz=l7Dyg#SjlroLOb&Zkch*SbqhgF_20%khjVJ1qHqiWfU48+_Uc|b7@dF ztB{{sMrGoLXclO8>>%DUphF}kM1)Y6uHpMu!KdY2H{YI2Vnzr6tBjci1R(h_Gh?sD zz%HT?cic+~2-*DQp{+@3X*St_#hxvIRgC zV$fZ@KrwSuPTTcx09;Grd!d1%1Jk9Vp{0^`^{zTof&uUlJb=^M+V=x;cJN2`P{*;Q z3TC@G9WcXxb|G;B@N*Ffd?9fvZ;;DOcqt75LV&RV_yvk@$ujNBVtD`n002ovPDHLk FV1mk$^x^;j diff --git a/public/images/items/miracle_seed.png b/public/images/items/miracle_seed.png index f5bc766545a63343aacda01423f1d25ab22f6862..8be7ba72d33160b3bda09751c1f5d5db7ac20b5c 100644 GIT binary patch delta 214 zcmaFN_?&TqWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME09)DP-t%EIC|9Z-MgrJ z_p1N@e`jIzsRAg$UJ~RN%{((lQ;K^J+S!g%d!7OUV}toD$$Em=XZ+ z78uocUqK6A?_7uI65z??*7WoM`@VfQy}X@o)bumqwV9<*Q?tx&I?4k1lo4fK*&2><{9 M07*qoM6N<$f}{RicmMzZ diff --git a/public/images/items/moon_flute.png b/public/images/items/moon_flute.png index 893cb6a75796b92a2a6aa9429e199a4afbda4736..5d3c0caf5f2cc6607e182677bd5b0367b6b0e951 100644 GIT binary patch delta 216 zcmcb>)W|f!uwF61C&ZPDfx*zw&?~C=+q3GRpgBR!d$YRtPFZqv$bTSTyHBl@ zxpn#;&u4Qu@4VY|fnhZBGDErE@{|eNW;+Q8$^gTe~DWM4fY%*if delta 296 zcmZos~F~p+x=_ErTWU` zQ`0%^xknki{_kVn^SDuZ2A`&&-sA5-y$ZCR*cqQUKE71%|C4{+b^Gj&sWQKd*&5LU QbSVRer>mdKI;Vst0I3FZH~;_u delta 308 zcmV-40n7fM0>lE48Gi-<0047(dh`GQ0Sie)K~z}7?N%`k!Y~Z%Q}P~0M#he;eL_dR zz!Mnx0wW_UW1qlkbi<)j6i;!B1h(WMP360s?Ks1bmX`KwR!XtjHw8S-lg;Oo-Is^$ z#=RY;aUBv0NKiV~0OvZC0D&*Jt36-K=aeLZwSq&5FaijKpnm|Tg9He)oXUg{;Hgz= zRY8^DKGyi&O~3<(E4Zctj{T4#1OS3*aLu^_YaxaZ;OSdA_M}&pLcq1HwD_2354?*2 zD;~iC(hBYo=mxK)uK`-^#(z|y(A-mry3(nR5(okJ3Qb)VQQ1TKUhni)n{l7*7CQO# z;_<-4TFoPXJS}=fhyla>)#iOY-*o_O_SpE!3nwk@@9YgDd~fzazkdh-0000*6sU;1B*-tA;XfSImepPb3UBdraSXBOy*lY3U$X&6 zi*5VT5C8c0Fz;54diDOTkniN*Pa5iX<^ER>=-(H_&vGZk?}^wmOb0CIDJ`nxc*M0t{`2$dDLZ=0 z)1GxDT%M5eFLvI78^W`8Dyya)oy8IHyv}Lwbce+gtKO;>$e6v^%XX{q)>_qoJIzn8 u=c;qoba=e@8p^!*^u9mZhFdn&N9HT{uptZaC<93{AHwZBb z;T~SyX)wOF=TW<41ppDI>>4a69UV?>lA0|JmTCPOg*x7k05UPX*~R)8f4n|=V?|9)w=*+T4<{oOD%2Y&KW dT2@(}>jU22uPb((csKw6002ovPDHLkV1mVFkfQ(q diff --git a/public/images/items/mystery_egg.png b/public/images/items/mystery_egg.png index bb117a137b0a9ef2cc75d1ec041655f5d820a092..ac631cec7c82ef613d1d7e6d14a1e168a26c3748 100644 GIT binary patch delta 231 zcmeyv_=9nRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP;i_R)xDsl;-aa>SXu2}Wnd%}#3cWOD8tyohmv_0Yc(KoCQX4p0UyWX60|MSb8 a_Ope5$20xC$5#Zhp25@A&t;ucLK6Tqo@j#r delta 235 zcmVg+M?vA-L5{PdA(qu8su66K>_G{EP!6^($^HTk=W01z2EfbcSz5jK l3YGxPU&Wt3$DvTDrrybUz9dHEmX81c002ovPDHLkV1k~7X>b4l diff --git a/public/images/items/mystic_ticket.png b/public/images/items/mystic_ticket.png index bd206998fed1fcb040a0d51293a2a66904ae2865..cab03fa54708d0406262cc71cb28cd1a692bc713 100644 GIT binary patch delta 235 zcmZo=`olOuvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gI>0By6-XNx7!-IUba<@TQE;GQ z!ionAZfv;m;>V94g(g1hfYO{LL4Lsu|DnK~Y4#PMV3ntfV~9oX+lhgE2NXD*T?Kaj z?{tq{G*kF*{I&abT34pjwJKTN*qX<2Lpr6QW9PA!+gfv!87}Jxx$e-NV7!{cr+bDL zN595XPlY+IXIT}dTP87Z9Z-I@?pEEk#`3BA7QSDQbtCcSms+KD9CnLBxA44ok+8dG f@$b{Me>?OzeV9I#{Wn_#bOwW`tDnm{r-UW|z|m!j delta 244 zcmV#*rGxxf@Vfoj%^-AeGXM#m z`-QCm+#oP`e{aWU{POqM5553;VlssbfLjX~EP-f*F>OIlENy`~XRcoAM+j_TdM)fr z5V~pspilxpYXE9Nf-kpF3xG>lYT?#VDlMFz{tUq68sg&N4#@wP`VqkV44*wa{R-Uf uf9c?uS6u_)UUf|i&4V?>Bf+6isD=KT9b2 diff --git a/public/images/items/mystic_water.png b/public/images/items/mystic_water.png index f944fac1a9c7b1add524976635c712aac73b040a..2128895b3856380c944b9d4c8e0b7f92cdbf12de 100644 GIT binary patch delta 232 zcmaFI_>*yhWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DQ1D`4@bY4ain_XH z&AmDI{vW-1_5c6>2eTL!0;M@ig8YIRfP648XPSKlC|K_4;uvDldv`)0-vI>x86(AL96Rx3ZqB)L}Mi;m$U<%H+;f5`QjJ~wy!y-CEuX_n^}SL!nOr7^IJ4O c?_a|_aRcLYcg^oYKsPXWy85}Sb4q9e0A)a1umAu6 delta 221 zcmV<303!eS0qy~i8Gi-<0047(dh`GQ0JTX(K~z|U?Ud0CfFKM+8HITmf!Q2^H5`Fo zRzV?YQVCU1T7P=U#YB_dvz{2EQmJ0b8IxO!hR@s=2^WDF8U8x}D@1Rwb7ujO#Q<<% z4~P}uDWLwA+z=zrSs<*n{{fV6?;|;sD(SNDJ;rKk3v2)o9#%rC*WMP$dL-QypN3z!nR~5ZI#ODiya5 X-*xnNz8YXn00000NkvXXu0mjfpAuT1 diff --git a/public/images/items/mystical_rock.png b/public/images/items/mystical_rock.png new file mode 100644 index 0000000000000000000000000000000000000000..8cde22bd16c0d30dbe2e28c9cd9f95fec8f48618 GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|76tf(xB_Vb z0Rbfy9dm;qD}zu=(?}QloH)ybGW!fOheQ*vOq=kONLR1iU}w*;Ja6}cRkgbN0_rXo z6gbW?ta==NWS;r!b6&cc4PL%&-lbg`*;B)dm#i?Hej}mbN5z7#?me5h=>PT&|9^HL{JpM!(xK1W{!F=kq~pSe z9~Ukh`0?Y#j~@r(&X)sSX;u>C7tHXV93arSS`X;=W=|K#5R2ZelWvza83?%gF8H#D ziEFAr;FPQk5q*W9|KneKinzS}w9+;|@x5f5!QOlKTQ8-%|4nhmhsJ#8HzkJp=Nr)e1l<}{P zKWuP;DVIfYkKvS!Gn?K!3!jtBmFDRG{N#kblfVKy4rk>Tf~^8GuXFuwFueUNYGE$3 z;v4U7<%+ElI$MM$Y+kTsLh795FF(#;@d-6p^rG2N`9x6afyie|Gbb%L&gCTPdb#{~ zjObJ^&9la{m(SW9x^{ufW$~h)9-7k1iE}niUGZAV_S)GZjhV-PZTh&ZMX_(U;jvw& zDf6bsb8I={s8hb#(Czc~6;lj*Ec*5fA9vaiIy)+sb&bWuRGIIeYhFf8i;UG+^=ci@ x#J~GgQeJMGoxAPxu?Y@O@`Cew)Zf&9X0DoUqZ{s9{~s8k44$rjF6*2UngDxeTF?Lh literal 0 HcmV?d00001 diff --git a/public/images/items/n_lunarizer.png b/public/images/items/n_lunarizer.png index e45fb8ecf8d6e94a71b4c4e0b77ab1b098cb1904..a03b48ad387d815bcb27b2ebea3a58c09b6d75bb 100644 GIT binary patch delta 220 zcmcc0)XFr$uwE{}C&ZPLfk8n*At)%Qy1M#ZmZL!R+2ZDAg*ETitl9GJ*|Pv8er^T^ z2CkAIzhH*{Fi_Vi5(X5l_jGX#vFLp|$y(@$0gn^&wy!(?w<@cedhOkuRe7lGV(H(@ z3^Tq?PFH#Gu43+#X7;FaAuIyA?i!0`OcK}Ryb@~mQjar&?XQgIfg3H8qXl#L-`Q5b z`IWXpXT7_7=cu%0E|(btiIVPik{pF~y$1_rqRpAc6C1qFfXv+tfgQ&{tE&6+LM)zv{k zLB-9@@3MeO87eZC%mGqdB|(0{|6zb((;1!fKvB*DkH}&M2EM}}%y>M1MG8=Gm8Xki zh=u>%OWtD53OuYACL9p{w*R484NFt~yuRB$JO#B%UQfOMiYio1&Yj29E`G7GDOLaOAK7CbVl1-hHT)78&qol`;+0FT&x2mk;8 diff --git a/public/images/items/n_solarizer.png b/public/images/items/n_solarizer.png index e706a42c9738e43dc5ccab857adc240759fd0dbd..69153fd38dd6a19a50cc583d742b1e4f0cae0203 100644 GIT binary patch delta 226 zcmcb`)Xg-(uwF61C&ZPDfk8n*At)%Qy1IHxlIFWC$9Hoai<_Gj*1TJ@X3M*0&#J%d z|IEO^z+DpL7tHV<4rMzkse`@O1TaS?83{1OV`PXqNy0 delta 306 zcmeBXy2UiXu%0E|(btiIVPik{pF~y$1_s3dpAc6C1%)k1n(v-HdpE~%&6+LM)zv{k zLB-9@@3I^f*1Q9%`ZcpI8c1=M1o;L3hXV#Lf5uNhVa@`N$YKTtzQZ8Qcszea3Q%yh zr;B5Vh5y}4-eS!PJggTc9MDev&t0E)$X(&Z%N=KrFkDw(6teG1JmVtuo6j^0DgvLFi|1US}9HcSHyRLTuV3oXBVakKR9Ztv{zc-V^Wj2y9Y;{4ucxYiP=AHfO7x< diff --git a/public/images/items/never_melt_ice.png b/public/images/items/never_melt_ice.png index bec7cc0e5d4514e00a19e03ac111bbced73e6e88..35b1ada771d0761b317fc936e2aeca1c14b6bba3 100644 GIT binary patch delta 238 zcmbQl^q+BpWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME09)DP%x}sQoQ8olB>_| zef$6I|NnrJ#mj&a>?J{d!3_VwU}^ob-$0>OPZ!4!i{88E4TTOHaJU4nkNEb_-ArJo zp-;??lP#0}FPYf)_&=L}EdL|ZhLrfD*#fcK(vQB-YxueK#(@Vj7&yFmHr!cu+`&iS zP^wI$#9UF|cjk=Y^ZIKU`3{KQe!=Qg@?ob%!_(lK4mz)k(zaY}P+c*(GmL!)qx0|d lnW1wtei~IT`*pgQX+t`5hV>$GMxcurJYD@<);T3K0RUW1XR`nR delta 257 zcmV+c0sj8~0g?ic8Gi-<0047(dh`GQ0NF`IK~z}7?bN{u!!Qg5P>so{%=oQAkI0O30B%SpJLl#ez^(}afZ(Pa?g1E)0$4j*2H@Qy!T@gQ9W{sYT)&Jk zfWrasc4$Ewo&vClZvhAoe~KOk0X7^zu5j=kW^1&ns(-3CYOLN!*lGQ<00000NkvXX Hu0mjf%Exej diff --git a/public/images/items/normal_memory.png b/public/images/items/normal_memory.png index ddc22d1d4ab6ba08b375941a03375b1d3d43f105..e1ff89a9993c7045d2ae67e0ae8a418bb111a63d 100644 GIT binary patch delta 299 zcmbQre3@y2VZA|sPlzi&1A~HsLQ+z7a&mQb^_1e~=I%Lb_8vWZ^ytxZ=gwWbcJ1E1 zd(S}NJrMl=|G&ax4^Rt(KuM5aFawZ}3=RZzI|Jpmdb&78)5Klg?=If7YIgxs#d4}=`r>&TAtV;XdWNLVB4GYaL zDVEcov8wWn0P_R($5RA&)-TxlP4F07pi#wsm2;Ds6Jlhxp9$V4&>i2j#+Wae`>2X) o+{0XHGq-K$Yk$RTk3YxhH;YsH@y@kHKrb+Oy85}Sb4q9e0D8rc`v3p{ delta 365 zcmcc2G?jURVLeN_qpu?a!^VE@KZ&di3=9SVJ|V6O3JOP$9)17*{r~^}pMk*pYuB#b zyLa#0xpURkQ<9RZyXUMaZf@Rt^lWl+HBeLX<1H;fN}wdjFBqr=88AFhj+F$;aTa() z7BevL9R^{>s=f}Ec~xtIw{nmz{7Gups7Ln|Nrfm6J40DU77QC@{RQq zT(#;yc{!L~cQ9sBI(~1nams-wDiypZzMf+$^3GYnZ9F|%DuM4Il!vS57o>K1bTvi3Qt~)mw2%7}Fxczv_=L_W%f>qCCZvD&4 zHP_4HrS6P<%zt>(-OerC=5X@M?#yQ&mGv2x)-arVWMHyhasE%B{}?=7{an^LB{Ts5 DK1!^4 diff --git a/public/images/items/normal_tera_shard.png b/public/images/items/normal_tera_shard.png index fe2b9b93fd6159465198f585306dcef13a1c503e..1c7a41ea0ec56b8310c134f1685365aff728885b 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R-kxYQ2AS+4?gN?%uxs=GKV^_ilas`1Jq(|BGI;%?C<&h9`4x^1qU0KW0H|rTT9t(dm$!*`Xy#36|_vAAV#jlrF WGG|^ryKKHZ$Qz!nelF{r5}E+euWG>n delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}j~}1Dxpm_1?duQj-I_nC zb^VzK_m3_EO0@_ZumCBpk|4iepfU(x*mOqcJW!Ogz$3Dlfr0NZ2s0kfUy%Y7+~n!v z7-Hdnb>c;#!wMWM4|Q7p{OA9E>7qtf{q5`1Y*G%bYnQUzf8{;brQ6nyE??j2Hwi4R z5!$j~N)uby!@vWZrWtZCI>+%ixYtv__RdtsUjL?y9meyn`dM*yD6j`hc`%t56nYhY z-^|b|+5V+LrDN7?)`|)D{Fu^*W@{#|77_pE$`K^K8P9Ueg;ohKbLh*2~7a` CPl;gw diff --git a/public/images/items/nugget.png b/public/images/items/nugget.png index e8d39912349932ef323726a6745bc72fab44ae90..0340f5d40000b747b1fdc9a18ea101fda5c5301d 100644 GIT binary patch delta 205 zcmcb^c#m;{WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME09)DP?%FJaCVK?|Fd5I zpC$eO|KB!Y>KmX0dr6RAFawYe1WW6e{RRr9c)B=-SoFS~XvlZKfPyr!#-V*ansJ?-PJ$~89ZJ6T-G@yGywo5 CMpiQb delta 203 zcmV;+05t#J0o(zQ8Gi-<0047(dh`GQ0HaAnK~z}7?Um69fG`XNJAxy0o{r%PuHy)< z(luNol444X6@QY5kb_X^hwrG5noNjn}_1`9FCsYIU<>e!{}TO!gWl<~2Q1Tv5k6E8eu}UG)Mxrf-YN*xL577dUag pV7EM=zN{g9NAul2e(U-<+=+=yo9E>(T@JK^!PC{xWt~$(69BmDPCozu delta 189 zcmeys_|^bR#l0A3<*?y$9{r; kg1mygL*0Rr=kfb~a-S__o>|0H1TvYy)78&qol`;+04mQ#R{#J2 diff --git a/public/images/items/oval_charm.png b/public/images/items/oval_charm.png index dc7911755888ed436adc78cec63834a8473e9126..fcdb914ec2257ff9e9159b23bd51ec64e58e4f0e 100644 GIT binary patch delta 226 zcmdnW{F!lrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DP}m!l)EsngP1gT= z-AkIU9{vCS-v6V|E=2`L1Eo1jg8YIR{zHK|)9foi!9q_L#}JF&tCI}*4k++27s@L9 zuP@|G&6%_HYr}+h4q{8T#H#y#Qtj<XYKbUt3*a_Ig!-a2;1 VS0_8HIDxh^c)I$ztaD0e0szScUUL8d delta 422 zcmV;X0a^a@0ks2=8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00C7=L_t(oh3!@$bAvDx ze%np#CrrM~%_5P=)gf0mTxTmc#aw46ajomkwXSg>Yv%%r+rM}dT)04?0g_U~cgI~4 z?!NEKdoM2mm@whWxUoTkh*V$8vdjv1C-LoqDh9R-B1EJnV}BPHR}uO`YvR_1kv?nkdeRNEBb36UBMwE;zUmAtLd& zPhhS$lmY+@Q-4qqPwoeCSZT#|u({j$HZ(H8zu!;R(uA8(>LIULqN2$hUS7+>6RUOa zEBI`fn#cl&Lv-|%vp%o<@B0wZ8u)rn%lYqLF@Abru-vmjf^}$5ffSX(007H9v-afD zlBiLzwd>vnZrWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0M1W6-E09)DP?)l0&5|`+&R)HD z_TIaD@4o&2|NmOvCwZV8M@f)hFawYe0#{Fk7y-p9JzX3_EPCHg@)l}P;BnS`So~jl zHkZY@8ISH6-rlq9;p9vDs>N^LT#7oW_;A~5miU&7t4-A`?prgaizH;QxOJ@A$hD(E zJ>h581umDS{0Py7ja!@c#WZ>v*uUme(eM+Vu>64UCpn{ICMm~V=Qw(v=vE#0N z0!OY)MhfzxLMP4XDV8iDkPJraNb} zE)u{B}=Z}yZ8V9e*IFAIV0maKbT^vI!df!fR z6lzf5VeVAu{qX<47kAu|M|Tac^K$2kIQ@9cR&j8vo>Z4OYlBXm^Ts8IwKbNB6pFN+ zRCzM_(1&vqBO8w;U6Wm7puNCmyW66fUVG1T-AU@(BlB5fc2f7>DgHamj}<*vOqlK= mw@+ks`Vp!2>;4};&fzy!XK+Ud4Gb&{ z9USacc7)MfC6y=r$xGakIWF;+tfJ~Ye?`f%csw4DazY4=<}@&3Ceee<1OUFo@}5_% zHWDNF+HNJc$F|KC=)r)~=JcJ`f&|9U=77_vwjhCHNutPiD`yHV&<`AT&$&I!ABCmww`wXa{+!Rv9-y= oBeh`q;&Fk~pIURU$K$cc4tLJZoKWDUx&QzG07*qoM6N<$g0X&WG5`Po diff --git a/public/images/items/pb.png b/public/images/items/pb.png index ec4fe69c86fd7556ced320965cb81ce8e9b2373f..37c37edb8c1dd3fc4dc9eaf43fd4d9a923a1c4e7 100644 GIT binary patch delta 243 zcmZo-YGIlnSllz?EDmyaVpw-h<|UA$7~m7)3ZxYj6ug3h=6G4&i?aMb z#q$4E%j)XpB}}%WV$u6_k~d$2 z0uSrQ#w}m|v2PRUkUcp6DyrZ%UR&g9G>r zZYAmT37h>_>Ij!_XNY3RuyXBbJaoulb3ps$)+OxPVD6>c(e_BHQc)I$ztaD0e0sv+%XxRV& delta 241 zcmV?19s2-jYpso@#>3rB>#_q$$l=MtU`b#+G<2tqLm|YmRlm7010yd z05AtwqM}ry@+COuZ&xjLFOxXu_5K5KP5=Ps{O%5v#Bokw4!VCs8Ig%|DxxZv5zOIG rn#EP*G9rhRXnrneejw@V>#MN~`FDQg$2@Bb00000NkvXXu0mjfI=*LQ diff --git a/public/images/items/pb_gold.png b/public/images/items/pb_gold.png index fd71feb8e55e5375f5948515721531b0de5f0eb0..6dff68241588faae241780118b6ee5fd2e5aaa3e 100644 GIT binary patch delta 344 zcmZo_BloT zbE+g))XVOiVS09sHn@4{ePAI|6%?A|MmYrP5A$B&j0^w z|Nr0l|Np7~|Np0$DKr4hk}L`G3uXZFp`aedfY1iPo_B$&mU+53hFJ7Iz2qo#NP&m- z0+UnsQ3)l{clAM&AN5UPesTYwc_XLJY58MwW?pgWU;yTu&&*!dx(?`M22WQ%mvv4FO#tkGsd@ka delta 498 zcmV0)YgO8Gi-<0047(dh`GQ0mw;2K~z}7?Up?(17R4)f7eJXL<|)M^|9$d z+R5jLK~kFtn-g|Mk}}vxEF`4eb*#i9vC>3xrGrZhu6h!}&{%}UYq<91D7~JF<^IW= zd!P5?`TyVNeeRwE4<0=HGZdHmM78`WZit15TGqpz^|-Rkrhnd@iv3n1KuBU%3Jocw zDB?D2&@*}H*tgFeId%bnzteiQw0Cg6H}capRV+Z6Lj8S?qu_I=d&QoNA4KFI^Rln&dexHf*P(VTAiljLUojr;?5!Aq zg1F1Hb^7%234Z{FVU`t8Q*ME2Li$W2L>PZ3X#4weE*yyz;-2R+Yu{%WCiQi-z{~Fh z03;Kqn7JDO)cH9Gi~$E|@m=a#hvd4fVUSFmN;}w9oiCw?Ei|B|9|`xhpspp~uV-o8 zwop5{mHnydUIu4VWjP!rp}M}oR&o=bpU5PZt-;)Zjcd3_9u76IbrfS@c(kguK#12E zD6Pa7C*oc@bK?=1N1DVdi-wl6951J07*qoM6N<$f?vh<-2eap diff --git a/public/images/items/pb_silver.png b/public/images/items/pb_silver.png index f60a8348a94de2e587a94a66e2d0b4336b25763d..9528517a77a6e58e4a5aa0340c97ba8b0c501bfa 100644 GIT binary patch delta 344 zcmZ3(@`7oCWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0cYsfbE06|)z>J*qrmo`t>DANc z*G`|`v3T|DEqj;jKe71O#Z70g?zwXJ?6ddx-~GSx>Hp1-|8IZ)fB)P6XP^E*{__9z zm;dj+{r~jiKM-6`RJaN>OR^-$FPH%&00H$d281>U_Ph&JwanASF~p+x=_N;@Lkc{s z7o1wdypmW1-_-|Ae$+RG`NjQz=8c>>r{#~$nR%tdg(1Ai~|%7lM+3YqkqUybnHl z;A`Gm*#k*)zHSXW|M1_sH;Vi31YVBZJ!ebkv+c$2G&NV)yJ^k59TV{W>CVY(lzi)t dd^!B5z^>hkTjQwV$tj>v@^tlcS?83{1OVwfwVMC{ delta 542 zcmV+(0^$AW0;~j(8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00HJnL_t(oh3%HlO5;Er z$3Oj}h>gvtV}*yb2Kw zwTl^|TB#UqRex12W7!56G}V0r{Mh|zykd1H zEKWo_$E7I$6*RrDb9BH`D#c2ChWi%m9Uk-;&&((J@=4~uA7bO4cL6XU#{BT@*%UyQ z<(`SbCOp(3Hf3$@1OPy2HG$NEMhhNCIs<_QjCk9|VBg#+0O+6Nnt*>VM#hYkJBmB> g9}-utTo(;pPsawd6qTd;EdT%j07*qoM6N<$f@#h7PXGV_ diff --git a/public/images/items/peat_block.png b/public/images/items/peat_block.png index b62e94d523f9c769f968c808688d176721e2b17d..f3c65449b8746be17f40c1b3395b0db5e81cfc30 100644 GIT binary patch delta 275 zcmV+u0qp+#0=oi`F@GdbOjJb+001B$AVD}dW>ZsjWMq$af}Dqsv!a)@o~OsXxYD=4 z=GoOu)6v)f000bhQchC<|NsC0|NsC0|Ns99#84&x006B?L_t(Ijos2q5`!=d15j+o ziUaq*Z{?)SK=|xiE!gPAW&+FdhY{wr-U^}DA-x9rgcOFe z5Li3J3>N@18#CBDpcBwqzlO)%T}wF%Syx4mWvvP=ryUYu$`NePPwOqHnuD?j$^;N* zs*#RhY?}ZDd+fk5uLzn1#tqIFneQRVQ0(*g5wBX?WvL;6h zi_MFsm!_m#+J0cmyyZZJ-?kj90#ZCBL4Lvi5r9GH{<(8Nan1sd$YKTtzJnmlxMO1W zTcF@cPZ!4!3;(N=9tyQ6aI{=>)vB-l|9$V#4VT_MtJ`kewM{-@=9~I2ZVoFV+K#PN z$#QuoJ#otCo;%ZTK4q9#QO3OFXQydVl12BNi@6Iz3!DV~_yg2;g?waK;B_qff_{T< zgRZxMkN(mdyX3;o+)m3-a=xCB{iS1PnCY|y&C_z@8;|ap@SEW{!-7?_LZ5TU+*NB} z@vSXscyGw?u23MLOvA?G2jd6l-FG#9&69Iu*IQCm=D&PhsQZn7$4jl1zS`7f+z9Be h&tsFTV%+dvesZC*M8bk6i-F!^@O1TaS?83{1OU0)nmzyk diff --git a/public/images/items/petaya_berry.png b/public/images/items/petaya_berry.png index e1dae467187c346db760ccfe29c39b7eeb108f1d..0fba884c2e2d2df711b326e240587c3f16c1227b 100644 GIT binary patch delta 320 zcmey)bb)DtWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP)ITq==L%^S{;%x5F zId4d>jM4P#pWX7mfbsO}PdjEGxIO3Z(L=69GY(|vJiVhdM zTJvr~(qcyu$88zs{i@`zsw#XkSy|Z~EFdXpQ0K$l-6g!?*qMwy|CeU`Ke|M*|MAij zmdh-~Z2DrO5}!TmwlrOT@0*rUyw7Kw+%m(bVsEPFKkC)|@r$co&i~95Hm;|9KjVP@ OVeoYIb6Mw<&;$TQ*Oj&a delta 359 zcmV-t0hs>K0`~%t8Gi-<0047(dh`GQ0X|7YK~z}7?Uu0(gD?<9GeSmS1=dKJ5hz(9 zWlGwNz#5bpfi+U5b@Wl5bvi*J#V6AEq?5tG{qO$|!{Jb)Mvb6onkF%lyMhm=b^)EI zTN;NhpYO6_K)d#s!8I37z=Qe~lgxz@urdP-7^4yutPMXCv40P1L}rdzahmU&HWXO_ zkoVcjuJilloSx$)U+11;EA*g>TVGXNE7q}{69J{|1*|CQ1yn$0R*duz@C}F+#f^yk z0#gEp>=xKIAw-K;FA%^<3yLy!G^fHeo|1;O_k>u0*A!h# z?(-SafE43B-(Vu)JrCQ4RcL9f$B?d5|B(cqhkgqd72e?ec+Rhx1x6*!Glp$K9-JM{ z`^~n@x1!hv4{nQk(6DXS6A&=q{@S+;A+YJ_Uz?dIU;>{DK*Pd}MGS zpxYTJm*eT;7-G@;_M$c40RxB_WImZ z7ksLAi^1LF{w*IKg+nZY9!pgiQ~Wh1%!##lAa#gM^hPMhihF{!&2Jmaoy=#vWfXO~ o^zhrSD_iCMe3ZUib@V)Q`wM0({aZ!*fEF`&y85}Sb4q9e04jHN-2eap delta 225 zcmV<703QE}0`dWn8Gi-<0047(dh`GQ0J%v-K~z}7?UgMKfG`Y3Im)hrMIw<%EE35T zkUIibK<*kyDhFWC{Cjk4$^00000NkvXXu0mjf)oEIs diff --git a/public/images/items/pinsirite.png b/public/images/items/pinsirite.png index 2616cf6dfe1b80588b8ce2087bc13399a57e76b0..88ecc8e9ea95fab9570dc6cdeea1d944aef67733 100644 GIT binary patch delta 236 zcmeyy_?K~lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ1~CDcr@FpB{^zN zb@Bfxn*Xm^om(4pZtI-?N9X+i|Lp(&{{?GzR{@psmIV0)GXVK;pv&U87ATSJ>Eak- z(fjtIBi{i94i*Pi&80v7e-|^kcR(%GcK7wUIXu&fKB-^bw3ZX-gh-YLNq#L~_u5Nu zZ0HmSd8T%W$HC^|fhK2_2XRVlr+oByGQM?eZ2Wj&&IjHj6$e@;x@Ep!9=7!C%G1x& c=RT=q%-~^KIG=B6FVJ2FPgg&ebxsLQ0E7Q)ivR!s delta 229 zcmVK~z|UV_+BsqhJ(_f}si&6cqj=W4c>B zr@Hw6(QK>#|AQ34G+i75vf%$UtN-V=&H-bPXc?f_&AONi)>pqT^CtqmgV2ws{v;QuqYBS2XY-4Q4b z0IH>FI=~hZ@KB&>EpD_&+tfpQ-w zUM8_a>F3sRJk@Sg&v9J9+1ld6dT!^WhN~^RW(l->^vJ!xe?f)7uD$xVS|fineNArK vudsERpq|I3_qSQN*DE}65oLL9e~vTWmv{e}w7GkM4r1_h^>bP0l+XkKIx~Ju delta 327 zcmZ3+^qy&gVLeN_qpu?a!^VE@KZ&di3=GBrJ|V6K1_nP4Joxe8$B!F70t^&>T=?;0 z$BhpgPMm1i@#DmcA16K>C|Gb|!igUTUOZTE!ot7+s4ur{Qz?)VED7=p{*MM2RM*Z- z0!nfgctjR6Fz_7)VaDV6D^eKh85mZ0x;Tbd_@ABR$ah$Qho$h~1czCl{$Dq1GF2>F zEpvOPf}t{t*t&Zk(i?*lw(GO^y)b-O8=fv;q2{Gxuu?&#uYgzBB5ehqzFGsLSwy1M zoYSTSuVWXi-!PMbtsu}bfZbpZ%W;tfRz6xAf(;mXHXQtOLgcuz>JA^pi|q%VJESX{ z6;0FZQK+tARtT0jxM|AF&kUU3YIiSap3doX+uotG-bx~_>HQzO6<>K-Jhe|9Q2+1* P=oJP}S3j3^P6BrZ?@FAx5{oss~ua5W$sp&)HHtQZ#>toT2m)(c2}QeX-w!d smH&^Mx;!eMizrQzopr0JOkV0RR91 delta 183 zcmV;o07(DY0muQ68Gi-<0047(dh`GQ0FOyTK~z}7?Ulg^z#t4o9mUx)lk4>82(Hkh zE2N|lNF_by3vE7py!oD0Yblvb=8LJdvUD4KjKLDPgoVpUL^uf#E+a%B;i2%i$zUt@ zCWONIeBNj1p05J%1E&JLb>4E?t$+r4)mDLdOgvnmQjuuX?l8iBGFCt(wBb*#C$KhD l#M=Ue*@k`r7%Y?dbuPCeh}L~fn$`dS002ovPDHLkV1i{2QmFs{ diff --git a/public/images/items/poison_memory.png b/public/images/items/poison_memory.png index 2b0036201d93ebf1509f0fb026a2daad654e3350..6c2b0aea77b2441653e494683569b0e6974787a5 100644 GIT binary patch delta 325 zcmZoJcaj@(X4F@{z%T zfNp1?+;&eF#}JF&yOTVH4lD4m)Z4Cci}>+>|5=XX;ynA*ix;ih?ZAEeTfgIZ?sac% zX6uP8=->?bbH+jQpU|vVM;!LCeu|Q3`gW)Hnp7c2p2>#UimMhK(R8)3;62%3yhq?f zW!DmZ#+#S4nG=27C0Y(uxIRB4*sk<&ulU8b+3g!y1XpI+MljbTyb(HfTl3y`v143z zJ_dQtYZQI;7A(9zE#&Z&e2)9lTXsn RV}PDu@O1TaS?83{1ONu#nWX># delta 369 zcmV-%0gnFF0)YdN8Gi-<0047(dh`GQ0Z2(iK~z}7?Uq3ff-n$8ISN_j=*_eoGSB1)lrCxv~EgkRsR4B#{IM*u$5_zY2sd_{1{V zZW6$Ps~rek;4n&on@2Ghe~F0MuV?-t2a?#x%>`#2NOF!~;R P00000NkvXXu0mjfd{wEN diff --git a/public/images/items/poison_tera_shard.png b/public/images/items/poison_tera_shard.png index b124fa051b95978d7fc27dbdee44e489b1372c16..4f21d158a412b1637f391b69bb9645a9c1d30a62 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R+6nXFg8dztrR6sjfYTH{ZFs@a3MD7ykeMFZV(w5-818 z666=m0OUhJU8hJGP_)I<#WBR9_v$1^v7-tc%-lg7-}is;e|zo2^`lRp@HWL=Pe1*J z|J^lCWjEhOy%5oqL+_Zhryjnw(qmrnp{kwcQEYPWu53OxSxV`IW4FMM!;)Q}MR|LD z%qBK{Ipe_X*J! W8}rKlc{hK8yy5BU=d#Wzp$Py7rD*j4 delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}Jufd@UHI};*Pg?h?|6yN ze4M&}smDd2l*a=jcOb=8666;QR0aVIo6hK*2a0kQctjR6Fz_7)VaDV6D^h@hn><|{ zLoEESPP`~|Sb>A(p-#)6|NP%CUDU{`zkPk0P0FEl?NXNeue|5Fblcj|)({I!+73RKP%1-1@>Sm4<_@1La)N_ zn;BXq+rKoZbj+H~S~20CA5(hqZ?jKc-Y z`=F=J{`qzI`fCpv^x}UiS88$}JhB72e4-G+nuV!oGkZ zP&2`6U!#dD=eBc_wb}eeE1xZ9lfO8p;ONh$UC)nQIQ#b+V@>3#`*XxYma$9^Q%~8( Q19T#Tr>mdKI;Vst0E-ZOAOHXW delta 289 zcmV++0p9+j0Gm6(>4N6K%R-p76 zlqs_UWy-8TnUWO@XK~i)D}e%kS3c>4lt_8cKREI*^z`)nkq|=CHU~57r|uGa;Q9H; z9hbYG#5b@CxJlrl$Ll47lYtYA#_3jH01sT}RC+qZETZ5h0)P08=P3&SMhQS!Ovy!n zU=_gl74EWnl>nG<72tJOf$}P37nGI1r!vOHU&3xhuD*$Y!jt^@tN`jJ04T%pQ-Gz2 z%TBQSeM^9?F2OIM3Md>aw-VI_@G$}iBB;W7uZe&K@tVEoBJfMXZ324|TkqZlZVx3} nP=cEr&+K`y`5L*fr>9n4=@N18&e^Dh00000NkvXXu0mjfo#uvF diff --git a/public/images/items/power_herb.png b/public/images/items/power_herb.png index 15a581490a0b2f35f6bccf85991636d16910e673..ba156c62122715bcb6d007b5447009db48fe8212 100644 GIT binary patch delta 208 zcmdnR^pkOdVZB^{Plzig1A~Eq!3G0^7Zw%^0s?kKM4a&OxZ&aPAtU2OMaBF1Z`&Cd z7`RG;{DK+&!$4i9NElGG*we)^#G?1@L~Ee~3LGx30T2I)^F2@z&Hm-Ht@cg&maXv) zN+L}&dS?D+V(;8tyqf>g*}dl@)pM--mqw|*Df2uZ9=h_E?wg7BuQ|UwIox0^uXExr zx7d@W#=koc{GD*z@t5xb<=`{LRX>(o7H2!2W4`CZ`qxaB&zOEcR%dJm+RxzW>gTe~ HDWM4fC2nAc delta 274 zcmey#xQl6mVLeN_qpu?a!^VE@KZ&di3=DDsJ|V6P0s;&S3|>@Jys)s?U|?{=!{da9 z$Bu}I4;dLiC2x6lUI0>DB|(0{|6zb((;1!fKvB*DkH}&M2EM}}%y>M1MG8=`-_yl0 z#KQmS#DjcC6gXT0uN?jV{~>E^s>!VSz1w4EmC5ycdVM{=M_hr+?D5<0bDR~8icg6z zIO_Sig6)>s@{m(EFI@jQ*|o2&F7~gI(SBx!i`UM^?_pv}{N>2dz}0qNT44dx*XLgu z7}h#|Pkz^6df~5ae8V>R%#(~8s%EV-EISa-Vcg*R#<(H+oqFD9mIc@JlNKuYKhG}f RW#9(7&ePS;Wt~$(698Z>b~pe4 diff --git a/public/images/items/pp_max.png b/public/images/items/pp_max.png index 4875282955718fcea4819152d48d6c9a1fee5d06..787641e26ac1b21c0c6a4d329a772cf49ee7a857 100644 GIT binary patch delta 269 zcmbQwG?!_DWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP>7mh+1<@CWv}M5 zvtIw7MIHTLe6;%L(KT!C9XR^A_{kA2^tXHXxx{E?;WtQ4K_9yy^2m-aiFZ-|rkV`V!jrefyd zRmvrjRT$v3Xl}zRoul&$G6bFa0keP!Y<{$|(j zWbWrw-lyBMK5C9|MEN0x#c6ww3-sU8`?Oc9Wa|9BZ|RjxKTfmlSAR1>3FsyUPggcS Jmvv4FO#mQtcXI#$ delta 271 zcmV+q0r38v0-pkq8Gi-<0047(dh`GQ0Om5S%m3*to!xaUTKrn{ea~AmH)l8S@Nf>4WJd9>VL%nXr9*!Krw{=#@ylnFCzBNg{%RzU>wFR0oePHzo`m~#riI|=MXZz8y00>D%PDHLkV1kWSd_@2N diff --git a/public/images/items/pp_up.png b/public/images/items/pp_up.png index 1334d228bc38fa893c8b1c4c6a34a86aa3cc8317..463c3a0578da9199892cb80fb419b94c355c0165 100644 GIT binary patch delta 270 zcmZ3)G>>V5WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP?!>Bxp#`@|D(m- zj@^5s_IfQ@lC*d4nxkvJE%|oz-qB~@o_+iOEi3of51?wkk|4iehX2SQ-0QXoP^QDv z#WBR9_v$1^p(6?$EXs=}3jF_nSGIofyOW03?{2fX==$(P;UDQlhu1%=P8{KQDYay) z;H5VQS{Vfm4mVs?eOi~2$-{d3zE`_t?%U$a&GSv6-L&`}JY M?5=(;>zopr0F~%}r~m)} delta 274 zcmV+t0qy>t0-^$t8Gi-<0047(dh`GQ0O?6YK~z}7?Uu0(!yphvJqm3`NSQVxxXcO} z!>vc4^a_-$k+6)7hMvrV%6lEtFEeB)Ykojd$Ap6vk)} zSa`WDS@S5&p+H1{S_ZlRltcrN-#|%J^L4%+S;+O6(;On2n}7Akg2L4uC~Z%>ec{7O#DTFsD{R)PVRp((OmBgtFr03K0z;LP(I(Pl$RpJoQjIVgw`J Y#UtOHMQy9w01E&B07*qoM6N<$f^719AOHXW diff --git a/public/images/items/prism_scale.png b/public/images/items/prism_scale.png index 5a0d45c686b96b3614ea86b772a209c8bc658a48..2436e96bf7330beb4789d4b2cbe76ed6b61383bd 100644 GIT binary patch delta 198 zcmX@kc%5;AWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0M1W6-E09)DPo6XS>h- zpL4bO?7O}1{_hDZGy%$Slmz(&GyI2utEWPYfMSuJE{-7Bmi@-ZlKxC9<#dS9O` zxvi-)`~SAMoXdS5t2@_}#fLfPgqH@rlbUMZR1&3kPN7`mdKI;Vst0CMb7QUCw| delta 182 zcmV;n07?JX0mlK58Gi-<0047(dh`GQ0FFsSK~z|U?Uca{fFKM-8HM>=!=o!W0xK{A zN3V{+3YeOdlm?E!iKZ|4SKbR4LvS3&`6@BSCTA|swGA^1k@CINcRBibp-4dWI#De-zowU!1B7~J{e&Wz~XjZ(*WobkS~nHEMEn{K0+N}Cf5}%WV$r*H@glhD)djuI-GOPrg8V)`=0Q<58)vFr_+57`!0rV1jkk;TXt$J2V_fdtT9YZR z+*0Y*wsZb=2i-$=x}@I5+3PNEnbvHz##WL2bVKMu3$a7b?xwmpT?zFz7fR&yx+QVu xL6YVYQ^AM%r;ONNKU7NV`8$7ewXXd<{^vZbbM%Y$PXhXb!PC{xWt~$(69D@~j7tCj delta 382 zcmcb?w2XOzVLeN_qpu?a!^VE@KZ&di3=9SVJ|V7#hK5&@y7w9;{at3?PF{>D;>00ZR+dxX7B*-uLKPq5&pd2d+l;bS$ zhy*I-I}E~%$MaXD00kd=*1I@{Solw!*vQwcz~j=t?ruTDzyJ5&75K7bJg>l263ls`*;cr;&pRKaXL!JwQWdX>3khJKckS@DAU+|Sq7 z-eOXFsF|`v_VPiNfQ^zH^abN)^e$+S_(>FVdQ&MBb@0H+|ZM*si- diff --git a/public/images/items/protector.png b/public/images/items/protector.png index a7b01a8c53d64900148b0d3cd99b2827f520030d..8f65be09b2f4e3d0453e80a666b5350b1bb9a8fc 100644 GIT binary patch delta 258 zcmZ3=G?{6FWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DPzW;A%(B$%_A;Ck zWVt5E@?Mm}vtrA4bBeu;JH7%{aFqo41vC7Ifx1qSFra9!r;B5VMep5v!Y~j8;EdunWlFC=nUa!{ zHe;|tMqnn&l&oO%B0Y3E*^y;mOo2~&5)#qf=O4l_^y<~Cpqz67`PuMo@!`ELp*e)Z zWtu@^!<#|S^mRQ3Aa_58=gr$9&NsB+3o0fG%0EC z6wPl-82%qE{)*=XKzTW1c7GJ{Dy2 znXsMZ(o}^Nlh^#6xMK3P!xuFaZn)URw=VmXn_+*NcfnpZh8rtu&jOvq;OXk;vd$@i Gu?YZSR&zE0 delta 273 zcmV+s0q*{o0-*ws8Gi-<0047(dh`GQ0O(0XK~z}7?Uu0(!yphv8HF|@r1Tmoy+X!F z>k%luLQ2+1=@Dp2z7x<11xUfiio~HWY=ihuXLClW5hMOBwAQ{Py1AWa?~M5>jL{&l z@NJs1=0TW4fd~M#40Hh~i3T9Qfs&}^%jF!ikn1t0IYcnOFMlWR?RCGdsVRg6kV;ME zv*rM+U1J8I6hhu(ZgT+puzqvf-b(-}7-O6Y;9d=VPF(vYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C?q9ScNZ5|S5Mi} z-F$S-lK()oWzGM+TmBzC`v2*BbAY4=p~ zMHp6Hs(SDH`BXzxr+#9p!%o)6O8ksPl5W{&4U%T?p2*vvwff-{C7T_RF$_(QdlT;X zU3}sEfn{k=N`k>MVfBSk6AwKIOP}M!Bxso3Jo~Xs<4o6DHu(d3GnTVFUu%3(!ZFeB zf#TZ#5t|aCOg@O6t3AEr3HyVqj;d>RNHY2cdaGR@4ub?%D8SeN21k6 SlkY%(FnGH9xvX{{GKwsa1^!x~EK3uL-316T z*NZWa-b@46_SqJZIB?e)b8FwgVKB3S`{#2K`I^881{48-{(rtKpp?+V+v~c3gyTCK z$pX__Lm(spC_{jo<~&ASH;WQ_0bc@e&X(5#+@6kOoDPS0ff-y%0BAp1l$fOt-cLZl zPx# diff --git a/public/images/items/psychic_tera_shard.png b/public/images/items/psychic_tera_shard.png index 0a5656ccea188856030cea45a0e0667f0988f63e..f4b1cf7b259624f024141a31fab1db16bdd3bb4c 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R)yyw%@E+x;OXEsjfXww%&NS_3g>y@BaV)Zx*z$2`J4~ z666=m0OUhJU8hJGP_)I<#WBR9_v$1^v7-tc%-lg7-}is;e|zo2^`lRp@HWL=Pe1*J z|J^lCWjEhOy%5oqL+_Zhryjnw(qmrnp{kwcQEYPWu53OxSxV`IW4FMM!;)Q}MR|LD z%qBK{Ipe_X*J! W8}rKlc{hK8yy5BU=d#Wzp$P!XUupFK delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}lgHmZ-1_!Z*PbU^Z!DK= zzge+#Z|)tS)HL0W9w5b4666;QR0aVIo6hK*2a0kQctjR6Fz_7)VaDV6D^h@hn><|{ zLoEESPP`~|Sb>A(p-#)6|NP%CUDU{`zkPk0P0FEl?NXNeue|5Fblcj|)({I!+73RKP%1-1@>Sm4<_@1La)N_ zn;BXq+rKoZbj+H~S~20CA5(hqZ?jKc-Y z`=F=J{`qzI`fCpv^x}Ui|9_Fgh2202_L3mKUlFzvFLqz@gUy;1rFu_tq1?>KWP=- zblvsYXx(~EwzL1N7);z-JSI%OthS*d?Y86mZui6I8;_rFynXk$1?z)byibpwZF+lm z?u4grB_k)?eO=yIc35jd{erpDDfO&Nj2F!96#xG%#@vPRb^Xz~?LZqDJYD@<);T3K F0RaA!UatTE delta 200 zcmV;(05|{N0oehN8Gi-<0047(dh`GQ0H8@kK~z}7?Uca{fG`L}J4)AZ4aaZ=S8)W_ z@aWNNS5Yycfrh9DfyD3=(p%qy!%ry^iTouw=N-odT$Z7ZnFIyzWn-f*fp7+foUi&N z7#u^uFzeLo2)u=>2t2_NJdfQqp9;Wd@VN^d1thox);s+TTtT&j*!B%vz5Uqs0^FqS zuxQNTRiN44yz5=y^!(;$mjuk=RKNvJB~m03QOp4o+>$m#B!A}s0000do3^RkmUdFgKj)Q*go9xsbT3((^Ie+^+yMo}{ey8id zAIx6Ms{idd$Ima)5vy)p^tg4HdwM2!XW`W(N5KfwcL8e_9derf(CUh~uuu2`b-9M$ rD~e_YvtN^NtuNVs;gTe~DWM4fF*by4 literal 6525 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 diff --git a/public/images/items/rare_candy.png b/public/images/items/rare_candy.png index d81e7ad08440889b5c8b8059f5ec5e9d832601b5..a860a116905061307eb14da5acd02bfc37d31af3 100644 GIT binary patch delta 253 zcmZ3()W*F2}(MeRD891 z%DXvx|6hIg|4;I3OQ0M_NswPK!+!|4dMd;SC^o^<#WBR9_wFP|F=j&!CwAAp|9iV% zUbDEpZ_`tElV3LV+7FKUuVdMh#J=fLp5}xy8|@-L#zmtsgnK5HVao@iz z;`Khp04RF_=y|(uQQ8g`N6H=mRY310?Z8kby_B_{!0luW)49>aEKo?7-Ezz59%eBjam`hCvgG6%$!Zq9b1 z-(;-sGGgnY)Tsvm0pjO8hHjjG;*p&oFhAR7rRO~WzzF2Bn~qX@D=r0a2nQK**8?)- iZ|5)m_h!tfiWMKPLjlo+MlZ1d0000;HVd{&4r2=Ri4*k|4iehW`+7^;C!vP;7#yi(`mI@7+m`V$6mdPVBCG|Mzyk zyk>EG-=?STCckXzwI3YyU&pd1iG9n z{>MD;1rxXG2(FvJE1;NS&-|m#j@zsc=r{&XS3j3^P6~ZG3S9ug%izgx z=F$pqzkZ;kH-7;5;h1PugQ8~52_;Uv^IK7$f2r|+j9%hCxip>>VITUO1=Hv2g5RSr z0F>8y^YeY21=A;^{;N3XRasfJKH%YPeJ;eAwr`R+-^=hBJtG z`+DWkvJs!?WdM$julU&Wn0U>FZI+feaqkEHig@>CMFjnd2>KN|9?I2^;DoX!IB`qUzZYza rY!^6r=;f{VKO6JmvH7yEUGv!^idZD3Zi)>9+RWhT>gTe~DWM4f+vIS> delta 413 zcmV;O0b>4-0;~g&8Gi-<0047(dh`GQ0dq-2K~z}7?Ug-9LQxooAI&79DI$;tuMt*s zhiDL-atWMj5WyvAYIAUC38bPX*MuMmqSh86B4|mhNkoD`w84vmZgPVn6zevWk=*{y zMUmh>aE9~ueed_4!#QALVq(%`EJim1B>;v-M+hcj1QRixGr!R%ntW&M0Q>Yga}FniQ!cJAQ{0y; zJlU-{91dm{7pSB&o2sgAb=-lUC|_mB<#NLNtRmF|&{S#U{WS7^mThY~5rEK97;~Vh zzBM4Zl5U$y?tkvnwMz)_{CLyWAD@`jiRg-ekn90q%Yao$G{C5_y z6NqRy7gI__e=lkR5e-txQD5D(?tR}j(MH$; zwWxQMYl}<(0B`!^0bSRP;@6sB9l~iAthgV~#e*|w(c1jnfWOMnq4MM9<9d_@P90!h zLn9@!Q!U`YSv}jp^elu}=D90YvHt@$L^M1-zYd||LPUfA+*CLu^lJi%MB=ac0>Ff? USkJHAtpET307*qoM6N<$f>q?QR{#J2 delta 234 zcmVSB!A6GL_t(oh3%Cg4uCKWMLEjOv}0hANF)}CL?XEY5{cz1kdk~- z#+I<8o$61%Aj|l#U9(k{$z(ER$~kwYTqHbH*AI_XK@h$l$8Cg<)BG|()Whqh{e-JP z7ijacZjU(tRY%{j8e;(cBm|&v@BPWwQxGC^ z007JY!o&3#ga`nt1OWdj)@eq}3-#ni94Q0X9{>OV07*qoM6N<$f&k8GX8-^I diff --git a/public/images/items/razor_fang.png b/public/images/items/razor_fang.png index 77c3da44c92fb58b2c12acec078214548468fdf6..75306db5c4c21e84ef9f0c9d13b23141547fe0fc 100644 GIT binary patch delta 367 zcmV-#0g(RU0g3~VB!2;OQb$4nuFf3k0003*Nkl3_+{D8^Ur4pIS zO5|{xoU8;{Sw|g{Nb0}=s_+jQ*G5h@lAnMJVx-rN97|JLOdgf{a_RTno9}u791h1n z;|)DP2$5@&pp2lccfq&&H>FRkJA0#q~fNI`v z%=r$i4afBDI2j)yL^iAd0I+s}kGAdh8qN`iEwU}Mo(H2Dcz-SMxmY3DTmo?f04Sbb z5K#)o0f5=`24FY?`{wI|njh}3Afgn@^~QP@j0ALCeJ23`fgjj@=Cpti!ppN%yQfkJ z0)ILI#T#pW)M)xCOe!FR@NSM~K%r7du2ZWy7&HUFrC@sv#sVfO%mN`q>L{yP-rn8I zvA37yEp6Q1nG~^}l$uI2?{i`2s!HwlBz#KBE8t N002ovPDHLkV1h0Cq;voP delta 198 zcmV;%06G7P1L6UYB!8(%L_t(o!((6=1*2dT3^kyjpzt4t2gKqfQ=E;NS z#qXZ&1!I^4=;8=;%Rv~#&nm8_p95ePZ#jDQ|C}Xj;FvCsfQ10aLS%sK2%0+p-Et5> z4h@<*0+$1jL!r5Q3hhGy8$b>PnmYhw8NN`UOK!jy3UrBvK|db~bSawgIfCZVKqxvu zVsx#busMWoQGv@LbWIPq8Y%5#DWokWL978O6pH8~S z*Py_`5US$z`G39n(J0ds+vHxyyoo72df2H#V0ka+(bPBy$)(*ytgT^UYN~sE!b&yYYNNh q>q-vlH}=(*3$#fa#?0W~%rwQ0b^ql04ZDCYVeoYIb6Mw<&;$T9&uaJp delta 460 zcmV;-0W2lMup{tv4Et!1V%c=nKzB&!q9@$4Ou#+KEC4cbI?h zAg`?_+?kxV39Y2Qcw)^2pmg8;Hxtny;?~~I_v)?EgwakRM9x*2FjWS|&7bc4eGk%t zKB`tITQG=9*e|Zb#9N>=usi#pUCjUXX;V6{exPi@*7PHbW{XQ_6M+1}g%`75j-xSG0F4kN9PFxxe}<0ez^o-*-@V{!OqlQn8OrS(U#(N2*zUGF5I z*Pd)wQX*2tjg_@VaiGh{=)~c3d3aK!3ZN|>$Uxr&fYFId<8G`BjOjX-8SywX$`46M zNXW$b0`W7PlzFXA^#A|>4rN$LW=%~1DgXcg2mk;800000(o>TF00007p zZ4MB<-#cFfU}DqwIPSOc4MMX4@hSlJ(j0`{W7pWjAUG-pKz|vy6n4EzqXNRjSvZ%4 zaB&m%#M!kB#Sq+7+Wjid&B$daPB{y3^f`#IEa>970%4etZOPGlk$O!C4;wpA=u;U& z0eHSOT0Q42r4Rsn8800iF^=5*9z<~iVyrY`1puTSu`&7iznc&bYe^Ui{}~3+7muOW zlnll7_CCR3-zEbd%O--~ltr`D#F`6s>sH%dN%fVy>}9X}00000NkvXXu0mjfWsZlP diff --git a/public/images/items/red_orb.png b/public/images/items/red_orb.png index b982649c9b3791b3e395d05c4adff80f2aadd4ae..cee83740ca5b6140e00573c8fbc4b97c8ce87c6f 100644 GIT binary patch delta 301 zcmX@lw3lguWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP}rhic~8Oezoz9B z3CI6Y#s9m#{+~_y|19Z$bMyau_x}I?|C^U>5l|^_NswPK1CS2~x-5=sffB1dT^vI! zdaqt`6gsTH!FpkVg6p3DmA?(&dYRPUo_12D`+w7mirD%H7yh3a?v9JMPhMasCGYZN z?|asr%Iyh$tVKKmp~Zr{QI5F>=B}REwqo^yd)bEJrNUbx84~}lT6dO@4bnyn0v-SpA^>MDb<`Or|s~_I-0X$(lY^zdHf!qHPvoB sRf}&-uUG7N+~GI9@5Re&|5Elco~&k-`F(+T2hiaRp00i_>zopr043jr1^@s6 delta 319 zcmV-F0l@yf0?z`F8Gi-<0047(dh`GQ0TxL_K~z}7?Uua_!ypiaJw{4ekKi(GMo5_z zGJ?yr86|6E1n1j5Dp?#GB>=+Wb!!x-a8yP0#Guk9hC`8+c~ zQ;29DvUlUu4q|0a6(F^MU~_91p*cbXsY4{@(Dz){RDxJ#?|=31W~gcapUmCuyC3#aMRObmB@nD*$Q5pR4gj=uqT Rxn2MO002ovPDHLkV1j4AimddllbB89wNuMQa#TimtEch7G9emCh%}h5qaL&|@)5>Y`jZZZ^<}U>wKI}dD^dH{^ wL9W}3smjN0J$`pUd~0}Y)vw;5@PAwMJ}EH?m&hf52U^bH>FVdQ&MBb@02^pl_y7O^ delta 261 zcmaFIxQ=OpVLeN_qpu?a!^VE@KZ&di3=9$hJ|V7#hK5t-%!#V5cFN9PyLRo-qk9d# zf`F2(<=roV6h}#rU+{kjV7S-3HxekuS>O>_%)r2R7=#&*=dVZs3U+(CIEGmGznu`t zcSM25dG6Xf|BsonY*kn)b+$a4b>e|$ow^MBFN`byGcY8tjZ$)OS*Rpk^jpBxxIl1b z`jw~8{xbN8KVsVxubL3YSa`#*>xrDG!gXVpnNFTd=A1oq`7OI?KL>xk#-yzq`%P9e zgg#ck>$6(q%tiH!Yvn{@m7Mt(FG~|Q_Iew*Fq~oS+z;gvMSZ&a-GJ_5@O1TaS?83{ F1OV|!XORE^ diff --git a/public/images/items/relic_crown.png b/public/images/items/relic_crown.png index d8c4552ea3cfaa78c3c46d7776b6020efc6760a5..de090041c1c6c282a0f56b11f41d31d5e0294083 100644 GIT binary patch delta 279 zcmcb@w47;zWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP%sRNvP??y^73-b z%8IJ4o-$|7nl)>V9^Gr5IU;2It;WE*7&)yw|p{I^jg8J#UyD{#CGbs@Pc4V*O>}aO19-+ z=$)tUu4Z}m>UW2os*gS`nEAayRB`>S=MUF^)wP}!;ceS-$1sa+y44@^*7f)LuXE?F XXI>|;tJ-Z5(76nru6{1-oD!M<%?Wil delta 324 zcmV-K0lWUE0@MPK8Gi-<0047(dh`GQ0UJp~K~z}7?Uu0(gD@0CGYTuDOqrH4B_$;* zutrKoV1<;-MRZ6HoxThaw$k}amM#1LyZaX~x!r2is8QoWG)=RXoEH&l-HqdVM56si z->++00RlmU3xPnh zT!0wzqV7{JKs^@6(S9*`>UK*J^9-<`x;2YM_;u^9AjGfVSo62favb%~N{t#da^nlb W0r?``hUvQi0000hSy(GvlnBhMdEUjPm8z|)F>Eak-(fjs-As>SRhjXCjrQh delta 161 zcmV;S0AByV0kQ#*8Gi-<0047(dh`GQ0C`D7K~z}7V_+BsqhJ(_f>AIE$OH-s3jfhD zT`m59)(ZpE+#$#ozuO{#fsq|Tcgtz+2(Sa5C4mjUHwU}rAaSq*fa+-CfV15K5Jvzp z$TD;clLM)vSu}tQM|KD@hRM-9AtE~j84pNyqDYYMs$b;13DAIIw!pDe9n zt!jqJF5kJIMf^>YelN4CQQ)>o@XySQ`l;fc%`8U}1QlX{Zes9s^>bP0l+XkKz=Ceu delta 260 zcmV+f0sH=u0+j-g8Gi-<0047(dh`GQ0NhDLK~z}7?Uum_gfJ9DEn!PY3pv_`$8E(D z(vDY;mar|P4VMXw%znb2{C`=$jyr1Yd(=;^nk4h<>J%@!uuUbD0g+L%=JC4%| zbM63KYE+CsHRfEmf|akOT+5DYJ9b$K8?K=?+yw#;(*UiW)_v{3_;!H2<|{}mx9nnM8)XaNY}4#2P;02~T{KA>|U0NRYW z0=5aczXSR&(D2Z&z;-~_ub>CR5zfT*zvo!0)pM0E>D_735b?aKW8ODcB z&vb3M>H6%?zF^V7;EAoV7#Cw=)v*gL8H=Zmc>$C&d!tD zmc9>T-Y$7SYT}B7p8mq+0WF(bn9f~RYrm)7lzipSv5NO=5~n_~4xX3y_WUtv(^s6Y Uazjn>fj(mJboFyt=akR{0Kv7E)c^nh delta 353 zcmV-n0iOQa0`UTn8Gi-<0047(dh`GQ0XRuSK~z}7?N+-DgD@0i6joscN=lb$Q>Jvu z8Xkc*WlGAlS%u_TI&^y21Q~;bxf|EQ`GC9W8CT~8XPk`DI1z@cJ5YP)uR zYVh~0BDCw)+&rwcGw@DlBMZ6d2M;MX<}s5x=caLd`6u2rrhoD6y54x~76Ac5EC4CH zMm8WuL0c9q_Slk10;H3;5J*|J7f->O5Z~_CUXPI^K%8(nwhpv=7M?5sonu)D2?@DJ zJ!u-)4F+2~h+5b&XE1pY!UYD}aul=hr1Xab@L&KgB!~k-eRds2?1pba&H&$vI%`?( z1745}kZU9_ye+?DOu`FKPths=hM{_i5|@iFgiUvj{?s*K00000NkvXXu0mjfr5u_P diff --git a/public/images/items/revive.png b/public/images/items/revive.png index d7952b7653f5ec2a28c726bf5ad4478510a33964..e84659867d8464c137e5142389e9d7ba408a2efb 100644 GIT binary patch delta 166 zcmZ3?xSer=WIZzj1B1(wu46!ou{g-xiDBJ2nU_Ege}GSjE09)DP*}3W^4YWM|NsBL zcV5T^6k;t2@(X4F^8d?RPzwSIxO%!chFJ8zy=W-JpuoZGXz=s@Y|%BGeQTHPU3=io z`?7cIj5Qrn7O~7^y)knIV;_Ua0mcTljDsDV6L!k)6HbY9c>b+7Kc6Y-0;9&P=#yK3 PCNg-s`njxgN@xNAdH+8J delta 146 zcmV;D0B!%b0iyws8Gi-<0047(dh`GQ0BT7@K~z}7?Uk_&z#t3+8Rgf=Y^=jg0Q A9smFU diff --git a/public/images/items/reviver_seed.png b/public/images/items/reviver_seed.png index 31cfae46f9418c7fdc8467d7cc134a4681574c79..10bc5c324511fa17168ea42b2503fe0c6ab22d98 100644 GIT binary patch delta 299 zcmbQox|?Z&WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP|$NQO0J8K^vIcC z7@2X-@%&`Z&%45QG|%7rd&d8d{r~^}4_(FG22{#h666=m0OZ4gE{o$@pu|c~7sn8b z-nWws#SSa*I2)e0apcbbJyR$5s_@j$wF>zlcUYWF((C8zY)017y^XiOr>p?+i_9+&&e!PAuzQD0Xh*otX}=9yJ_)s&KtW z!&i)X=I)t0uen56F$P!a_=7 zBV}Phbfr)Tc|<~9HyhdLawR1V|L@MZhRodYNYeajI^Uc#bASH-^L^(WGB7YO_*YaF zG)Z_woRFQwu@>HP`)wc?)V)vssZN40;*`vIj^$52oy>S%L|_< zAa9)e?&d0~p?^1wn|TZw2uQQI;+OG>86UD8g!0N!j@;@j9@|*jQ!R(CQ?N5?V<89v zZeNVN7e{$k52v`#Znt~Qk1n#f)^XG{fD~fV#OnN46Mx8r+ybRIS|uDRs6TlFFiJs{w+J9K#R3qhr zIKOnljW}C&&e@Q=-=Jy$n-42fiV7nrfe;p;_JQUQHX&C0I2l3r>n6?Ps5&54zjGGM z?}?EPZhw`c0(=Lq92GROyvb&edf@3U&>VybOx9WI+U-CXQ38|UA^9x+*~>@Q$2iji z^__HiZIgRmfiU=rIMDqAvVpcHBbna?BIRnE%oCsf3E7ZC=BvU627d&iXLT<${2~Sb rQUCw|4rN$LW=%~1DgXcg2mk;800000(o>TF015yANkvXXu0mjfRNN_R diff --git a/public/images/items/ribbon_gen1.png b/public/images/items/ribbon_gen1.png index a9774d18ad0b9dece5beb30964275fdb12f4fd13..1d731cf2e985898d83ebacaf82f089974ec1c394 100644 GIT binary patch delta 323 zcmZo-z05R0vYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-WcY5?$TZL3Wot-L7T$ zUz}}ra#P{IXK{}Yr_G-?{lKoRUv6~&|Ge_jjR*gK{SuSRT>#V|P!i-9%_ delta 628 zcmV-)0*n3A0)hpQ8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00KHmL_t(oN9~o*D@0Kg z$Ir9SY%Ew%L-M0E;Y}7;uvDTU8)6}LHdgX?XjV3MWI?3Fq?D}GkcH+^)07{HDGH0B zrdfD8XWqHJH^$ui^j;`ubGviTobTtJbI*Ai{IF?1tPg(ue*k#9)LuXU9Cr^uV_iK|Z!HmnuK?Ty z*_vKxYYCFz>1``q-`&Dk&ubnam4?8>kv|zI2H_9lwQ26*A`$X~v z5@W*z>nVUS*binjKX8f&n0RXhB-ObY(D(K|129p%eS4RJ8&~O)0D4n?NS%)iDM6@| zzya_@aBUTzqNS4od4$OHhbNd z|L79G@p2C9mZE-Yod$Xl~l7U-hhtLD_E$jH4Bo%=)4ANGq0#Q|6nO$bg4ha#Bh05!wY#= zy;~i^vu@SQk=mKFtuW@Y$)}PMX1^CtrUyEGeRzHO0nLY(ed=YtD@+i2C zr`kDfr|0sn3@ndogtZdRb0E3L?IG_h!;?36ch@L=g=q=v`XYPDI=V!K}etA@W8DITb0-49T(t^rujDqtnv!`u07~ zqwkG9NWkrrSv6W~sA^-0fU<7WFyi%Th}M(y$I(P$2xI`p05}h++_#rI62yomFtf3* z!ENQ0k@cRvwAoREAVBKNDrYwME)R!SXpsXM63!KKD3rt|roN1PfGaPp>mLyya9_;R z!%qV+*&Eht+kdf8C_)Zs^)lvA4)A()T#YSH6X^TZqiVmrDUje?fqJ-7lnX%uS@&E$ zoE;cSq3&k)POWY&5-<-CSU8#s^#>KvUF{Q4#U#TG^K|JeITa$ z=?5V1jNAuKlSGFsxwxc=`W_2SK$4KTAoBrpA2Am=&KD7&J8c)Z8eI8ccq^2n5|I5N z^@bJVBBu-3=g#O02~=b7b1cDK>U{)yTwrp@2?|aAJlp+20`nf1t8Kk62l)3M7q9^W zP{l-yMt`7`-oqIT*(=HtFkHw#CIHI~&gRUqr#P2<;Gqx@0S1$ovlFtE@^c0WaW3e# zuM-*};2Y2zVhGr6+LwS)NodEJ8@It{ zUCZ#lINR*xrow;E;vOGPGjdwylyhwUyy*vaZT)hi`~T;amu@`x|LfO^f^`dlI)zJu z{DK+&V*oq*JGwyW{hluMjv*GkTQ43IYF6N332@ByxFYo9fB)O2(lc?{-KiN*n(%08`zKeT>95`w}0XOp#IGEqj!>Y z9?nc^-Z@3kHNq>BSKwI`f52)*sTIY{*;^gn`+v~;##)x3Td4Oy=cBEJ!MyN>=wzYe d&YS-x%UwInqiNA}dlx8}JYD@<);T3K0RZqDoLc|@ delta 689 zcmV;i0#5zu0=@;18Gi-<0047(dh`GQ00DDSM?wIu&K&6g00MVOL_t(oN9~u-OH@%5 z$IokF12uszR3?djpbXg?B&>z)6e6)`lN1u>+FD5c9qPtfw5o_miXcjaKwBji5;9{j zO!xz_M+p`*3X_Xoe9z2z+^3`WzUe*OcsB3dnS1Z|bAAqE(SIJBwa5DOUjT;>9dzNq z`o^D%@2TjZ21EGF{N=6t zKJjahZ}S>yL4QgPB)C4b_iHzlR9rVd%9jHG;?1?yK7cQ)zX%ZN=YyPz$N;8?v)jal z1Q1P~h3Ej_U2Z()0en1viB2>equN&wnITdD)BuXGPebJou0Xn2cV$V={`#Z-S|~QISXuJhg4Q znaPkq@Zpl@OjjDq5I@`gj6P5H7~OANgaAmrctfe=@vX)0Tc@*2)Ym^1K0v1PBDurG zfs^jO!hg|F+RTO5j~=w~_X8siO^)!p)J;`UcW8of5F)mz&=?VQXO|^j35F7 z;PSbvm&qP~=Zir5ohh0aYW30)7J$!tx!nZ7Gzz*1Yy*HetXu@}dC(~A24L#F1jgN( z29qf4188f&i|^(pzm_S$vMI2ts?-6sqmB+hy()zN1(j^4b0&LylQRf_?_gMqeSm+M Xs#h>)0#}Lv0000Eak-(YtqYpir{{k4yd1D32)z{^s9S<kmEHnHJ(3@#7v^Pw1xqDD7Knw|*|3qnLpE&e$b$SRA*E!c{95P@^-_K$rYI~} z$inE{=T7&|+?lzTsYki1_uia)zMpgM_uP3JWO!*A)`vd{V1EU4O{plQU;wZ_%t6qi z?KXq;vdQse#pdw4bY3?-~#Pi~{P+Z##TC`8bT11-z2&xXnQ2^KS z&@?B~Gdn`Q-=6G1QN^1JfbH5Bpc}w?S+tXQRY%3E3vxM;vxjFu2s{#FGv(?G{($iK zoINJzSy>2?Tz{AVy*+LxVd=4Qr#KBni0-LUPMq$gopE|ZWENsHS_PgfOTRLDZ37%M zv_e^N2^6f(kQf#K_tU-j439-*P%pQ-+)lf4bes>>l`$fCd{YHiw>Qw+_?iYdH=(}n zk-#VV$GJ)Inhw8l;iiIi<*l&E25>qJ0V4N%L|iZlLVqpUd9{xPlOOKxyC7)wbW&KS z`^}^h0DA|R&pBLPteo{r=m6}9dd)dHT{LQ8bO3XZ5mlY@pes@O2j1IS!6ok5$A#k>VU8^ z%;GQ^iNh6eR7wD{)zhS^@#%^2xv5kWs>c6*0CNA^{e6EYAAM$=>wuP>&E42uoenY~ wyN~^Y;`vXC*&vl$D#*ttKYsKN@ClG>Vlbj$EDu=#0000Eak-(YtrzZK1;o94_^$Uz<7~{QsXTemv87qEGy-Pm2ymCLR>{C+8w>aeD2c zdqUTrvREJe_ zd~^I@`0DoYwMbUfKoQ`j5%=+#vPtMGH oA1`uaN_wMtdWCB2ufr8geQUWDO=6}$0D6wW)78&qol`;+08-JYSpWb4 delta 689 zcmV;i0#5zy0=@;18Gi-<0047(dh`GQ00DDSM?wIu&K&6g00MVOL_t(oN9~opOB_KM z#@|gLHWG{=L`5`#a43p`ifAP^ibaacp(2<+An8P_SZSr$nZ`~*644VZ#5BQ5NOD3% z5e~r*#9Sa?M9v~uxbnQ`jI-nI&fKad#j}uhW z6_NXHdXC@QM8+CmYdOgxSnynkyXj?qC-#w&qm9qmqLQ`YYyj{fM*$*FB6T;!h2?;h z_;!0v0IKH;uYccrjJ}$F!_V-(^!Xo=4x@eJ0pYzaUR_-10oeX^LV!R@L^`f&CQ!o! zAgf*E9G>gqf&>uJ$qHE$wLJsILJR`9Ar9~2Zx1BE*QO4tEGwtt#VHn50c?vg5CH8Y zDq2)~V!eo}UzD)m`e7CAA01Mx9_Nmo@;J+M2D! zc~w69EPg^?(QTxw_Px|4weG zW7%lmct90LE2@3YA=C;E@9uIANbfUZ{M+T95k%1ES*o4)vF>6JF@Om7X7YeO{ zb;es6KwSV>iLUXht-TaqmmUw&@KXl&)v*G2S2QcNMvwdWUNg*~So+!90I*TjAOry5 zV>H+E3>^3`_~!vUE$E(~bI5E{;N<10H5$4IRVpKL9t5P$=8UI%OkLnPd>;@00WJZl X-fl3^Dx7-&0000Eak-(YyEZZJ}lb9+vumKq(>B5C7|L^L|UpzBJu$w|`Hy!@5pSH zj-F@`ATO{o%2$X{G%;CF;3{jNXc?oLo_I=N*MS#`N)8OK#h8}`z20^$%8t={VS%`_ z2;a8O-~~+`E)2Jw3wU1DHUH&N60-K)KmYQK^)J%DixzutH<5p0#&uwt?1Uog_vIIM zEA#X`?{B#dL_t(oN9~t8O9Md= z$LB00jfEBpQN#yGP%orV3oQjvRBRM2L^~TR@pDKj8#~29Q3TNt5X4GQv5=g?5%58X z0R^>)La^{;CYj|fuiL{rqTn`{y`7!^Z)bKUoB|adN`>{|&wl_Id66mwE^8;;$wt8V zO3jH)RsIeB&HG81ZIqf(P->>}m92kUgPalpXc3*J!I@=x=0t=ruGa-Z&=eZ<4gkfI zSH}d<*q))M84TAv19-gkk#iio^Q)F?F}c1-a|A%JT$*enY-_+NFw)!P905?gtG?C( zaP#~I2oc*_0e^Kg;2pqOST7J~5`^d&$#@5Vr;A5@0^q!F7+RZ}p?+_T7(4~wD#$bp zKv##K1TPbvaGy-TRR4PxAf5u>)2TNRCi}E@DEO*h0j9z{{Iwrq>Pa6!032LqW^ru2+yhYDNPkCMFGKV%{tvkG;Y)12Jh(H; zHX+<6-H0|-6=pR}^nKc#J2}y%BgBE?Y%Am65kPR~0D^&*{L62d$Mgq?O^p+*s{q=_ z5E$WX!zm(Q;HeRiRF@V&jUKrMV4!&S{vkQn?owp|)V6Gsx}F%5f{;mp1)zj;8JnW1 zvjZq_EMyBH8wJMz7+M^8IVMmXoGLc}WKYkbb!wlzuw`n>sY9pszaM}aoQUt|r(Jnj zBA`@Pn}b_2(sq~7?8N-hA@gA(Eak-(Ytk0Ab+y~M@zk{HCNP^|Nn2xmPPusygPbV_~E`OMTxWKiCyH6PH8!i zW_FrWNbIs-iB?}^A22$+GhSXT@JxS#TJ@ZN+)*Ki48MGIJn~;5nc?*`=0jVz z=H{*~`q9a^BTHu4@d_bR&)F_lwWciVv=tO)_WpBsy(5p|LY_aB_ZxQvoGEWQWqt9t zpWIWn1MOB1uJ&3qKFZZnW%$Lsw|cESOM!0*tH!QX`Nk#xSC}XFb3B^$>v=lR2MnIB KelF{r5}E)uEtYQp delta 622 zcmV-!0+IdF0{jG!8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00J~gL_t(oN9~o%D@1V= z$IrFUY-YiN8k0O~ns6sIC9#qc4OvYT`5)x(kiDfSQc6ryN>&O{noCVn9*HRyEKrk$ zt8-?~?KgL(xxX`$$HLj%d7R(*e$L}}t^vPn#xLtbtpIi*fq$ywRC|zwKeKbBUl&;6 zLW<*w4*-D8!d4AVDIqH190XD(9)UX zR)~@kIV+{L?bi*;9IaY$algs|Jg3j86@@_*CnP;U)6dzXIGX|?N=yPkWk_jpK~QFkk9 zSD+k#d*vcPpy6G#6~zFU-O0g`Qw690nJn}T^^4cC2!G(=%13&5-4H@G7RTQtn^6~l z_7Cp?97fd|!@Ule{hAPMMO^?pmA-{YxQ&GPb(~*1F^8ovc%b-t#`ko<%vVhlBAYvo z5QDgf5QW)N@d=o@~I!kBE1TTU#I|6VqISyuWuVw(7#Z~IH zXw;n@0cXsdofRdk1L0MH5&#T}=E{!z(6CZ$wE~pQzCuu`KXF#7fHa`g|L+6P^5K5k zA0PBlw*^Lhz1D5>8bURQ15=@OIzB}=MFLQ1pH%(dKfo7yCNVJ6{wBZx0000_$%)#}JF&`n{75^0g@NxajHxII{lxpFa1{!Lvb!5`~{97`!)}(vn+k z>%x7mGVes%DJ7q*j+NY-F0is4PcP$XD0pTwyID+zN!mr+F! MUHx3vIVCg!04p<>$p8QV delta 613 zcmV-r0-F8T0`mlr8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00JvXL_t(oN9~rsF9Ts1 z$DcDa76Xzd8leo*Xfz!#bnQUW!GMsa@edG*u_1!_og*d(u0MwWK z04Nm^P%8S6!%;4oo6Oa!YGIWOFab!pA_agImwA@BS}Oo@MHgc`qP0ZWXB79l zD-FrhHxJM~=YQn^Gz)*}v|S4{%Q55e$_%tbd>X)BdnYv1)`5F-9vI*xo}rkx$J73d zumjNgj<$31gH$#6n>>)ZYKF_)74(K4A$^vIw$?j}3G|N&w?hPgAkca{AYeW=LHmy60w^w5 z@d3PJX?Qw6)dR4D&#vyxa0WQfld~H<>A^o%%K+6^=Ycu+z z+VS^*K8gP0!!1{L0^)h_3K?uxI0F8dc$sKiPbV2G9L@xZg@K< zSD`nVTTpG$HL+dQ0>#1$4Guh8dHd1slW{jhzN;tQf5>y=>k3cfnPtCn9ts}5Kg}}9 z;q6lWx2!;ke2k~&7RabL2WpOb~S+sXo^}AV2Ok2N4 zneJ_vQ+-~z!HS{!c4OxbX1-d-8vY93`3@0Re;eq1s{hPjxR&kzjk9fnppfu%^>bP0 Hl+XkK9lMVZ delta 628 zcmV-)0*n330)hpQ8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00KNoL_t(oN9~rsOF~f; z$Iok!7MDf~iE41sRDyo2MME}*Hbk`4(9lrL{ROo&G&Ds7m2);kO+mj96P5Q(Vg0=maW|7owxf7379i2rhfe4TkJJ17(H0CY z-Z`pk=Kv2B34b&aXIBucHYc*}mO709bj!*AN{R|{_t-fvw4EbC0G<`zXF4T@c~Ami zaR$K5(RLiTw_=V8qA)^)X4iB9-scv88jx`@0y%Tpc6lCZH)GQg)H^!j`ErT6w-L9S zExoq#7x@^Lskn$zN7m?NF)F^kQY=2CohI@Z6Gyn_vd%F4P(0dc$ z_fJ8obV^4RSIYqyC|`VnOnjm)z{%MTgaW;e8dQz|yN)K$srbjn3`CP@a)6(PBas!@ zJzS;Frze-m4VB*rDgXk-aUnpk&j;DLF#?e7Mu6+vO(;B;2>_Q0gc3j|J_M12D=LcO z-!N&zm~9{cE`-1}I=l`y*=<`F>;MFcs@rteMh%bj^}ySEszYx8~imqu<`$`~Uy{;m)IGKn?sQL4LsuKt2+9+BH>i(`mI@7+n>OotUXT$+#hJJj#_Uud0hyY=Fm+c)=#%XS?9*spk=`P{AD%X*n~ z)+%$Q9xZ;RSdz=#d?`F2_pRE6nRhWeAV@;sxnXs+F!Gomg_R-R2@e$Z6uWpr=1!EcUYX7Mk3p9G1U zvLBGR(<*Ae;>Wbyvx!F&S%Rm$)qfMmJZ;Z$=gOMA{d2?*`f*JDdiEVJ(ESXau6{1- HoD!MOISN}Io~D6(HhmIRW(Ukl`U?zGrl zfS|ss++*k+2cG-uF-T-Hc<5U<+&kwFNJx>d2@s69- N002ovPDHLkV1j4Gq1ONa diff --git a/public/images/items/rock_tera_shard.png b/public/images/items/rock_tera_shard.png index b4e6f8a29cfe7e1e51e551bf768e44cf2245c526..a07ca7955a49200cf162d8e0e891c7b066b8cea6 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R-k-3RPDhTiw0+;+px7FRfj@T`}Gnrt_iDm?zY;qbm0&zRJ^{)B38jqcq#cDFtDmsin*yH(+s&6o#S{M-0LY|duJ+RuYXg<4&!-O{j4}U6xf5MJebT23cU)y zZ)RwfZ2!`r(lKi`YsG|neoX1bzs)`c?&xzkqwTf&)$F4T6)84cdz57~|Asa*9NG9m z?}MH?`{&o;>#sdz(2M`6kn>UDO`-U`Yw{e=f3kd)miKB{AH)oFKZB>MpUXO@geCx( CB#0>h diff --git a/public/images/items/rogue_ribbon.png b/public/images/items/rogue_ribbon.png index 85986d93c8af7f41785cdb72e00e82dfa01be4df..c3cfdcd85f324c1caae5edad5275c1eeefb843b3 100644 GIT binary patch delta 316 zcmbQve41&3L_G&H0|SH0lCEPwim^Dz-HBn{IhmJ0j(UJkh%1m*5Ki~-2so`+m=?LV zq4;=5$Bd&#kKVd<>&A@-@87@w@#Dwu-@hv*7S;om@|Fbo1vC6d0=g`YYk?9wJzX3_ zEPB^Y?&dqJz~QQ$<@)je{&Jg~%UkL<&4vPiy4;Oe(^he=eH?#*PryA zcy5@uq2v+c<3;xyk5sWQ+0wy~FxjJ%;l#|S#dDY$Hg3IY(9zJ5U2tAVwWUKn&agy! z#q0KHU53b2S&RoNPbn^p_GLR&ccn@{Z>RVBXW!%Q^gmm2Ut5 delta 368 zcmV-$0gwL60+$1j7+wSe0001iRAh?v;e;DB?- zeqlrXkzpKv@JU2LRCt_YWIzLq*aZaN3o^VHd=D336aWkV{{R(W6kz<%$p1m$14slS zAoNd&;l9Fsgn$xQ%RRgTKwD4*fcE_VfGi*gwB1s)1)c?vF@NDuOjJcm001c%7$zhpCM6~*A|ojzAt@yzDI_T&EGa1{DJd)| zF(@f9EGaQ8F+4OgIW;*vI6OQ%JUl%-Pc1G|EiO_nE>bKpPcSh`H8epzJW4n@bvQY7 zJ3MpN>WcxR8mh;P=8WVQBqb?QeR$Qctb>Y zNk(E{UvObxV_{=uVq$1yWpHnBdv$YrcXxPrb$)kvdw6(zd3&EdK9omCoJB&JMn{}R zMW07RoJ2>QMn{oPO_xkfoJmTpNlKzxT8w>r#${v0Wo6D`W7=)`IRF3vOLS6BQvm<} z|NsC0|NsC0|C3AsF_TaM4u4t1|6Bk70Tf9@K~y-6<&x1>fU=h{Z7xvO>zg^FPBKi>wz)-ed(J!CmT4YW{z!8U+O1aQKS31#$?ot2u{0n(&R9YN P00000NkvXXu0mjf<6`XL delta 627 zcmV-(0*w8h1=KdpR{Z zJUBd5Qcrkzb$fVtQcX&nMM8TzIVL40tw~BTEHN=GDR)UmoPS0|K|MU5M?`R8Unv+E zV_{=fQc_Y+Pk2K_pFKX#VPkuDcT!18mrPA%Vq!c!JWoPDdptQQB_m>AUpYlWQZ6o> zMn{}UN=h{}JTx;QEGbGjIdwQWnMOx=J3KKcDNislbvry#EiO_lF(xD?DIz0JEiM26 z0CNEdF#rGnO9XUMPE(UH0X>sI0S$iu%Ng*j00009a7bBm000id000id0mpBsWB>pG zD@jB_R5(xF(rZ_OKoADtm0eJ$D72DNysSu3cC)OoG{rD;{{IhZh{XfisqelYm}TZU zdsu+sKiMU~SPIhxb<`-i7BtQ|qTsp_S1guFlU=0r zv*CE2ny&%2;8Mz-e=vnllR{MeIGuZ&BBll$mVm^ z%mPII5k+B0uZXSZd4OzTMbYO{-TfpF@N2PJE&l?UUq@vVY-JY!;x_`m^IUiDMxg)z N002ovPDHLkV1jP<@y!4L diff --git a/public/images/items/rusted_sword.png b/public/images/items/rusted_sword.png index c42e669441c610975d384bac6c6d90c106a68a23..249233374e0e6814d881ef8770c5b454b0413f41 100644 GIT binary patch delta 384 zcmV-`0e}9K1k3}FF@JQdL?}QfOyrYiVn3YHDk3Yi((5aBXXQbr*YkczB#eLYziKG{u6% z0000ibW%=J0FmJ!k?;$Dc!0sy;CJat_g5b<7U0e|VknEF)X;*Ubi_K3%ra}D4TQP&A5 z&xjG}054I5XznF4Lk`45&1ftkaduIgnDos~(v0|e89)e0iEPeJkMj)&&)0A7@B&>@fH(X~~ e^4pjFc)b9eat{QdKG*aB0000OqI3( delta 457 zcmV;)0XF{31C#`iF@FSSK}|sb0I`n?{9y$E004wgOjJcFBq>r+Qc_S)IW#jPB_lR7 zHfwEbYiVmKBq1>B|^JT@~iXlH19b$cizBSAPeT1`rOH#SO9QcONRoF+y@Pb(`aB`JG2Ie0iX zoJB%UFDz6nEC2uiw;M%i0000ibW%=JkpF;Ymb6R5(x7lF1T+Knz3^K!>29xD4*%j`IKiXDEUbs>bqcUm%^=69_>4 zL;ni^INJvR24NI+gveL$Ks zVP=2x3Gs`FsR15NIiE4pW*?}jnZi#ZC94lCmX-<3VyRiZ)4&*uIZqimLIDM?ti?6J z20v@kK(SrzxS#Sqe87G$dA=vw7Ol$?01n44&m!0F04hssPiHsqqt+rSFNoLcSKxMk zRMk`cCQcpjdOg*4lqAGo*%xPhv7P<^sOuFsMjMrF_q>|*00000NkvXXu0mjfk|?Bi diff --git a/public/images/items/sablenite.png b/public/images/items/sablenite.png index 904abea5ce4eb86c169a3f63cf398a7d6a36bad3..48eac2d5875f55a31679c24fd80f22d46fda335f 100644 GIT binary patch delta 245 zcmey(*v2$LvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gH^3*v6-X;6C_K}QTH{##E-UHV zl&t^vs;i^s91WWDE~|S@_mpo_*6dw#_S?H}|Ns9tXm@o2YTz#k@(X4F@{z#P-g(P_ zQaPS3jv*GkZ!dcD9Z=w431}3{%KLlg{|;8^@`TCj=DywI)3I#JXY~b<*F2mI8P|nA zN#kQFcv-8e7VwZM;aE^W;}2mr6B8GPbDA|5X7CGhMU@=6p-}%|?gn0^`U5ROXA<-M k??&yjt4of2f25Kjn1h+~-kn>&ffh4(y85}Sb4q9e05$P%9smFU delta 234 zcmVzx{jzxaCwP|n646M0#f2~0WL?d_hXPia4!WAl_|6WGJFtQ z2{nNd{i%eCK*{AJk^Ov-kOFvC^&EVg1W!TrE09xYCjkLO>siz5oCK07*qoM6N<$f-LxAga7~l diff --git a/public/images/items/sachet.png b/public/images/items/sachet.png index 1ec6010f1af5f264bddb8f6fc77abf92f1beb116..6d91fa210fc4d46c8cb8d582b6df3a8896eae34e 100644 GIT binary patch delta 223 zcmcb>)WI~tuwFXAC&ZP5fx*zw(96p!*{S;4TFdX(il;;^U7NghZ}G8Y)}B@d1_sWO zAirRS|4?AgH2Vrru+7uOF~p+xYG5GOQ3IY;XVdol@0?$qyrEy^|KtEJuT^Dh`{KxD< XJDC%vIrJX^I*Gy4)z4*}Q$iB}h|FP# delta 296 zcmeBRy1+ESu%0E|(btiIVPik{pF~y$1_tQ>pAc6=Lqjhwuf4^`)+TRFcB-BdweH{an^LB{Ts5t2c7S diff --git a/public/images/items/sacred_ash.png b/public/images/items/sacred_ash.png index 389b2605b93673f43a3905751e9d36c5c3446f2c..4fab9dc0dc75e20449e08624a3e56bae1f7f1e8b 100644 GIT binary patch delta 277 zcmZ3B6u7|93z5a^>i~^0dc>_5BJN+4WZ^U74M`Qdw!s))Ox0{&6c#J0NkG zX9WkNgExb!f`o~|t4KzriGC72x1Tc$d_QyC>00#D>h~K&|0c88{bkv;D$PWqtnl!= zSxkZJqH5ZhUaY>e@Q3O8m%+Qet*^vSd?1~1Uzh2I``0g5CM7S6-(~*kUtnFdyrUP3 Wht(H8Z5^N^89ZJ6T-G@yGywq81AYSl delta 281 zcmV+!0p|Xt0;vL!8Gi-<0047(dh`GQ0PsmfK~z}7?UpePfOIff;z*V!Xb+H##O zEx8I;*kjOY{w9x%Bb5$o;r`?YA-eA|0y+#mJv}`E8OQPA+Z4Pk*SDT7qQy(ORT$Ae z$E-*bcryt`?gh5(z8CN`U1~!mv=9rch9XgE{9~KX$!VEXaaG;c7~$768+*Q?TH#;9fxBd7k(B5i=PJ4!iIKmxL9tA_#;( zikZN=t}nF$l2gK;c)&|370MPN;Mxa%+L;5Vd>vlE-m+l=M_a~!>d!9=+uP8?fA(ji f8N8?GFY*LkrxHF<#hS&K00000NkvXXu0mjfDGYtA diff --git a/public/images/items/salac_berry.png b/public/images/items/salac_berry.png index ac0d29f21599678240fa1b1d3c27215ee0804ab3..846dbb4f1603dd25fe9b73b1a6ad6eeab56bd605 100644 GIT binary patch delta 291 zcmcb~w3%swWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DP%tdk^y>Di-dlY3 zUe>d3)l056U;Vb_%f*vBfYO{LL4Lsu|DnK~Y4#PM;6_gu#}JF&tCJ2gH5>3asV-6b z|Np4+)o#(t!hsnP)Xa4A_e8CdvdMPprG*fpUW-B$GatrVECK=3 z>u{b0K%Z3>fd1ZnK+x>*JjK`8$M(`rS62v4fB-axU`U}K5PyG3fu;n56vV|;1#>2$ z#)QH<^dl8F01STY4wE=@oi)v~0KgOwD)i}cFd3S=0C4tmB7}=HQxGsq-9xq} zEQYe1P6sEH?h8#!k1UgMTLRq^xW~*1L35kj;_Aq{Z==_OlM;=r`Rbyh0D8<)VhXl? z{B-WkTRH``k*fmRc=D3cy74*&RU5Qy{wb?q5J_Xpdl)Z~wO+4fm+mLe<~& b+IG|4xqp87J|wU700000NkvXXu0mjf)&Z93 diff --git a/public/images/items/salamencite.png b/public/images/items/salamencite.png index 1a0096b4de5069c60c3f20472abf48d70d0f8561..f175f39d3514e364492585c34b37f7dfdb4a45c2 100644 GIT binary patch delta 249 zcmeyx*u^wKvYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C~WcadKMKWQQR$1 zJg2(2n`6q}q%}vcc6Xm$v*z2HHO)uw9X)#V-Me@H|Nl2QV;u_ABTy3L7t8?UBZC70 z-OfO{98VX=5R2Zo7Z36^DDW^B1x$DtqVwnf{auMWa%WU5yS~qayJf>C^+2Pw6D@zM zEV^@s{Q<|z=-Hi&E;AIER!&iAc+1H;X)iZ>jPs2JOv||#uUaq4pJ4mJ?*-dL+XYS@ ox9-Hv-*v6mt}Z!h{f|n9TqYLIi^{1|K#LhXUHx3vIVCg!0Qt6X_y7O^ delta 233 zcmV0{Q`v8Gi-<0047(dh`GQ0KrK_K~z}7V_+BsqhJ(_f}si&6cqj=W4c>> z^ytz50>yLwb4=L_rs?7kn8n}Ltoh%3^d8u95KdZi6f6$HG;;*9f&y!j-Z(X&O&{T&tefYalpHG@8FKO+TD%e z2xJF<)Y3E^U<(NeXeiJ$7a)fMdPsmA0Kzo!J-Q>19Rjj^iK_~WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DP|$QN4hqU*n8LvD zjN#r@$DphwbGE!Ydhh?ccmKUt)>{G^6vA`I`aBg)nV15g3V@vMblfnCtr9z!+7%9%tt>DCb=+1 zo_BaJtClWtX8vxDg!|4HN`+UX2U&Dazwh}no0Idy-t>f38xDp3kP{R+_p-#{+x&^| z{OZO3KYTIgUL}i9*7*e=buQd96I*_};=}wn`G|!q4Ch&j9D$Bv@O1TaS?83{1OO0@ BbD01D delta 269 zcmV+o0rLKm0-XYo8Gi-<0047(dh`GQ0OUzTK~z|U?UpeP!Y~X)eUz>oqgUuLx^fjp zMvlN0I09=&##|xbppSl|goW4d=`I2|z^)=W zoYP!{;qs6uCwbRb)q2FoW~B z8IIBKj-(YF$?)wy+kN}H!+G4U@LYgJT;MeUH+W3~+wKA{Np$`9>job&!Xuu3n)#}= T#IwWz00002^#A&;M+>qIKc0yz-;}A)GS$9wQf91> z+I*K)=8qhoaJ-D3-O1=OLqX_i)Mkb)>LMQ7^kfQn6PeX+g>oc3@7SE*VEe)E1zUsd q0w)i>y!HNPV;(#> zbV~7m$1KPHnqHb(Kp4bEb^r*|BoxpcfQ+XUdtr41%^a|#J7kKWBWU7)z2C0F9kI7K z2*VM`4gjg8SvsiRn}szbiY;m6dt9M_9ugo2fG|ybkM0O$hd^>gG3_l!FN$FffmuFa lbpqWj9tERd6pR9D0|3%eM|TaN#{~cY002ovPDHLkV1oJFT@C;M diff --git a/public/images/items/scizorite.png b/public/images/items/scizorite.png index ce86b80701c451fd9ca6e1ade1b04ef740495b2e..8ffca143835d0940cbcd1b3c9191363d6ed93b8f 100644 GIT binary patch delta 235 zcmey$_=jVTA)Ohr;B5VMeo~- z2l);ta4-k3-c)<@e}DPWqtZK4Qqrs6dM9s~GS`0PiA`c^=RB|03CXVNbf~|tZOG`t zu`28JUd8~MhYSxDg$jHHnS({e8K&7Lz>% delta 228 zcmV=K~z}7?Uk_&!axi~uVe+fV~rbwHBzz$ zrAu1MTZIu)W(~u)Fc=FdO?(K+Px?v}Mfxw+-KCTyNs@o1*2*@+i~Din>9FV4np}s7 zNb$Vz?b?}$q#QY&NuDEN61H3!DzPSDB{mn(a^$irB7xxE3SA%}Q}6;dx)8lYm_Vn# zDiI>Uyu2kIThL2b0lXW!4!%u7rx3aeKBnL%0RbfB>%D{(LAjoaq2>N4eu+HGfA&up eUYsOJvNd-ktWSG2eWY3d0000yvZ}j-iq}-nxjJRZmL*$`9=-bP-M9bhXFBB2Q$^$-5re|Oxy>TSt?HSc2oo)g>t&SKc}JMNb>V}A9- z_nHr{hiQ1t*~R#K-}W${6e1(mDp9|a~b*nYa}8ood+aIuOc z=azj8g)0rTD5Ampt`P0=ugb& zQ%XaBm!5Yo>q1~YkK1&b`wa2WKc!VV;^zC|KK}~fa2zwl{(o@H{~ac(8bGr~0svy1 z-ZO*%0MWUqVu)+z04NJU2tewGw{HTf2*Lr}+yO8UM3k-ru^8Z|*+&3LIq|mV+?+*s zssI$e2%&QxLgXEwJ4MSD0KZ`b&=`lvW6rbQy-r!QU*{G9xH+vPNY?=Li?ORH1FTpR z0~nEN2VlI8<3?0u9szubxp{0W5K&dzaNJy2)0oGb-}FU9%gKO5CkWoJe-n7Wot1o9(~HYo7Z%UHf_C(+AgY?rrB?Kk-`5{dmQ7 zXZwX3)}8;~PA_cuRCa4&O$lRt&?VLeN_qpu?a!^VE@KZ&di3=Ap(J|V6^x~ZfjEG*1S(=fv?%)-K=H&gTe ze#cKAKkZnvc~_4mP(ga_5pN*HQxfDC{2u`rgzld^2NdTl@Q5sCVBk9p!i>lBSEK+1 zr+KAbMuyLiF$PFrbHE=@M;PDpIa7uj$r8HbYj$8 z9HSyMA?xgJHU|sE_pFnC^E~x$49L9oBk|UxD}9;7x$^^-sag- e*>(y&ADMZh)i14yYjXj*k-^i|&t;ucLK6UOvVf8R diff --git a/public/images/items/scroll_of_waters.png b/public/images/items/scroll_of_waters.png index d1e6a0388b6bf89034d1c486d2a36cb56ed2566e..e4a0cb725eb2f86e22fbf1c928640358a2431956 100644 GIT binary patch delta 214 zcmX@l^q+BpVZC~QPlziI0|4H<>pr9Wb|fg?&`7ZZ>qn)-*Ly9&7VGg zn(bNf45*H`B*-tA;Xe}4WpP{!l*sjTaSXBOy*tTK=!gObOQxyN#Q*!tec#SJSy{f$ zc8hB3P5XB7Gpf>S{DgV0&Dr~?V8>vW{>-#owZxb^AFIK44$rjF6*2UngEKQd!+yX diff --git a/public/images/items/shadow_reins_of_unity.png b/public/images/items/shadow_reins_of_unity.png index 929aeac6fb4a0ff01dab467a2440c63fe2e0f6cc..85cbc446851539615828ece73f7b9539266429b2 100644 GIT binary patch delta 311 zcmZ3=e4lB8VSPw|Pl&5D1A~Hqp@N8^ri7uUil&5!qlAj1rlyyUrjM?cua35_p0=O4 zRe+gQn1x+{sZE5PYnZKjyuEvZr-#39K(M1{l1EUsXFyI+Txm#Zd01*?SXzYxvsMHH z1A|OSkY6yve_Wvc|NoWcYXgA_CwjU#hFJ8zop@2KNkPCxH@%d3YS<*7|Nrg1l7N%!j&Z?NrTn^ delta 381 zcmcc5w3K;*VLeN_qpu?a!^VE@KZ&di3=AOwJ|V6WB959Wnw}p1W>#Se0*2;R0Uklw z7Ip!i0XdoyhPLkUx>~+Enm#((zK)(rVQCfi?g^TjUZyq?A*tnIsg-uFVG1IKdfI-z z0l^X~jzMvyK!ca7{oU{x(-yxS>O>_%)r2R2!t6$HM|;t zf}1>D978PppH93j)MUWpve~ukO3}te9Dn}TM;R6H-svaJJtOd(Z0WP`5>OetCz(xlHLbOl6YgLC=*ARIkrfXfiu)oUm|J zJPQ-Ml8H5A%9C?WiMNf{8{5k{3CzEIDK2XBA1#JDWAR3xyCv_cn1Ai#|E~D;?P5=M^ diff --git a/public/images/items/sharp_beak.png b/public/images/items/sharp_beak.png index 3ce8d83e3aa7c02c0e2d11f43c2bb84172a1a061..f22019e658bc198e43319bf561cca2856730975b 100644 GIT binary patch delta 231 zcmZo=`oTCsvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gBEToa6-X;6C}cTGbSEiXU1Ry} zUey0*bN+wZtJgg%4=Be`666=m@E-!Mo(eGnidA{KIEGmC-o0eacf^3hHBe4|^M6_P zra4@1%1rc%^CqY|f7#ByW5?QL!8)ExUj-8OtSe^R{Kb&N{A$M@{Y$zxe>3cxxs%&2 z{oVV9x0m9L*w;Kgbcy{bn+MC=hN43@3BOGg=4m9zP1t|lZ^zE*$DO~tW?6lH#mdKI;Vst0ApBWO8@`> delta 244 zcmV^7f?K1D@}twq7AgGC&3)-41d`u7Ft(>D5{Yz9N~uTP26q2cZV z7XEt7egZW(iY@^-1T>s3py5)0YN3*!90?281u&|+fD9-DpKXEH>*Z5j1^$5pOqm0< zS8w6lk~ovlc8}jq?gHZ8(?Oty(8sO5s?b-$Y6Br8r ue)}3+um6-&5Fo9A0j2GDL(g`Rh-VIrOZg@O*LwB<0000v8uT&8EleTCI( zd`qAKBsi644YfoAA~>g%3h39cP(>YC=;WRhqC{%(+-FWqU-B0e`~Td3_ha<|ioOEM Tn%N3800000NkvXXu0mjftHxeE delta 278 zcmZo-+Q&4(u%0E|(btiIVPik{pF~y$1_sdppAc6wQ{&LMn!K_J(yG>~hF-Q#kwBTI zC;F#>6njaKU+{l0V36`=b^{7=7I;J!GcfQS24TkI`72U@g7ZCH978Pp-%j)vVo~I9 zc0KT0ey8x#zZ+-#4M|^^A=jqm{d*z5ME$M?Cs*5&xl6*PKF+gVFn!-m$2Ge&a)fn4 zx6gLjU67!`A3>He_KOBTF>}R|vvf`@5?+Yg!|6LQW?r^O8^PKg|0*&@Og_rUT*W@&1 XMJ`41i#}QjbS#6XtDnm{r-UW|v5;(4 diff --git a/public/images/items/sharpedonite.png b/public/images/items/sharpedonite.png index 3a71f7258ce1d76413e8e5dbde70a0141d0b0914..b3eabd5650f7eb39b19f84d4aa4f880d90915040 100644 GIT binary patch delta 249 zcmey&*u^wKvYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C|q6R_5WVALh+j7 zC1+2fPxnynt%S^-<7x{cSgms>-$W&TQ+=B4>Vf4@#3?| z9Yun38ZzZ${$|p+pRzv- zTY{dQt$z2d`2YX^<*_r2fYO{LL4LsuKt33lGtIsN6rAMg;uvDld-sy3*bxN|mJ1C$ zJO6h|>r8f4zNx--?SGjIkAK8)yv#1QSLUrz++u9)SU&f4Na5FgK`af`>?e9>>PpSl zZ1M{ee0H^cg@X~Z(~*CT(ce}Hh&rrr>Ij=qyooiXBgf4(S?Eh?WA~2UZT^Ctuiu$5 z%n0v1UDm(vz=XHi4k{Ptq!jZobq3q~S$#bJ`=vh&N99=kzRz~d1Uiqw)78&qol`;+ E0KUX<2><{9 delta 282 zcmV+#0p1xiL>1xm`S z!3dPJl$4ZNfs&He=p+5;bn@9CpIsn-=}ROEc`tUHWST}sMt)2PAzJMMe!dQCb()Dt z@HcUlAiNYkGAY`w1@?F zx%!d_;n>$4t|esUGIbq#OCYr}NJ&3IG5A diff --git a/public/images/items/shell_bell.png b/public/images/items/shell_bell.png index a185be50188e6f68da9d5acd4167a1e02fd86f2d..6367d1346726cc27495efefc860252f614af9a27 100644 GIT binary patch delta 303 zcmaFGw4Z5$WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ1J5ds_yPy0t8#O z%sG4X?AfF5u3r8B|K8Pa@18w-_W%F?NtS7ofl7Hxg8YIRfP6U6WpP{!lvwNO;uvDl z`*xBy-(dwFmuz9-wvT_$N8diHHKG2UcBz@d-jCvO>-W#Q8uFymb3xd2UE!BcMDL3E z?C_Vma%!Qu+>JLf%(2y$PtKiXYvBC0<8+e4BOOQSz4~kmqqjXcV{=7sH_Oq-4@@$@ zi#?yo7B+WAN@UZF_&dj+9K5O^+;_vVCEI6bP0l+XkK1&WS| delta 346 zcmV-g0j2)G0_p;g8Gi-<0047(dh`GQ0WnELK~z}7?UlU^gD?<<8HIURDI>5#N=9IX zl$5lTl$2>Nc}5Qo>?Fb*sqUl`$hQ35zl*}f#l__Uxz)8)RV8Iv2E7zU2tk0S&X~if z_wFI%I0pUZamuj6U_e9$q4duwtTk;L))996r;NZ}He7=NfPZ#x&!@f*iakUE5PVZc zWTipF2_}$=DBz28Ob5?vXtn{oYzy9|fN8)P7?Fy?VFOn0=dkbd49rIX#_l7y;G0j_~Klr3h;Ca^rNDCo{B=_{%nAV>Fn1Yep2kyd(?pG3&?iltWW7O srmf-og482e3&DSV`}bP7xVU7>3o&ldIV-~22LJ#707*qoM6N<$f|c#2t^fc4 diff --git a/public/images/items/shiny_charm.png b/public/images/items/shiny_charm.png index d0c8197f7c4246faeb05cbda58b44bff4c6c3767..9f692828d04dc94d405516239d8a1d6db9894f94 100644 GIT binary patch delta 246 zcmcb_+|D#XvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gI>0By6-X;6D9rhvrCB^BsQOvd zoNtzAzs>pf?f?I)J4*5jfYO{LL4Lsu|DnK~Y4#PMV5_H#V~9oX)k)S&hYdKK7fY~w zw=ZnDeeuH9iw|7S8_CCC*KWP^WH;aYiEs10uL&0XcJ(l0ls}=iK*q-|P>@-`;a;$V zKskRxYQffGrWu+|ybFJH^ax2a=`8crNZOc{;T=-{=F#`sugfjx?2VfAGItL1gLi5B qz8CnJ-?XdW`fz@2_l!6HuQA_lXJWg}y08c6A_h-aKbLh*2~7ZuGHX)+ delta 451 zcmV;!0X+VP0@4GJ8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00DAIL_t(oh3!_Wc7s3= zz4TPHt~ODF1c^&NBXL2-)gn_#{(w68gyb`DkxgV!sjb@7O$BFw04F>{4cF|l2jmvveaegg|qF!RxB47FHM!?EfOhjBJ?BV2DEPpnaN)bd&j(mJs05c}Cq*>PTg zuhQ0I{$iisYgymf0ogqO$Qa1&HNqBVAj+o)KL2!n?sK7IIHSX9ob>h-vCTYe=3A$K%;S6>8ui zq*?N8t7Qc=C2!n@LXd4WvAZhYWw?78mF>o|LjZuQ&jG|aCL)&HH$~-bIR7{%^WXCi z0N_P`OURRPX>yx_s}vxlS>n(wTHUtVD?cJ478gRd|2)>JB|zqb{b-IDF(m!~w8_~0;P+?K4OCe|Gv>)YpCuBpgTe~DWM4f`388$ delta 295 zcmV+?0oeYb0=EK?8Gi-<0047(dh`GQ0RBltK~z}7?Up+Z!Y~j-Q*sR7k&+|$3MnZm zxk8RWOX(xf8m*Htlf@QDSw{kSq!GVp=Q+C$9)_;2u3wjPE^6-@JcVRu7_Nnj<$4nU9e>V4r-eIX1|S6_^esFb zXRB~i08Bfa0T8|br0>&vZx4XgX8;OMpYMm+1%OSv;PsG+>lQ3QtMCE^NDMt%x z;qq#-dY*hO-3AUfTm4r6ycH?jeEUgJSc>xs*|^5+;lqQ-05F3A$~0VWLk*zshIzRD t-v7M&d`!N^#~ZRL?GkkXFFf;6kW03XW@70wW7><;0@^ zwoTSqfGqe6Y71t2l09-!82PP&zQ~bG$r@gj01lI;!2M{Ji09A zs;Kb02m55NEZ%6E#FMsWLYz(XZ|iiPGgb@CxmFyon7NqkfnLKY>o7*mC5Lv0s4~T0 zC@!4jrC9HHCd%Tm?~2%{AAcrwK27b9XbDMiY_+ymT=SLT)?$&p{5AKafR1DEboFyt I=akR{0K`yh(EtDd diff --git a/public/images/items/silk_scarf.png b/public/images/items/silk_scarf.png index 2eaea7aa435b2aa367ca93dfc31b79f42fd8680d..83f056c8b413283cf1e693df56bb9e35c7e72b20 100644 GIT binary patch delta 272 zcmdnOw18=XWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DP{^t-UbAJ((X(go zJ$v@<+qY-`LEzBEwdO!+&XOR%U-Nj;YHmF7rM_p+rDdzSPB7Se9=7brWcZ>pLD@pKcuw2V z^zX@2CckOr=lkR=AXD^t&4!PAFD&Rj98jzu!PBtz!JOZ%2gDoRwobMC+u-S2)xWVr zQD;S5Q`3W~2i%v)mp0z`&>Ec}vt3}1bFJ#hh z0%JzTu0}?B=;1mQ5PPT;OO~pn&G-EB*J&Ct;^kG0E5LjC(^6;z`SEZuU}pHu-k(&IHh_I q*aC;c8PLkK-yN=Ra~d(?$ngXPTo}JVUeI9x0000;~5SZy5_*Z6u$ZJ+-#++~GOLd>B8S z?0(wK)UmC=udpvwQZ(t}x!Qbl;z z(t^jd;AcLJjKR-`nCN8(mI2Y7w;R!AF_}yzlj(+>b35v_a46^eJOsmQt>1bSLc_U% z7~^~hp0|c``cldXVkih3dhh>+({b-@5H?uTx`z^uPz0(Ylv)r90|-3Z1){<9HXQY9 z18_da9$gS9g@AMQ3Pcc{JZ-6e16Lqus1qSfy`6g6%Se#+hB? diff --git a/public/images/items/sitrus_berry.png b/public/images/items/sitrus_berry.png index 8e9463a80c264f6770f50fef6638f7c69a4b0022..703657ad8dd443a375198a12bf5e453b6b37d990 100644 GIT binary patch delta 264 zcmZ3_G=ph^WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DQ0OkUTvKcq)a;dY zHR|dXuV-5v-(8LR|1Rs~tpgoE6zNDg5Ekwa^tt2j0%}ZLo>=n9}2rQ@+1r52wrgyOZHJbH$|Rn=AwU3YZ&ftW#j*{_F4?kc?_PeelF{r H5*V8R^el8d delta 287 zcmV+)0pR|a01Wk#T7 zgp^q&C9AMPN>+gQBuCDd9YxWUlE=HQmcrG5HzO&=%TV9HgYtU=xN^pg}|Aip_)=(!zc;Q+yXS&l-LyPyN>;C lx)HH|I#0PF%^1r1rgn>{z{WH42wngH002ovPDHLkV1fpDfLH(k diff --git a/public/images/items/sky_plate.png b/public/images/items/sky_plate.png index 1fed973142bba604fe9ba985ff4c39ffc3506f3e..293bb8f5dc201c8efe84d2c6d3a348bad996cd51 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqfkMR$jR_kJRy^=H@FU^IkBSdJJZ>fnGB7Z3lmz(& zGyI2utEWPYfMQvmE{-7EC>fh0n+9>2Ny)|ErX}4pUXO@geCx(!%unu delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6KK(OLL!i^slAAWco_@OajgF?j& zpya`?0n9*(qa?^L_&)?N+-u$&2^8Zj@Q5sCVBk9p!i>lBSEK+1CwjU#hFJKYo#e^a zV!*>PS?%=y`kugB=aQHnnFPyBco7s*AH?ys)n51z)BbJK1(f;(w`2-TSY*R>N$CV* zt>_+xf-D8=MsCMSu?<|44y#e6arzJ4eGaVHQIgz?ZK7qIL+2#jz5w}Bce6C)2O?b*o(Y=k+<$=y*VDNPH LV|7{Ql+XkK!gFd< diff --git a/public/images/items/slowbronite.png b/public/images/items/slowbronite.png index 7eac1fb82d5d23dae8cb890d5e9e85da2df08a26..3dc21ffb550c81de1fc27231f7c883a556f8bf7f 100644 GIT binary patch delta 249 zcmeyw*u^wKvYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6DBMfRdbT&{TXXlb zIdi^kX+FDU&EB(n?;UNvcW=(Ocg^3v?ft*^=(Bh4{{R2qY~X7E)FV(5!PC{xWt~$(697tQc=Z4P delta 225 zcmV<703QE}0`dWn8Gi-<0047(dh`GQ0J%v-K~z}7?UgYKgfI|AJxb2BN7&M9q}(gy z2wU1tY3UVGrc9Z3+{qFdqhjMkgn95W1mV9-1iMaA6y>QHW00qLF-(8~UYMfI&n6*p6_-%%CLk#k z_a<*ay|d&T=>;#X#hWoWK{0000a==u%0E|(btiIVPik{pF~y$1_tQ>pAc6=L&JB^p6y+-WKPzUZ{NN>ySKME zsM=982q^!fbKN8$#aR;M7yKUz7=ryPgg}A?9+AZi419+{nDKc2iWH#WY)==*5DWji zmrn9E8}PUW@>`t!UtbvihKEn^t=#(hhU%0imaF!k!yIydnLcB?Fe9?W_8#NM(%76; z-Z=`pJ_u*rJ+q|K$cZWC-tHf)vnB{nm{l&wp6tqW?4qICX93{}79D-g^9~dkz5j7S zz2RzvTtW+L#2?m)&zpFc{N1d+U`4wBf(*y*J-?U~y)OEnlRPrN>E-s?yzS5TFkbn^ ax=WZ#>V1LM3@)HU89ZJ6T-G@yGywo1Re0(E diff --git a/public/images/items/soft_sand.png b/public/images/items/soft_sand.png index c627bc10a8e668d2b8391e08557db09550372176..feda8cd385836ed653b2c1410663b718bf40cf8c 100644 GIT binary patch delta 255 zcmbQwG=XV?WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP$;%6o|5Htc1`h| zq&eT7&AB?~>bouP{(rmLebP}0sDi5`$S;`TKMd4$ii810yF6VSLo9mVPI44tR^(ur z&M5Q!zx=re&!#N+9+JA}=31qy*#BQPo~qzXPhBms{7?{I3|sZ#ASV7c#ss~4Tx@5X zTX$=nnfGbS@kjHU)-C^gvNPqI&D}uJMUPc0To@+5kWRH*#Iz`PYj5<#2RYS0J`}dU z{_wU+(tF3g{s|l0j=WoWwoU2YrR_!kH1^LGpHjt=c%wNo8t5zrPgg&ebxsLQ0EEAG A3IG5A delta 271 zcmV+q0r38i0-pkq8Gi-<0047(dh`GQ0Omxi< zTg;*Ykb{8vjn{&6jc|R=-G8}C)CBa%nhDfCIsUGHzibSkM&Unu*%$_&HR~_x4GXYw VzDfVsvH$=800>D%PDHLkV1kSMb^ZVV diff --git a/public/images/items/soothe_bell.png b/public/images/items/soothe_bell.png index 62fd6ff26c5709751c13943ed51973b823707ec6..fbceb808c568c50fbf631994da8dba302b4674b4 100644 GIT binary patch delta 261 zcmZ3%G>vJ3WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DPzVYNs;;hXHZ;6i zoV8@hlK*@6o;`c^*|TT=|Nnn%RbCHN#9b2P7t8?ULqTm>?Ny*~kEe@ch(+(+NsdfM z6gZf9MOps;f57|pYRUQCG3h)D`aUjat*d$H&Glk)M9_gE_GcxE2@^|CHtdwqpTn7E z#~ToRU~x`bXj?!+prcG>ZtjHO6^k3ZuE`$IQ&;@HPW`|q*B#8~I1h@J6$d*Nv^`Tx zQ`kR?IX$sqN5#CR9qq?1R-d^2PH%71zu<*p00i_>zopr E0Brbl6aWAK delta 280 zcmV+z0q6df0;mFz8Gi-<0047(dh`GQ0PjgeK~z}7?Uv06#2^rbQ%YJ$E0(d>J$l?$ z(nd<~xGmU*%M(5rh8!Kkf&-6e0)B7CpSW!+R;(Bl`@T2nF?hSKcmrfcZOTY;2Pm!LAFwp|yYQy}Pho`0>@+QBkVO6h$`ZG8_j zqCo}51W&+{+BxT@m}0`htpR--Za@P9wYtmRPRCFK8kk@j?y^^v)SqVHF8h!Q0Au9? zv~bo)m;p>652yU06#(qvoB<&QFk!*$3Np6_!p;E?wmX3eg&)g)I{eC?ax?Njp+~P| eD^~n<`~VMUBoQ>RCi&U`0000pmfWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP|$Ro;~2Fisru@g zDOc|u{dV@=|9kJ={r~^JMYUf5sDi5`$S;@y$cKQsPLVL6Xtt+|V~9oX+l#098Web3 z0%zK3{QrO0uk?1(qglJ>Hmg*`F1P31HaAlJHD`LN%H4g_3?@aX9MJYMSjNTU6kMOw zAysqHVJXYO%LU~Yi`b?u=S)!bc=+sG^($M(?`s%EKAyQd&tLY<*8$8*<&5H@ag@F#AnRYVxv53?$Z zn8K0n@ls_G6Ny})?Vgts#RUMD;Q|u)G|owaWlT;%hG96s@mam5lfW}6B#R5gWl=kZ z1d97(-M=*vz)pF`EP!{#1#$@iV#Rfmv4H0S3_sOMfF+Lp0Gq;DLWvOgFaLz5MV}0000*yhWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DPzVYNI+~O;Wy+K} zbLM=TGUe>qv;Y79KfLL~YoIh|NswPK1CS2}=1jA%00qlET^vI!dY?{m(DRkmV{*&GyzCn&7=dNI)&Ti#QjU{i-a=m1X<&E%a-pY33*_>s3 z9E{t)GI%_{cY8^(zM7-gaY@CU#(4(5@}7+S4tvY}PevL%NIh}+FXKLk>*7LxYh^#g dthj%MU8INUY0DDn4L~hXVB8XBY@VYpp+s5D+#1h!7BM;10w+ z+*(1F0E{u#H^99|xHe$lT>%*W+4swA#1+6!-&&i;*936~z*>R`g&_hQ1_S`GOE{-i z2%6!Ke}D{!DF#{*#4X%fr?-9#;BInC+i;nl5De4?^x5^?>sBb#vY(GO5^@({Xy|Py bmHG>vxUbC(;eLLy00000NkvXXu0mjfIhtWX diff --git a/public/images/items/splash_plate.png b/public/images/items/splash_plate.png index a832f3dbf8abc1c1d50d024abb1535299911b54b..d86ae5eab579ce0986d5a483fc3d328bad37f4f3 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A_q&1T3(~I1y0sAY;Ohh7~_%9Qd*O7n2Q{9Zji?LLL?;IIACiW!dZbK|fl>=W;T$`WFt> pEm9}A_bhak<1X1yvhjWzL(pZmt*x$}vw_w!c)I$ztaD0e0sx?0Pl^Bl delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_l8Y4;ohdm~r4o#)Kah87B+^ z762vlt}&JZDUOmLzu^B6z;Lg5ZzNERv%n*=n1O-sFbFdq&tH)O6rAYk;uvD#e|C~5 zUyA_`%Vf3F|Lc1KZ=FkGdSntTGvP&0NPQ5;*H(MsLrnX(O&3t=6Wo$1Fkz7m*CnMB zjJ2YB7z(l!tQ)xol`;+05}3^v;Y7A diff --git a/public/images/items/spooky_plate.png b/public/images/items/spooky_plate.png index b5794713d0d23e4b1faf476be87e5c33e00bafd8..d7df7d25e320cb83703bb75bbfd0ba678436d3ce 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqK|(@CK|w`B!-N?#R&3aC;KYd=4-2pGGB7Z3lmz(& zGyI2utEWPYfMQvmE{-7EC>fh0n+9>2Ny)|ErX}4pUXO@geCy8w@;`5 delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_lic6Eol`;+0Q=u*Z2$lO diff --git a/public/images/items/starf_berry.png b/public/images/items/starf_berry.png index 71fe1ac116f549499779636781a78bd975ba6db3..cbf423e83438673b133219404612f1e626c3c17a 100644 GIT binary patch delta 282 zcmX@Ww2EnhWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP;kuBd>7>yG{v%d zuj9QnmP?*xy}Rd_H0A2vcXO`(KWYn2ops#tEXp37O!_{8F$xA)qB<)heKwF>1``GaK>Eow8r-wsr4Qgohx+%)*L@_)X?_sjr`}l ZKEiWZW#{G_2?Jfq;OXk;vd$@?2>^$ac!B@` delta 304 zcmV-00nh%b0>A>08Gi-<0047(dh`GQ0S8G$K~z}7?Uu0(!Y~j;Gm2YANa+Gu;0J)IZ4yhs8OR}IOi5lgs^ zbnU)tfaR8OJhy#Y#)JeCDpkxt3^>fk7ZGl5;1gKF$K_&cfPY>64h#WIVQyjo8(>8fc18h9sZGwUOc=AE|%1L-u z_E@;@#~^?;d^)!Q8iQxw04xR+1^~ktn{v##2AiC{Ho=UU8R0Ro+5HbU;8}9{CS-5K zOqjoZnZ5qn$tfeC%zr|#8R4lfq112vR@JES7jXlqLSe0n(R@Du0000Br3 diff --git a/public/images/items/steel_memory.png b/public/images/items/steel_memory.png index fbc13016c002c84e2c3c0049db4d52ada8b83cef..8c45bc8b6408b501c0b6d23c394415c7bf2512c5 100644 GIT binary patch delta 326 zcmZo>zQ!~`vYwfNfx%@-*D)Z)SRCZ;#IWw1%u680AiyWY6-X;6C?q9SS65FdZf*{m zv!r;*n(jGkrmWer7YL4?J$m%$)vH(U-Mjbh+qeJ!|7YwLc?i@aP!i-9%mCygg98EG z&Oo^xo-U3d7QJ^TISREX@UYbPE@()6^uK<$aEU(0z4GTNq2?Bh)1JyJ>*`w^UQoG6 zAbacNjW$Lp=bsAklqO8L-^94pj^*aJv>Ao9yoqmlZ{7)TaGVn~g?;(L-6vjEC{6gR zJqajpyLP6)v62?Q6F!Y5=VUf&Yc3TDol#TyLVHD4>-h)FAK3p+d3485cWLhhd-D&I z&fQjQH@VTkwl13K&;)&V0@&cv^+v!Z0VqR)>$){jmbFvDTR=+y&TM%v!PjmuQ8mqR0ST890OHD~M3x$S znt+7A^~eh(q0s_tJRP>i!gmRzz&PDaRSpZV;bi0CS?la|*$Icp;U>hN0A!%_Y&LW} zpT7&fm;J5)p=^BTWykYgcf2h9UiRJsgmdU%jg_%=zR$DwZbA*Wja(@alD*e!XoKsq zOMy_hmjE_&Re)9CFbaWtk78~vMJS+W{wW6%+sKUtM;%CFj$r9joCK19jwi)`+RU(J RwWI(5002ovPDHLkV1kYOtEvD1 diff --git a/public/images/items/steel_tera_shard.png b/public/images/items/steel_tera_shard.png index b0b2ccb173711a311a9e81269e9cd286b043dfe5..c93f8c52f60e61c10bfc5501964bf11a77194836 100644 GIT binary patch delta 225 zcmcc1)WtNxuwE{}C&ZPL0R$|aBP%D*-Zrak#rC~NE}lJg;rgA&5C8xFKS#Im4^Wz` zB*-tA0mz4dx=xWWplFMyi(`mI@6}0;Vn-D?n7Jc3zVH9w|MuF4>qnnH;cbe$o__ib z|GR6P%5Hv*ekp1xhu*QQo^trsN{xBNhpKj(N3qGhyR!M*WGST+j@<%34oh}@7Uk{L zGMm`+X_W)FU!(Q<_({bqkA#?W7;RMQ%37AbSlBSEK+1H+i}^ zhFJJtop@2`umT6mL!FjC|M|aPx~P#=fBX70o0LQA+NCV_UwO}U>9)0_%hz}MO#+K+ zgtjc0(!>__Fz~>pX@=a3&T%{r?)4O~y)%`u*S{%ahw;3tepZ|v3hcpB9!%y1g6kT}wPM0OKc@8J-)5fzcl0@&(e_&XYW7iviWD2JJ<2kge?yxYj%@s( z_d!pc{qyVa_17LU=*9n3$oZ)7rcnIeHF=KbKUuy?%X>Af4`K$opTX1B&t;ucLK6Vv CcZX&G diff --git a/public/images/items/steelixite.png b/public/images/items/steelixite.png index 62f688f0842306d07c09f7fdd960ac38c57c8c6c..429c668e656ae220a8717c2b9a4f12ea5b4d2da2 100644 GIT binary patch delta 244 zcmey$*vd3PvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gH^3*v6-X;6C~(Yq<~8SR@tmVs zN8e4Evt`MeqjQel+j8{kmb3So&we|5_1@Wc-~Rvq-}cy%4XA;?B*-tA0mw%JPkZMr z14?Ckx;Tbd^uE1#kgq|3hdIDO*C4m;|NotN5_!^U^ImS%Kg*=}=8xwTo$M#`YK1Ol zy%#NL`SN|QkZ^~ABTG=Wr^9x25s!6>G6jB#%xrw3OgF5Pawgb*@O!~F(RP88hgRNt k|FbbK9-B}5+BctlNhkBt<$D*O1lr5s>FVdQ&MBb@0Azh|hyVZp delta 228 zcmV0`&oq8Gi-<0047(dh`GQ0K7>=K~z|U?UgYK!!Qg*GxiuhPmj{IN9Ywg zYV6q2SJ0?2YsQWlv$~bR<<|{liBt-D@QE>j|11n1h9C%ne9r~n8NE{(|fQsi7b=N=}`cu&`&}Is)WVqdkGZLa$<*alt7VI{x}_`5srp5OiU^#A|=as3ZI0*w$W3GxeO0P-jzt`oEz2^{Q4hjcPS3j3^P6IJ|V6^`v3p`ciuh!`F-!_&+9%tUdOP| z|Nr}z<+r;pzdW@1;qi;J*(ZlH960jI(s^&^;m3EsJw18+-EztHy}5U8RxAZ-XKv~# z0#afnL4LtNqc8yji27!pwP=l^=MuN*8J-foi(e-g*We0=(!bqtj?>I@3YDwP?Mm)di#n0hVB^#T|F zT8r2>D_9*Kb@lB(y@KVyJdT|TpS&1MT*@5$?rafSV|eDO#WGW_#`*_GGtVwrW}?s9 zT_({HqNl;)@Ox{A9}Pm`i4*pSHtG?H4Dt0&~5Vtoj7ja z`=GwBvYW#cX?lzQ>%QH$5t?{~b>T`h>yL)z4*}Q$iB} DSCX-w diff --git a/public/images/items/stone_plate.png b/public/images/items/stone_plate.png index 44653583e6069f5cf8c1ea503e2fa0891d34228b..dfc3a0cd1329edb265f219b4741168ec78dca106 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~EqK}SKrf{utCD;h2wnDOGqh7T_eoc|ck!oa}5Q4-`A z%c#R<;phhJItdVbK4R`I!<%&h)} qLv@SP3GO`$UFEn-Hk53wG5uFelF{r5}E*vqfqz& delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_nD;G`zU6;lqmq7Y@u=&=Jv5 z5CD{npLekgNO6<|`33)n0ETanMpx{JL7sn6_|Fe@k z`C1HkSSG8T{$Jk{czopr0M)i@h5!Hn diff --git a/public/images/items/strange_ball.png b/public/images/items/strange_ball.png index 64246f031ee2300ec010c1a2d58d00c9b740e79d..2ddce33d7ac5bf2c26106f2533910c799d9ad06b 100644 GIT binary patch literal 968 zcmd6l{ZCVO6vi(j;8KB%Or{ZoB$Gw5b;gzFy@mV2r7dm0EelGSZJg3pxq>Yke-Siz`7b=l^Lfq>&rjz$ zR|R}-CTlGVf}l)ZDM!e7{<1z!WypcmF2+*oh1`9RHL#9mc8{Q}vSc}tpTF{4JtUSv zjm?lu2{o!9sTyk1K?)V5{3Gq+wUo=(Qg3y$j4;cDWFbg~(Y(rHNwYc9?>PkKJ0-&d zJO?K1w;e$-X}A3t<~Tm&5TU~&r?VDwoW@Woij@Q1&!LWALY)VE2EMPm+;1rNBbC4) z0I&ccLI4Yau@WFv0k|rF90>niJ=IeYvDV=I-xKz84-j$4*bp`~OqnH9w;RJ|Y52A@ zY>|g8O%aPUVmXDQwK#f);i$8oK;`4k>e#@A`Cgs_-;d&%1eHZl`#tW1#K>W<_vo1a z6oLOlk@fgU14&4T5eZ4kC{i*)U2svq0@rT_|np=6LukVGO#C4#OuUf)8% zHS>sgHIDxmB_dJkVVsD>-u<8SB;)=kGhmvYoOvEf%*STpOG}IFy+t7MFuk?3g zZN_IgnmqP|X`6+fot-tiZ;C3I%k7dkp%$xErPtm$yGr$uOT~%Xw&q9=9a{0@%8DJK z?cyAbzVOY-r{C=n(QT{O=4ETUy9`A;K4-IwwtTreRPYsS%=(6)7Dy#MVG5mGy`s9h zs*pb_z#kOJcjgv9d+mAURS$O-?pni=wc7_u$ delta 873 zcmV-v1D5>A2lWP!8Gi-<0047(dh`GQ13XDYK~z}7?Un6MQ&$|v56_h+2Sc|d+n=)+ zYBHRC?>j4O>7Zq0Xwn<7!}$=drPg*_5#Z`ik4^wEdhtr zhh>R#=Ht27MAu}mD1BklZ}Q2#_uQQG{ob43`5hrL$|$2(QGXjm4sRB{o`g1*e&^C$ z-VlZCjt#PVwl^6$ro9t|xoHZLEod>D*%tkQ?W&CrCX?B&T6ur&N6uN=wE*iLf`~*M%5>bHhfg8`gmjV2%Q)~-$O4BZ#%CLy7=d4DL{Lrt`sJ;S5yb-SrnT-47@ zV@PFplo`qi{WFPa-ofSAFb96OaWK+F?d;VgYG!*lGJoyHdT)SQWsG{ikJ>Rm->NE` zi(gxNfN~ii@HmKX)km8QaVa*$#RZ4X1&KL6ghh_E$FFf^rJt(nZfbo#YJ3W&&=ePb zjZjfkmck#{u#xdZoc_64hF3iN{HI4&z#@MWm$k5n`8NggqLW6~G}YcQOu;G6PpCR| zE)S8_`+sO_tU16t8!HgU&JtL<&0}KHbQy8z6r%1sMB^#>yh203Pm_9`^W!SU8zKC+ z;&^W^Ftc=*tkbQ$t*x=<#wT(qRs0kms74%bmYkvIqL+XFO3*zLL>#O~onJ$L9)B62iKmYe#FpYby^|oT;RJcdjgnTK zoW^D<>~>0RHu4-!w7ID_qM|&$m+iIr?oWurCi&$Py1BJCfH-5Mu-isqm-PiXS33Ao z?t-?<7PPtR){5U99mKfOCu`s+qW&17sfD_ZA@+G)?Dx2+lGiGalYNSpt>ZV+a~`ys zEn@7M2=j@o@Gqp{XVUQVk>~6faIjPMfOGBUw3t7aJZd*(74YfgFKlso*y{4?Y;k(| zI2dGemLZMD@qc6x*}PR!o`g0gGRi2US5eOZ{Y{!Pvo_yh00000NkvXXu0mjfjhL@K diff --git a/public/images/items/strawberry_sweet.png b/public/images/items/strawberry_sweet.png index b08fece34cc39ca670566ee0cd6e2dfeb69a341b..5df6e1cd8beb08ef966922b07e748afd12141c49 100644 GIT binary patch delta 319 zcmV-F0l@yr1BL^TF@JSXOjJbx001!*5FsETDI_5&Bq@71Idefla6&?LTUxCgA)F*5 ztso(fr0d&pZA}k+n}WXrlt3~z5mnJ_v)mM00;m8Cv;LyQvi|C9FgD( ze_4bmQUCw|j7da6R5*?8kjol^AP`0+r$Uk}LK`f+koNwM82RbSnKo@b+yBfpNjBDq zG$MZFQd_H~049g5s9vG1ulbGf~5uYkAs`w1Y87qgmE+6DUxatE+_ikpv?C~qk#SO3=?ns#Rs6W3*ScD R({}&>002ovPDHLkV1mItjTis` delta 386 zcmV-|0e$|41IYuBF@FSSK}|sb0I`n?{9y$E004DROjJcN6c8ySA$40?w=^;TJUJ;O zDXknK$S5qgZgbn9r1zhp_i1bKOHI}wA+IefAs`|DK|+)~LjTj&_qx6RVPp3+F`OhL z|3yN3I642OrSoZL$tES%Bq7s*f$?W(^q-$_LPGyUME6xva~DBD$Sf?aARzz%0G7oT z8~^|SCv;LyQ<1?PkD0IEquK~y+T z?T}d(f-nq4%TUpRIG~MS1?tfKFVO%|g2G_|dVhNIa??q;8Gcd_9`X^<+9LcQ3QKh z_)gBdty|ErC5K~%+=4?^_5!;E-^ukZKXJFY>21Wx$4dmJAF$l_p;DA(zuTgf^Uv>o czWoS0*BNHhkO^C3fevEuboFyt=akR{0Dg35D*ylh delta 307 zcmeBUy3I7fu%0E|(btiIVPik{pF~y$1_s3dpAc6=L&IEak-;eU0Kx6ly<4j0FX{on0BOsEg>aY#OEm2>1<=;BzX|H1Q_7|dR%GEe*E$Fo3T zYj_gF9Wyy+=35naE}eTEc*i+IwTU6drBdyY+>C(NA|AIGxnHMDlDXg$ap#FppV!{2 zSto8PeQCJ5rZcE2H|H&ji>i>|g))W=sm~k@(I)OU(p!9l73`WhZ48$bUgoH{HT8^+ xsK$}?4g3#{J$9T|KTsbRC!VmDpJDHRhQEuH=O`H*Vh6gM!PC{xWt~$(69AK!eIEb- diff --git a/public/images/items/sun_stone.png b/public/images/items/sun_stone.png index d22b24792fb0cd38ad4b177e68b61ffaa6f7b2ea..33a7e8f8387b7e686bb075a5765ea2e56032e711 100644 GIT binary patch delta 302 zcmeysw2x_mWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0M1W6-E09)DP-ynjJes8Wtl08f zv)BJM#sA-(J)2yg36$d~3GxeO_zwYBPlXr(#SVD7IEGmCUJW|Uci4bK`&i@u|Bq*u z@UK;QRr*-uDKeLcK+PO$ELSHkC2%P!myG{)S65=)ldl zUkWEqa6VDBm8)Fq`FGbX$C%o(U2ipre?1hiH0F#H!=Y+{%S~5!R<6k_R7-rjA-zWW y;F_{!{OXS7*EVkBirm*@-FSWd?%!MXNAR2Svm}20e8d9i8wO8TKbLh*2~7ZgorlN( delta 352 zcmV-m0iXW90`LNm8Gi-<0047(dh`GQ0XIoRK~z}7?N&<;f-n^HC~P@`SKt_4fg^Ao zui?^bxOC~ZI!&h;A7BXWi_!EY6AC5Fyk8%OL$hZ8U|rV*;A`aJevNPu@yWYPejdYZ zJo*WscO<}d8u~~IV0}6D!6g+@K=KeoxW}4d2Pgz<6{0AP0Ds75gfC$kDHRZacNrn> zR}rE41`$CLtRK@5!L$%{1PGB$fkp!YY;E|EYYGywn3T5SqQnR2(Tv=PAUSKKN=GaT z5ONJaiM3;j$(hHu@EbBMOnqLp{ghzMWA3vXc1J-AFA9*#wq7bZ_p}vv%?LgHECD{u zH4hx^ca4IckXgG#D0s}W7M4J-3BFsUBN!E?L%n4bNL+OmtaSx*Z3VdfnAoYfgyNyI yRe+9M9Y+2UNaul)ynecr6uPuLUIY~->F{XVw<0000ULKOOFg0&MTJFM(yoDJt|AXTG1tt6s%J?63yYhegl+Go)rp@`^yySoP z%75Lrd;h;!^6&q*pWB;MeSs!Ql?3?(GyI2udMJ%Vu?PKC04iJJ>Eak-(Yto?LB3`M z0hh>9(MH{CO1J+1znHbrlmFZ#lex?@&M2SDIWVKXi!bxr_p*oaHH-{GA&g!gXYKu8 z@4NKq@%rrE6)p?rT+RIEea^eTdfAjc_r*kc}1M(K?4yORrFGp+ufC$su+Sg!MVU)7Fn)_bnCe{0y$=#gXbKtABM*~f*f3nadB ey*hlPit*z^*5&7C8wvm&%;4$j=d#Wzp$Py>KdIjU delta 495 zcmVVdD=FGa4J>O=A?A22H7<=32}&CXu=C zy^C^o_uc#6_w&yAp7S33_b^lr3nApkYq40&&`v3Yke`Wvw}0oDxRd9!0ceLP<>6KU zY?-jwfI@u&13}ZzYZl|2|nf0t2Dq_Vk9Oy5Y z&Q9%19>v{eXW@qPsRZH6C>_mS;v{StuVesoCikZD6kXBf_vEv1 l=s9+*mhG0E5pt8iX4mdKI;Vst0AL!6=Kufz delta 568 zcmV-80>}Nf0>%W88Gi-<0047(dh`GQ0u4z-K~#7F?N%XJ!cY)C{0!QpNn>%wHI2m8 zH6>}p#+sO%4Vo1b+OV-ml(y*Nvth%gZSH^Y-p63FcOy`^?}N8@jieoDw9Ex%)noS%p16ErG2wgaU4RJ{|r=Rh6f(6s80+;0?P<<9J3B@vRA* zTPLLaaGH|fmOz653?Q&*E{Y_zOhVo)_+k@K@g75=E`Rk36}VQ40HnWjExPSQ8N5ll zg9035y$b-0+E3F)RNzm6L$yUI;9u>HA~L2;h&ahG5(Mc1^q+wY)bSkoQYxGRb_oCu zkoa}D#=*Yy=HyZWrp8eKF{KL4W|vOtjWvw#&oK=KzH#;lz$Jh)l7zF;YibltrAHuG z83H)B=`kNqVciix8M_A-2U#ErEN^9vVP1f3eR~2sSKtp$mB>W!knpMi0000vIXj0Uc zZpUYPv+gxF|6eoZ|Gnn_-?se!|IYB)M|+?;o{}KHV21w)zRDoy1Z8@euCWW$uhM9(ww<(=Jd87G-9(w}wk-5wP6MjilGP4Uz zWm@(`+#`5O!pk`qr+-tJoMo5wLGY~fI*a;%?{_42?YwW*pzr;2_GhLH5tdn}`v3DX RFmN$2c)I$ztaD0e0s!31cqjk> delta 295 zcmV+?0oeYb0=EK?8Gi-<0047(dh`GQ0RBltK~z|U?UpeP!Y~X)dz4&(Bd{_uGBWlW z8Ci1-#;%N9qa!0DYlvNbPaax&(GYDInoAb1hL_fHos;aT1|OIL4X?Xb|q{F%yAb5@sDJN#x$W t30z9x-%tWKIUt_t^I-FHVXt1b>J4StTfEq@_bvbc002ovPDHLkV1l2*cqae= diff --git a/public/images/items/super_repel.png b/public/images/items/super_repel.png index db09ded8a26fe711db557006c6a0b43e615fae04..628cdbc5c1d68f1b9e5eaf3648489a8e17628316 100644 GIT binary patch delta 256 zcmbQjG?8h7WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09)DQ0Oi$uI}!hGG)!x zy?eJDJ$m-+v#ZaZef#zw2pDVU{Q)ZCE(!7rW&jC5Ky6v=RiJRYr;B5VMeo%~2l<#4 zIb6iu8o&Ox-_dh>@rB^Y-&CtUYFa$3-1U#|rpa^dNukn7+8cueIK3BXDYbDF%)S4> z@&@yp9F7c?NLKg61E1`6AF$xwmoIIgb@1=L;?L{3idU621zm``;C{i6<9&-ymR7M= yHN#|=@7&KK{w7Jkms!;)aNi{OXJ$tIRPmpSS#F8T-G2{s6N9I#pUXO@geCx|)pQU5 delta 259 zcmV+e0sQ`v0+a%f8Gi-<0047(dh`GQ0NY7KK~z}7?UpeP!ypg@{S^M_GEboOGg78? z>C&aYz!TgOEy`KP38nI06zNu4$spvN1B{ubQ0O0(QmP}ng+oUvogo(pguJ$`TA_~) zAXANs5vYwm>QYGMkDRY*$FpryX2OQ+P#aExz{_-iu3oH{1AOh<0hZ-?1?kG|UceZP zr2y=E8CER85>5pWpJ#2>eQ*G{0UYbvoaedO6##)2Kp^M<5;g*WeE~}8`dk3I!{{>u z_7I})0sSw~;jUkSJprj-!3g5pIY7M=z&2Fub~pU#r8E?}TW|du?5mui5JCU|002ov JPDHLkV1obNbo&4R diff --git a/public/images/items/swampertite.png b/public/images/items/swampertite.png index bfcdd99606b2baf98fa15a0e2c04cb71a00a1946..d4d6415f6f41df8545fe8cdebde7ecb08cdd1ed9 100644 GIT binary patch delta 234 zcmeyt_?vNpWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DQ1A+hT9cLaE-Naj zc}mulHN{)*ZJ9FX-I^ucOO9^2`t1Mz{~iyXJ^(7^EeY}qW&rZxK$pdFEl?uU)5S5w zqWA4ZN4^6J94rp3I<9~IS96=)JD`?qyZidwoQ`QlpVY5zTD#Kmv}bByL${^iwf>F5 z+%q^FQ`H2G7(TWzbNfwfsP2@|C@xQQ*sT1F?HKd>mVAX{%z8Zm{?+waSNr7mZ(QsD a$!3-s(;kbTAMJs*GI+ZBxvXTxUlfIBpr2pa&(KL?ZIR8orfpw}EFVynw9{F

    !lPPQjR1(py zgqc8&&qE0l0i3r;Jo;fHp#`wk^gGy_giOKo7U(IgCjkM(WcO)Aq001d;QchC< zk zdxja-MA08YEFa@|vAtZt_emVCj?=bX?ST6|jRRel2cW@vT~$JWXNgyTxM4t^PXdma z+k*nVx}GH4{3*+FamYg;4cE_W$EM*$&OPGy{CDg@IE`qIG@^^dOz1wFjiZb#+|?# qjFlEE__?{3V&>z`5c1`uewHU?w+ulnF#xU|0sw6 zCy_MEUS1aq&|98y!E+Tvwp^{=*T818%#t!k`>_Rf*zb!%N>G_|c@lrb_7fHAItng_ zF1`;`vcuEGF~p+x>7<8z^@kLATGCz9HZJD5dGCKF2 z+BVl+D3s%faA zpsAwpEiB|)Ma3KmiIWNn|3ibm1ODWPW`1%z5fL+kl8zBi}|abtvSBirL(xVoheB= zV&-K#xACS>BKxhFk{H%acZ{WjStLX=%I{duoc-FDWzQl9)=hisi_6cPW-<(0bd>L) zvMD>G^ql5zKU56t4?LM%Q7=$4k9(4{1&1BShkNXnKLp}iQaxA|E@|>{g*7VmoJnjr z&b4KulBi4&Q@nT%Q`nl$6K2=Nl4V$*W*xi5;rn@pvH#l;>*ap}e#d8(S5B7~nD&%Y ZJlb6^`qNEqp#K;=UHx2G);T3K0RZnaq^|$~ diff --git a/public/images/items/tart_apple.png b/public/images/items/tart_apple.png index 8f9cf89da9f4954790015e926627ceae8985ca91..ad9a1728bb5f5f280f024e85c2622ca34dc0e929 100644 GIT binary patch delta 499 zcmVSXiAt@jsDI_5&C?P2%DKs!H zF)T5ASyym!SDY9aoEjLAA|;e2DYqmh%N!ft7#PVQAn7bC_aGtnBq{$SDfB2P_b4g1 zLoxqZIq`WW_jxJwdMNi+RsU5|_hCw7ju>l-7-fVgWrQ(vuSZ9Fu0?sSM|iJCd#^`( zu1ROGMTD|3gt9sBjyZ;^Nt}a!wZ41jo8rii#j4l61ioLaQKd zLd5rfFVml!re(Z#JQtbFd}lM?WHt!?A*AGD9Nydyo+*924ZEkq;e0-Lpmebqh8?e5 zzW`&?_--)NrGBp3pyNZ7nz4VeRRJ>d%L9_`(FFyF-}ydmePu6IwV+g(^BlYWEJkWyBH pyL9Bmw#b@`I~+sEFDvzD`2n9~Czix40R#X5002ovPDHLkV1gOh)|dbQ delta 569 zcmV-90>=H!1d;`iF@FSSK}|sb0I`n?{9y$E006X5OjJcFBq=!%5Gf!bkRl~9EHU>W zA@nFHwTxD1@>xwZVRSuSY2;7;B0cXRt+c zuSa;VM*si-bX4RY0000ybW%=JlK}xSlMn$4e*n9P>!$z!010qNS#tmY4#NNd4#NS* zZ>VGd00AFKL_t(IPu-GjSAsAYhDRBtS)1g`Flix6ottDBlI;KguLgU-$?2Rv*Y#n~ z%YAXqIA=)z!haM{4Gb1{@~*CXH@<&+=fR@lEFiBx81(Lae>m)W&KjzIc*KN^f~WD= zfA>y20Qz7MNe#qJYsy=241f}vkJHq-bL~-$TI^~A4 zEQ{s_j-aEWD6C+bHg^Q`T1-;oz8R;j6bp7+oR!wMWOkG&4Eoc-HB zyS2{rmdt{?{Ksc**VD+mEx&4s+=hA$)%!Y~XLlsL)M(z6yk2sXmHoM5nO*J9Vv-jO zK73g{t22Qspj#+2U}dQmQ#ae&xe7{O(=>dQBYI*EFnsiPf7$5xwCUD+w)anRil#i+ zTfO`Ghd#zY4Zla7?ad#hQs-1WtI=qfBe}M4ca@j>heHD2zZyJZQk9C}*FHWsy!MZv eRKNVQ_EN^=I@Y8Wzn5!*g2B_(&t;ucLK6TbJA{D% delta 351 zcmX@f)XqG?u%0E|(btiIVPik{pF~y$1_s>#pAc6d9jNJ@WE2{2r_Gh-o8inG8YvY3H^ z?=T269?xHq0u(&q>Eak-QSX0ulDANc0*}jQ=R%hE^><#nxRk6ZvftY;=Ckht6EP z)!JdvKNp5Wmfzj`?i$QF*5Z-ytcE$GwRhj4bZ3U?hclx~Z!d_@xo#bxRl^f8^Tgk% z(^af~a?$1o7-M^U`xb2Lti9XeTAoxz$>6D>jN!Y~1C(JhWI#+hc nURZkbTdcnQnZ^GYZ*0?NuhZRfzw(>|&{qteu6{1-oD!Ms}|MS|mf1JlySBY;rsCb~S{YrlOw{+WB2PWB9w^k|x?PKtC^>bP0 Hl+XkK*PdE7 literal 6191 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 Av;Y7A diff --git a/public/images/items/thunder_stone.png b/public/images/items/thunder_stone.png index 8b853b2f758b7e7112ebb67f29faca70c71a12ef..9e87909516bb3fb248f07fb20aa2d084d1c0ffa2 100644 GIT binary patch delta 273 zcmdnQw2*0nWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP|z&a^qS(8wIyrI z*{G}Us=Kdtulcs-+y8Ip!kp&-RdAIA`2{olhk?3Ikuad>Y)==*5R2ZslMV_UR^V`P zUbybxfBtsY%P(2x%(=aHpSaTM;~%F_oLO(X&Evj=(XoL3g=Qx-3)r}ncW~d}n9R?b zaMpxV+`K3yv5;^3HIw;9EkCR)Uz07yjIpwu`!y}Hw7Wg%)ZalT; z@S_KYH&b<8+)avlFYT|0EdGA*LS^7p+n-VqHn|m&pO;$P+pAVtkz+qsxUPt`WajkF SlR(EaFnGH9xvX-8Gi-<0047(dh`GQ0QpHoK~z}7?UpePgD?z5IZ9Tp!V!7|){Z>_ zYmdRmH9B&Qj;vI_(wAJz2}pJrsu)=yA@ZIBG3mM%Em}AurL^br67aZ;X3pDOPXYsP z;uxO8PeNc?r#ccEt_Ac=KqO4Uf=dCwstM%a6aa_`@cMpy&wse*7C3^lQVHj^Tc8Bj zQ%yLMv*P{`EdlFYYk0^?z=Iq_R!vYYW%XeKtP1BdaApXc0{y+;m)EVBx)-SRN#r&i o5?pl$RN8h`-y3?hXz};)0bYdwfawos`~Uy|07*qoM6N<$f|f>mzW@LL diff --git a/public/images/items/tm_bug.png b/public/images/items/tm_bug.png index 56278cf2f661be64f86ecece60bc7f6f3d8bc128..229230198c4f9f988522584e8b81fbdea6b08a07 100644 GIT binary patch delta 319 zcmaFEbe?H~WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0R)9~4E09)DP)JIup7Jbf$-AsI z@2ab-r)+uGz4zUmtKYWV`*!r%x2x~Ief$6a|2)?HB|z1DB|(0{3_v~tgnQi<0m|(3 zba4!^=)F71Q|Pb)56i@62kHO+^W5r>>`Zu5ZKS?xmn4g;=6{JT&t+r+XN6nArDQsue#2dV|5! L)z4*}Q$iB}tTK^A delta 348 zcmV-i0i*uU0_*~i8Gi-<0047(dh`GQ0W(QNK~z}7?Upf)!Y~j;IZDn($rW;hZ7C@! zx1`;2k3dUF>C&yyi}a8srG?;ij`I7nA>Oc4Ore5nF(-yOouUw;9(Ib*09fCR_;VW|d1 z2uvk6mYTc3%ja}hGO4Y52^1b@ko>8Pj^-@w)cb zcdK3i(Oid)?^SZfv;iHWse11~G>@mA02~7Irs`uCqIvDu6+}040gw=gR{)GNudBI3 ukTik-P&3~2KR_U^O^x5?7i`3ckB$fDplgtk%gWmT0000VTA;)>PZ!4! zi{87FJcSM`@UZBfc8dP@|6b3AVvdCR`;#pLOO%gn%Kb0#s`9{D<(Pbt2hV;wIfb)r zh!QsnWBZ}nu-liZ(?fEmWS@`f3yXw^mc+_dHNL|w8dpUoPE9cNzNPg?H-ud&Zt{{^ z8?LP$i@7?&HYUrnyvY*tls}iuopF2dxdvV_R<92y#DA6N8i{Ktp7SniJ(%2R^h^7y zq3&wEA8u<3Irls=DATAodZ>JVV*0-0%Rl|NTW6U+^E%sGgYeLEKtC{ey85}Sb4q9e E0If-jH~;_u delta 344 zcmV-e0jK`R0_Xye8Gi-<0047(dh`GQ0WV2JK~z|U?UpSLgFqC7ISOa$5x53NsI9C- zR$`HrNUnga#BMVrLnf0gf?W{JzT^c6%bV~0uuxUSiWN(+x~@aaFB5M2J`B?o#(7>H z=l9`#9*7E4{Ie{<4KM`BDo$Yp@5V6-fNNGH8-$AQ0jN0cVSi0B00K1KYjcNyD4oLU z$yLC^w`aGyLO`6^@|;<_9|llyg+NdoIh4qr6~R%R>#_l;xUPek&dKKO;~0SVo{lnm zKmx?pCjodi5J9g!dkEp4S8Huq(;f%VUUHxSfS$Aed*X+)CxA{ew_KloEq%7^9f0E8 zbadMJuA@Z?kx`Vr1E{#~dIV4ih$m(55U~%AZ@U{rE^z`NAg6y10PC`fD+Gcnh<@!{ q_|*RZf~cP={0rprU$A1u{@T9NVLNgdln{yl0000y_Syeu-~I!EKwFq2P$_RokY6wZNB{=rhRmAvv> zwPig|)^>q+X_Fn+PHhxz$TfRmk+5R-B70}y_JzF~E~=Y_4irwB_t0O_JY(&%NmnXG zJ}H0H$(WRS+>S$H)hkEy=Y_0ma_9YTVC-%ZIrI3)KefGQSp_CtSLNoB<4zD+A1xNC z|DpFsR>5P@_Kll=O193AJACd>&;3)^pMN`D$@rj#owtr{-!q^O7(8A5T-G@yGywqH CK9H&a delta 333 zcmV-T0kZza0^I_T8Gi-<0047(dh`GQ0VGL8K~z}7?UpeP!axiJ^OU?T-$+SGOUV;b zrlq8$n(=%!TW;^dv&}%5 zcz-fGp6vzT1JCh36#~hoM`maZ0KYFwG6a%b=jkH=%?ZGEq<@%G9zy%C#;Pg^{MqK+ zQwjldR?B;CyH_!Qnkxj7;>w{!_1qC$y;1?xT-U*f?NN>6p$x$Ho{D-(fM|UcfUgE7 z=(VpNMtJ9U3mS&896(i?D05s>JqtlLe96*Jr zs$K!Sd359whDH!Duc}@lBJ=3jB}AGz0g!NQ2MB<5spblSq)5(o5Fj$%^gDncs!ff5 f<`b+%i@%OLi9d6=3|ltY00000NkvXXu0mjfvpJQG diff --git a/public/images/items/tm_electric.png b/public/images/items/tm_electric.png index 0610c3f3337501c2b54613ad38ec0de2f75ed2e4..34e4fe8de7b29857dce5ae9fe5ef925e10f00643 100644 GIT binary patch delta 314 zcmaFEbc$($WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP)JIu{(qF=|51tm zXD$EVi~9epy1IJG|95l#|KI!n|GoeJ|FcCWeFrM#EeY}qW&rZxK$pdFEl^^Ir;B5V zMep57)?&>DJS>7Q^zZ-QGtnjJh{Uh@6m2=v&N$gc;;u%k?lFmXTZ|fJ z_$y9hQ@E(9V!oTB;f9-wirMav1BFWz-#t>3Y~%KK7Ep+=Xx4UorE3uSC3*#?K(*0> zx_Pa?I`(o+SpDXPx?;HK#|HlEl`V5_@A-D1rMpS!O!AXI*N(+Zn0?}(UCLvV61^2& zkBn-O5_{_F#d+HTlpf4CaUHx3v IIVCg!0Jkla%K!iX delta 348 zcmV-i0i*uP0_*~i8Gi-<0047(dh`GQ0W(QNK~z}7?Up?bgdh-wJ%%OM@G6#GW3EBT zRV*#N0;MHacw4~WAnX=`o6Uxoyo7?}ee)x67`nQ;Dx{P`$zKb`J^=>-u-?u9`}7=0 z7VJz2ms-68NYila6JTfWw*a<1gi;FFMi0OcMF0`*4B$*XKz|HpUm}pjz^eC-vh{I&n_%h z1Ss6E1GrXXX8>zn{Wb=GA@j0O1%R9-FBMh*_MHER@Y~f#0J+W1q#Ms?p8Ynqt3CtZ zaDH^;wmVaVs8y;y`2s}Si%%{C2nZrwSAEunEWGgS28d?i3_zscK%@Xfx^1|GSQhdi uJaZsceGPu}KY&4`9}WJQU$CyOzt#(WOI3QVt;?DK0000fpiA{ zirD7raAVPe!YNm?g*L40u&k||=YHT$Rv}x?22GE`lh0&7Yfs-MmeBU#@gzyNdEARk zAJwVGD1B~IKXu-C<}=y$!q!J(KfXw>n{)n0Sls^G`p=n<{by$jc3ZFm=nn=@S3j3^ HP6&t$u#E z^FY)XMlg4a{|Nj?kfP?}%?BL;;5RCPv0@NvPQ?IdP5>wyfPd!8eGRfzfGK6oF`iuo zJnV)!NFlH=4SBDo6hM;!m^}dq5z4<^*_6nh6~Wai3qZ{wHP?ACvV8*e{g4J=_kLHT zvGy~;&fSy^pn?hZ+GYNq$J@p7t%$xvN@aUyO2+S*Lt`Jz% sf)KzOpZXm@5Y?&1Kl2GzqsCvy3%`ecKR`dqq5uE@07*qoM6N<$f(SgD761SM diff --git a/public/images/items/tm_fighting.png b/public/images/items/tm_fighting.png index b9f812767e3d71c2dc0b2e25a82588e481de7626..144d75826cd99e80dcddf1de64a42dfceb1e9d91 100644 GIT binary patch delta 311 zcmaFIbew5|WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP)JIuepbxztXbmO z6w7x@qTX$(uCAW)?&zFvSNHyZ_w4`w|CxU_+ypA+EeY}qW&rZxK$pdFEl^^sr;B5V zMep57xA|HWcwAOayZ7M#{_^D#zG4^azu&D?vTR?dvGh-J#uL`=?P8x6Fs$BwuUbnx z?zQ5AktGi|9x!w|@@5co^H&cWd3mfL>tmboFyt=akR{ E0GgYRpa1{> delta 350 zcmV-k0ipiK0`3Bk8Gi-<0047(dh`GQ0X0cPK~z}7?Up?b!Y~X*dkn^2gR3z13XC1O zLPti9z{U)k&)T$~`qC`T}b?svLHSloQxZ%8a zZs;kmmlHi(Oe6pw+Xq~S5y=YgyEWxg0ksoZB?!J-eIy|8@qagDvH-!i)ml|_XNbw=u8m^;7S57#+8Q>)k|A&RSDUw0vfK@G0bM$cJl;e@Jz-A zO9Ue8(*#U4fS}j5dJ={^%B|OEPxl%ng2!r>$1YN w1YRm4=G?d7MZW`BMCYR5pZNqUQR1)T1}^p`|JQZtT>t<807*qoM6N<$f|AOkT>t<8 diff --git a/public/images/items/tm_fire.png b/public/images/items/tm_fire.png index 1de4b7a4a6462bbf442350d169e3afcdbd0c913d..ae19e3818737c6319e8554cf5aba85957a7967f8 100644 GIT binary patch delta 311 zcmaFEbew5|WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP)JIuez!*9{}#>v zdmaBDO{%V*^8ak}|9f-(Kim8N-M#<+|KIv8U;|XjTN30K%mC!Wfi8>VTA;*MPZ!4! zi{87Fyv14+cvyN{Ch&i^e_v8?hhbO!{FkEdLod2KvG`|b@~J8N%ezkt1g2&QEckGa zK}^=^$2o@oTo2N^9a=4WI~dHOwN@-y`0mv*$tVk+)I|bQ&-h(*$ALhK3j6e0d`1jKq29dXH=WqSJoD1{GNZj2!uW&pu3=rdF+58P&F}r1Ujo8IB^;D6XD^ z$i3SSgbPpC#eBT@02btSC=1~kYf5>X(g64lfRYfN`5J&V$A6qE8^D=snpq(POetgR zl)DQAh#+9jv>d|_<3O7Mthon)g_mUWuL0?~Blrwd7QmR>=Vmh=k5S*Bw*f?FPbC`5 z0ff)0vH+q)FwwJ)(!)&W!rg+puFn9lXUV2Qv+0?;^ItLFoZbQ0ZbpaOj_25HeX;Zr z0L^*n*lx!h8&%LiWTp3-kZIptxdbo}FwaWw?Lx{tb?q(?#motS1wa1j=scb)YHlI0 uXauqVgvPtR2N1++SL2^~1*=u-uj>Wv(@nIuHi8ZS0000= zy{9aPY8?Z1GyF&sc5v5Lx^QrTW>cTamDsx`u9NwlF50`WN(pmasPVoO{D(KdJJfhm zm0aT=4;$uLDK|FqGb~$Gb>Zpf2*#~vKl4az;P7DB{=un!^1WvaK5lh?Q-lR<*cyJ^ zF`A^l@q_sznLvj1H3HVx^_J9b=e7R4w^phD^|#Yi%-f!_vxr!~`vLR>gQu&X%Q~lo FCIFIklpFv6 delta 342 zcmV-c0jd7U0_Fmc8Gi-<0047(dh`GQ0WC>HK~z}7?Up?bgD?z*ISOav8eF3zN66SU zBV$Kaj*u~H8l$|{xGt5FP*qhdJt-2%@AHoWUDu*Ti-PF;K4|)yv2`IVJ_Mgc=j&}f z4+M$L>Vk>p1VF|zJOim}z8ObN(fAzzI3?}K0412`c>~ZOyx0L4 zL&aSHzzc+XR*SPuP*T|d+?+!gx8HWE9vzv4iaMYH7$qs4H-I!Au5rBN0buc@w8a8| z_I?q7tY%8HmerFHJ(Jxc4a1lZz-Nht!p(>IADL%Y|L6cS#@~07*qoM6N<$g2+CXZ~y=R diff --git a/public/images/items/tm_ghost.png b/public/images/items/tm_ghost.png index 71a6b558fae947f563b4a229f2667deec330b371..a7e8928aa7e8d8b2463f9a6897398c9d27308c5d 100644 GIT binary patch delta 310 zcmaFDbc|_&WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP)JIuuCAW4CF$PL z>UUSCe7m>i+q1pjo}K;n?%ucm@BRZpCl|*Lpip_I)=?~i-OfRb|zkD5e zqW{R|1zywM-d0Hn59Qxwab7tg@3RfFS%k=xJt_UnpJ#8W(m!zSh5Ym$;jnq!Mg1SA z>&v)Be{fn8&b;2Dr}yt6|MiK?Whk&6MUhup;efUC_Jc#yRI64k!P>U6?8yp&U^h31z#;QJfc5u0y`E)*Q1L?m5r3yA10cY)n*u-#g8h$) zXQ=`KECj?M7)0OeAUbS42|&da0)cVmP$GL)1XuO!04lEgC}!Qc{u}@Y&w6aI2oT$! z1Yom)2zqU^hY+6GYQekCod?ifa;N}+p0oc);-|AGz-FSy?Zk7frO%eVwm`*s=;*Zb z{KsB}NXlM&t4(F!J971vVJd)qS;Z9sK@ps-I1(=U m9Y7HEqQXD(30AGzU)vMRjeP`RJ0%4G0000SfIwAF0TVH&;n{Ofb{;m0^A9w2_^%u@zd;iz(Q8v&M44$rjF6*2U FngHKIib((f delta 344 zcmV-e0jK`S0_Xye8Gi-<0047(dh`GQ0WV2JK~z}7?Uua_!Y~wsGfHMl$qF8UmXeZ^ zGApE{%nFn)-3Bh=tkaW~NVbCz@{>*&2)^(A#H8z5v}jQfecvxBea-mlr)3KB!oV7z z9R|XU&wh;NK7>UB@8|H0AXUv_O!GYetwt4d=kL1!G$#O541Yj#N+HJZSWPK4ri!b8 zAD{efl|sOr*>Vj-tgW&E)LbF3DPB30$etBpdsI~c)LgHF5!<73?ve*!drzeXivX$X zivTnemJ_|U*~19m*=j+<;PL^qj~plfpy%xWmU(ve1kg!F>2>0{*3wtY-U85^hmKA= z@AY-y1fnQ=?NP0kee1}LQ~w#fqUM8&K&-wp<@Bjbz{{R1f>4@)Hpiyf&;_vy}jIS3Nmet=sck227NuFo6{Y_r+iFI@D!MBc#Vcmvak%eiN ztp)KCSM(U~yivPw@l*##g7G|Ft4jgprNJp;2NE@YwXaYp?i4b)KdE3@J=YbZt36BR zr7PMCooDndy0OupDJ=Bsg6{7-nKo3uW8~Ihb1?WU@go1wTRR0-d;Xg&Zu8kwPXF>Y zsywB{y)Q7mp1byF;+udw79TI?-l(oWw*1rAU4M(>4jo}zseQKRJJ1shp00i_>zopr E01pP08vpEKHGB=m zTqPq%V9m(L$QtAtr!PM$Qj;Qt@}xIZjr=|*CUh9Oy1FVfj-xO6Yr)UQ zvaL4jUcjbox7hPc`vKzfBp5aq&VMU>clR*>!EfFcrhnb~X5GgC2Ez5y!D%;P01=|9 z`y9Y-T)8H|C`kl|S9PBbV(AYjzjg(pS-1jlL4mNF0KBegI6`pI7{rEqJ`FzfJ3v9u ihX()5Cs|6lw5|IzRNuYLdj?E8NpSatFWP#FVHNswPK14sZ0IFAIV0mV0Yx;Tbd^xmCx zTc}xq$EBCC==cBsZ`HP*6S?@kY`#qW`9jVU+x{l6_|#yki5co#fsW7GgiP)yX-obSTalh+G^uJ{>mLsr z?p-O7x78U}ud2Gx{@I4Ughp3Ku4jTX?x%doW^8#<>cQ0fyvgK|NXkL;BwLoJ unxgF+H$M^=*|(e5`m=4FcK`La(?2scIi6R-fBF;;nJXpiG94}goOZ7mi7tn-TibTNd;;YHnRh(TA<0CT$Ss)Q2&1>Kto;5g2!8ZIGFlpyjsZv~(F9zYQ3Q-goz6|AZ0 auXP8BRh^=pg{7(h0000pu^K@|xvFN=!>9o*c z1s>+d636-f{jb+2a;89ZJ6T-G@yGywqqZ;qw_ delta 318 zcmV-E0m1&f0?q=E8Gi-<0047(dh`GQ0ToF^K~z}7?Uq3fgCGz^Jqma87+#}Sa_iEi zOST+=_BZ+QGh$5uo2FrsiAD_X4NM5b(4$9>ig3=wTz(Ba&vOhRLl(LhyA)_Dq3|mK!ZC)d79f0CmUmhS3n!Ray?+W6uo8gp)p~*ZLlz4t zTqQ6mo@`14R|HR+O$8LL{{h79(VV77nSkAUX0EX)VE;u{3D{}?!Cu?y0m7JFE#x>( zRBxk;MJI2_6Dp6IvHlc;*4j#%-0`RKp zRpJb8k6lVMgEvzE6QZh|2nASmQ@BcCQY&%>zV#kJ5zSk{KXV1^(c`b<38vMT91VcM Q`v3p{07*qoM6N<$f`b-|3jhEB diff --git a/public/images/items/tm_poison.png b/public/images/items/tm_poison.png index f9f31b015dcbf36f4617f1c199918b472a7de142..83cb4488f336a79aefb94c7b8641a6e578b4c2ab 100644 GIT binary patch delta 312 zcmaFCbb@JuWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0dVo)eE09)DP)JIu{=cQVx_Zjl z>b+Z%?me3_=l|X*|Ie=ZfA8r3chCO+{~xkq^IxD+-jX1{U_J|DKlzcW@-sfAd^l6Lyp5(6+zH7e2E_&q@E$%w*!**tLdd zi`sO7cihZh#ZH`6V|0J(<{~iLSJdKCKzV8KvcyLwTbLBJd}29g{U!k6r)( delta 344 zcmV-e0jK`R0_Xye8Gi-<0047(dh`GQ0WV2JK~z}7?Uu0(gD?<98HL$c!)s7xgp{Wonej7#n&aK7Y<~bG7`oX3L?K{GiSee~ zE)XDuaOSL*YZziJ!ro*6HCG5E#&i1`{Lnd5JVo4B3_#6wAIx|>Dr5RI01jTL*kBPL zwm%CXtj4v~Uo;^o-i6(Qy3V8n?9P*eg<)IIoacXLo?QI~pc9P=*NNv^T3@XC0|3o= z>FBikZyiUZ5K&px?*Kyc@YeGH3IX%1>UR(^^VqfPA&Qw300~b!-~q6&sJTKQ=?+Bh q{?Pc+{{VuhE;as{U$7cA{yJVw3|^3k(^_u;0000gnPb zV$pkdlBdvN1s)b%?hD8M-=8hGQNN+K-v60PsCn}Oi@tiE-aQYJ_C{9*bS#Pda_{iz za|^Dy=qIKJ>}4(3?7ASRT~P2qnm6lIlPj@zO`N&g7f#i1QQa(jVB@4|iL)wPkEN*W zT(fz?>?4~OcukvHEL5;!75m*e&jk&(Ro-J{&*2I(=JK*%yZNE{M^?dO+4e#smgz_Q_diUjI~M=+>+Zirc5UozZ}tY*?gV;)!PC{xWt~$( F699iWlsNzZ delta 345 zcmV-f0jB=P0_g&f8Gi-<0047(dh`GQ0We8KK~z}7?Up?bgD?z*ISOa%HMmBP(2!sH!TKo=BT0@3Uhfnx;mL8X3{Ht)%odW9e@q&q*vWcK@9Q zV#ebrav$D?%OYOj_dFX&QS;Rl0>Jdx2Pg@#nh*VF05->*Q-3yqoizYb5HMAdu_?C- z1`tBPT(i|N3^5LL7{D`U2yE=0)|ALzD}raBvH)c6t;7 rEn_x5^*ca8Sf?8Q%qLil8h;%xj*^iKSemHY00000NkvXXu0mjf<+qq@ diff --git a/public/images/items/tm_rock.png b/public/images/items/tm_rock.png index d05ee8c1a7ca4c2692bc8253a7faa0189a56319e..6e13a1835e75daf0594214daf101fcbe9b96b8c7 100644 GIT binary patch delta 304 zcmaFDbbx7sWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP)JIuzPiQn-rlHt zM~kbgr#!nl<=wqC@17m~_U_*Q|NjkhXFmX{<0%R93uXZFVSw{UfErMIlc$Sgh(+(+ zNvHXm4R}}#E$W{B|G$0r!nGknRr%jr>P-$Gn~`(d-py^_gRs5R?`a&ED66TVeQ(x$ zr}Z%si}Dw06$?GNkl6Em;z}nzsX)=G2TvSHWO?>p?%bM|g!L84Z-OT*J2As&PQMjr zhdB3@$g(%$jO}hA)5W*H=8&-NzTdzs#wsFI&-i({`CM*|E5#@I4zFW1@H?lwOaF(O y*)|`|gJCkq{Fcu7@y_f`+V>wJ`{K68pJV>Noo#1gt^qI5{S2P2elF{r5}E*v;EU@3 delta 340 zcmV-a0jvJN0^|aa8Gi-<0047(dh`GQ0V_#FK~z}7?Uu0(!Y~j;GfGxr4a%%QnKc-L zl9na13^yl3JAOI1{ zT$Nk}0$2!``)rr>Y>LVlMFXh0Lf}&Eb_6SeuT@q6HP>@6;`6B5HWI*hJL@>cy+w5V4JzFiPY1()IeMdGFC!ZfmZ_J~!C%{uT-%GC@&$X65TlOyii#bEP z9ech31tKYX3r(Qrp}|8KLclyJdxcmtx08<$*~|%m3qxbq0^nR$bA`aA76j(ZSdBOR m4zYw19xyd^r`EKtVuv8tWNtfSM zB1MyxxL2j!+{n+wZ|Z!aeR?5F-`f+`9~xX8x%w&!>#m1AXPP%>PkqYLz++5O7XO7V z=|_CVV0^$OY8Gi-<0047(dh`GQ0VzpDK~z}7?Uu0(gD?<98HJfL0xP6s4a$_1 zlxZnF0xct?q;>Qyed+6Tp|DL9MLy{S0_6AZe6r}e7A;y7MBn$(%ddf_OTq0M2T84C9o*297!p-gO^+x8&@%EmyytefI6$w{QRd|5w=YsSK!;wx!wLpo@o-U3d z7QJ^T-4<$A;Bn~{EPDKZ|90s$b2S&#zkh3ISll;zMb2&ewko-TtsK*(TRpBU+B)r2 z*Y#h5VQf>q8O&$1Sb3QNcslUC2?O(W(>QbNw7(8A5T-G@yGywqC C@{d0N delta 337 zcmV-X0j~bV0^tIX8Gi-<0047(dh`GQ0VqjCK~z}7?Uua_!Y~wsGfL)R1j?*HnGt9i zAthy2piIdMlrG&G9q7>M$%M#12q8b|6icyu-}{M`u4~bvMMm^}A7c8N@nLphzWU(& zQ_IbV{$^!t%?Gux$c7z+oKxCQyKsV&nh-p1c>d= z0g|!(ih9#0??e7j!rwj zb+kw!va;6}XiC{*S1th*0_IuSD@4rv9RO6!oB%j*tpbF=zM|#|fkPEU?|y4s^*?|h js;b66^9$CZ#b3uAs*qk5V?RHL00000NkvXXu0mjfE@_y@ diff --git a/public/images/items/toxic_orb.png b/public/images/items/toxic_orb.png index 7fb36db516ec36ae30a5acdc3f004d8540051f1e..3483c13ba2b4963a49deb2a04f7f4189ba3aad0e 100644 GIT binary patch delta 239 zcmbQi+`u$JvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gF~BFp6-XNx7!+vSXmGeO!{f$^ zfEx!AUfd}7uwllJ7dt-u`0?X=_}!&IMcgGpe!&d?;h?sx_9{@g%+tj&#G?1@#Dk&- z6gZr>dW3wF-!bEQv?F^)@mX^xji=Y6Gp63U(R@l^`^AN8ErotxR+E{qOfj&1rlBI+ zD+b{Os~j9G9J*gA9=Kn7rccH3sZjrm*VA(kMWvWG>nnwCI;NcK$)9bv?1<~etopSc itL)@g%bfq4dUqioi+aztR2!fZ7(8A5T-G@yGywpOCThk2 delta 393 zcmV;40e1d?0+<7k8Gi-<0047(dh`GQ0bfZ(K~z{r?UkW&!!QhnRc2^t7#J8BSXek% zSU6Z%*vIH2>=6bB3j+fS0}aDE|88~FvTTuaxeKxHa&D4y_376yWkV~k&C2m917roV z0<#pTs_H)0zD?64|6kGp4t##Uj*gG>rH;>2K-2&T&VlXKlYg^@I^T!OQ`q8iZ$;bz zqJ>ZaaPYe5$!-n#ub$eEM^pyr!mTqzfs4$pP(vgE><%yGZzp8`QvtkP9DuWj?B(A4 zQh-%pG-qx6>1(S}VNwAJ0J(>O#@q;hw53@Vp#Qu@v&mW`TQ(!_479ic0BC~%z6*7B zL}gH#<(9!&C4a3E)g_oxVAv7WUe^g~0GRME56GFoDs7Jo0U$GJ#L*G>e8@8a14%oK zCKZqXW&7xTnenhI0HLiv&Z+<;L>xAu9J1yZJ}@MlkEP8%34kGDfHgiwvi7Tej{h^@ n+;?gZ%ndMgE(2r*vI5_s2=^iBj^Ta)0000ixZsH55KbP_57e8t>SYznOXe{ rhw2uo6Wn_iy2^2vY$(}yKaC;iGTYWxSI^l%YZ*LU{an^LB{Ts5De6)8 delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_moK9^9DmanMpx{JL7sn6_|Fe@k z`C1HkSSG8T{$Jk{czopr0IH*FPyhe` diff --git a/public/images/items/twisted_spoon.png b/public/images/items/twisted_spoon.png index 54a96de7d0340ce60b4b9ab8789e58a6bae6c89e..9bb23b043861bb2d99c082ae9d609be208e4844a 100644 GIT binary patch delta 207 zcmcb|_<(VOWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0P=HT}E09)DP{?X-p0j4nvv1$N z{r`XVanod=C|gO8UogXe5U8qr@DC`G<>}%WV$pl|QXpT00uOV5_x0cLk?hBgq-fv2 zb$_404U4{b_T6!D4y#z-wTOs16sRWkFgZl7@mOHva4K!t&Zx={+&NX;3~kH`#|;?H zZ2y|@Z3(+c`HiofMgQb>)G^((jF(>!`9OIWYn_t1N*LqJCMDmGKx-L1UHx3vIVCg! E0IhgamjD0& delta 205 zcmV;;05bpJ0p0PG1*%Q(PDPEmbdngKp5Oz0Q-s4?J58;2S)quCIGm+S}p<_9GwUe zcuqKTfl#;Fb7OMnDFlZ{_>+orFW#Hq*uT7PTnwOuKmgro7BY4d0wsSoU^Laq5i(M zA)^b&s;t+089i(sGCWiiD)13x4ptRsm}Z-lQ(*JK?+074%>$+-fwz9IJeyJY>eJ6i b>qgTe~DWM4fqIza^ delta 229 zcmVK~z|U?UgYKgfI|AJxVOM^a?qG<+dq3 zg007}O}R&~%oX-Jv-<-hA`3M-kz_42gD~<2cU05<(!E=EY+gX?qMreP6Fl zL{PBgiC!fW<+YY0CB^z2F_SoyGc6^~1f;~}0$h&77^?(=dtNDkm`p(n$nZwg5@rHv zex6F02$c7{OW+7V0sGV6!at@fS9aaOGpuv^H=eW=?3r)1xBA4H$3G4)nduvwKCk2Ii8C3~ z1C~^oJxibXBP3Ux!{re74Xq6p6W&xtuQv$j5@!C8&l$aetztsH0b2??gEn&mqsfGW z%-t&-9FG*fw{K<$5e?J0(Z0?^?aVIkEmPGxe)(LPJ>lQl$8~@5X5O6F@wTzD&@M4j Xh)uF1=E`260~tJB{an^LB{Ts50w{gl delta 296 zcmV+@0oVSi0=NQ@8Gi-<0047(dh`GQ0RKruK~z|U?Uu0(gD?<986hKh4OXCZNtrTj zN=jD92rg4*1KKeuAC zig56JJ^1r@3Bj13Q+-1o*vx`Sy597YM8W zGzNI@FW>@zQ<5ZN0SPQ^e{q4m)vE}!UH`K{yn0-lEYMjSwiqysDO`Z=d=AGP6#*XS zruUQZ`o$P9f+O*Kl_y~s#?X*g4CBEyYVU!^eOZBM8t;Gv#(bPteH(HK3XVxpg>wls u-h&c23!F=kh#{2X-vz}#NNUxpm7|{Ons~T-MC~O20000mJm3PZ3dyt2lchdBMB) zdD|IMR=OLc@YR}w||2X@+T0JfSL2j>T|BupM z(E;yq3VhuF6!^LUE&z(8kD$nc3%nNu3cP0!d=HOoM*ffdAF#(h0Ezp2A%t6^nE(I) N07*p#PDHLkV1gsJl*a%7 diff --git a/public/images/items/ultranecrozium_z.png b/public/images/items/ultranecrozium_z.png index 208f3fb173d72419259df6f9d84dbb6160936250..cdcb29e6c260bcc30ccdbfaa1d2bb36245db9c32 100644 GIT binary patch delta 241 zcmcc0G>d71VZC~QPlzi61A~HsLUVD@l4i#_Q;N6DN!qey%9br_?wy_U?B1IH-_HL3 z|Lp(&cb3c7CIOZ5mIV0)GyF#ax-5=sff5~_E{-7BOY3LRG9VbN8Zp!DVc_qK^X zGjq;qn){2gFWVilB{%$^@FMve@8*ko-MO2arR6VYsaj^}&3g6FU7_73*$Wp${jj(x zIFU`xdN$kFd$QgFZYArNEzH`gbtuNmb&=IO3G1eVrbP0l+XkKl#X!> delta 301 zcmbQmbd_m>VLeN_qpu?a!^VE@KZ&di3=HZ4J|V6O3JU+foqcw1&Hw+;{{MfsWy_i^ zTc*sJQhe|1oGo*bnu~*$Gz0Z8d|Y{P0g&P?3Gxg6j|3QOUnsQ!B{&N_B8wRq_zr_G zdS1sa_p?AOZ0|=dE3tR+`91lNZyS_ zL0t)<7aG%A#3pI=FI@25lKq25e#61$gp#+#2P&$c$Zm7}CbM%<;BATjGo0dBRA0%; ss<|h5U1Ps5Jmt@gnCH^{4A*`!%-E(`dd1u2GtjLJp00i_>zopr0D#wx7ytkO diff --git a/public/images/items/unknown.png b/public/images/items/unknown.png index 4e01608daedd56415fccb2fe653ae0bb061d22d4..2d0637048aed322ee699cffc20cbd896ee5b1968 100644 GIT binary patch delta 169 zcmbQwxQlUuWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgXMj(LE09)DQ277<|I;R~dq56z zNswPK!~g#-0oN3P+yGA(#}JF&$G~da41L8-(U?IhZ{NVwiqlX_KJd z8IN^LJJ<^~4kU?`WzN~xkbPV-;K(iiiOijW4f;ykI+<8}7c?nnzVBvaWVjm0a4_(n R+CiY<44$rjF6*2UngCh1IxqkL delta 142 zcmV;90CE4i0iOYo8Gi%-007x@vVQ;o0A@)aqkC00000Ne4wvM6N<$g5tt91poj5 diff --git a/public/images/items/unremarkable_teacup.png b/public/images/items/unremarkable_teacup.png index fd4298b6a59e1db2e91994f13f99fd40a4db9ea6..340214b6a5c9045d9a5c92b5e42ba1aa28b29fdd 100644 GIT binary patch delta 211 zcmV;^04)Ew0{j7xF@F_MOjJb%001#DF-$r-X+#^Kmr%jEuIAy}Evgt>00007bW%=J z0RR90|NsA`f2R8Y004qXL_t(IjqQ<362l-2Lyj6W{` zj(|AE?v4>&bOo-H5mq##a@dErQNlMz7d#|j(^@d3VVFf`drXNwAILPzHQF;I@H}JV zn06QDMW6vjTj)0|A@>#RaQfL$J@r%DLrx>Ixa32tSe&<6%5~X4&jS|10)7jQ74rZ9 N002ovPDHLkV1kokTe<)M delta 272 zcmeyvxPxheVLeN_qpu?a!^VE@KZ&di3=Eh|Nn_Bi)z@+TkK2t+2)!}>iF3Hp0oZ#)Pp03Qm$vLP2_N2J|%SFPd`E4Qzw*) zQhc@*a!3lDQ`T6x(U#4#bR&xfuPgtVZ`0qX-`6$>-fFq#tMh}pW2Y9r-hCmSMJi#6 z)7%1%Y3>`^yB(U}R@UFkT{kgZGjBqA9mk%olYhB0 z=B(!C<~3`kJlnf>$<-xSuWmVd^ys^HN8kOw`v2R#h@;;`fg1Qrg8YIR{-c1Wz4Mj< zr6zj1IEGmCzP(^AbXbAMHBgypQoTUN|I@ucmT*k;oPSdL&Yk3AKX(25EOu!6ny(Hz ztB<+wQPl3YOi2mNzNUP@FDysgspV8{Yj}<@f9R?w_t)_nx`>RZdF&chi

    ?Hy$XRfTVj`*F9Tld-A=dXdAxq>i_zeP%f}L}+H-Er14Zlg?CTs5kL(y28 z2QM&?SZhDR^(3+c02(n^lbQ}hv{(^=b)I*Q1UMm3Q~*sFKKgM7E5$R8f9JU(0^UEQ z2^;HG0zH|OT$TXB33vCI03~oO!b#Svs70_U?(~!ZN3Mg5{vpL8@oq03{7nSJqptc< lqQK>!bP0l+XkKL#twm delta 234 zcmV)X3FN}PKfQ_>uFb_U1BK+sLYS#rp5d14CCE+wLKIbf@e~Mh^ zdTb(sg4?*rFpo9UP^!R`mwFy?li+ftu0H}zB=!VY;&1^iM`KR+etQI1vjE~U1uMYO zjc6s@1TL?#E8!yWSl3Mgub`D+0bJ|4557%8r{MY)@D%JMAb_~sy_H}QlWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0L4Z$)E09)DP)JIuuCAVv)!ps2 z{DK*Pd}MGS zpxYTJx82jlF~p+x?j%p4!wNhs^}5ZB*^U4In<>jYZ&3W6;ulgneFDqvZ~Y7B>04y4 zJ;vSI;hLR&cBt=Kt=FvpE#3+ zpWqk8fKOk}aTrW9=5cbnv7-1%kMrasXOzNTK1PISNvIv$K=UilWGV8CeoY0)H)#=lSG| z-316bcW&zL`lke2md6n7H$&2 zf=d;k1c%WYxOo(Faf-;Nc)B=-SoGeV zwhMAEbP=^l$1ZYt6aEVQMBG?`1b0&{&dfDQ?@U z^!jkLn!%HW0n2jYPCm`)Y)iA65%7RNM>=*%YZI@;xn|pj)s-Qle-8Gi-<0047(dh`GQ0QpHoK~z|U?Uu0(!!Qg4J&NXWnGsUD%?Me+ zWkyKpHl<6ipb=cARqzOCJZLJ7NjDLJFWl&!)QfP}wQAMsV5OAGFNH(rxoo;#mYv*9 zXlTxL_5D;H_u^+l;0#&UuPit;4B5v34#9y8tHE#ME7pLPhJU*okkMNP1dPCGIOGyU z4jw`Up|j`m-pSp7PQ4hgOpH_Bz+%MJ0H6S|2@CGF2N;fS8LTHEV))@5VBI}Wfx!^p zy~_fs8PMQU;pkqVa{nAUx790)hr_44*3Zs;@5`Z_^w6IP&Vy{ZDtlJ^lax|C(chn}O0? zB|(0{3_v~v)OCu40YzIpT^vI!daq7$6g#TG!OShMc<28i-?!I3TtE8s32#%}_4Lzk z_}^XQRCe=i)C&rbfm*67}?V|UwQf2n1EoVh^? V^X4m>J&7Q1c)I$ztaD0e0sw^pW!C@z delta 309 zcmeBTy2~`du%0E|(btiIVPik{pF~y$1_rqRpAc6d{r~^}yWgH3y8mg}xin*yH(+s&6o#S{M-0LY|duJ+RuYXg<4&!-O{j4}U6xf5MJebT23cU)y zZ)RwfZ2!`r(lKi`YsG|neoX1bzs)`c?&xzkqwTf&)$F4T6)84cdz57~|Asa*9NG9m z?}MH?`{&o;>#sdz(2M`6kn>UDO`-U`Yw{e=f3kd)miKB{AH)oFKZB>MpUXO@geCyc CrHM-b diff --git a/public/images/items/wellspring_mask.png b/public/images/items/wellspring_mask.png index d5546cdb8dab5a616bc2c7beab605d9537571805..921c71e14939170de6d1e633bc46bb2d878860e9 100644 GIT binary patch delta 249 zcmVH}hW zXxt+XdK}-X!NOZEb523Rr#wXbNF`iWRYvJZ?m#U{Z0;%`b8?wxZ3}3ui+c!bTHrih z16)G>Mn-IBu9m_o5Wra)Q}kf@2(b@QsbDc3Ko1TiSe}5Fc6%1K@G%yZa2lWxG;n(X22($$cBWq^x00000NkvXXu0mjf4z_LU delta 314 zcmZ3)^oVJKVLeN_qpu?a!^VE@KZ&di3=Gl%J|V8&K0bzqhCGgq%#BY~)?cu``t#h~ z|9}7f1Eak-;eYo+ zB;R2L9+rUHGoJoaf9I2tHbf?WGbdiRWhQw5#IM zd*f2nx^eenE_R{MynBqo7VAG{T(muC@*3So@pFr_dzDVee)#HVz{-C_<-y|@d)pXx zG6&~&d=`1XzDyQyC|RVP5Q&E zAI3i}zJ4XX;DGPrr$!N&U;%e~M12|fJkl~PK)yS85fdW6B#)z4*} HQ$iB}7|Dm! diff --git a/public/images/items/whipped_dream.png b/public/images/items/whipped_dream.png index 94628a443d18c13e0fcceece7fd3f6d4a5a467cb..16090ccaac0eff93cca81f7b4f6471e0b91c654b 100644 GIT binary patch delta 245 zcmVi^ zA)u31h#60f0Hl^c7n=qGp%!8xWaRR{NC8qblI6AukekwF);zR{%2hX2QIjq!x1c1( v^LIqA)93k1rBh}Oi?;?kf!&8==e}59V_*ct5C3(y00000NkvXXu0mjf1=n!t delta 319 zcmbQo^qgseVLeN_qpu?a!^VE@KZ&di3=DDsJ|V7#hKARoT8FV_aS#tn)|amtC#N1ifA zd^UDCa_F>3rE662Z7yRmfRL)Xk1eMa{e{#I%Yow zJ`Rf`E9Nu4{ax~#X-r|?g!qfk`+IIpe^I2}S9XVNcAK|y3v^;@-vWKY N;OXk;vd$@?2>{YJi-7%hq^@ zy}=wwL4pri`GhtXujRj_d#3mr=WV^@nNvA;-}U@_c1`$Ssc$Fde`Trqlz3n+zu1$1 ztlUKh5B!UHP7j`^Ms>t8cHIn3;lVtuC$Xg`CetDnm{ Hr-UW|0h(vJ delta 274 zcmey#xQl6mVLeN_qpu?a!^VE@KZ&di3=DDsJ|V6XDkc~h7`(Xg;=zRn7j|6u@#4pa z2OkcsIPl}g51^8NRfe@dimN2ZFZe$UFl;)ba~>$lS>O>_%)r2R7=#&*=dVZs3if-t zIEGmGKb?4x?}!42OW>8G|NlQ^jZHO~Rlj$8%&aoGeowEj=l6&!aG5=R`+bhHqEYcF z@dZacKUc8bGFu*U>gI*(KPS8PwbjM`RWjPo>~Qhg+4wz7Oo_i785+3S?n^5yVEX#} zD+9w?$M4DS8cZ+zwT*AsCZBndaYNOtb%tdJ;yH{PeBT&1M88wd`^>W7ntswk1^?&S TWxWjCK-YP?`njxgN@xNAqM3d~ diff --git a/public/images/items/wide_lens.png b/public/images/items/wide_lens.png index bf622521a9a8e511924f18b1c6569e469e96a1c9..f7dbe9843fa8c5f9d4925f183a8de9bb96210f2a 100644 GIT binary patch delta 242 zcmZo>YG#@sSllz?EDmyaVpw-h<|UA$7~m7)3ZxYj6q1sXnhhnkI4ayL zHhi|ESfG1}#M%E#mMr=I|G%Iry9iJbcS(?6FawYe1+`_hSAoKno-U3d7QJ^TIr1G) z;9zlGz36{^0c)r4WY_a=W73@zqzi|F=Op3K~z}7?Uum}!ypVr8KK7<{907*qoM6N<$f)V>{EC2ui diff --git a/public/images/items/wise_glasses.png b/public/images/items/wise_glasses.png index 49a95761afdf9973c6edfedd34faa0766d594daf..b48d2cb3ffddd8988848fc3c77292ec1639d4a3c 100644 GIT binary patch delta 215 zcmcb|_=0hQWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0M1W6-E09)DQ1Ei}N{UKKnlh#P z?AbN{L0~f5JW-$=M@f)hFaucR|NpC}LX3c7S)MMAAr`%FCmfV&P~d2uE3xmtw7DsN z(4p%)%S!C|rd?Y9ok`$^oWUJkgZA=<{{fZEE<6cp0jHf9k{E2I3RHP-Gic3xFY@dQ zm&jYcRFRV<_ABx|7r5HqzZ@-;I;C8HG84n3;tLTMUX+(IeUxP6-y_|h544uS)78&q Iol`;+0R7xlDgXcg delta 205 zcmV;;05bpR0p0CTnfN>So*&fHSQQ@HA~zfG(@f0sQQbdIKOH z0uF$D2qFkH#j_%Sbq82tya1Hq;f%!qP|(axF45++C=55T2u1+bj{vy|3L~PBT)$5) zA_d4Js`6UyK0aWG@z4#meWGVP-2iYCkb5cnG5?Axm1;O`;+W?%AvE>400000NkvXX Hu0mjf!$(%t diff --git a/public/images/items/wl_ability_urge.png b/public/images/items/wl_ability_urge.png index a9eaa8343130d3dcce82d7cc5363223078ec0378..b6b2c8bd3989d5377a5cd144204da37a41f2cf5c 100644 GIT binary patch delta 241 zcmbQi)WkGFvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gI>0By6-X;6D0q2!RaaLFOlkJo za<=;F)j4zK9DVoy%))1^KxxjBAirRS|4?AgH2Vrru))*CF~p+x?L|kvRs#-}0PCgA z-|aUxT$OMX-fmwXruLa>rOs*l`zopr0E^{ibN~PV delta 264 zcmV+j0r&ob0+<4j8Gi-<0047(dh`GQ0N+VOK~z}7?bfjogdh+FP)e`_>iI1Z+JfPh zVG9=;(#EyG1C~k51p2o1Avo&bOG>iKlIYVku#(QQ3deB!xplLbz?*iKz~&G>+Px%VoQi7Kxy@< zXP*O({RGg|KsNvpIU?Hk)!O3l?hSZ=M|^7{^_4sZ0EiGF1VD5qoEw^!`7wYI#+VC) zhN5I^>sbDX1R#JR`2dzyhe*{v*tP%w O002ovPDHLkU;%==KXRb} diff --git a/public/images/items/wl_antidote.png b/public/images/items/wl_antidote.png index dbe0d5b94eaa04e57ed7d094a9e90b455e7c4677..93e4757938b8e4f00da3c12b8698d8671c89078b 100644 GIT binary patch delta 234 zcmbQh^qX;lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DQ24Py8)m4xskhAkekA!^@*L}kjWc9|6W#^p6`Lk4Gg;@cg=?FG zdO|B_WmC)N8@bI|LYGbmi-jzCYA45;>R;_Hf4>3o)zB dd;QOdU9poT@&B4SIiL#|JYD@<);T3K0RR!0WH$f+ delta 255 zcmVzF?a=>z(x11+IfLvSHDak zJVOQO`(A{ne*iAvP)ZTK@YefzfzXZL*cd~^pc1V$ktE#OSpkxeQl{{d7+T`jz|H}` znddl#o`kQ7^(cW%Vie?2oLxqP!SKsy&2@YSEWiRR@CEMFVJ-n2J@Ehl002ovPDHLk FV1m@+aSZ?f diff --git a/public/images/items/wl_awakening.png b/public/images/items/wl_awakening.png index 9a0adcda904af2e1c30ba78ca5496936162740cc..57e83b30cdafe6063c47ce5b3af757c774d469dc 100644 GIT binary patch delta 234 zcmbQq^qX;lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DQ1IArAmPG;2@@u4 z*sx*2haVR%T)6S$$BP#)UL|d;2CCpH3GxeO_zwehog!gC(Na$r#}JF&w-dej4k&QA zh&q1!C!TlEf3}6`%WW@jZIto!l}#<5Z{#*>30*oNEEcllshxOZNS5ewk-(_=2d`@KHP*@#4h`Yl|;JKowjiL4Lsu|6!o6QzQ&1TI%WI7-G@;cA_`m0R;{h zQOA$}#PbgN&$cjqx$Wic4Kvi;)LZ6%KazYdd5(3&#u+lf3GV{)icOQ2nXL2J!nMso zJ)xDevZ>|sjofA}p-U%(#X^=mwG(d)$r4>I5*RiA;8jh&=K6$bi5$!ad$?ncg_zam dz5Zv!{_HTz!c~2bvw<#P@O1TaS?83{1OWC~WFG(k delta 258 zcmV+d0sa2_0h0od8Gi-<0047(dh`GQ0NP1JK~z|U?Uk_&!yphvJqn|E1dm3U(j!o2 z1ec7Ek`dAo9nwVxAAyLkkm8CbS>oWo0}GZI<1&+};VPg4D)9dT#u$m%;4%j#kOKC{ z?IV&1LLduS_ffqXaUEUXWLD_84^r!yltL&+#u%0Tobz7tj|wjw{1q$^ZZW07*qo IM6N<$f_LU@0RR91 diff --git a/public/images/items/wl_custom_spliced.png b/public/images/items/wl_custom_spliced.png index 6a0ad4f8349d91ae5dea106d22417f92bc52a1ee..8aef30edb27c856f55b0c0da858ddd46cebf0669 100644 GIT binary patch delta 264 zcmX@YGJ|P?WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0N`Oy@E09)DP`Kjb^DZRhZEkM< zwEeX!ZocmCpS< delta 566 zcmV-60?GZD0>lK68Gi-<0047(dh`GQ00DDSM?wIu&K&6g00HDlL_t(oh3%EEZ`(i= z$3Kk*QYncva?_Yo)3T``xNKXC0;Z{?QU=BvIg&v^6%cS!P9+;!>HdJZRkf)K4ysg8 zG}W0)Qq^QqGZ3^4IQHx-B^X9TAxh@#JCRy{!tS zlmHwzdjRa353F~)2_ZTn9%Ts#xw##)w^aealoHpr0cguZT-(NRYwR8!0dUvtCc2SE zDb4tI>xB@QQhzd03R6mi5KNT9aci_1WgNGL5F+xw+}X+8wAvj2@O_`^{OQ{^&Tt9@ z?f3l$poZ`JtmlZCDd5$&a{x-C5kFsaIBxc6i83d{DXm5sfU0%KL@CJbsS1k*GiBeRpAbDQ2m*CgN29a59`ivqw87!nqEXB&z;@ z2)G{%c(T16i2$hd`y9;epZ0@e$o2G}#1~g%vPc!+dEVMfn4Li+A}$1$S9@_a=JUJ# z%zHq458Mw1lt!aWzwbZvDi6`ViqAGT7ur5Pw-%1;R1cb)FkA|NWkTYK!#O&!SN=OL zC@5Gtzb^qt_`4m(szhP{000hUSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$ Eg8H5L=>Px# diff --git a/public/images/items/wl_custom_thief.png b/public/images/items/wl_custom_thief.png index cc1302ffb355a77aaa18a701ada4afc42d62bb3a..de6d62a48bc04dc40e4d12dac7aebae5e3137522 100644 GIT binary patch delta 234 zcmbQl{F`xtWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE0C6ukdTv;GcYjlR>^U2 zaPafUCKZeTqQw%!3_UlpsrIS3@BRa>Eak-(ff9yH{SsT4j0i6 zhyUu|X_{|Vm~|=l^7ceS{~kXM`}dv6bC2&R+mN);V%dQ^i*G&4I-->t6PO~J)981A zOZXKF=ktxX*+NyOOcdAAC_Y`Q*QD|MjGxzJ z{>6(Ij5Kio%;F-`xp>v}olYjnA&kUYj%@M4>)Wxav)A-QaR@PvU?jzIn8nBzAp>-I zVjRIlY!n>4zMVmULma2&FpC8^#BqiY$svI5`_zm$q70oqV}B9Rp};~)ioJF4HPy2r zK?kVWi$X&H!6qDCNNP{xSIb0-YgaGWNfk9@IUqG7j^QfHT84%tX*kt1EJ|2XjqcQASWlsz`(%3@aWMatm*{>1Q-|?7#Kc$_`uK*GmByNj71D* zzpTNV2#G2O*n8O67z_*yu*!e>^a-o@y?gfj5fg$r1H&d0}x!vFB$1H-+0 z_o!PJz(Ro(K#cFns*DIZ4BRC_e!&d?;h?sx_9{@g-qXb~#G?1@L{C0uMIM&pH`vbnmzT+56FOk_?LZ+HEx@!wh5vGU7oCxiK&EX7PbpDILu%!us0wDg_ssxKvc`Wu*66fBgVU@*Pb zWQO9xcYBf!hJ?!{3mqxp;f)HOT;l&oa7)8yYk|#q&XOE?dk)So6lto|=x+Zpy^`_T Xbk?HQr?gTe~DWM4fo$zK6 delta 280 zcmeBVI>0o+u%0E|(btiIVPik{pF~y$1_s3dpAgr8fB*vngBK4bELae6;6TBL4;vnI z6#O`G;KzyyD?9>#sy<|#UkaqSOM?7@|HA=;mp|htpfG2FM`SSr1K(i~W;~w1A_XWo z(bL5-#KQk=kEhTP1rFDvj8lKh?+~o-m~dp(z4EWO4gRoq?)xAK5ot%s6<%>D1D!dBwUnzlU9K-o~lFDB=4V&j-fV={syWuRaPp@8ofdRaZ&sLfDfjaBL__}`KMwo%oyl{L?NIMKq_; z?*NzZDHhJ>8*j6Psw|nPuA@m1A^OZz5aIrUM;}g(8BBV@^Dbh{CIj;g67r=yd^HTPk0Q6 z#?TztJwS^Q`&~#$Pz~3k1OkatkXLc=7!?M?AEP$U@jp-j6;OcggsyZs^BUK@(X784+C|bB4I$$QcoAh5R2Zo6TSHkC~&xl zemMMB|4!3-UtZ2^n}IH1@O1TaS?83{1OVnlWhVdt delta 259 zcmV+e0sQ{^0h9ue8Gi-<0047(dh`GQ0NY7KK~z|U?Uk_&10f7W86hJuO2)|uH&V)! zDKo;2aAitLIwD(gbZ{mR@fA|Ic+yE2{xh7wrIg%EriPn<37EkD3wZA}QiH=BlmG{W zaQTQPf)L0;9(Sjrh(H7m!L{zoagl%s(8ABH9xhOgNFW5V?tEfgyC`=7CeZ3$s~r~D zclFH<$Tw7g&bJjV{{UQoxZX}oEnFKP7Laae;SkS^1eL6tXGDVLjta2EvbcA6iG-HW z9N0ZTixK->s7X+b)T0D4iC&ObarPK>2E!ktInVJgFaZ-Vffs0vF0QxcjF12T002ov JPDHLkV1l5`ZZQA= diff --git a/public/images/items/wl_guard_spec.png b/public/images/items/wl_guard_spec.png index b494123e92eb8a4b6d05d59db9253f2a2f647c9c..9d22029e9272935a5f0fed4c856b35c30bad0947 100644 GIT binary patch delta 235 zcmbQj^oMbRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Vt`MGE09(If&zt#iVA}r5&;ha z8X6iFELgB%!-g3jCY<=Oqc5Z3Cr}Z0NswPK!+$uaEvvl>6fW{~aSXBOeLK;U?|=da zL##mSfBPL7I;M@czT7HVXFNke@lVPgb-%pQxj#IwR|aTXxxSgjCOI)j@T#!l%?0)j zTsIzBX5{kD*t=lPz6wS&mKmQPb#tber%7y>@J8wc_qEgR%a>SLI!<_S$i7W&c6HwQ bzo~q^DXc-pEplN%>lr*<{an^LB{Ts5Sg~T? delta 259 zcmV+e0sQ{_0h9ue8Gi-<0047(dh`GQ0NY7KK~z|U?UlO?!yphq86zblcodJ~l9CZz zrep+4kB~7kLdtYRM|2k0r<^TLA(5_lvMg-g1Nmc8N~R}W?|hu)9Yp zAPYhWAE81d0xF4fjs(ZO_f|sjofA}p-U%(#X^=mwG(d)$r4>I5*RiA;8jh&=K6$bi5$!ad$?ncg_zam dz5Zv!{_HTz!c~2bvw<#P@O1TaS?83{1OTG1Wc>gD delta 259 zcmV+e0sQ{^0h9ue8Gi-<0047(dh`GQ0NY7KK~z|U?UgYO!ypVra}=AN=Y*e=DDiBks_$nPdJSh@}|4a}}F~(^mL&HtL1We%n1)OslvBF^vN`M14 zA3maqAOw<-aPlgO2t?ozT}FMPgMe*x8q1VSL`ZhTv|Ch}dt3Dmk*YWoHD zU463yuWzgXoq?KwoB^}|;pc@Zg=^#80@4jF{8(2;f^u&6z=#CR?G<2&i=W@&ITD&f zb71!XEk^8jp(H^yQjZcyBw9gU#mQsT7z}@m#yrQrzywUd1fHU%S{`FvF=zk)002ov JPDHLkV1j7{Yd8P^ diff --git a/public/images/items/wl_ice_heal.png b/public/images/items/wl_ice_heal.png index e28f3205a808555839cbd91921e56a07481adbf5..9ac297c0e7cbe14cbed5117d61bf6004d82d4f3f 100644 GIT binary patch delta 234 zcmeBU`pq~&vYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gF2EMirXA4xu!JjXg>;|!VLgm-~?#imKiOxAg9;o9b) zp3ur!+0^p+MsBl~(4`Z?Vj)YO+KD%YWQi^p35=S5@Tw+XbA7_JL=NVIJ=`(JLdzopr08LP3MF0Q* delta 253 zcmVJqpM3C@wh)N8uPO zXX%cy#7+duz=WT{MHeqIq4Hm=fhESc%w%e~3aEezJYT>VBM}?i-a!eZfZe&TNFoS< zEabJWB7z7+;1*o#zFcPsh(OwS+nS$%YFGjxkaf3v-$gkEoOVE~d!cq*;M&zM6F8r- z0`w2G1o$673lQ!YDNzfT)`tbS8`?O8kl>&af7JQ2mZvr0By6-X;6D0q2!RaaL}v9$cA zsrf%CY0jKE|L4rP+}u3}D9u?C0unQ}TbAE;~fpY(^PMEz96lxk*7l)78&qol`;+0E>iV5&!@I delta 257 zcmV+c0sj7i0+Ird8Gi-<0047(dh`GQ0NF`IK~z}7?bfjo!ypU=P>-UP5m-TEu!h!f zsX5&$MFIyH0vNcYQ1Lta^!#-;J^KmiJPaFaB$4Ils@;#?9UN-_%R9)1}U zhMv}jAYw=XvIG!@`=NOYJ~^ZZ(FO3s;}&YUj0uPpfTVU|?s`g$Z6U@0ji)bNI}Pyr zM8u&6mI0VqnE4HGt_@h-fCqTQwllz?EDmyaVpw-h<|U9L9pDq<3ZxYj6ui8=s;jH#%;7kD zR^b1Ci8*uT{QrOSl+-*gpfqPmkY6yve<(0#ntcT**x>2n7-G@;_M#(Ss{sc~fc4Vm z@AexTu1YuxZ?~@xQ~S)cQs=b&{mW@`*;!G$ma64WP+~gZd9&N#kxI9lvLcHoezy=%{tQ k`+FnbhobY>i~kpy+3#VoUFH&c25Ws_rLL<`vdqD^~i*qgu7eX%IwofYc zeo3*`rc@w90I3{G%PBxg2n9g`KslbmRpL2-7y-z}9>Pir#&fn1On@c@pW6+9^^9ZX zOkfzmd%x!ZXaYdb0RZA|61BIa8xRXI0z-~tOHrJIdI1R$pMw$-^Sj%XUCsjFk4z4z zFT+T{330Uq-10}8Q426@Gy03|SpJ9vAb=_P0>kc!!^2-vvH$=807*qoM6N<$f}M0? Aq5uE@ diff --git a/public/images/items/wl_max_elixir.png b/public/images/items/wl_max_elixir.png index ba900bc2e972e4d09cb550aa7cc0664ad0769a89..4a33dc853fd6392e25272c8172206f2caf384cd1 100644 GIT binary patch delta 224 zcmX@W)X6l#uwF61C&ZPDfx*DQARr)M#}0)DHw1oss4(d0&^WMT#t$GkapT92nm`^I z1_lQ1k|4iehW~I-TUL7&C|vL9;uvDl`*xxyAG0D4%W;XEGymmfa@d4U+P23mzQVdh zZ`Rvg|7!eqR(7o1GTX^uJ|}xI6VIm#(H}D+doS&Hr>nKSgin71^NNCnvJ(uZ*P6^w zT=;HJ(!r2$xn!XmB|N-U;g3uFCkcLW_+&kyBhQ(YBX7^a`Gq1)l^WgcKc-hQZi`{n UT@!fI9q1MYPgg&ebxsLQ0Kmy(0RR91 delta 280 zcmeBVI>0o+u%0E|(btiIVPik{pF~y$1_s3dpAgr8fB*vngC8F%cI;4ia6{n7j}saP zcHH>!W5$mk1|1zhRhMT=tpifrB|(0{|KWha%b)QRP?)p8BeIx*f$uN~Gak=hkpdK) z=;`7ZV&VU`$5ZHt0*C8S#;L#McL>&ZOgOUYUisJC27lN)_k9qbGJ67#bgO~GDL1BQ zLp=s{*9XUXbqn++W*ofXbZTkVykgy(-@~pqZ{yTol<@tG=L2Kw^c}XGS09C)cXGZG z^U7O;x7t0CC+DfAz!^QB#JEZkwfzCi&mAM$Hh)$S$YHhVKNKV)-8#GAkvPjD{ui}M Wf?3Bha+!e6WAJqKb6Mw<&;$T|(se=r diff --git a/public/images/items/wl_max_ether.png b/public/images/items/wl_max_ether.png index 3cd58498fa740fd430e1c56d739fd09b65c2f7e5..d3f69ce053dc9a6703dbdd7e2bac138beb23bed0 100644 GIT binary patch delta 224 zcmX@W)X6l#uwF61C&ZPDfx*DQARr(>Vu3}(g@^?UHf;FOv0=l36DMvw_;KOEgAb;Y z8@4boFmRUy`2{olhlAR(+N(g}dQTU}5R2Zo6FvEu6?s^W-$?uTUtT7MP3WX;d(7f1 ztV{G}z1{V%#(!sJ$I36Woebu8vK2G&e5w%rF(b0~($=@Sv%Zz^>2F|OQLs>cg2D7! zlNpK&-|k5~=n^KEEOaG>hcip`a*6*V!7B})tpzscI7@Kk?KwEVP^76+qr3gb^h!oc XM%Ecc-&b7#x`n~h)z4*}Q$iB}Exl$O delta 280 zcmeBVI>0o+u%0E|(btiIVPik{pF~y$1_s3dpAgr8fB*vngA*riELgB%!-fM79(;(n z5b@y0g$+MCBo&ZOgOUYUisJC27lN)_k9qbGJ67#bgO~GDL1BQ zLp=s{*9XUXbqn++W*ofXbZTkVykgy(-@~pqZ{yTol<@tG=L2Kw^c}XGS09C)cXGZG z^U7O;x7t0CC+DfAz!^QB#JEZkwfzCi&mAM$Hh)$S$YHhVKNKV)-8#GAkvPjD{ui}M Wf?3Bha+!e6WAJqKb6Mw<&;$SxxOBPz diff --git a/public/images/items/wl_max_potion.png b/public/images/items/wl_max_potion.png index cf92810943cbc06ca10c1b67573a9262b9797ae4..6b58c07e86a5e5ff5c2b07e96f74a955399ffba0 100644 GIT binary patch delta 234 zcmbQn^qX;lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09(If{FtUGaf8huwlc7 z105%RoH%jgz>6Ob9(>65*5wAO;3^673ugEa19hDuVL;JRPZ!4!i{7^rz4;C(aJYzm zIQ&=tPSbp|!mLZVm$xSx`uF&8*uU>go_l;p$%dqj7RwIYS$yeP))A%5n29N(IgNe? zxP(u!a6aF7n=Mpj$wYM>jpEa_dQBSFPx+l&v&pV`)nr+w{|-kEConZhitp%Ine*$; cwZEx+t5>pIW>xO~1atv|r>mdKI;Vst07`dg9RL6T delta 261 zcmV+g0s8*?0hR)g8Gi-<0047(dh`GQ0NqJMK~z|U?Uk_&!yphvJqn{_tc;KmQhEeN zpk#!UlqplXBRQgr3_gM_zCwyCo@9xG{|+peVvN&BhK8$v3aG&U3m9W0VuQ^blt2pb z{`M6~1R;=x%(E2{L?8m2;9B?PI7>hTXklwz^9ZPhB@hBxcYYx}c2VvEOrX`hRNF1E z?&`=6@HbR|&bJlL{{UQoI9)@c7A}o<3vf5Iu)8k_4l23$CBYIjw^!hO1D@R{yo5tb zXb$WiNQ=E#??O$2YPcRHkV)(YcopZb;J#q^V>ISD{sk(a0xIwX^ZHlrZxnu`00000 LNkvXXu0mjf>sfA8 diff --git a/public/images/items/wl_max_revive.png b/public/images/items/wl_max_revive.png index 12e3b263c21fbacd671156e392417446d027a31b..f2eabaa8d5b9276fd5d466af4401e6f73ee2b6a3 100644 GIT binary patch delta 235 zcmbQr^oMbRWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0bbwEYE09)DP}s15VZ{c412-6M z91ythfZ@Z3j2}NPJW*P}2$be53GxeO_zwljf!(F~JW!UwVej3~gPtNb_LPdkceQ2kaMI z=wn~m@jxfy^Z}oq?+u1gvIasj{EeLV5+9#qj8y6KpHi>f<@t@nW0{y1lYZW-)R>b= e^G}!7&tz5(W6|U~9GwJo27{-opUXO@geCy5tzb0( delta 260 zcmV+f0sH>^0hI!f8Gi-<0047(dh`GQ0NhDLK~z|U?Uk_&gD?<9JpvbggiS0MNnUG66K!&2^|XPZ5y))D3k|OLkT?tTC@wCelfm@MsLgeJ2QJ_OF7O7Vha^^ZB}pj&0000< KMNUMnLSTZ|*J|wm diff --git a/public/images/items/wl_paralyze_heal.png b/public/images/items/wl_paralyze_heal.png index 9a741c705d48b7a9c7b0e145653f73e504be76cb..8e89e54c156b75358d5ac8bdeb1019e2b9204e01 100644 GIT binary patch delta 234 zcmbQh^qX;lWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0T!2rAE09)DP}s1-;J^We7cUYf zOqj4?!-fkNF8ug$;>C*>IR$_B09A061o;Is{D*hA9X0py>3)eOW z^@LW=%BGgjH*%Y`gf5*B77JPO)K0uHBujL;NMO|bgI6{An(Gs$C2}wy?BR|%7GhSL d_xhg^yJ9Cx;{P>uazGa_c)I$ztaD0e0st%yWOe`m delta 255 zcmVjWGJu*U$ zJu(I(kY6yve;BCi6bS>0mU_B4hFJ8zo#@SXK!L+W zG~mlW@w|invn@mdKI;Vst0Gg^}!T0ha=h8Gi-<0047(dh`GQ0NzPNK~z|U?UgYO!ypVra}fqXYtpQjk}1@E8>a!yltI&+#u%0Tobz9W%T@&cgE72><{9 M07*qoM6N<$f~U!D$N&HU diff --git a/public/images/items/wl_reset_urge.png b/public/images/items/wl_reset_urge.png index 25ba0dfcdb935082d1d40a2750ed82133ba155f5..0d2f94504f05cc5b44b49d77e872fe5bd04a5cac 100644 GIT binary patch delta 241 zcmbQj)WkGFvYwfNfx%@-*D)Z)SRCZ;#IWw1%u66gI>0By6-X;6D0q2!RaaMQuHmS@ z8nxtq^_)3#p8dZ%iKl7{P@1zO$S;`TKNOfV&AtK@Z18k(46*2ad(n}v)qsN~zszo8D_Ubkw@u k{k@UzL(%!`#s7=U?Dw$PE^`Sz1au68r>mdKI;Vst0NBlBdH?_b delta 259 zcmV+e0sQ`g0+a%f8Gi-<0047(dh`GQ0NY7KK~z}7?bfjo!ypU=P|A!!>s1&btFQ`X zO0VM;vIaT%PC7v#fDz{uDt_a0tmjVxG1gjhXN&?Apa2D2_)u(Q8Q>i7iav?=X+|O4 z!~OB3q1*nTIOiw@hzNj&wJi5ZMEyNI@_4cKE zrvbR0Q0qtoVt^3B834coTf@a0Kma0sHBtJNOaovbM{o#)?+JNBaBUVq2>2f45D30$ zsSUAxAm8mcptcN>fG0By6-X;6C~R23uwsM2fg21r z4hUR$!0_Qi#*ZHto+vF~1WI$31o;Is{D%T_rrB43f`y(gjv*GkZzp?QU+X5R19GUXpx Vf~bzH1WGwOz}b@1OI`^;6ezlCtbr$zywU-{Q};5jc`J-1|^UJ_WjdD z6F~^Dka=_}iU>rY2(F!8&XWX0KntGcp&+kC2(Z)1@MUuhDR4j%aDi4hT;Mp?#I_7+ zj6v(yG2%C>%WET#2uSkq#{_8Od~+>W&fgY@|Fae(k#%wHU4g2^859ob1Jqzz*Pq`G x)uRNM#8r^3m_0@pgW-=+pXc}=n1BhGzzmdKI;Vst0D4hm9RL6T delta 268 zcmV+n0rUR*0h|Jm8Gi-<0047(dh`GQ0OLtSK~z|U?Uk_&!Y~j;Gm1xG6h_Dhj6g}5 zk`Wkzk}_pVN=im>XLKhnik&ky@)x1F;z^Nw_J8MCb{9hEwq(RvDfkOCv2G9b;IP95RxHjG_Al>l7eqtmj<#|6dB0+Oo1z6&G z+|A)B5}HDDVD|tmMl5$BCqXq*j}nL^YC&Gb(PLB@41bKad5(X937CKhya34{Jl;`{ S`;Y(t002ovP6b4+LSTZrG;HSp diff --git a/public/images/items/x_accuracy.png b/public/images/items/x_accuracy.png index d119a75f1bbac343b0c1bd739206989f690c09d4..e7af52fc6845a5b6ad5a1521fad7347a38a1f79e 100644 GIT binary patch delta 286 zcmX@jw2o}zhq)wrGa_Z5jjKm7|AE^iqGvZIKf!- z-S5HE34t;qVa^X`E=xY=6QS3%;*x|W^V$!q^baS#+cuw7PAqlnl!9k-6sjcVUD*2X z#e|ii=Q(eFkovH$eXaL|N6LFwERMc(v0-|-l(>_a`L+vT56Ze{Gu+xY`G)Z=z8@0h i_dWOh-6|e`j``vXmigEJKi&j%F@vY8pUXO@geCw%f{GIW delta 315 zcmV-B0mS~U0?PuB8Gi-<0047(dh`GQ0TM|>K~z}7?Up?bf~h1r)(SeKRW&Fl{}O;uG@fZDd5Jc`4I!|)cxi~t{R z;|xz4pRN zOD5huI2GpNJX@?#>OWFGhr;Ult3=j@y zJ7R!yBGiB%t28;Bx#nHKZV7+sI4}=E!%P3GiK1UYIjs0+S5?(t>jighzl;YS9PI!A N002ovPDHLkV1gfNi#-4U diff --git a/public/images/items/x_attack.png b/public/images/items/x_attack.png index 36c76da9486a6069257bdcb952744324be8e4d8a..711aca7269c4530df3a231640d92aa2abc339b7c 100644 GIT binary patch delta 286 zcmX@hw2o4lQ{K&4^X%%?|IhCI|Nmd9h&KtSh`S`nFPH(yhl1L&+N(g}C7v#hAr`%NCpq#R zHsD}k))Dyqpa0#YZL35kf4TGSqH#m(-um4Cl8Jeh2IgHyknIX{@WEcu*IgkIB%OA?yQYd@^gKb-h(+k93zvDB?o3ZBhTsFIj>Ve7va z6IOchJBwcZmRDeqmeIQr7XhUw)};!a}b+b)DXDC?fhaBJV>8^*Wzen^zx h_uTh)t9bl5=8G>_=3oE+coWdY44$rjF6*2UngG+mheiMZ delta 317 zcmV-D0mA;S0?h)D8Gi-<0047(dh`GQ0Tf9@K~z}7?Uua_gD?<<8O1BG24iG}lqp$( zk}_r1$OyD4U1kN6XXT;C2_;BATtt4-3CB2m@6JEaG*wkq4hkX68pYw`Fs!1O5yIm% zE%2oHSd0{b$NrK+rPVkTem|X4sA$O5fG#ospW`h7EF8bpfPae#Lh(?55!bGp`?gK< zP4OPa;yz7g8NipD0iF}C1~&9qwQ$Zg-v!()?k^n$+5ptO^m|Pd{R*Z8{Dv`-w?!3Eb+|atWKKH+5VqT?zdDjs+L-!cTC+~{S?JzjOSoGcR z!P5zWG9qEl4`wb)KIapm*R5vdsi%uzI3r+dbyOilbHFo3t1avWjr>mdKI;Vst0K-*@l>h($ delta 315 zcmV-B0mS~U0?PuB8Gi-<0047(dh`GQ0TM|>K~z}7?Up?bf_fH?u!bRYgTb0jleI^vDix+wLv083Eq+ z!wi@1!#Eqs0zaN!;qq#13P0>`Q@Ah`YQPtnfYDHj9DMQ3hw3S zx@3Yr!5OnU^Q8)qE#>#jz5MDAgQuncmN_Ou_P#@aV?g~Wly>OBvy{EBaN3yI%mCqV zwj%~OCqfPQu{4^(nQPt!?3VDCjsw#WG`#e`n#lSUl)|!qb`=%kaGY4 diff --git a/public/images/items/x_sp_atk.png b/public/images/items/x_sp_atk.png index 772f9fe3315d9ca80063eb89824d8d02cca6f338..f0e674e4d45a494d6202b90e308af578115b7d2b 100644 GIT binary patch delta 286 zcmX@Yw2o}zhq)wrGa_Z5jjKm7|AE^iqGvZIKf!- z-S5HE34t;qVa^X`E=xY=6QS3%;*x|W^V$!q^baS#+cuw7PAqlnl!9k-6sjcVUD*2X z#e|ii=Q(eFkovH$eXaL|N6LFwERMc(v0-|-l(>_a`L+vT56Ze{Gu+xY`G)Z=z8@0h i_dWOh-6|e`j``vXmigEJKi&j%F@vY8pUXO@geCwl1d0Iw delta 308 zcmV-40n7fb0>lE48Gi-<0047(dh`GQ0Sie)K~z}7?Up+ZgD?<8If~E25po2dCnY6i zu0lzh($^pwqank}`A94-kVjhKV23xm{y^6?H8nXXgs^B-hY!Pj7uAdqp3=O*S3Nf) zRp8SUbEvc$r^3hamP18Dt_F0G0hrPw11ucB)qsl$Lh(?5SATfF#2E5?Q|!Z7^wZ=a z1NbvQ2sHsPuINXbRdF@&EpuxEV+ejvL7&&jAp`nA3)PHic0YdhDL=0z6TAmF#~jYQ zQ~_qo@@wW={*j6O4;iQXPYKYGr&+dw<8VkoNzUu z$Et;MuK6zDZY??CrPF^5K;29KuZgN(K^9j1v#Y7;(s}_CE4-{);)(SD000070(N-C~S>h7L0 zWlHy&HG8k#d-m+=yLa#Y|NsAR`t+4RMcgGpe!&btJ`~iJ)m{Y(FY$D746*3FJIRsn zumJ}PvyQ;;|NQSJZCfQW`OBSm7mXWQ_txkBmrTstX>8v0chJBwcZmRDKE}g5Pj)l!*qTraVIhJZ5P5Gly%Q$xV3Nc4dYvUKP1ZU hd+z(YRXqM2^Sd^d?Q;{~`v6_c;OXk;vd$@?2>_$hg+KrR delta 314 zcmV-A0mc5V0?GoA8Gi-<0047(dh`GQ0TD?=K~z}7?Uu_8gD?<8DTTUxq=g()0$0kQ zg_OZHM~-d*G8SV^Rw#+&#fQivt#FLPn_YjP>zbOH9Mt#yrcoU}P19RcGeY>fE*TER z7_*To@Nu3~sI(fF!iRB8p`syI1G>lnd@RoduyFiV11=^A#eYKqMhv(67D7n#P33#2 z%IiK&78$^w0Yaz=fN{lrv{@Bb1D`UtCNPFzP666jCuIiYfflM6)2xm!f@}GCJu|^R zz&WNk^Ro&tTb5rl*Ycy^4Q@;SHS@!S%idQA;WU7L3uW8&;5o})S9oq8CN49;P&l_E z4e*?BHK50;g)?)m`7YpYaewJ3&_>GIyY#=BsQMLTVbwponwtJvJG+CbHt;@WZU6uP M07*qoM6N<$f`@sHJ^%m! diff --git a/public/images/items/x_speed.png b/public/images/items/x_speed.png index cbd1747142f05eb6b02d8602883209142e932f5c..daebb295d778e6b243963026b24eb48022cdefc4 100644 GIT binary patch delta 286 zcmX@gw2oKOi^dJDd+T%mOD5)38klz-ku!9Uk$m#5_}mVI6O2XQ{T@7> z5GW%O=KNshvgC6<5qeE4E=g!Iul=w}|8U~FZSz^>#8S6TDR?$Vp-N)jg{}WyOjsFu zp7Z7hsSoSg*LqKQq`Y^<;^<2k8>W{_i93mzZ@Uoopsaf~!>xUjZy4X=`yo+&-*eyJ et>W?Lm@mFynScHN<4r&pGkCiCxvXuK58Gi-<0047(dh`GQ0Srk*K~z}7?Up+ZgD?<8ISS|D2sr}hNl8hW zt5Bw;*2OL`W zpph!@aamHRv>KPfZ}Xf&MMI$mbdv%2u(EqN{;Poy6NF+?fPWDKCLYJM-W2;V7X36? zWFTd|gAi(BH6Z#|%RJn`r_8+xj3JmyFxWmRGN2QBsAf#FI=%>gD!={aOt3APurbA% z=PJN#S$@r2%a8UjxG(*;%xNOz>??$D8bG^;@;UV4$z`uQoX<3InE{5vc^r?-?VboV zpx3I0bFKL<;4Wzif9WXD2cY4l|J6j*uOJVr{@K;k^w)X=t}?u=odZW*00000NkvXX Hu0mjf9ZZr} diff --git a/public/images/items/zap_plate.png b/public/images/items/zap_plate.png index e582b41937fcc1ccd2e7638daa3e158804204cf6..a966fb76cd33116e10b5ef4c8aee7f65c750a37b 100644 GIT binary patch delta 191 zcmdnO^n!7MVZB6vPlzi!1A~Eq!Hfcf0}TcbR(Sk4knrP1#g7*qEE4;+GcYi4lmz(& zGyI2utEWPYfMQvmE{-7EC>fh0n+9>2Ny)|ErX}4pUXO@geCykXiwGv delta 268 zcmaFCxP@tgVLeN_qpu?a!^VE@KZ&di3=9$hJ|V6K1_lpSc>K6g@#96uj{^w@8VqI> z7yu>ta=y#}QXC~ge!>4CfZ<;A-bkPrXMsm#F;K-}5N14{zaj-FIMLI^F~q|E>?BXV z76TrZ$!e$n*Y^b8I+w)s$Rt>1!i%7g`XG+4t@gr)nD%d*E}+yWxFu6y!Xg{4OG+mg zYen}k6l5t_H*z~xif!PUbYNxU7B0PmoG~1yHYadu(`@D}YLQOM?7@8U7;yT^7f+K#4X_7sn8b z-m8ODy(bzsgqpKx~En=n E0Hp%h&V|w)Xx3JdwoapAuc=hks@KYG0 zL15wMV3Ot{%%MOCKq&)F0CJ)M2t)~hYChd>M;1~&=2V9e^M7T!c<&zJxumKP8bB*H z)!(WE%x*q10L2jc9doM#xYhY>-$Jhev|x;JD!~42=u>I}AZ=VtkcMgoAm*Z`0I|7- zXu1Wu(KCQWPt5?%Hx@5t0Or(6h#DZ<5g$KlCDau!RfuQ+0--^2KOySf@YG9bj~yIJYOtlm-e&ddawE!cRqKSFHyL|Av1@&xtl{+FK^kB?wG1M z&U1R+Ol6OMlG$*5ub1#Cwcz;z-=bzOtXPp?=B0C4=3nP#CZ5z_4{?#Ui-yTOfi2P- zIc2h9cV6)8ynblG?RWFIFE7e#-7~XXF8ueSm#?S)x+!yjhebf<@=P0`(-=Hm{an^L IB``Jt0E*ml&j0`b delta 273 zcmV+s0q*{o0-*ws8Gi-<0047(dh`GQ0O(0XK~z}7?Ulg^!!Qg*Gm5VnAuD8r9s&6^85KfUb2bltKjY5Jec0Iq zLJF3`O#n*5r|D}|fYR{CI3~}1uh$Fk5vjzva0*xrfdI6;C4b?!`Lexx7=nghmo*8V z6oLc58UWCDQ~)p>EkPgvuBijypO#bsx1g#A_!j)D0ENIwP@4h{!2uwULV(rBP?`h` zr#69*&I5Y+ykbl?0r+(T(sc-vAk>fL92^IzK8TJ~hxbX7aOuKo8ZPxm({PvT^!flb X5L531_;&jM015yANkvXXu0mjfLIrit From db850c79cd89f86413cbd0db998ee19905e51ecf Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Wed, 26 Mar 2025 19:12:54 -0700 Subject: [PATCH 29/48] [Refactor] Moveset arrays can no longer hold `null` values (#4919) * Pokemon movesets no longer allow `null` values * Clean up all the bangs caused by movesets allowing `null` * Pokemon movesets no longer allow `null` values * Clean up all the bangs caused by movesets allowing `null` * Fix merge issues * Remove various unnecessary `?` * Apply biome * Fix `global-trade-system-encounter.ts` * Fix merge issue * Remove unnecessary parentheses * Remove missed `?` * Match formatting of `pokemon.ts` --- src/battle-scene.ts | 1 + src/data/balance/pokemon-evolutions.ts | 30 ++--- src/data/battler-tags.ts | 12 +- src/data/berry.ts | 8 +- src/data/challenge.ts | 2 +- src/data/moves/move.ts | 121 ++++++++++++------ .../global-trade-system-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 13 +- .../mystery-encounter-requirements.ts | 12 +- src/data/pokemon-forms.ts | 2 +- src/field/pokemon.ts | 85 ++++-------- src/modifier/modifier-type.ts | 18 +-- src/phases/command-phase.ts | 28 ++-- src/phases/learn-move-phase.ts | 2 +- src/phases/party-heal-phase.ts | 2 +- src/phases/turn-start-phase.ts | 2 +- src/system/pokemon-data.ts | 2 +- src/ui/fight-ui-handler.ts | 2 +- src/ui/party-ui-handler.ts | 6 +- src/ui/summary-ui-handler.ts | 2 +- test/abilities/lightningrod.test.ts | 17 ++- test/abilities/neutralizing_gas.test.ts | 7 +- test/abilities/storm_drain.test.ts | 17 ++- test/moves/grudge.test.ts | 6 +- .../absolute-avarice-encounter.test.ts | 4 +- .../dancing-lessons-encounter.test.ts | 4 +- test/testUtils/gameManager.ts | 2 +- test/testUtils/gameManagerUtils.ts | 2 +- 28 files changed, 206 insertions(+), 205 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a6c986d3d0f..544dbc40350 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1371,6 +1371,7 @@ export default class BattleScene extends SceneBase { return Math.max(doubleChance.value, 1); } + // TODO: ...this never actually returns `null`, right? newBattle( waveIndex?: number, battleType?: BattleType, diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index c34bc229bd7..e49bd049cd6 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -179,7 +179,7 @@ class TimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { class MoveEvolutionCondition extends SpeciesEvolutionCondition { public move: Moves; constructor(move: Moves) { - super(p => p.moveset.filter(m => m?.moveId === move).length > 0); + super(p => p.moveset.filter(m => m.moveId === move).length > 0); this.move = move; const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); this.description = i18next.t("pokemonEvolutions:move", { move: i18next.t(`move:${moveKey}.name`) }); @@ -282,7 +282,7 @@ class TyrogueEvolutionCondition extends SpeciesEvolutionCondition { public move: Moves; constructor(move: Moves) { super(p => - p.getMoveset(true).find(m => m && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(m?.moveId))?.moveId === move); + p.getMoveset(true).find(m => m && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(m.moveId))?.moveId === move); this.move = move; const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); this.description = i18next.t("pokemonEvolutions:move", { move: i18next.t(`move:${moveKey}.name`) }); @@ -303,11 +303,11 @@ class MoveTimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { public timesOfDay: TimeOfDay[]; constructor(move: Moves, tod: "day" | "night") { if (tod === "day") { - super(p => p.moveset.filter(m => m?.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DAWN || globalScene.arena.getTimeOfDay() === TimeOfDay.DAY)); + super(p => p.moveset.filter(m => m.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DAWN || globalScene.arena.getTimeOfDay() === TimeOfDay.DAY)); this.move = move; this.timesOfDay = [ TimeOfDay.DAWN, TimeOfDay.DAY ]; } else if (tod === "night") { - super(p => p.moveset.filter(m => m?.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT)); + super(p => p.moveset.filter(m => m.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT)); this.move = move; this.timesOfDay = [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]; } else { @@ -332,7 +332,7 @@ class DunsparceEvolutionCondition extends SpeciesEvolutionCondition { constructor() { super(p => { let ret = false; - if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) { + if (p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0) { globalScene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); } return ret; @@ -1540,13 +1540,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.AIPOM]: [ - new SpeciesEvolution(Species.AMBIPOM, 32, null, new MoveEvolutionCondition(Moves.DOUBLE_HIT), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.AMBIPOM, 32, null, new MoveEvolutionCondition(Moves.DOUBLE_HIT), SpeciesWildEvolutionDelay.LONG) ], [Species.SUNKERN]: [ new SpeciesEvolution(Species.SUNFLORA, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.YANMA]: [ - new SpeciesEvolution(Species.YANMEGA, 33, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.YANMEGA, 33, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.LONG) ], [Species.MURKROW]: [ new SpeciesEvolution(Species.HONCHKROW, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1555,11 +1555,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MISMAGIUS, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GIRAFARIG]: [ - new SpeciesEvolution(Species.FARIGIRAF, 32, null, new MoveEvolutionCondition(Moves.TWIN_BEAM), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.FARIGIRAF, 32, null, new MoveEvolutionCondition(Moves.TWIN_BEAM), SpeciesWildEvolutionDelay.LONG) ], [Species.DUNSPARCE]: [ new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new DunsparceEvolutionCondition(), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "two-segment", 32, null, new MoveEvolutionCondition(Moves.HYPER_DRILL), SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "two-segment", 32, null, new MoveEvolutionCondition(Moves.HYPER_DRILL), SpeciesWildEvolutionDelay.LONG) ], [Species.GLIGAR]: [ new SpeciesEvolution(Species.GLISCOR, 1, EvolutionItem.RAZOR_FANG, new TimeOfDayEvolutionCondition("night") /* Razor fang at night*/, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1571,10 +1571,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.URSALUNA, 1, EvolutionItem.PEAT_BLOCK, null, SpeciesWildEvolutionDelay.VERY_LONG) //Ursaring does not evolve into Bloodmoon Ursaluna ], [Species.PILOSWINE]: [ - new SpeciesEvolution(Species.MAMOSWINE, 1, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAMOSWINE, 1, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.STANTLER]: [ - new SpeciesEvolution(Species.WYRDEER, 25, null, new MoveEvolutionCondition(Moves.PSYSHIELD_BASH), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.WYRDEER, 25, null, new MoveEvolutionCondition(Moves.PSYSHIELD_BASH), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LOMBRE]: [ new SpeciesEvolution(Species.LUDICOLO, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1592,7 +1592,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ROSERADE, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BONSLY]: [ - new SpeciesEvolution(Species.SUDOWOODO, 1, null, new MoveEvolutionCondition(Moves.MIMIC), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUDOWOODO, 1, null, new MoveEvolutionCondition(Moves.MIMIC), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new MoveTimeOfDayEvolutionCondition(Moves.MIMIC, "night"), SpeciesWildEvolutionDelay.MEDIUM), @@ -1651,10 +1651,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new TimeOfDayEvolutionCondition("night")) ], [Species.STEENEE]: [ - new SpeciesEvolution(Species.TSAREENA, 28, null, new MoveEvolutionCondition(Moves.STOMP), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TSAREENA, 28, null, new MoveEvolutionCondition(Moves.STOMP), SpeciesWildEvolutionDelay.LONG) ], [Species.POIPOLE]: [ - new SpeciesEvolution(Species.NAGANADEL, 1, null, new MoveEvolutionCondition(Moves.DRAGON_PULSE), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NAGANADEL, 1, null, new MoveEvolutionCondition(Moves.DRAGON_PULSE), SpeciesWildEvolutionDelay.LONG) ], [Species.ALOLA_SANDSHREW]: [ new SpeciesEvolution(Species.ALOLA_SANDSLASH, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1720,7 +1720,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.HISUI_ELECTRODE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_QWILFISH]: [ - new SpeciesEvolution(Species.OVERQWIL, 28, null, new MoveEvolutionCondition(Moves.BARB_BARRAGE), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.OVERQWIL, 28, null, new MoveEvolutionCondition(Moves.BARB_BARRAGE), SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_SNEASEL]: [ new SpeciesEvolution(Species.SNEASLER, 1, EvolutionItem.RAZOR_CLAW, new TimeOfDayEvolutionCondition("day") /* Razor claw at day*/, SpeciesWildEvolutionDelay.VERY_LONG) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 4952488b48e..c4004e9c582 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1174,13 +1174,13 @@ export class EncoreTag extends MoveRestrictionBattlerTag { const movePhase = globalScene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { - const movesetMove = pokemon.getMoveset().find(m => m!.moveId === this.moveId); // TODO: is this bang correct? + const movesetMove = pokemon.getMoveset().find(m => m.moveId === this.moveId); if (movesetMove) { const lastMove = pokemon.getLastXMoves(1)[0]; globalScene.tryReplacePhase( m => m instanceof MovePhase && m.pokemon === pokemon, - new MovePhase(pokemon, lastMove.targets!, movesetMove), - ); // TODO: is this bang correct? + new MovePhase(pokemon, lastMove.targets ?? [], movesetMove), + ); } } } @@ -1191,7 +1191,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { */ override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - const encoredMove = pokemon.getMoveset().find(m => m?.moveId === this.moveId); + const encoredMove = pokemon.getMoveset().find(m => m.moveId === this.moveId); if (encoredMove && encoredMove?.getPpRatio() > 0) { return true; } @@ -3184,7 +3184,7 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { public override isMoveRestricted(move: Moves, _user: Pokemon): boolean { const source = this.getSourcePokemon(); if (source) { - const sourceMoveset = source.getMoveset().map(m => m!.moveId); + const sourceMoveset = source.getMoveset().map(m => m.moveId); return sourceMoveset?.includes(move) && source.isActive(true); } return false; @@ -3354,7 +3354,7 @@ export class GrudgeTag extends BattlerTag { if (lapseType === BattlerTagLapseType.CUSTOM && sourcePokemon) { if (sourcePokemon.isActive() && pokemon.isOpponent(sourcePokemon)) { const lastMove = pokemon.turnData.attacksReceived[0]; - const lastMoveData = sourcePokemon.getMoveset().find(m => m?.moveId === lastMove.move); + const lastMoveData = sourcePokemon.getMoveset().find(m => m.moveId === lastMove.move); if (lastMoveData && lastMove.move !== Moves.STRUGGLE) { lastMoveData.ppUsed = lastMoveData.getMovePp(); globalScene.queueMessage( diff --git a/src/data/berry.ts b/src/data/berry.ts index ed8ae8d2b62..13820b1277b 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -65,7 +65,7 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate { return (pokemon: Pokemon) => { const threshold = new Utils.NumberHolder(0.25); applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); - return !!pokemon.getMoveset().find(m => !m?.getPpRatio()); + return !!pokemon.getMoveset().find(m => !m.getPpRatio()); }; } } @@ -147,9 +147,9 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) - ? pokemon.getMoveset().find(m => !m?.getPpRatio()) - : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? + const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) + ? pokemon.getMoveset().find(m => !m.getPpRatio()) + : pokemon.getMoveset().find(m => m.getPpRatio() < 1); if (ppRestoreMove !== undefined) { ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); globalScene.queueMessage( diff --git a/src/data/challenge.ts b/src/data/challenge.ts index a54f72aa7cc..1387732a773 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -450,7 +450,7 @@ export class SingleGenerationChallenge extends Challenge { applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { const baseGeneration = getPokemonSpecies(pokemon.species.speciesId).generation; - const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? + const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; if ( pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value)) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 1555967789c..07d621f6f2c 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -1881,14 +1881,14 @@ export class HealAttr extends MoveEffectAttr { */ export class PartyStatusCureAttr extends MoveEffectAttr { /** Message to display after using move */ - private message: string; + private message: string | null; /** Skips mons with this ability, ie. Soundproof */ private abilityCondition: Abilities; constructor(message: string | null, abilityCondition: Abilities) { super(); - this.message = message!; // TODO: is this bang correct? + this.message = message; this.abilityCondition = abilityCondition; } @@ -2103,10 +2103,10 @@ export class BoostHealAttr extends HealAttr { /** The lambda expression to check against when boosting the healing value */ private condition?: MoveConditionFunc; - constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) { + constructor(normalHealRatio: number = 0.5, boostedHealRatio: number = 2 / 3, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) { super(normalHealRatio, showAnim, selfTarget); - this.normalHealRatio = normalHealRatio!; // TODO: is this bang correct? - this.boostedHealRatio = boostedHealRatio!; // TODO: is this bang correct? + this.normalHealRatio = normalHealRatio; + this.boostedHealRatio = boostedHealRatio; this.condition = condition; } @@ -3374,14 +3374,14 @@ export class SecretPowerAttr extends MoveEffectAttr { export class PostVictoryStatStageChangeAttr extends MoveAttr { private stats: BattleStat[]; private stages: number; - private condition: MoveConditionFunc | null; + private condition?: MoveConditionFunc; private showMessage: boolean; constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false) { super(); this.stats = stats; this.stages = stages; - this.condition = condition!; // TODO: is this bang correct? + this.condition = condition; this.showMessage = showMessage; } applyPostVictory(user: Pokemon, target: Pokemon, move: Move): void { @@ -3653,7 +3653,7 @@ export class LessPPMorePowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const ppMax = move.pp; - const ppUsed = user.moveset.find((m) => m?.moveId === move.id)?.ppUsed!; // TODO: is the bang correct? + const ppUsed = user.moveset.find((m) => m.moveId === move.id)?.ppUsed ?? 0; let ppRemains = ppMax - ppUsed; /** Reduce to 0 to avoid negative numbers if user has 1PP before attack and target has Ability.PRESSURE */ @@ -3779,7 +3779,13 @@ export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultipl let count = 0; let turnMove: TurnMove | undefined; - while (((turnMove = moveHistory.shift())?.move === move.id || (comboMoves.length && comboMoves.includes(turnMove?.move!))) && (!resetOnFail || turnMove?.result === MoveResult.SUCCESS)) { // TODO: is this bang correct? + while ( + ( + (turnMove = moveHistory.shift())?.move === move.id + || (comboMoves.length && comboMoves.includes(turnMove?.move ?? Moves.NONE)) + ) + && (!resetOnFail || turnMove?.result === MoveResult.SUCCESS) + ) { if (count < (limit - 1)) { count++; } else if (resetOnLimit) { @@ -4365,8 +4371,8 @@ export class LastMoveDoublePowerAttr extends VariablePowerAttr { for (const p of pokemonActed) { const [ lastMove ] = p.getLastXMoves(1); - if (lastMove?.result !== MoveResult.FAIL) { - if ((lastMove?.result === MoveResult.SUCCESS) && (lastMove?.move === this.move)) { + if (lastMove.result !== MoveResult.FAIL) { + if ((lastMove.result === MoveResult.SUCCESS) && (lastMove.move === this.move)) { power.value *= 2; return true; } else { @@ -5461,7 +5467,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { : null; } - getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number | void { + getTagTargetBenefitScore(): number { switch (this.tagType) { case BattlerTagType.RECHARGING: case BattlerTagType.PERISH_SONG: @@ -5506,6 +5512,9 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.CRIT_BOOST: case BattlerTagType.ALWAYS_CRIT: return 5; + default: + console.warn(`BattlerTag ${BattlerTagType[this.tagType]} is missing a score!`); + return 0; } } @@ -5514,7 +5523,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { if (moveChance < 0) { moveChance = 100; } - return Math.floor(this.getTagTargetBenefitScore(user, target, move)! * (moveChance / 100)); // TODO: is the bang correct? + return Math.floor(this.getTagTargetBenefitScore() * (moveChance / 100)); } } @@ -5769,7 +5778,7 @@ export class ProtectAttr extends AddBattlerTagAttr { while (moveHistory.length) { turnMove = moveHistory.shift(); - if (!allMoves[turnMove?.move!].hasAttr(ProtectAttr) || turnMove?.result !== MoveResult.SUCCESS) { // TODO: is the bang correct? + if (!allMoves[turnMove?.move ?? Moves.NONE].hasAttr(ProtectAttr) || turnMove?.result !== MoveResult.SUCCESS) { break; } timesUsed++; @@ -6688,7 +6697,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { return false; } - const firstMoveType = target.getMoveset()[0]?.getMove().type!; // TODO: is this bang correct? + const firstMoveType = target.getMoveset()[0].getMove().type; user.summonData.types = [ firstMoveType ]; globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${PokemonType[firstMoveType]}`) })); @@ -7005,7 +7014,7 @@ export class RepeatMoveAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // get the last move used (excluding status based failures) as well as the corresponding moveset slot const lastMove = target.getLastXMoves(-1).find(m => m.move !== Moves.NONE)!; - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move)!; + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move)!; // If the last move used can hit more than one target or has variable targets, // re-compute the targets for the attack // (mainly for alternating double/single battle shenanigans) @@ -7039,7 +7048,7 @@ export class RepeatMoveAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { const lastMove = target.getLastXMoves(-1).find(m => m.move !== Moves.NONE); - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove?.move); + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove?.move); const uninstructableMoves = [ // Locking/Continually Executed moves Moves.OUTRAGE, @@ -7134,19 +7143,19 @@ export class ReducePpMoveAttr extends MoveEffectAttr { * * @param user {@linkcode Pokemon} that used the attack * @param target {@linkcode Pokemon} targeted by the attack - * @param move {@linkcode Move} being used + * @param move N/A * @param args N/A - * @returns {boolean} true + * @returns `true` */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // Null checks can be skipped due to condition function - const lastMove = target.getLastXMoves().find(() => true); - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove?.move); - const lastPpUsed = movesetMove?.ppUsed!; // TODO: is the bang correct? - movesetMove!.ppUsed = Math.min((movesetMove?.ppUsed!) + this.reduction, movesetMove?.getMovePp()!); // TODO: is the bang correct? + const lastMove = target.getLastXMoves()[0]; + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move)!; + const lastPpUsed = movesetMove.ppUsed; + movesetMove.ppUsed = Math.min((lastPpUsed) + this.reduction, movesetMove.getMovePp()); - const message = i18next.t("battle:ppReduced", { targetName: getPokemonNameWithAffix(target), moveName: movesetMove?.getName(), reduction: (movesetMove?.ppUsed!) - lastPpUsed }); // TODO: is the bang correct? - globalScene.eventTarget.dispatchEvent(new MoveUsedEvent(target?.id, movesetMove?.getMove()!, movesetMove?.ppUsed!)); // TODO: are these bangs correct? + const message = i18next.t("battle:ppReduced", { targetName: getPokemonNameWithAffix(target), moveName: movesetMove.getName(), reduction: (movesetMove.ppUsed) - lastPpUsed }); + globalScene.eventTarget.dispatchEvent(new MoveUsedEvent(target.id, movesetMove.getMove(), movesetMove.ppUsed)); globalScene.queueMessage(message); return true; @@ -7154,9 +7163,9 @@ export class ReducePpMoveAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { - const lastMove = target.getLastXMoves().find(() => true); + const lastMove = target.getLastXMoves()[0]; if (lastMove) { - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); return !!movesetMove?.getPpRatio(); } return false; @@ -7164,9 +7173,9 @@ export class ReducePpMoveAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - const lastMove = target.getLastXMoves().find(() => true); + const lastMove = target.getLastXMoves()[0]; if (lastMove) { - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); if (movesetMove) { const maxPp = movesetMove.getMovePp(); const ppLeft = maxPp - movesetMove.ppUsed; @@ -7203,7 +7212,7 @@ export class AttackReducePpMoveAttr extends ReducePpMoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const lastMove = target.getLastXMoves().find(() => true); if (lastMove) { - const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move); + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); if (Boolean(movesetMove?.getPpRatio())) { super.apply(user, target, move, args); } @@ -7249,7 +7258,7 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { const copiedMove = allMoves[targetMoves[0].move]; - const thisMoveIndex = user.getMoveset().findIndex(m => m?.moveId === move.id); + const thisMoveIndex = user.getMoveset().findIndex(m => m.moveId === move.id); if (thisMoveIndex === -1) { return false; @@ -7301,7 +7310,7 @@ export class SketchAttr extends MoveEffectAttr { } const sketchedMove = allMoves[targetMove.move]; - const sketchIndex = user.getMoveset().findIndex(m => m?.moveId === move.id); + const sketchIndex = user.getMoveset().findIndex(m => m.moveId === move.id); if (sketchIndex === -1) { return false; } @@ -7340,7 +7349,7 @@ export class SketchAttr extends MoveEffectAttr { return false; } - if (user.getMoveset().find(m => m?.moveId === targetMove.move)) { + if (user.getMoveset().find(m => m.moveId === targetMove.move)) { return false; } @@ -7790,7 +7799,7 @@ export class LastResortAttr extends MoveAttr { getCondition(): MoveConditionFunc { return (user: Pokemon, target: Pokemon, move: Move) => { const uniqueUsedMoveIds = new Set(); - const movesetMoveIds = user.getMoveset().map(m => m?.moveId); + const movesetMoveIds = user.getMoveset().map(m => m.moveId); user.getMoveHistory().map(m => { if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move)) { uniqueUsedMoveIds.add(m.move); @@ -9186,7 +9195,17 @@ export function initMoves() { .attr(FlinchAttr), new AttackMove(Moves.WEATHER_BALL, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) .attr(WeatherBallTypeAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 2 : 1) // TODO: is this bang correct? + .attr(MovePowerMultiplierAttr, (user, target, move) => { + const weather = globalScene.arena.weather; + if (!weather) { + return 1; + } + const weatherTypes = [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN ]; + if (weatherTypes.includes(weather.weatherType) && !weather.isEffectSuppressed()) { + return 2; + } + return 1; + }) .ballBombMove(), new StatusMove(Moves.AROMATHERAPY, PokemonType.GRASS, -1, 5, -1, 0, 3) .attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER) @@ -9426,7 +9445,13 @@ export function initMoves() { .attr(AbilityChangeAttr, Abilities.INSOMNIA) .reflectable(), new AttackMove(Moves.SUCKER_PUNCH, PokemonType.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) - .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? + .condition((user, target, move) => { + const turnCommand = globalScene.currentBattle.turnCommands[target.getBattlerIndex()]; + if (!turnCommand || !turnCommand.move) { + return false; + } + return (turnCommand.command === Command.FIGHT && !target.turnData.acted && allMoves[turnCommand.move.move].category !== MoveCategory.STATUS); + }), new StatusMove(Moves.TOXIC_SPIKES, PokemonType.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) .target(MoveTarget.ENEMY_SIDE) @@ -10321,8 +10346,12 @@ export function initMoves() { .ignoresSubstitute(), new AttackMove(Moves.SMART_STRIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), new StatusMove(Moves.PURIFY, PokemonType.POISON, -1, 20, -1, 0, 7) - .condition( - (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? + .condition((user, target, move) => { + if (!target.status) { + return false; + } + return isNonVolatileStatusEffect(target.status.effect); + }) .attr(HealAttr, 0.5) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .triageMove() @@ -11041,7 +11070,13 @@ export function initMoves() { .slicingMove(), new AttackMove(Moves.HYDRO_STEAM, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) .attr(IgnoreWeatherTypeDebuffAttr, WeatherType.SUNNY) - .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 1.5 : 1), // TODO: is this bang correct? + .attr(MovePowerMultiplierAttr, (user, target, move) => { + const weather = globalScene.arena.weather; + if (!weather) { + return 1; + } + return [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(weather.weatherType) && !weather.isEffectSuppressed() ? 1.5 : 1; + }), new AttackMove(Moves.RUINATION, PokemonType.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) .attr(TargetHalfHpDamageAttr), new AttackMove(Moves.COLLISION_COURSE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) @@ -11156,7 +11191,13 @@ export function initMoves() { .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK) .condition(failIfLastCondition), new AttackMove(Moves.THUNDERCLAP, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) - .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? + .condition((user, target, move) => { + const turnCommand = globalScene.currentBattle.turnCommands[target.getBattlerIndex()]; + if (!turnCommand || !turnCommand.move) { + return false; + } + return (turnCommand.command === Command.FIGHT && !target.turnData.acted && allMoves[turnCommand.move.move].category !== MoveCategory.STATUS); + }), new AttackMove(Moves.MIGHTY_CLEAVE, PokemonType.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) .slicingMove() .ignoresProtect(), diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index a81392941ba..2b7cd823af2 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -306,7 +306,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil if (eggMoves) { // Cannot gen the rare egg move, only 1 of the first 3 common moves const eggMove = eggMoves[randSeedInt(3)]; - if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) { + if (!tradePokemon.moveset.some(m => m.moveId === eggMove)) { if (tradePokemon.moveset.length < 4) { tradePokemon.moveset.push(new PokemonMove(eggMove)); } else { diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 758e3fabd76..5d3f834ed75 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -781,7 +781,7 @@ async function addEggMoveToNewPokemonMoveset( let randomEggMoveIndex = eggMoveIndices.pop(); let randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null; let retries = 0; - while (retries < 3 && (!randomEggMove || newPokemon.moveset.some(m => m?.moveId === randomEggMove))) { + while (retries < 3 && (!randomEggMove || newPokemon.moveset.some(m => m.moveId === randomEggMove))) { // If Pokemon already knows this move, roll for another egg move randomEggMoveIndex = eggMoveIndices.pop(); randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null; @@ -789,7 +789,7 @@ async function addEggMoveToNewPokemonMoveset( } if (randomEggMove) { - if (!newPokemon.moveset.some(m => m?.moveId === randomEggMove)) { + if (!newPokemon.moveset.some(m => m.moveId === randomEggMove)) { if (newPokemon.moveset.length < 4) { newPokemon.moveset.push(new PokemonMove(randomEggMove)); } else { @@ -820,16 +820,13 @@ async function addEggMoveToNewPokemonMoveset( */ function addFavoredMoveToNewPokemonMoveset( newPokemon: PlayerPokemon, - newPokemonGeneratedMoveset: (PokemonMove | null)[], + newPokemonGeneratedMoveset: PokemonMove[], newEggMoveIndex: number | null, ) { let favoredMove: PokemonMove | null = null; for (const move of newPokemonGeneratedMoveset) { // Needs to match first type, second type will be replaced - if ( - move?.getMove().type === newPokemon.getTypes()[0] && - !newPokemon.moveset.some(m => m?.moveId === move?.moveId) - ) { + if (move?.getMove().type === newPokemon.getTypes()[0] && !newPokemon.moveset.some(m => m.moveId === move.moveId)) { favoredMove = move; break; } @@ -839,7 +836,7 @@ function addFavoredMoveToNewPokemonMoveset( if (!favoredMove) { for (const move of newPokemonGeneratedMoveset) { // Needs to match first type, second type will be replaced - if (!newPokemon.moveset.some(m => m?.moveId === move?.moveId)) { + if (!newPokemon.moveset.some(m => m.moveId === move.moveId)) { favoredMove = move; break; } diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index e9398547740..f9aedf2c1a7 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -576,19 +576,19 @@ export class MoveRequirement extends EncounterPokemonRequirement { return partyPokemon.filter( pokemon => (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && - pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + pokemon.moveset.some(move => move.moveId && this.requiredMoves.includes(move.moveId)), ); } // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves return partyPokemon.filter( pokemon => (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && - !pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + !pokemon.moveset.some(move => move.moveId && this.requiredMoves.includes(move.moveId)), ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const includedMoves = pokemon?.moveset.filter(move => move?.moveId && this.requiredMoves.includes(move.moveId)); + const includedMoves = pokemon?.moveset.filter(move => move.moveId && this.requiredMoves.includes(move.moveId)); if (includedMoves && includedMoves.length > 0 && includedMoves[0]) { return ["move", includedMoves[0].getName()]; } @@ -626,7 +626,7 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { return partyPokemon.filter( pokemon => this.requiredMoves.filter(learnableMove => - pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove), ).length > 0, ); } @@ -634,14 +634,14 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { return partyPokemon.filter( pokemon => this.requiredMoves.filter(learnableMove => - pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove), ).length === 0, ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { const includedCompatMoves = this.requiredMoves.filter(reqMove => - pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove), + pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove), ); if (includedCompatMoves.length > 0) { return ["compatibleMove", Moves[includedCompatMoves[0]]]; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 4636e68d6d6..63e166c7fc4 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -363,7 +363,7 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge } canChange(pokemon: Pokemon): boolean { - return !!pokemon.moveset.filter(m => m?.moveId === this.move).length === this.known; + return !!pokemon.moveset.filter(m => m.moveId === this.move).length === this.known; } } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 43bab0f049d..a7532685bea 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -296,7 +296,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public stats: number[]; public ivs: number[]; public nature: Nature; - public moveset: (PokemonMove | null)[]; + public moveset: PokemonMove[]; public status: Status | null; public friendship: number; public metLevel: number; @@ -694,7 +694,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { loadAssets(ignoreOverride = true): Promise { return new Promise(resolve => { - const moveIds = this.getMoveset().map(m => m!.getMove().id); // TODO: is this bang correct? + const moveIds = this.getMoveset().map(m => m.getMove().id); Promise.allSettled(moveIds.map(m => initMoveAnim(m))).then(() => { loadMoveAnimAssets(moveIds); this.getSpeciesForm().loadAssets( @@ -1751,7 +1751,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract isBoss(): boolean; - getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { + getMoveset(ignoreOverride?: boolean): PokemonMove[] { const ret = !ignoreOverride && this.summonData?.moveset ? this.summonData.moveset @@ -1826,9 +1826,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { .filter(m => !levelMoves.includes(m)) .concat(levelMoves); } - levelMoves = levelMoves.filter( - lm => !this.moveset.some(m => m?.moveId === lm), - ); + levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m.moveId === lm)); return levelMoves; } @@ -2942,7 +2940,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } setMove(moveIndex: number, moveId: Moves): void { - const move = moveId ? new PokemonMove(moveId) : null; + if (moveId === Moves.NONE) { + return; + } + const move = new PokemonMove(moveId); this.moveset[moveIndex] = move; if (this.summonData?.moveset) { this.summonData.moveset[moveIndex] = move; @@ -3487,14 +3488,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 movePool = baseWeights - .filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)) + .filter(m => !this.moveset.some(mo => m[0] === mo.moveId)) .map(m => { let ret: number; if ( this.moveset.some( mo => - mo?.getMove().category !== MoveCategory.STATUS && - mo?.getMove().type === allMoves[m[0]].type, + mo.getMove().category !== MoveCategory.STATUS && + mo.getMove().type === allMoves[m[0]].type, ) ) { ret = Math.ceil(Math.sqrt(m[1])); @@ -3504,7 +3505,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Math.max( Math.pow( 4, - this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1) + this.moveset.filter(mo => (mo.getMove().power ?? 0) > 1) .length, ) / 8, 0.5, @@ -3518,9 +3519,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } else { // Non-trainer pokemon just use normal weights - movePool = baseWeights.filter( - m => !this.moveset.some(mo => m[0] === mo?.moveId), - ); + movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo.moveId)); } const totalWeight = movePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -6852,18 +6851,7 @@ export class PlayerPokemon extends Pokemon { copyMoveset(): PokemonMove[] { const newMoveset: PokemonMove[] = []; this.moveset.forEach(move => { - // TODO: refactor `moveset` to not accept `null`s - if (move) { - newMoveset.push( - new PokemonMove( - move.moveId, - 0, - move.ppUp, - move.virtual, - move.maxPpOverride, - ), - ); - } + newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual, move.maxPpOverride)); }); return newMoveset; @@ -7050,17 +7038,8 @@ export class EnemyPokemon extends Pokemon { if (moveQueue.length !== 0) { const queuedMove = moveQueue[0]; if (queuedMove) { - const moveIndex = this.getMoveset().findIndex( - m => m?.moveId === queuedMove.move, - ); - if ( - (moveIndex > -1 && - this.getMoveset()[moveIndex]!.isUsable( - this, - queuedMove.ignorePP, - )) || - queuedMove.virtual - ) { + const moveIndex = this.getMoveset().findIndex(m => m.moveId === queuedMove.move); + if ((moveIndex > -1 && this.getMoveset()[moveIndex].isUsable(this, queuedMove.ignorePP)) || queuedMove.virtual) { return queuedMove; } else { this.getMoveQueue().shift(); @@ -7070,20 +7049,17 @@ export class EnemyPokemon extends Pokemon { } // Filter out any moves this Pokemon cannot use - let movePool = this.getMoveset().filter(m => m?.isUsable(this)); + let movePool = this.getMoveset().filter(m => m.isUsable(this)); // If no moves are left, use Struggle. Otherwise, continue with move selection if (movePool.length) { // If there's only 1 move in the move pool, use it. if (movePool.length === 1) { - return { - move: movePool[0]!.moveId, - targets: this.getNextTargets(movePool[0]!.moveId), - }; // TODO: are the bangs correct? + return { move: movePool[0].moveId, targets: this.getNextTargets(movePool[0].moveId) }; } // If a move is forced because of Encore, use it. const encoreTag = this.getTag(EncoreTag) as EncoreTag; if (encoreTag) { - const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId); + const encoreMove = movePool.find(m => m.moveId === encoreTag.moveId); if (encoreMove) { return { move: encoreMove.moveId, @@ -7093,8 +7069,7 @@ export class EnemyPokemon extends Pokemon { } switch (this.aiType) { case AiType.RANDOM: // No enemy should spawn with this AI type in-game - const moveId = - movePool[globalScene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? + const moveId = movePool[globalScene.randBattleSeedInt(movePool.length)].moveId; return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: @@ -7156,11 +7131,9 @@ export class EnemyPokemon extends Pokemon { * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. */ const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries( - movePool.map(m => [m!.moveId, this.getNextTargets(m!.moveId)]), - ); // TODO: are those bangs correct? + const moveTargets = Object.fromEntries(movePool.map(m => [ m.moveId, this.getNextTargets(m.moveId) ])); for (const m in movePool) { - const pokemonMove = movePool[m]!; // TODO: is the bang correct? + const pokemonMove = movePool[m]; const move = pokemonMove.getMove(); let moveScore = moveScores[m]; @@ -7269,16 +7242,8 @@ export class EnemyPokemon extends Pokemon { r++; } } - console.log( - movePool.map(m => m!.getName()), - moveScores, - r, - sortedMovePool.map(m => m!.getName()), - ); // TODO: are those bangs correct? - return { - move: sortedMovePool[r]!.moveId, - targets: moveTargets[sortedMovePool[r]!.moveId], - }; + console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName())); + return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; } } @@ -7637,7 +7602,7 @@ export class PokemonSummonData { public gender: Gender; public fusionGender: Gender; public stats: number[] = [0, 0, 0, 0, 0, 0]; - public moveset: (PokemonMove | null)[]; + public moveset: PokemonMove[]; // If not initialized this value will not be populated from save data. public types: PokemonType[] = []; public addedType: PokemonType | null = null; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 3d2e67b0dc3..e8470853388 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -627,7 +627,7 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { iconImage, (_type, args) => new PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), (pokemon: PlayerPokemon) => { - if (!pokemon.getMoveset().filter(m => m?.ppUsed).length) { + if (!pokemon.getMoveset().filter(m => m.ppUsed).length) { return PartyUiHandler.NoEffectMessage; } return null; @@ -1170,7 +1170,7 @@ export class TmModifierType extends PokemonModifierType { (pokemon: PlayerPokemon) => { if ( pokemon.compatibleTms.indexOf(moveId) === -1 || - pokemon.getMoveset().filter(m => m?.moveId === moveId).length + pokemon.getMoveset().filter(m => m.moveId === moveId).length ) { return PartyUiHandler.NoEffectMessage; } @@ -1333,7 +1333,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { const attackMoveTypes = party.flatMap(p => p .getMoveset() - .map(m => m?.getMove()) + .map(m => m.getMove()) .filter(m => m instanceof AttackMove) .map(m => m.type), ); @@ -1468,7 +1468,7 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { const speciesId = p.getSpeciesForm(true).speciesId; const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null; // TODO: Use commented boolean when Fling is implemented - const hasFling = false; /* p.getMoveset(true).some(m => m?.moveId === Moves.FLING) */ + const hasFling = false; /* p.getMoveset(true).some(m => m.moveId === Moves.FLING) */ for (const i in values) { const checkedSpecies = values[i].species; @@ -1529,7 +1529,7 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { const partyMemberCompatibleTms = party.map(p => { const previousLevelMoves = p.getLearnableLevelMoves(); return (p as PlayerPokemon).compatibleTms.filter( - tm => !p.moveset.find(m => m?.moveId === tm) && !previousLevelMoves.find(lm => lm === tm), + tm => !p.moveset.find(m => m.moveId === tm) && !previousLevelMoves.find(lm => lm === tm), ); }); const tierUniqueCompatibleTms = partyMemberCompatibleTms @@ -2433,7 +2433,7 @@ const modifierPool: ModifierPool = { !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && p .getMoveset() - .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .filter(m => m.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) .length, ).length, 3, @@ -2452,7 +2452,7 @@ const modifierPool: ModifierPool = { !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && p .getMoveset() - .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .filter(m => m.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) .length, ).length, 3, @@ -2574,7 +2574,7 @@ const modifierPool: ModifierPool = { !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && p .getMoveset() - .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .filter(m => m.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) .length, ).length, 3, @@ -2593,7 +2593,7 @@ const modifierPool: ModifierPool = { !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && p .getMoveset() - .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .filter(m => m.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) .length, ).length, 3, diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 055d52e7a8b..8691ac453ca 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -104,15 +104,14 @@ export class CommandPhase extends FieldPhase { moveQueue[0] && moveQueue[0].move && !moveQueue[0].virtual && - (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) || + (!playerPokemon.getMoveset().find(m => m.moveId === moveQueue[0].move) || !playerPokemon .getMoveset() - [playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable( + [playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable( playerPokemon, moveQueue[0].ignorePP, )) ) { - // TODO: is the bang correct? moveQueue.shift(); } @@ -121,12 +120,11 @@ export class CommandPhase extends FieldPhase { if (!queuedMove.move) { this.handleCommand(Command.FIGHT, -1); } else { - const moveIndex = playerPokemon.getMoveset().findIndex(m => m?.moveId === queuedMove.move); + const moveIndex = playerPokemon.getMoveset().findIndex(m => m.moveId === queuedMove.move); if ( - (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) || + (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex].isUsable(playerPokemon, queuedMove.ignorePP)) || queuedMove.virtual ) { - // TODO: is the bang correct? this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, queuedMove); } else { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); @@ -157,7 +155,7 @@ export class CommandPhase extends FieldPhase { if ( cursor === -1 || playerPokemon.trySelectMove(cursor, args[0] as boolean) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length) + (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length) ) { let moveId: Moves; if (useStruggle) { @@ -165,7 +163,7 @@ export class CommandPhase extends FieldPhase { } else if (turnMove !== undefined) { moveId = turnMove.move; } else if (cursor > -1) { - moveId = playerPokemon.getMoveset()[cursor]!.moveId; + moveId = playerPokemon.getMoveset()[cursor].moveId; } else { moveId = Moves.NONE; } @@ -195,10 +193,14 @@ export class CommandPhase extends FieldPhase { if (moveTargets.targets.length > 1 && moveTargets.multiple) { globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } - if (moveTargets.targets.length <= 1 || moveTargets.multiple) { - turnCommand.move!.targets = moveTargets.targets; //TODO: is the bang correct here? - } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { - turnCommand.move!.targets = playerPokemon.getMoveQueue()[0].targets; //TODO: is the bang correct here? + if (turnCommand.move && (moveTargets.targets.length <= 1 || moveTargets.multiple)) { + turnCommand.move.targets = moveTargets.targets; + } else if ( + turnCommand.move && + playerPokemon.getTag(BattlerTagType.CHARGING) && + playerPokemon.getMoveQueue().length >= 1 + ) { + turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; } else { globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } @@ -206,7 +208,7 @@ export class CommandPhase extends FieldPhase { globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; success = true; } else if (cursor < playerPokemon.getMoveset().length) { - const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct? + const move = playerPokemon.getMoveset()[cursor]; globalScene.ui.setMode(Mode.MESSAGE); // Decides between a Disabled, Not Implemented, or No PP translation message diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index 7bed71b3363..4107a9cf087 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -49,7 +49,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { const currentMoveset = pokemon.getMoveset(); // The game first checks if the Pokemon already has the move and ends the phase if it does. - const hasMoveAlready = currentMoveset.some(m => m?.moveId === move.id) && this.moveId !== Moves.SKETCH; + const hasMoveAlready = currentMoveset.some(m => m.moveId === move.id) && this.moveId !== Moves.SKETCH; if (hasMoveAlready) { return this.end(); } diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index d95400a3f48..a9b24309e24 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -23,7 +23,7 @@ export class PartyHealPhase extends BattlePhase { pokemon.hp = pokemon.getMaxHp(); pokemon.resetStatus(); for (const move of pokemon.moveset) { - move!.ppUsed = 0; // TODO: is this bang correct? + move.ppUsed = 0; } pokemon.updateInfo(true); } diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 6065a0caf6e..34dd7df3e89 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -178,7 +178,7 @@ export class TurnStartPhase extends FieldPhase { continue; } const move = - pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || + pokemon.getMoveset().find(m => m.moveId === queuedMove.move && m.ppUsed < m.getMovePp()) || new PokemonMove(queuedMove.move); if (move.getMove().hasAttr(MoveHeaderAttr)) { globalScene.unshiftPhase(new MoveHeaderPhase(pokemon, move)); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 76f5526e407..3fa07e8b085 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -35,7 +35,7 @@ export default class PokemonData { public stats: number[]; public ivs: number[]; public nature: Nature; - public moveset: (PokemonMove | null)[]; + public moveset: PokemonMove[]; public status: Status | null; public friendship: number; public metLevel: number; diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index a4f02e13303..9f76e85f228 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -243,7 +243,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { const hasMove = cursor < moveset.length; if (hasMove) { - const pokemonMove = moveset[cursor]!; // TODO: is the bang correct? + const pokemonMove = moveset[cursor]; const moveType = pokemon.getMoveType(pokemonMove.getMove()); const textureKey = Utils.getLocalizedSpriteKey("types"); this.typeIcon.setTexture(textureKey, PokemonType[moveType].toLowerCase()).setScale(0.8); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 6a9b565989d..3c04692ea31 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -478,7 +478,7 @@ export default class PartyUiHandler extends MessageUiHandler { filterResult = this.FilterChallengeLegal(pokemon); } if (filterResult === null && this.partyUiMode === PartyUiMode.MOVE_MODIFIER) { - filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]!); // TODO: is this bang correct? + filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]); } } else { filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)( @@ -1182,7 +1182,7 @@ export default class PartyUiHandler extends MessageUiHandler { case PartyOption.MOVE_2: case PartyOption.MOVE_3: case PartyOption.MOVE_4: - const move = pokemon.moveset[option - PartyOption.MOVE_1]!; // TODO: is the bang correct? + const move = pokemon.moveset[option - PartyOption.MOVE_1]; if (this.showMovePp) { const maxPP = move.getMovePp(); const currPP = maxPP - move.ppUsed; @@ -1647,7 +1647,7 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotHpText.setVisible(false); let slotTmText: string; - if (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0) { + if (this.pokemon.getMoveset().filter(m => m.moveId === tmMoveId).length > 0) { slotTmText = i18next.t("partyUiHandler:learned"); } else if (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1) { slotTmText = i18next.t("partyUiHandler:notAble"); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index d42572cfef4..9b209ded57a 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -1208,7 +1208,7 @@ export default class SummaryUiHandler extends UiHandler { } if (this.moveCursor < 4 && this.pokemon && this.moveCursor < this.pokemon.moveset.length) { - return this.pokemon.moveset[this.moveCursor]!.getMove(); // TODO: is this bang correct? + return this.pokemon.moveset[this.moveCursor].getMove(); } if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { return this.newMove; diff --git a/test/abilities/lightningrod.test.ts b/test/abilities/lightningrod.test.ts index 1ca6c6b1e89..986899353ff 100644 --- a/test/abilities/lightningrod.test.ts +++ b/test/abilities/lightningrod.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Lightningrod", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.SHOCK_WAVE ]) + .moveset([Moves.SPLASH, Moves.SHOCK_WAVE]) .ability(Abilities.BALL_FETCH) .battleType("double") .disableCrits() @@ -34,7 +34,7 @@ describe("Abilities - Lightningrod", () => { }); it("should redirect electric type moves", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -49,8 +49,8 @@ describe("Abilities - Lightningrod", () => { }); it("should not redirect non-electric type moves", async () => { - game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + game.override.moveset([Moves.SPLASH, Moves.AERIAL_ACE]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -65,7 +65,7 @@ describe("Abilities - Lightningrod", () => { }); it("should boost the user's spatk without damaging", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy2 = game.scene.getEnemyField()[1]; @@ -81,7 +81,7 @@ describe("Abilities - Lightningrod", () => { it("should not redirect moves changed from electric type via ability", async () => { game.override.ability(Abilities.NORMALIZE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -96,9 +96,8 @@ describe("Abilities - Lightningrod", () => { }); it("should redirect moves changed to electric type via ability", async () => { - game.override.ability(Abilities.GALVANIZE) - .moveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + game.override.ability(Abilities.GALVANIZE).moveset(Moves.TACKLE); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index 0003ee56598..aa5a48d5e4e 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -176,11 +176,8 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should not activate abilities of pokemon no longer on the field", async () => { - game.override - .battleType("single") - .ability(Abilities.NEUTRALIZING_GAS) - .enemyAbility(Abilities.DELTA_STREAM); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.battleType("single").ability(Abilities.NEUTRALIZING_GAS).enemyAbility(Abilities.DELTA_STREAM); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; const weatherChangeAttr = enemy.getAbilityAttrs(PostSummonWeatherChangeAbAttr, false)[0]; diff --git a/test/abilities/storm_drain.test.ts b/test/abilities/storm_drain.test.ts index e2a7b3e212e..58ff477fa43 100644 --- a/test/abilities/storm_drain.test.ts +++ b/test/abilities/storm_drain.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Storm Drain", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.WATER_GUN ]) + .moveset([Moves.SPLASH, Moves.WATER_GUN]) .ability(Abilities.BALL_FETCH) .battleType("double") .disableCrits() @@ -34,7 +34,7 @@ describe("Abilities - Storm Drain", () => { }); it("should redirect water type moves", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -49,8 +49,8 @@ describe("Abilities - Storm Drain", () => { }); it("should not redirect non-water type moves", async () => { - game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + game.override.moveset([Moves.SPLASH, Moves.AERIAL_ACE]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -65,7 +65,7 @@ describe("Abilities - Storm Drain", () => { }); it("should boost the user's spatk without damaging", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy2 = game.scene.getEnemyField()[1]; @@ -81,7 +81,7 @@ describe("Abilities - Storm Drain", () => { it("should not redirect moves changed from water type via ability", async () => { game.override.ability(Abilities.NORMALIZE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; @@ -96,9 +96,8 @@ describe("Abilities - Storm Drain", () => { }); it("should redirect moves changed to water type via ability", async () => { - game.override.ability(Abilities.LIQUID_VOICE) - .moveset(Moves.PSYCHIC_NOISE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + game.override.ability(Abilities.LIQUID_VOICE).moveset(Moves.PSYCHIC_NOISE); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyField()[0]; const enemy2 = game.scene.getEnemyField()[1]; diff --git a/test/moves/grudge.test.ts b/test/moves/grudge.test.ts index ebd062a76ee..161fa38edd2 100644 --- a/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -41,7 +41,7 @@ describe("Moves - Grudge", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); - const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); + const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === Moves.EMBER); expect(playerMove?.getPpRatio()).toBe(0); }); @@ -60,7 +60,7 @@ describe("Moves - Grudge", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); - const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); + const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === Moves.EMBER); expect(playerMove?.getPpRatio()).toBe(0); }); @@ -84,7 +84,7 @@ describe("Moves - Grudge", () => { expect(enemyPokemon?.isFainted()).toBe(true); - const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.FALSE_SWIPE); + const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === Moves.FALSE_SWIPE); expect(playerMove?.getPpRatio()).toBeGreaterThan(0); }); }); diff --git a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 3e1588f3a72..e00ce03333c 100644 --- a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -136,7 +136,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.GREEDENT); - const moveset = enemyField[0].moveset.map(m => m?.moveId); + const moveset = enemyField[0].moveset.map(m => m.moveId); expect(moveset?.length).toBe(4); expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH]); @@ -259,7 +259,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(partyCountBefore + 1).toBe(partyCountAfter); const greedent = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; expect(greedent.species.speciesId).toBe(Species.GREEDENT); - const moveset = greedent.moveset.map(m => m?.moveId); + const moveset = greedent.moveset.map(m => m.moveId); expect(moveset?.length).toBe(4); expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); }); diff --git a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index a4c1052463c..77cd65e51b9 100644 --- a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -112,7 +112,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]); - const moveset = enemyField[0].moveset.map(m => m?.moveId); + const moveset = enemyField[0].moveset.map(m => m.moveId); expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -208,7 +208,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(partyCountBefore + 1).toBe(partyCountAfter); const oricorio = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; expect(oricorio.species.speciesId).toBe(Species.ORICORIO); - const moveset = oricorio.moveset.map(m => m?.moveId); + const moveset = oricorio.moveset.map(m => m.moveId); expect(moveset?.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); expect(moveset?.some(m => m === Moves.DRAGON_DANCE)).toBeTruthy(); }); diff --git a/test/testUtils/gameManager.ts b/test/testUtils/gameManager.ts index 0ebc83cae31..3289c0ade01 100644 --- a/test/testUtils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -292,7 +292,7 @@ export default class GameManager { const move = (this.scene.getCurrentPhase() as SelectTargetPhase) .getPokemon() .getMoveset() - [movePosition]!.getMove(); // TODO: is the bang correct? + [movePosition].getMove(); if (!move.isMultiTarget()) { handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); } diff --git a/test/testUtils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts index ae6c11f5efa..11636bd66b4 100644 --- a/test/testUtils/gameManagerUtils.ts +++ b/test/testUtils/gameManagerUtils.ts @@ -99,7 +99,7 @@ export function waitUntil(truth): Promise { export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: Moves): number { const playerPokemon = scene.getPlayerField()[pokemonIndex]; const moveSet = playerPokemon.getMoveset(); - const index = moveSet.findIndex(m => m?.moveId === move && m?.ppUsed < m?.getMovePp()); + const index = moveSet.findIndex(m => m.moveId === move && m.ppUsed < m.getMovePp()); console.log(`Move position for ${Moves[move]} (=${move}):`, index); return index; } From 6316218bd3fc42286a882e1d117db3cc6f0d4cf6 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Wed, 26 Mar 2025 22:40:46 -0400 Subject: [PATCH 30/48] [Item] Add Weather and Terrain Extender Item (#4799) * [Item] Add Weather and Terrain Extender Item * Add Documentation * Clean Up Unit Tests * Add Weight Function * Include Suggestions --- src/data/ability.ts | 20 +++---- src/data/moves/move.ts | 10 ++-- .../encounters/fiery-fallout-encounter.ts | 3 +- src/field/arena.ts | 37 +++++++++--- src/modifier/modifier-type.ts | 49 +++++++++++++++ src/modifier/modifier.ts | 32 ++++++++++ src/phases/encounter-phase.ts | 2 +- src/phases/new-biome-encounter-phase.ts | 2 +- src/phases/turn-end-phase.ts | 4 +- test/abilities/forecast.test.ts | 2 +- test/items/mystical_rock.test.ts | 60 +++++++++++++++++++ test/moves/dive.test.ts | 2 +- 12 files changed, 194 insertions(+), 29 deletions(-) create mode 100644 test/items/mystical_rock.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 3a14ad1456d..7d8220a629f 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -308,7 +308,7 @@ export class ClearWeatherAbAttr extends AbAttr { public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - globalScene.arena.trySetWeather(WeatherType.NONE, true); + globalScene.arena.trySetWeather(WeatherType.NONE, pokemon); } } } @@ -334,7 +334,7 @@ export class ClearTerrainAbAttr extends AbAttr { public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); + globalScene.arena.trySetTerrain(TerrainType.NONE, true, pokemon); } } } @@ -954,7 +954,7 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr { override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): void { if (!simulated) { - globalScene.arena.trySetTerrain(this.terrainType, true); + globalScene.arena.trySetTerrain(this.terrainType, false, pokemon); } } } @@ -1126,7 +1126,7 @@ export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { if (!simulated) { - globalScene.arena.trySetWeather(this.weatherType, true); + globalScene.arena.trySetWeather(this.weatherType, pokemon); } } } @@ -2483,7 +2483,7 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr { override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - globalScene.arena.trySetWeather(this.weatherType, true); + globalScene.arena.trySetWeather(this.weatherType, pokemon); } } } @@ -2503,7 +2503,7 @@ export class PostSummonTerrainChangeAbAttr extends PostSummonAbAttr { override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - globalScene.arena.trySetTerrain(this.terrainType, true); + globalScene.arena.trySetTerrain(this.terrainType, false, pokemon); } } } @@ -2886,7 +2886,7 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { } if (turnOffWeather) { - globalScene.arena.trySetWeather(WeatherType.NONE, false); + globalScene.arena.trySetWeather(WeatherType.NONE); return true; } @@ -2986,7 +2986,7 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { */ override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - globalScene.arena.trySetWeather(WeatherType.NONE, false); + globalScene.arena.trySetWeather(WeatherType.NONE); } } } @@ -4137,7 +4137,7 @@ export class PostBiomeChangeWeatherChangeAbAttr extends PostBiomeChangeAbAttr { override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - globalScene.arena.trySetWeather(this.weatherType, true); + globalScene.arena.trySetWeather(this.weatherType, pokemon); } } } @@ -4157,7 +4157,7 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - globalScene.arena.trySetTerrain(this.terrainType, true); + globalScene.arena.trySetTerrain(this.terrainType, false, pokemon); } } } diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 07d621f6f2c..1af872e0915 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -2851,7 +2851,7 @@ export class WeatherChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return globalScene.arena.trySetWeather(this.weatherType, true); + return globalScene.arena.trySetWeather(this.weatherType, user); } getCondition(): MoveConditionFunc { @@ -2870,7 +2870,7 @@ export class ClearWeatherAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (globalScene.arena.weather?.weatherType === this.weatherType) { - return globalScene.arena.trySetWeather(WeatherType.NONE, true); + return globalScene.arena.trySetWeather(WeatherType.NONE, user); } return false; @@ -2887,7 +2887,7 @@ export class TerrainChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return globalScene.arena.trySetTerrain(this.terrainType, true, true); + return globalScene.arena.trySetTerrain(this.terrainType, true, user); } getCondition(): MoveConditionFunc { @@ -2906,7 +2906,7 @@ export class ClearTerrainAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); + return globalScene.arena.trySetTerrain(TerrainType.NONE, true, user); } } @@ -6454,7 +6454,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { export class ChillyReceptionAttr extends ForceSwitchOutAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - globalScene.arena.trySetWeather(WeatherType.SNOW, true); + globalScene.arena.trySetWeather(WeatherType.SNOW, user); return super.apply(user, target, move, args); } diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index d9bd6983d97..6118fe3d0de 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -140,7 +140,8 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w // Load animations/sfx for Volcarona moves loadCustomMovesForEncounter([Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); - globalScene.arena.trySetWeather(WeatherType.SUNNY, true); + const pokemon = globalScene.getEnemyPokemon(); + globalScene.arena.trySetWeather(WeatherType.SUNNY, pokemon); encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName()); diff --git a/src/field/arena.ts b/src/field/arena.ts index 2c538de890f..4f243789567 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -42,6 +42,7 @@ import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrig import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; import { WeatherType } from "#enums/weather-type"; +import { FieldEffectModifier } from "#app/modifier/modifier"; export class Arena { public biomeType: Biome; @@ -311,10 +312,10 @@ export class Arena { /** * Attempts to set a new weather to the battle * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set - * @param hasPokemonSource boolean if the new weather is from a pokemon + * @param user {@linkcode Pokemon} that caused the weather effect * @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use */ - trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean { + trySetWeather(weather: WeatherType, user?: Pokemon): boolean { if (Overrides.WEATHER_OVERRIDE) { return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE); } @@ -336,7 +337,14 @@ export class Arena { return false; } - this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; + const weatherDuration = new Utils.NumberHolder(0); + + if (!Utils.isNullOrUndefined(user)) { + weatherDuration.value = 5; + globalScene.applyModifier(FieldEffectModifier, user.isPlayer(), user, weatherDuration); + } + + this.weather = weather ? new Weather(weather, weatherDuration.value) : null; this.eventTarget.dispatchEvent( new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!), ); // TODO: is this bang correct? @@ -398,14 +406,29 @@ export class Arena { return !(this.terrain?.terrainType === (terrain || undefined)); } - trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim = false): boolean { + /** + * Attempts to set a new terrain effect to the battle + * @param terrain {@linkcode TerrainType} new {@linkcode TerrainType} to set + * @param ignoreAnim boolean if the terrain animation should be ignored + * @param user {@linkcode Pokemon} that caused the terrain effect + * @returns true if new terrain set, false if no terrain provided or attempting to set the same terrain as currently in use + */ + trySetTerrain(terrain: TerrainType, ignoreAnim = false, user?: Pokemon): boolean { if (!this.canSetTerrain(terrain)) { return false; } const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; - this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; + const terrainDuration = new Utils.NumberHolder(0); + + if (!Utils.isNullOrUndefined(user)) { + terrainDuration.value = 5; + globalScene.applyModifier(FieldEffectModifier, user.isPlayer(), user, terrainDuration); + } + + this.terrain = terrain ? new Terrain(terrain, terrainDuration.value) : null; + this.eventTarget.dispatchEvent( new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!), ); // TODO: are those bangs correct? @@ -802,9 +825,9 @@ export class Arena { resetArenaEffects(): void { // Don't reset weather if a Biome's permanent weather is active if (this.weather?.turnsLeft !== 0) { - this.trySetWeather(WeatherType.NONE, false); + this.trySetWeather(WeatherType.NONE); } - this.trySetTerrain(TerrainType.NONE, false, true); + this.trySetTerrain(TerrainType.NONE, true); this.resetPlayerFaintCount(); this.removeAllTags(); } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index e8470853388..b5574c02c8b 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -97,6 +97,7 @@ import { type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier, + FieldEffectModifier, } from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; @@ -1998,6 +1999,13 @@ export const modifierTypes = { return new PokemonNatureChangeModifierType(randSeedInt(getEnumValues(Nature).length) as Nature); }), + MYSTICAL_ROCK: () => + new ModifierType( + "modifierType:ModifierType.MYSTICAL_ROCK", + "mystical_rock", + (type, args) => new FieldEffectModifier(type, (args[0] as Pokemon).id), + ), + TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in PokemonType) { @@ -2810,6 +2818,47 @@ const modifierPool: ModifierPool = { }, 10, ), + new WeightedModifierType( + modifierTypes.MYSTICAL_ROCK, + (party: Pokemon[]) => { + return party.some(p => { + const moveset = p.getMoveset(true).map(m => m.moveId); + + const hasAbility = [ + Abilities.DRIZZLE, + Abilities.ORICHALCUM_PULSE, + Abilities.DRIZZLE, + Abilities.SAND_STREAM, + Abilities.SAND_SPIT, + Abilities.SNOW_WARNING, + Abilities.ELECTRIC_SURGE, + Abilities.HADRON_ENGINE, + Abilities.PSYCHIC_SURGE, + Abilities.GRASSY_SURGE, + Abilities.SEED_SOWER, + Abilities.MISTY_SURGE, + ].some(a => p.hasAbility(a, false, true)); + + const hasMoves = [ + Moves.SUNNY_DAY, + Moves.RAIN_DANCE, + Moves.SANDSTORM, + Moves.SNOWSCAPE, + Moves.HAIL, + Moves.CHILLY_RECEPTION, + Moves.ELECTRIC_TERRAIN, + Moves.PSYCHIC_TERRAIN, + Moves.GRASSY_TERRAIN, + Moves.MISTY_TERRAIN, + ].some(m => moveset.includes(m)); + + return hasAbility || hasMoves; + }) + ? 10 + : 0; + }, + 10, + ), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 4c59bfe1ef1..7c9207bbea5 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2014,6 +2014,38 @@ export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for held items, namely Mystical Rock, that extend the + * duration of weather and terrain effects. + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class FieldEffectModifier extends PokemonHeldItemModifier { + /** + * Provides two more turns per stack to any weather or terrain effect caused + * by the holder. + * @param pokemon {@linkcode Pokemon} that holds the held item + * @param fieldDuration {@linkcode NumberHolder} that stores the current field effect duration + * @returns `true` if the field effect extension was applied successfully + */ + override apply(_pokemon: Pokemon, fieldDuration: NumberHolder): boolean { + fieldDuration.value += 2 * this.stackCount; + return true; + } + + override matchType(modifier: Modifier): boolean { + return modifier instanceof FieldEffectModifier; + } + + override clone(): FieldEffectModifier { + return new FieldEffectModifier(this.type, this.pokemonId, this.stackCount); + } + + override getMaxHeldItemCount(_pokemon?: Pokemon): number { + return 2; + } +} + export abstract class ConsumablePokemonModifier extends ConsumableModifier { public pokemonId: number; diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 5decab522b5..7afd4176788 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -684,7 +684,7 @@ export class EncounterPhase extends BattlePhase { */ trySetWeatherIfNewBiome(): void { if (!this.loaded) { - globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena), false); + globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena)); } } } diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index ed768742aac..bb1fe54fe9f 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -45,6 +45,6 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { * Set biome weather. */ trySetWeatherIfNewBiome(): void { - globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena), false); + globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena)); } } diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index c55f6d69a58..836647fbfb4 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -68,12 +68,12 @@ export class TurnEndPhase extends FieldPhase { globalScene.arena.lapseTags(); if (globalScene.arena.weather && !globalScene.arena.weather.lapse()) { - globalScene.arena.trySetWeather(WeatherType.NONE, false); + globalScene.arena.trySetWeather(WeatherType.NONE); globalScene.arena.triggerWeatherBasedFormChangesToNormal(); } if (globalScene.arena.terrain && !globalScene.arena.terrain.lapse()) { - globalScene.arena.trySetTerrain(TerrainType.NONE, false); + globalScene.arena.trySetTerrain(TerrainType.NONE); } this.end(); diff --git a/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts index bdc32604bba..642b490da72 100644 --- a/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -181,7 +181,7 @@ describe("Abilities - Forecast", () => { expect(castform.formIndex).toBe(SNOWY_FORM); - game.scene.arena.trySetWeather(WeatherType.FOG, false); + game.scene.arena.trySetWeather(WeatherType.FOG); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to("TurnStartPhase"); diff --git a/test/items/mystical_rock.test.ts b/test/items/mystical_rock.test.ts new file mode 100644 index 00000000000..0558bc21fe1 --- /dev/null +++ b/test/items/mystical_rock.test.ts @@ -0,0 +1,60 @@ +import { globalScene } from "#app/global-scene"; +import { Moves } from "#enums/moves"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Items - Mystical Rock", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .enemySpecies(Species.SHUCKLE) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.SUNNY_DAY, Moves.GRASSY_TERRAIN]) + .startingHeldItems([{ name: "MYSTICAL_ROCK", count: 2 }]) + .battleType("single"); + }); + + it("should increase weather duration by +2 turns per stack", async () => { + await game.classicMode.startBattle([Species.GASTLY]); + + game.move.select(Moves.SUNNY_DAY); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const weather = globalScene.arena.weather; + + expect(weather).toBeDefined(); + expect(weather!.turnsLeft).to.equal(9); + }); + + it("should increase terrain duration by +2 turns per stack", async () => { + await game.classicMode.startBattle([Species.GASTLY]); + + game.move.select(Moves.GRASSY_TERRAIN); + + await game.phaseInterceptor.to("MoveEndPhase"); + + const terrain = globalScene.arena.terrain; + + expect(terrain).toBeDefined(); + expect(terrain!.turnsLeft).to.equal(9); + }); +}); diff --git a/test/moves/dive.test.ts b/test/moves/dive.test.ts index 8d7b0f9dd00..d7b53701a25 100644 --- a/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -120,7 +120,7 @@ describe("Moves - Dive", () => { await game.phaseInterceptor.to("TurnEndPhase"); await game.phaseInterceptor.to("TurnStartPhase", false); - game.scene.arena.trySetWeather(WeatherType.HARSH_SUN, false); + game.scene.arena.trySetWeather(WeatherType.HARSH_SUN); await game.phaseInterceptor.to("MoveEndPhase"); expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); From 5fdc133955a95643fe34148c5f9ba0d68dffd256 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Thu, 27 Mar 2025 04:26:03 +0100 Subject: [PATCH 31/48] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20filters=20correc?= =?UTF-8?q?tly=20show=20split=20passives=20(#5560)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Pokédex filters properly take split passives into account * Removed unused dependency --- src/ui/pokedex-ui-handler.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 1f79d7006b0..d55b278a148 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -37,11 +37,10 @@ import { addWindow } from "./ui-theme"; import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; import { FilterText, FilterTextRow } from "./filter-text"; import { allAbilities } from "#app/data/ability"; -import type { PassiveAbilities } from "#app/data/balance/passives"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { allMoves } from "#app/data/moves/move"; import { speciesTmMoves } from "#app/data/balance/tms"; -import { pokemonStarters } from "#app/data/balance/pokemon-evolutions"; +import { pokemonPrevolutions, pokemonStarters } from "#app/data/balance/pokemon-evolutions"; import { Biome } from "#enums/biome"; import { globalScene } from "#app/global-scene"; @@ -1404,7 +1403,12 @@ export default class PokedexUiHandler extends MessageUiHandler { // Ability filter const abilities = [species.ability1, species.ability2, species.abilityHidden].map(a => allAbilities[a].name); - const passives = starterPassiveAbilities[starterId] ?? ({} as PassiveAbilities); + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) + ? species.speciesId + : starterPassiveAbilities.hasOwnProperty(starterId) + ? starterId + : pokemonPrevolutions[starterId]; + const passives = starterPassiveAbilities[passiveId]; const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); const fitsFormAbility1 = species.forms.some(form => From d9550517306bb913477db1a28773ea109bb4e105 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Thu, 27 Mar 2025 00:05:38 -0400 Subject: [PATCH 32/48] [Bug] `Mystical Rock` Crashing on Selection (#5562) --- src/modifier/modifier-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b5574c02c8b..f9770e9c6cc 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2000,7 +2000,7 @@ export const modifierTypes = { }), MYSTICAL_ROCK: () => - new ModifierType( + new PokemonHeldItemModifierType( "modifierType:ModifierType.MYSTICAL_ROCK", "mystical_rock", (type, args) => new FieldEffectModifier(type, (args[0] as Pokemon).id), From eb12b8c6926d24f63898094de83eeaf7b323739a Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Thu, 27 Mar 2025 12:01:33 -0700 Subject: [PATCH 33/48] [Bug] Stop Shield Dust and Gluttony from Displaying (#5564) Prevent displays --- src/data/ability.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 7d8220a629f..5bf02cabf6c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1285,6 +1285,9 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * @see {@linkcode applyPreDefend} */ export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { + constructor(showAbility: boolean = false) { + super(showAbility); + } override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { return (args[0] as Utils.NumberHolder).value > 0; @@ -4711,7 +4714,7 @@ export class ForceSwitchOutImmunityAbAttr extends AbAttr { export class ReduceBerryUseThresholdAbAttr extends AbAttr { constructor() { - super(); + super(false); } override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { From 19c61a041fdbe22936b05030c9e19171c102dcc5 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Mar 2025 22:56:26 -0400 Subject: [PATCH 34/48] [Misc] New Splash Texts, March 2025 (#5345) * Update splash-messages.ts 1 * Add Pokemon name splash text This will display a random Pokemon's name, followed by an exclamation point (ex. "Bulbasaur!"). * Make Pokemon name splash message weighted * Update splash-messages.ts * Update splash-messages.ts * fix trailing spaces * Update splash-messages.ts * Update splash-messages.ts * Add splashes which use random Pokemon * Update splash message tests * Update splash-messages.ts * Update splash-messages.ts * Missing comma * Fix length on test It even says to do so whenever weight multipliers are adjusted... * Update splash-messages.ts * add missing prefix thing * adjusted comment in splash_messages.test.ts * Update splash-messages.ts * fix blank line * Add gender splash message code This makes the specific April Fools splash message functional. Also fixed a linter issue with the randomPokemon code. * Update title-ui-handler.ts changed battles won fallback number to -1 * Update splash-messages.ts * changed afd to 2 days * Update splash_messages.test.ts * Update src/data/splash-messages.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> --------- Co-authored-by: Madmadness65 Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> --- src/data/splash-messages.ts | 144 ++++++++++++++++++++++++++---- src/ui/title-ui-handler.ts | 31 ++++++- test/data/splash_messages.test.ts | 28 +++--- 3 files changed, 174 insertions(+), 29 deletions(-) diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 9fd71d9d95b..de14e913664 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -44,14 +44,17 @@ interface Season { //#region Constants /** The weight multiplier for the battles-won splash message */ -const BATTLES_WON_WEIGHT_MULTIPLIER = 10; +const BATTLES_WON_WEIGHT_MULTIPLIER = 15; +/** The weight multiplier for the Pokémon names splash message */ +const POKEMON_NAMES_WEIGHT_MULTIPLIER = 10; /** The weight multiplier for the seasonal splash messages */ -const SEASONAL_WEIGHT_MULTIPLIER = 10; +const SEASONAL_WEIGHT_MULTIPLIER = 15; //#region Common Messages const commonSplashMessages = [ ...Array(BATTLES_WON_WEIGHT_MULTIPLIER).fill("battlesWon"), + ...Array(POKEMON_NAMES_WEIGHT_MULTIPLIER).fill("underratedPokemon"), "joinTheDiscord", "infiniteLevels", "everythingIsStackable", @@ -78,7 +81,7 @@ const commonSplashMessages = [ "mostlyConsistentSeeds", "achievementPointsDontDoAnything", "nothingBeatsAJellyFilledDonut", - "dontTalkAboutTheTinkatonIncident", + "dontTalkAboutThePokemonIncident", "alsoTryPokengine", "alsoTryEmeraldRogue", "alsoTryRadicalRed", @@ -176,41 +179,146 @@ const commonSplashMessages = [ "timeForYourDeliDelivery", "goodFirstImpression", "iPreferRarerCandies", + "pocketRoguelite", + "porygonDidNothingWrong", + "critMattered", + "pickupNotRequired", + "stayHydrated", + "alsoTryCobblemon", + "alsoTryPokeDoku", + "mySleepStyleIsDoesnt", + "makeYourOwnWorldChampDifference", + "yoChampInTheMaking", + "notLiableForDecisionAnxiety", + "theAirIsTastyHere", + "continue", + "startANewRunToday", + "neverGiveUp", + "theresAlwaysNextTime", + "oneTwoThreeAndPoof", + "yourPokemonOnlyGoToLevelOneHundred", + "theBattlesWillBeLegendary", + "levelCurveBetterThanJohto", + "alsoTryShowering", + "wellStillBeHere", + "weHopeToSeeYouAgain", + "aHealthyTeamCanMeanGreaterRewards", + "aWildPokemonAppeared", + "isThisThingOn", + "needsMoreTesting", + "whoChecksStatChanges", + "whenTwoTrainersEyesMeet", + "notOfficiallyOnSteam", + "fiftyFifty", + "metaNotIncluded", + "bornToBeAWinner", + "onARollout", + "itsAlwaysNightDeepInTheAbyss", + "folksThisIsInsane" ]; //#region Seasonal Messages const seasonalSplashMessages: Season[] = [ + { + name: "New Year's", + start: "01-01", + end: "01-15", + messages: [ + "newYears.happyNewYear", + "newYears.andAHappyNewYear" + ], + }, + { + name: "Valentines", + start: "02-07", + end: "02-21", + messages: [ + "valentines.happyValentines", + "valentines.fullOfLove", + "valentines.applinForYou", + "valentines.thePowerOfLoveIsThreeThirtyBST", + "valentines.haveAHeartScale", + "valentines.i<3You" + ], + }, + { + name: "April Fools", + start: "04-01", + end: "04-03", + messages: [ + "aprilFools.battlesOne", + "aprilFools.aprilFools", + "aprilFools.removedPokemon", + "aprilFools.helloKyleAmber", + "aprilFools.gotcha", + "aprilFools.alsoTryPokerogueTwo", + "aprilFools.nowWithSameScumCountermeasures", + "aprilFools.neverGonnaGiveYouGoodRolls", + "aprilFools.youBumblingBuffoon", + "aprilFools.doubleShinyOddsForTrainersOnly", + "aprilFools.nowWithZMoves", + "aprilFools.newLightType", + "aprilFools.removedMegas", + "aprilFools.nerfedYourFavorites", + "aprilFools.grrr", + "aprilFools.enabledEternatusPassiveGoodLuck", + "aprilFools.theDarkestDaySoundsLikeAFutureProblem", + "aprilFools.tmShopWhen", + "aprilFools.whoIsFinn", + "aprilFools.watchOutForShadowPokemon", + "aprilFools.nowWithDarkTypeLuxray", + "aprilFools.onlyOnPokerogueNetAGAIN", + "aprilFools.noFreeVouchers", + "aprilFools.altffourAchievementPoints", + "aprilFools.rokePogue", + "aprilFools.readMe", + "aprilFools.winningNotIncluded", + "aprilFools.timeForYourSoloUnownRun", + "aprilFools.nowARealTimeStrategyGame", + "aprilFools.nowWithQuickTimeEncounters", + "aprilFools.timeYourInputsForHigherCatchrate", + "aprilFools.certifiedButtonSimulator", + "aprilFools.iHopeYouGetSuckerPunched" + ], + }, { name: "Halloween", - start: "09-15", + start: "10-15", end: "10-31", messages: [ + "halloween.happyHalloween", + "halloween.boo", "halloween.pumpkabooAbout", "halloween.mayContainSpiders", "halloween.spookyScarySkeledirge", "halloween.gourgeistUsedTrickOrTreat", - "halloween.letsSnuggleForever", + "halloween.letsSnuggleForever" ], }, { - name: "XMAS", + name: "Winter Holiday", start: "12-01", - end: "12-26", + end: "12-31", messages: [ - "xmas.happyHolidays", - "xmas.unaffilicatedWithDelibirdServices", - "xmas.delibirdSeason", - "xmas.diamondsFromTheSky", - "xmas.holidayStylePikachuNotIncluded", + "winterHoliday.happyHolidays", + "winterHoliday.unaffilicatedWithDelibirdServices", + "winterHoliday.delibirdSeason", + "winterHoliday.diamondsFromTheSky", + "winterHoliday.holidayStylePikachuNotIncluded", + "winterHoliday.delibirdDirectlyToYourHouse", + "winterHoliday.haveAnIceDay", + "winterHoliday.spinTheClaydol", + "winterHoliday.beGoodForGoodnessSake", + "winterHoliday.moomooMilkAndLavaCookies", + "winterHoliday.iNeedAYacheBerry", + "winterHoliday.getJolly", + "winterHoliday.tisTheSeasonToBeSpeSpa", + "winterHoliday.deckTheHalls", + "winterHoliday.saveScummingGetsYouOnTheNaughtyList", + "winterHoliday.badTrainersGetRolycoly" ], }, - { - name: "New Year's", - start: "01-01", - end: "01-31", - messages: ["newYears.happyNewYear"], - }, ]; //#endregion diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 2f797bb4bfb..a9fdf22ec57 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -8,10 +8,13 @@ import { TimedEventDisplay } from "#app/timed-event-manager"; import { version } from "../../package.json"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { globalScene } from "#app/global-scene"; +import type { Species } from "#enums/species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { PlayerGender } from "#enums/player-gender"; export default class TitleUiHandler extends OptionSelectUiHandler { /** If the stats can not be retrieved, use this fallback value */ - private static readonly BATTLES_WON_FALLBACK: number = -99999999; + private static readonly BATTLES_WON_FALLBACK: number = -1; private titleContainer: Phaser.GameObjects.Container; private playerCountLabel: Phaser.GameObjects.Text; @@ -98,6 +101,29 @@ export default class TitleUiHandler extends OptionSelectUiHandler { }); } + /** Used solely to display a random Pokémon name in a splash message. */ + randomPokemon(): void { + const rand = Utils.randInt(1025, 1); + const pokemon = getPokemonSpecies(rand as Species); + if ( + this.splashMessage === "splashMessages:underratedPokemon" || + this.splashMessage === "splashMessages:dontTalkAboutThePokemonIncident" || + this.splashMessage === "splashMessages:aWildPokemonAppeared" || + this.splashMessage === "splashMessages:aprilFools.removedPokemon" + ) { + this.splashMessageText.setText(i18next.t(this.splashMessage, { pokemonName: pokemon.name })); + } + } + + /** Used for a specific April Fools splash message. */ + genderSplash(): void { + if (this.splashMessage === "splashMessages:aprilFools.helloKyleAmber") { + globalScene.gameData.gender === PlayerGender.MALE + ? this.splashMessageText.setText(i18next.t(this.splashMessage, { name: i18next.t("trainerNames:player_m") })) + : this.splashMessageText.setText(i18next.t(this.splashMessage, { name: i18next.t("trainerNames:player_f") })); + } + } + show(args: any[]): boolean { const ret = super.show(args); @@ -121,6 +147,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.eventDisplay.show(); } + this.randomPokemon(); + this.genderSplash(); + this.updateTitleStats(); this.titleStatsTimer = setInterval(() => { diff --git a/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts index 8ae13366670..bd29a17339a 100644 --- a/test/data/splash_messages.test.ts +++ b/test/data/splash_messages.test.ts @@ -7,10 +7,10 @@ describe("Data - Splash Messages", () => { expect(getSplashMessages().length).toBeGreaterThanOrEqual(15); }); - // make sure to adjust this test if the weight it changed! - it("should add contain 10 `battlesWon` splash messages", () => { - const battlesWonMessages = getSplashMessages().filter(message => message === "splashMessages:battlesWon"); - expect(battlesWonMessages).toHaveLength(10); + // Make sure to adjust this test if the weight is changed! + it("should add contain 15 `battlesWon` splash messages", () => { + const battlesWonMessages = getSplashMessages().filter((message) => message === "splashMessages:battlesWon"); + expect(battlesWonMessages).toHaveLength(15); }); describe("Seasonal", () => { @@ -22,16 +22,24 @@ describe("Data - Splash Messages", () => { vi.useRealTimers(); // reset system time }); - it("should contain halloween messages from Sep 15 to Oct 31", () => { - testSeason(new Date("2024-09-15"), new Date("2024-10-31"), "halloween"); + it("should contain new years messages from Jan 1 to Jan 15", () => { + testSeason(new Date("2025-01-01"), new Date("2025-01-15"), "newYears"); }); - it("should contain xmas messages from Dec 1 to Dec 26", () => { - testSeason(new Date("2024-12-01"), new Date("2024-12-26"), "xmas"); + it("should contain valentines messages from Feb 7 to Feb 21", () => { + testSeason(new Date("2025-02-07"), new Date("2025-02-21"), "valentines"); }); - it("should contain new years messages frm Jan 1 to Jan 31", () => { - testSeason(new Date("2024-01-01"), new Date("2024-01-31"), "newYears"); + it("should contain april fools messages from April 1 to April 3", () => { + testSeason(new Date("2025-04-01"), new Date("2025-04-03"), "aprilFools"); + }); + + it("should contain halloween messages from Oct 15 to Oct 31", () => { + testSeason(new Date("2025-10-15"), new Date("2025-10-31"), "halloween"); + }); + + it("should contain winter holiday messages from Dec 1 to Dec 31", () => { + testSeason(new Date("2025-12-01"), new Date("2025-12-31"), "winterHoliday"); }); }); }); From 0ea8edcf75c094f2cb9f53a3b511672d8f636cc9 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Mar 2025 22:58:53 -0400 Subject: [PATCH 35/48] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index cd4057af258..cae82762eab 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit cd4057af258b659ba2c1ed2778bb2793fa1f6141 +Subproject commit cae82762eab25f928500b73e0e9a3e7df1ae6bbe From 46d110e705f8ceb957dd67d3743a53f2e478a579 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Mar 2025 04:59:05 +0100 Subject: [PATCH 36/48] =?UTF-8?q?[UI/UX]=20Grey=20options=20in=20Pok=C3=A9?= =?UTF-8?q?dex=20for=20uncaught=20mons=20(#5529)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Options in Pokédex page are dark if unselectable * Fixed docstring * Changing display of seen Pokémon in the dex * Changed visibility of icons in main Pokédex page --- src/data/pokemon-species.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 73 +++++++++++++++++++++++-------- src/ui/pokedex-ui-handler.ts | 17 ++++--- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 15c60d28969..eca7d65ac6a 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -7,7 +7,7 @@ import i18next from "i18next"; import type { AnySound } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import type { GameMode } from "#app/game-mode"; -import { DexAttr, type StarterMoveset } from "#app/system/game-data"; +import { DexAttr, DexEntry, type StarterMoveset } from "#app/system/game-data"; import * as Utils from "#app/utils"; import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 8f96f1e44c2..b359c188e0c 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -25,7 +25,7 @@ import { AbilityAttr, DexAttr } from "#app/system/game-data"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { StatsContainer } from "#app/ui/stats-container"; -import { TextStyle, addTextObject, getTextStyleOptions } from "#app/ui/text"; +import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor, getTextStyleOptions } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; import { addWindow } from "#app/ui/ui-theme"; import { Egg } from "#app/data/egg"; @@ -63,6 +63,7 @@ import { TimeOfDay } from "#app/enums/time-of-day"; import type { Abilities } from "#app/enums/abilities"; import { BaseStatsOverlay } from "#app/ui/base-stats-overlay"; import { globalScene } from "#app/global-scene"; +import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; interface LanguageSetting { starterInfoTextSize: string; @@ -250,7 +251,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Menu private menuContainer: Phaser.GameObjects.Container; private menuBg: Phaser.GameObjects.NineSlice; - protected optionSelectText: Phaser.GameObjects.Text; + protected optionSelectText: BBCodeText; private menuOptions: MenuOptions[]; protected scale = 0.1666666667; private menuDescriptions: string[]; @@ -593,14 +594,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => Number.parseInt(MenuOptions[m]) as MenuOptions); - this.optionSelectText = addTextObject( + this.optionSelectText = addBBCodeTextObject( 0, 0, this.menuOptions.map(o => `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, - { maxLines: this.menuOptions.length }, + { maxLines: this.menuOptions.length, lineSpacing: 12 }, ); - this.optionSelectText.setLineSpacing(12); this.menuDescriptions = [ i18next.t("pokedexUiHandler:showBaseStats"), @@ -623,7 +623,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ); this.menuBg.setOrigin(0, 0); - this.optionSelectText.setPositionRelative(this.menuBg, 10 + 24 * this.scale, 6); + this.optionSelectText.setPosition(this.menuBg.x + 10 + 24 * this.scale, this.menuBg.y + 6); this.menuContainer.add(this.menuBg); @@ -704,11 +704,39 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.setSpecies(); this.updateInstructions(); + this.optionSelectText.setText(this.getMenuText()); + this.setCursor(0); return true; } + getMenuText(): string { + const isSeen = this.isSeen(); + const isStarterCaught = !!this.isCaught(this.getStarterSpecies(this.species)); + + return this.menuOptions + .map(o => { + const label = `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`; + const isDark = + !isSeen || + (!isStarterCaught && (o === MenuOptions.TOGGLE_IVS || o === MenuOptions.NATURES)) || + (this.tmMoves.length < 1 && o === MenuOptions.TM_MOVES); + const color = getTextColor( + isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, + false, + globalScene.uiTheme, + ); + const shadow = getTextColor( + isDark ? TextStyle.SHADOW_TEXT : TextStyle.SETTINGS_VALUE, + true, + globalScene.uiTheme, + ); + return `[shadow=${shadow}][color=${color}]${label}[/color][/shadow]`; + }) + .join("\n"); + } + starterSetup(): void { this.evolutions = []; this.prevolutions = []; @@ -904,6 +932,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData(); } + /** * Check whether a given form is caught for a given species. * All forms that can be reached through a form change during battle are considered caught and show up in the dex as such. @@ -928,6 +957,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return isFormCaught; } + isSeen(): boolean { + if (this.speciesStarterDexEntry?.seenAttr) { + return true; + } + const starterCaughtAttr = this.isCaught(this.getStarterSpecies(this.species)); + return !!starterCaughtAttr; + } + /** * Get the starter attributes for the given PokemonSpecies, after sanitizing them. * If somehow a preference is set for a form, variant, gender, ability or nature @@ -1076,6 +1113,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const isCaught = this.isCaught(); const isFormCaught = this.isFormCaught(); + const isSeen = this.isSeen(); + const isStarterCaught = !!this.isCaught(this.getStarterSpecies(this.species)); if (this.blockInputOverlay) { if (button === Button.CANCEL || button === Button.ACTION) { @@ -1130,7 +1169,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (button === Button.ACTION) { switch (this.cursor) { case MenuOptions.BASE_STATS: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1150,7 +1189,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.LEVEL_MOVES: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1208,7 +1247,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.EGG_MOVES: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1275,7 +1314,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.TM_MOVES: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else if (this.tmMoves.length < 1) { ui.showText(i18next.t("pokedexUiHandler:noTmMoves")); @@ -1326,7 +1365,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.ABILITIES: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1414,7 +1453,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.BIOMES: - if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1493,7 +1532,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.EVOLUTIONS: - if (!isCaught || !isFormCaught) { + if (!isSeen) { error = true; } else { this.blockInput = true; @@ -1677,7 +1716,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.TOGGLE_IVS: - if (!isCaught || !isFormCaught) { + if (!isStarterCaught) { error = true; } else { this.toggleStatsMode(); @@ -1687,7 +1726,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.NATURES: - if (!isCaught || !isFormCaught) { + if (!isStarterCaught) { error = true; } else { this.blockInput = true; @@ -2392,8 +2431,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } if (species) { - const dexEntry = globalScene.gameData.dexData[species.speciesId]; - const caughtAttr = this.isCaught(species); if (!caughtAttr) { @@ -2414,7 +2451,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } const isFormCaught = this.isFormCaught(); - const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormSeen = this.isSeen(); this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index d55b278a148..198d9606258 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -781,6 +781,15 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterSelectMessageBoxContainer.setVisible(!!text?.length); } + isSeen(species: PokemonSpecies, dexEntry: DexEntry): boolean { + if (dexEntry?.seenAttr) { + return true; + } + + const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]; + return !!starterDexEntry?.caughtAttr; + } + /** * Determines if 'Icon' based upgrade notifications should be shown * @returns true if upgrade notifications are enabled and set to display an 'Icon' @@ -1740,7 +1749,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (caughtAttr & data.species.getFullUnlocksData() || globalScene.dexForDevs) { container.icon.clearTint(); - } else if (dexEntry.seenAttr) { + } else if (this.isSeen(data.species, dexEntry)) { container.icon.setTint(0x808080); } else { container.icon.setTint(0); @@ -1931,13 +1940,11 @@ export default class PokedexUiHandler extends MessageUiHandler { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); this.trayContainers = []; + const isFormSeen = this.isSeen(species, dexEntry); this.trayForms.map((f, index) => { const isFormCaught = dexEntry ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; - const isFormSeen = dexEntry - ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n - : false; const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, @@ -2147,7 +2154,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } const isFormCaught = dexEntry ? (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; - const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormSeen = this.isSeen(species, dexEntry); const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; From 188647d2e57106256f3351e37a7b45713f0502da Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:02:42 +0100 Subject: [PATCH 37/48] =?UTF-8?q?[Bug][UI/UX]=20Pok=C3=A9dex=20filters=20p?= =?UTF-8?q?roperly=20track=20TMs=20for=20evolutions=20(#5568)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looking at speciesId for TMs --- src/ui/pokedex-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 198d9606258..a98415f72d2 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1373,7 +1373,7 @@ export default class PokedexUiHandler extends MessageUiHandler { const levelMoves = pokemonSpeciesLevelMoves[species.speciesId].map(m => allMoves[m[1]].name); // This always gets egg moves from the starter const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; - const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; + const tmMoves = speciesTmMoves[species.speciesId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); From f09c77c81b453a1c24e1220b33d95f22e6a951dd Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:38:20 -0700 Subject: [PATCH 38/48] [Bug] Fix Extra Ability Activation Flyouts during AI Decisions (#5563) Fix extra messages in getMoveChance --- src/data/moves/move.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 1af872e0915..c85ec7db295 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -1233,7 +1233,7 @@ export class MoveEffectAttr extends MoveAttr { getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): number { const moveChance = new Utils.NumberHolder(this.effectChanceOverride ?? move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, !showAbility, moveChance, move); if ((!move.hasAttr(FlinchAttr) || moveChance.value <= move.chance) && !move.hasAttr(SecretPowerAttr)) { const userSide = user.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; @@ -1241,7 +1241,7 @@ export class MoveEffectAttr extends MoveAttr { } if (!selfEffect) { - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance); + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, !showAbility, moveChance); } return moveChance.value; } From b838d5f775ea9f941f0f0fa3bdade1c7a584ac51 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Fri, 28 Mar 2025 14:23:57 -0700 Subject: [PATCH 39/48] [Misc] Allow Localization of Common Trainer Names (#5569) * Localize common trainer names * Update locale key usage --- .../global-trade-system-encounter.ts | 17 +- src/data/trainer-names.ts | 2645 ----------------- src/field/trainer.ts | 17 +- src/plugins/i18n.ts | 1 + 4 files changed, 21 insertions(+), 2659 deletions(-) diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 2b7cd823af2..4f10a657e4e 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -23,7 +23,7 @@ import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import { getTypeRgb } from "#app/data/type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { NumberHolder, isNullOrUndefined, randInt, randSeedInt, randSeedShuffle } from "#app/utils"; +import { NumberHolder, isNullOrUndefined, randInt, randSeedInt, randSeedShuffle, randSeedItem } from "#app/utils"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; @@ -41,11 +41,11 @@ import { Gender, getGenderSymbol } from "#app/data/gender"; import { getNatureName } from "#app/data/nature"; import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { trainerNamePools } from "#app/data/trainer-names"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { addPokemonDataToDexAndValidateAchievements } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import type { PokeballType } from "#enums/pokeball"; import { doShinySparkleAnim } from "#app/field/anims"; +import { TrainerType } from "#enums/trainer-type"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/globalTradeSystem"; @@ -982,15 +982,14 @@ function doTradeReceivedSequence( } function generateRandomTraderName() { - const length = Object.keys(trainerNamePools).length; + const length = TrainerType.YOUNGSTER - TrainerType.ACE_TRAINER + 1; // +1 avoids TrainerType.UNKNOWN - let trainerTypePool = trainerNamePools[randInt(length) + 1]; - while (!trainerTypePool) { - trainerTypePool = trainerNamePools[randInt(length) + 1]; - } + const trainerTypePool = i18next.t("trainersCommon:" + TrainerType[randInt(length) + 1], { returnObjects: true }); // Some trainers have 2 gendered pools, some do not - const genderedPool = trainerTypePool[randInt(trainerTypePool.length)]; - const trainerNameString = Array.isArray(genderedPool) ? genderedPool[randInt(genderedPool.length)] : genderedPool; + const gender = randInt(2) === 0 ? "MALE" : "FEMALE"; + const trainerNameString = randSeedItem( + Object.values(trainerTypePool.hasOwnProperty(gender) ? trainerTypePool[gender] : trainerTypePool), + ) as string; // Some names have an '&' symbol and need to be trimmed to a single name instead of a double name const trainerNames = trainerNameString.split(" & "); return trainerNames[randInt(trainerNames.length)]; diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index c72356d88ae..26cea19070f 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -74,2651 +74,6 @@ const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass"), }; -export const trainerNamePools = { - [TrainerType.ACE_TRAINER]: [ - [ - "Aaron", - "Allen", - "Blake", - "Brian", - "Gaven", - "Jake", - "Kevin", - "Mike", - "Nick", - "Paul", - "Ryan", - "Sean", - "Darin", - "Albert", - "Berke", - "Clyde", - "Edgar", - "George", - "Leroy", - "Owen", - "Parker", - "Randall", - "Ruben", - "Samuel", - "Vincent", - "Warren", - "Wilton", - "Zane", - "Alfred", - "Braxton", - "Felix", - "Gerald", - "Jonathan", - "Leonel", - "Marcel", - "Mitchell", - "Quincy", - "Roderick", - "Colby", - "Rolando", - "Yuji", - "Abel", - "Anton", - "Arthur", - "Cesar", - "Dalton", - "Dennis", - "Ernest", - "Garrett", - "Graham", - "Henry", - "Isaiah", - "Jonah", - "Jose", - "Keenan", - "Micah", - "Omar", - "Quinn", - "Rodolfo", - "Saul", - "Sergio", - "Skylar", - "Stefan", - "Zachery", - "Alton", - "Arabella", - "Bonita", - "Cal", - "Cody", - "French", - "Kobe", - "Paulo", - "Shaye", - "Austin", - "Beckett", - "Charlie", - "Corky", - "David", - "Dwayne", - "Elmer", - "Jesse", - "Jared", - "Johan", - "Jordan", - "Kipp", - "Lou", - "Terry", - "Tom", - "Webster", - "Billy", - "Doyle", - "Enzio", - "Geoff", - "Grant", - "Kelsey", - "Miguel", - "Pierce", - "Ray", - "Santino", - "Shel", - "Adelbert", - "Bence", - "Emil", - "Evan", - "Mathis", - "Maxim", - "Neil", - "Rico", - "Robbie", - "Theo", - "Viktor", - "Benedict", - "Cornelius", - "Hisato", - "Leopold", - "Neville", - "Vito", - "Chase", - "Cole", - "Hiroshi", - "Jackson", - "Jim", - "Kekoa", - "Makana", - "Yuki", - "Elwood", - "Seth", - "Alvin", - "Arjun", - "Arnold", - "Cameron", - "Carl", - "Carlton", - "Christopher", - "Dave", - "Dax", - "Dominic", - "Edmund", - "Finn", - "Fred", - "Garret", - "Grayson", - "Jace", - "Jaxson", - "Jay", - "Jirard", - "Johnson", - "Kayden", - "Kite", - "Louis", - "Mac", - "Marty", - "Percy", - "Raymond", - "Ronnie", - "Satch", - "Tim", - "Zach", - "Conner", - "Vince", - "Bedro", - "Boda", - "Botan", - "Daras", - "Dury", - "Herton", - "Rewn", - "Stum", - "Tock", - "Trilo", - "Berki", - "Cruik", - "Dazon", - "Desid", - "Dillot", - "Farfin", - "Forgon", - "Hebel", - "Morfon", - "Moril", - "Shadd", - "Vanhub", - "Bardo", - "Carben", - "Degin", - "Gorps", - "Klept", - "Lask", - "Malex", - "Mopar", - "Niled", - "Noxon", - "Teslor", - "Tetil", - ], - [ - "Beth", - "Carol", - "Cybil", - "Emma", - "Fran", - "Gwen", - "Irene", - "Jenn", - "Joyce", - "Kate", - "Kelly", - "Lois", - "Lola", - "Megan", - "Quinn", - "Reena", - "Cara", - "Alexa", - "Brooke", - "Caroline", - "Elaine", - "Hope", - "Jennifer", - "Jody", - "Julie", - "Lori", - "Mary", - "Michelle", - "Shannon", - "Wendy", - "Alexia", - "Alicia", - "Athena", - "Carolina", - "Cristin", - "Darcy", - "Dianne", - "Halle", - "Jazmyn", - "Katelynn", - "Keira", - "Marley", - "Allyson", - "Kathleen", - "Naomi", - "Alyssa", - "Ariana", - "Brandi", - "Breanna", - "Brenda", - "Brenna", - "Catherine", - "Clarice", - "Dana", - "Deanna", - "Destiny", - "Jamie", - "Jasmin", - "Kassandra", - "Laura", - "Maria", - "Mariah", - "Maya", - "Meagan", - "Mikayla", - "Monique", - "Natasha", - "Olivia", - "Sandra", - "Savannah", - "Sydney", - "Moira", - "Piper", - "Salma", - "Allison", - "Beverly", - "Cathy", - "Cheyenne", - "Clara", - "Dara", - "Eileen", - "Glinda", - "Junko", - "Lena", - "Lucille", - "Mariana", - "Olwen", - "Shanta", - "Stella", - "Angi", - "Belle", - "Chandra", - "Cora", - "Eve", - "Jacqueline", - "Jeanne", - "Juliet", - "Kathrine", - "Layla", - "Lucca", - "Melina", - "Miki", - "Nina", - "Sable", - "Shelly", - "Summer", - "Trish", - "Vicki", - "Alanza", - "Cordelia", - "Hilde", - "Imelda", - "Michele", - "Mireille", - "Claudia", - "Constance", - "Harriet", - "Honor", - "Melba", - "Portia", - "Alexis", - "Angela", - "Karla", - "Lindsey", - "Tori", - "Sheri", - "Jada", - "Kailee", - "Amanda", - "Annie", - "Kindra", - "Kyla", - "Sofia", - "Yvette", - "Becky", - "Flora", - "Gloria", - "Buna", - "Ferda", - "Lehan", - "Liqui", - "Lomen", - "Neira", - "Atilo", - "Detta", - "Gilly", - "Gosney", - "Levens", - "Moden", - "Rask", - "Rateis", - "Rosno", - "Tynan", - "Veron", - "Zoel", - "Cida", - "Dibsin", - "Dodin", - "Ebson", - "Equin", - "Flostin", - "Gabsen", - "Halsion", - "Hileon", - "Quelor", - "Rapeel", - "Roze", - "Tensin", - ], - ], - [TrainerType.ARTIST]: [ - ["Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan"], - ["Georgia"], - ], - [TrainerType.BACKERS]: [ - ["Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art"], - [ - "Ai & Ciel", - "Ami & Eira", - "Cam & Abby", - "Fey & Sue", - "Kat & Phae", - "Kay & Ali", - "Ava & Aya", - "Cleo & Rio", - "May & Mal", - ], - ], - [TrainerType.BACKPACKER]: [ - [ - "Alexander", - "Carlos", - "Herman", - "Jerome", - "Keane", - "Kelsey", - "Kiyo", - "Michael", - "Nate", - "Peter", - "Sam", - "Stephen", - "Talon", - "Terrance", - "Toru", - "Waylon", - "Boone", - "Clifford", - "Ivan", - "Kendall", - "Lowell", - "Randall", - "Reece", - "Roland", - "Shane", - "Walt", - "Farid", - "Heike", - "Joren", - "Lane", - "Roderick", - "Darnell", - "Deon", - "Emory", - "Graeme", - "Grayson", - "Aitor", - "Alex", - "Arturo", - "Asier", - "Jaime", - "Jonathan", - "Julio", - "Kevin", - "Kosuke", - "Lander", - "Markel", - "Mateo", - "Nil", - "Pau", - "Samuel", - ], - [ - "Anna", - "Corin", - "Elaine", - "Emi", - "Jill", - "Kumiko", - "Liz", - "Lois", - "Lora", - "Molly", - "Patty", - "Ruth", - "Vicki", - "Annie", - "Blossom", - "Clara", - "Eileen", - "Mae", - "Myra", - "Rachel", - "Tami", - "Ashley", - "Mikiko", - "Kiana", - "Perdy", - "Maria", - "Yuho", - "Peren", - "Barbara", - "Diane", - ], - ], - [TrainerType.BAKER]: ["Chris", "Jenn", "Lilly"], - [TrainerType.BEAUTY]: [ - "Cassie", - "Julia", - "Olivia", - "Samantha", - "Valerie", - "Victoria", - "Bridget", - "Connie", - "Jessica", - "Johanna", - "Melissa", - "Sheila", - "Shirley", - "Tiffany", - "Namiko", - "Thalia", - "Grace", - "Lola", - "Lori", - "Maura", - "Tamia", - "Cyndy", - "Devon", - "Gabriella", - "Harley", - "Lindsay", - "Nicola", - "Callie", - "Charlotte", - "Kassandra", - "December", - "Fleming", - "Nikola", - "Aimee", - "Anais", - "Brigitte", - "Cassandra", - "Andrea", - "Brittney", - "Carolyn", - "Krystal", - "Alexis", - "Alice", - "Aina", - "Anya", - "Arianna", - "Aubrey", - "Beverly", - "Camille", - "Beauty", - "Evette", - "Hansol", - "Haruka", - "Jill", - "Jo", - "Lana", - "Lois", - "Lucy", - "Mai", - "Nickie", - "Nicole", - "Prita", - "Rose", - "Shelly", - "Suzy", - "Tessa", - "Anita", - "Alissa", - "Rita", - "Cudsy", - "Eloff", - "Miru", - "Minot", - "Nevah", - "Niven", - "Ogoin", - ], - [TrainerType.BIKER]: [ - "Charles", - "Dwayne", - "Glenn", - "Harris", - "Joel", - "Riley", - "Zeke", - "Alex", - "Billy", - "Ernest", - "Gerald", - "Hideo", - "Isaac", - "Jared", - "Jaren", - "Jaxon", - "Jordy", - "Lao", - "Lukas", - "Malik", - "Nikolas", - "Ricardo", - "Ruben", - "Virgil", - "William", - "Aiden", - "Dale", - "Dan", - "Jacob", - "Markey", - "Reese", - "Teddy", - "Theron", - "Jeremy", - "Morgann", - "Phillip", - "Philip", - "Stanley", - "Dillon", - ], - [TrainerType.BLACK_BELT]: [ - [ - "Kenji", - "Lao", - "Lung", - "Nob", - "Wai", - "Yoshi", - "Atsushi", - "Daisuke", - "Hideki", - "Hitoshi", - "Kiyo", - "Koichi", - "Koji", - "Yuji", - "Cristian", - "Rhett", - "Takao", - "Theodore", - "Zander", - "Aaron", - "Hugh", - "Mike", - "Nicolas", - "Shea", - "Takashi", - "Adam", - "Carl", - "Colby", - "Darren", - "David", - "Davon", - "Derek", - "Eddie", - "Gregory", - "Griffin", - "Jarrett", - "Jeffery", - "Kendal", - "Kyle", - "Luke", - "Miles", - "Nathaniel", - "Philip", - "Rafael", - "Ray", - "Ricky", - "Sean", - "Willie", - "Ander", - "Manford", - "Benjamin", - "Corey", - "Edward", - "Grant", - "Jay", - "Kendrew", - "Kentaro", - "Ryder", - "Teppei", - "Thomas", - "Tyrone", - "Andrey", - "Donny", - "Drago", - "Gordon", - "Grigor", - "Jeriel", - "Kenneth", - "Martell", - "Mathis", - "Rich", - "Rocky", - "Rodrigo", - "Wesley", - "Zachery", - "Alonzo", - "Cadoc", - "Gunnar", - "Igor", - "Killian", - "Markus", - "Ricardo", - "Yanis", - "Banting", - "Clayton", - "Duane", - "Earl", - "Greg", - "Roy", - "Terry", - "Tracy", - "Walter", - "Alvaro", - "Curtis", - "Francis", - "Ross", - "Brice", - "Cheng", - "Dudley", - "Eric", - "Kano", - "Masahiro", - "Randy", - "Ryuji", - "Steve", - "Tadashi", - "Wong", - "Yuen", - "Brian", - "Carter", - "Reece", - "Nick", - "Yang", - ], - [ - "Cora", - "Cyndy", - "Jill", - "Laura", - "Sadie", - "Tessa", - "Vivian", - "Aisha", - "Callie", - "Danielle", - "Helene", - "Jocelyn", - "Lilith", - "Paula", - "Reyna", - "Helen", - "Kelsey", - "Tyler", - "Amy", - "Chandra", - "Hillary", - "Janie", - "Lee", - "Maggie", - "Mikiko", - "Miriam", - "Sharon", - "Susie", - "Xiao", - "Alize", - "Azra", - "Brenda", - "Chalina", - "Chan", - "Glinda", - "Maki", - "Tia", - "Tiffany", - "Wendy", - "Andrea", - "Gabrielle", - "Gerardine", - "Hailey", - "Hedvig", - "Justine", - "Kinsey", - "Sigrid", - "Veronique", - "Tess", - ], - ], - [TrainerType.BREEDER]: [ - [ - "Isaac", - "Myles", - "Salvadore", - "Albert", - "Kahlil", - "Eustace", - "Galen", - "Owen", - "Addison", - "Marcus", - "Foster", - "Cory", - "Glenn", - "Jay", - "Wesley", - "William", - "Adrian", - "Bradley", - "Jaime", - ], - [ - "Allison", - "Alize", - "Bethany", - "Lily", - "Lydia", - "Gabrielle", - "Jayden", - "Pat", - "Veronica", - "Amber", - "Jennifer", - "Kaylee", - "Adelaide", - "Brooke", - "Ethel", - "April", - "Irene", - "Magnolia", - "Amala", - "Mercy", - "Amanda", - "Ikue", - "Savannah", - "Yuka", - "Chloe", - "Debra", - "Denise", - "Elena", - ], - ], - [TrainerType.CLERK]: [ - [ - "Chaz", - "Clemens", - "Doug", - "Fredric", - "Ivan", - "Isaac", - "Nelson", - "Wade", - "Warren", - "Augustin", - "Gilligan", - "Cody", - "Jeremy", - "Shane", - "Dugal", - "Royce", - "Ronald", - ], - [ - "Alberta", - "Ingrid", - "Katie", - "Piper", - "Trisha", - "Wren", - "Britney", - "Lana", - "Jessica", - "Kristen", - "Michelle", - "Gabrielle", - ], - ], - [TrainerType.CYCLIST]: [ - ["Axel", "James", "John", "Ryan", "Hector", "Jeremiah"], - ["Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide"], - ], - [TrainerType.DANCER]: [ - "Brian", - "Davey", - "Dirk", - "Edmond", - "Mickey", - "Raymond", - "Cara", - "Julia", - "Maika", - "Mireille", - "Ronda", - "Zoe", - ], - [TrainerType.DEPOT_AGENT]: ["Josh", "Hank", "Vincent"], - [TrainerType.DOCTOR]: [ - ["Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham"], - ["Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah"], - ], - [TrainerType.FIREBREATHER]: ["Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt"], - [TrainerType.FISHERMAN]: [ - "Andre", - "Arnold", - "Barney", - "Chris", - "Edgar", - "Henry", - "Jonah", - "Justin", - "Kyle", - "Martin", - "Marvin", - "Ralph", - "Raymond", - "Scott", - "Stephen", - "Wilton", - "Tully", - "Andrew", - "Barny", - "Carter", - "Claude", - "Dale", - "Elliot", - "Eugene", - "Ivan", - "Ned", - "Nolan", - "Roger", - "Ronald", - "Wade", - "Wayne", - "Darian", - "Kai", - "Chip", - "Hank", - "Kaden", - "Tommy", - "Tylor", - "Alec", - "Brett", - "Cameron", - "Cody", - "Cole", - "Cory", - "Erick", - "George", - "Joseph", - "Juan", - "Kenneth", - "Luc", - "Miguel", - "Travis", - "Walter", - "Zachary", - "Josh", - "Gideon", - "Kyler", - "Liam", - "Murphy", - "Bruce", - "Damon", - "Devon", - "Hubert", - "Jones", - "Lydon", - "Mick", - "Pete", - "Sean", - "Sid", - "Vince", - "Bucky", - "Dean", - "Eustace", - "Kenzo", - "Leroy", - "Mack", - "Ryder", - "Ewan", - "Finn", - "Murray", - "Seward", - "Shad", - "Wharton", - "Finley", - "Fisher", - "Fisk", - "River", - "Sheaffer", - "Timin", - "Carl", - "Ernest", - "Hal", - "Herbert", - "Hisato", - "Mike", - "Vernon", - "Harriet", - "Marina", - "Chase", - ], - [TrainerType.GUITARIST]: [ - "Anna", - "Beverly", - "January", - "Tina", - "Alicia", - "Claudia", - "Julia", - "Lidia", - "Mireia", - "Noelia", - "Sara", - "Sheila", - "Tatiana", - ], - [TrainerType.HARLEQUIN]: [ - "Charley", - "Ian", - "Jack", - "Kerry", - "Louis", - "Pat", - "Paul", - "Rick", - "Anders", - "Clarence", - "Gary", - ], - [TrainerType.HIKER]: [ - "Anthony", - "Bailey", - "Benjamin", - "Daniel", - "Erik", - "Jim", - "Kenny", - "Leonard", - "Michael", - "Parry", - "Phillip", - "Russell", - "Sidney", - "Tim", - "Timothy", - "Alan", - "Brice", - "Clark", - "Eric", - "Lenny", - "Lucas", - "Mike", - "Trent", - "Devan", - "Eli", - "Marc", - "Sawyer", - "Allen", - "Daryl", - "Dudley", - "Earl", - "Franklin", - "Jeremy", - "Marcos", - "Nob", - "Oliver", - "Wayne", - "Alexander", - "Damon", - "Jonathan", - "Justin", - "Kevin", - "Lorenzo", - "Louis", - "Maurice", - "Nicholas", - "Reginald", - "Robert", - "Theodore", - "Bruce", - "Clarke", - "Devin", - "Dwight", - "Edwin", - "Eoin", - "Noland", - "Russel", - "Andy", - "Bret", - "Darrell", - "Gene", - "Hardy", - "Hugh", - "Jebediah", - "Jeremiah", - "Kit", - "Neil", - "Terrell", - "Don", - "Doug", - "Hunter", - "Jared", - "Jerome", - "Keith", - "Manuel", - "Markus", - "Otto", - "Shelby", - "Stephen", - "Teppei", - "Tobias", - "Wade", - "Zaiem", - "Aaron", - "Alain", - "Bergin", - "Bernard", - "Brent", - "Corwin", - "Craig", - "Delmon", - "Dunstan", - "Orestes", - "Ross", - "Davian", - "Calhoun", - "David", - "Gabriel", - "Ryan", - "Thomas", - "Travis", - "Zachary", - "Anuhea", - "Barnaby", - "Claus", - "Collin", - "Colson", - "Dexter", - "Dillan", - "Eugine", - "Farkas", - "Hisato", - "Julius", - "Kenji", - "Irwin", - "Lionel", - "Paul", - "Richter", - "Valentino", - "Donald", - "Douglas", - "Kevyn", - "Chester", - ], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] - [TrainerType.HOOLIGANS]: ["Jim & Cas", "Rob & Sal"], - [TrainerType.HOOPSTER]: ["Bobby", "John", "Lamarcus", "Derrick", "Nicolas"], - [TrainerType.INFIELDER]: ["Alex", "Connor", "Todd"], - [TrainerType.JANITOR]: ["Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn"], - [TrainerType.LINEBACKER]: ["Bob", "Dan", "Jonah"], - [TrainerType.MAID]: ["Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy"], - [TrainerType.MUSICIAN]: [ - "Boris", - "Preston", - "Charles", - "Clyde", - "Vincent", - "Dalton", - "Kirk", - "Shawn", - "Fabian", - "Fernando", - "Joseph", - "Marcos", - "Arturo", - "Jerry", - "Lonnie", - "Tony", - ], - [TrainerType.NURSERY_AIDE]: [ - "Autumn", - "Briana", - "Leah", - "Miho", - "Ethel", - "Hollie", - "Ilse", - "June", - "Kimya", - "Rosalyn", - ], - [TrainerType.OFFICER]: [ - "Dirk", - "Keith", - "Alex", - "Bobby", - "Caleb", - "Danny", - "Dylan", - "Thomas", - "Daniel", - "Jeff", - "Braven", - "Dell", - "Neagle", - "Haruki", - "Mitchell", - "Raymond", - ], - [TrainerType.PARASOL_LADY]: [ - "Angelica", - "Clarissa", - "Madeline", - "Akari", - "Annabell", - "Kayley", - "Rachel", - "Alexa", - "Sabrina", - "April", - "Gwyneth", - "Laura", - "Lumi", - "Mariah", - "Melita", - "Nicole", - "Tihana", - "Ingrid", - "Tyra", - ], - [TrainerType.PILOT]: ["Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow"], - [TrainerType.POKEFAN]: [ - [ - "Alex", - "Allan", - "Brandon", - "Carter", - "Colin", - "Derek", - "Jeremy", - "Joshua", - "Rex", - "Robert", - "Trevor", - "William", - "Colton", - "Miguel", - "Francisco", - "Kaleb", - "Leonard", - "Boone", - "Elliot", - "Jude", - "Norbert", - "Corey", - "Gabe", - "Baxter", - ], - [ - "Beverly", - "Georgia", - "Jaime", - "Ruth", - "Isabel", - "Marissa", - "Vanessa", - "Annika", - "Bethany", - "Kimberly", - "Meredith", - "Rebekah", - "Eleanor", - "Darcy", - "Lydia", - "Sachiko", - "Abigail", - "Agnes", - "Lydie", - "Roisin", - "Tara", - "Carmen", - "Janet", - ], - ], - [TrainerType.PRESCHOOLER]: [ - [ - "Billy", - "Doyle", - "Evan", - "Homer", - "Tully", - "Albert", - "Buster", - "Greg", - "Ike", - "Jojo", - "Tyrone", - "Adrian", - "Oliver", - "Hayden", - "Hunter", - "Kaleb", - "Liam", - "Dylan", - ], - [ - "Juliet", - "Mia", - "Sarah", - "Wendy", - "Winter", - "Chrissy", - "Eva", - "Lin", - "Samantha", - "Ella", - "Lily", - "Natalie", - "Ailey", - "Hannah", - "Malia", - "Kindra", - "Nancy", - ], - ], - [TrainerType.PSYCHIC]: [ - [ - "Fidel", - "Franklin", - "Gilbert", - "Greg", - "Herman", - "Jared", - "Mark", - "Nathan", - "Norman", - "Phil", - "Richard", - "Rodney", - "Cameron", - "Edward", - "Fritz", - "Joshua", - "Preston", - "Virgil", - "William", - "Alvaro", - "Blake", - "Cedric", - "Keenan", - "Nicholas", - "Dario", - "Johan", - "Lorenzo", - "Tyron", - "Bryce", - "Corbin", - "Deandre", - "Elijah", - "Kody", - "Landon", - "Maxwell", - "Mitchell", - "Sterling", - "Eli", - "Nelson", - "Vernon", - "Gaven", - "Gerard", - "Low", - "Micki", - "Perry", - "Rudolf", - "Tommy", - "Al", - "Nandor", - "Tully", - "Arthur", - "Emanuel", - "Franz", - "Harry", - "Paschal", - "Robert", - "Sayid", - "Angelo", - "Anton", - "Arin", - "Avery", - "Danny", - "Frasier", - "Harrison", - "Jaime", - "Ross", - "Rui", - "Vlad", - "Mason", - ], - [ - "Alexis", - "Hannah", - "Jacki", - "Jaclyn", - "Kayla", - "Maura", - "Samantha", - "Alix", - "Brandi", - "Edie", - "Macey", - "Mariella", - "Marlene", - "Laura", - "Rodette", - "Abigail", - "Brittney", - "Chelsey", - "Daisy", - "Desiree", - "Kendra", - "Lindsey", - "Rachael", - "Valencia", - "Belle", - "Cybil", - "Doreen", - "Dua", - "Future", - "Lin", - "Madhu", - "Alia", - "Ena", - "Joyce", - "Lynette", - "Olesia", - "Sarah", - ], - ], - [TrainerType.RANGER]: [ - [ - "Carlos", - "Jackson", - "Sebastian", - "Gav", - "Lorenzo", - "Logan", - "Nicolas", - "Trenton", - "Deshawn", - "Dwayne", - "Jeffery", - "Kyler", - "Taylor", - "Alain", - "Claude", - "Crofton", - "Forrest", - "Harry", - "Jaden", - "Keith", - "Lewis", - "Miguel", - "Pedro", - "Ralph", - "Richard", - "Bret", - "Daryl", - "Eddie", - "Johan", - "Leaf", - "Louis", - "Maxwell", - "Parker", - "Rick", - "Steve", - "Bjorn", - "Chaise", - "Dean", - "Lee", - "Maurice", - "Nash", - "Ralf", - "Reed", - "Shinobu", - "Silas", - ], - [ - "Catherine", - "Jenna", - "Sophia", - "Merdith", - "Nora", - "Beth", - "Chelsea", - "Katelyn", - "Madeline", - "Allison", - "Ashlee", - "Felicia", - "Krista", - "Annie", - "Audra", - "Brenda", - "Chloris", - "Eliza", - "Heidi", - "Irene", - "Mary", - "Mylene", - "Shanti", - "Shelly", - "Thalia", - "Anja", - "Briana", - "Dianna", - "Elaine", - "Elle", - "Hillary", - "Katie", - "Lena", - "Lois", - "Malory", - "Melita", - "Mikiko", - "Naoko", - "Serenity", - "Ambre", - "Brooke", - "Clementine", - "Melina", - "Petra", - "Twiggy", - ], - ], - [TrainerType.RICH]: [ - [ - "Alfred", - "Edward", - "Gregory", - "Preston", - "Thomas", - "Tucker", - "Walter", - "Clifford", - "Everett", - "Micah", - "Nate", - "Pierre", - "Terrance", - "Arthur", - "Brooks", - "Emanuel", - "Lamar", - "Jeremy", - "Leonardo", - "Milton", - "Frederic", - "Renaud", - "Robert", - "Yan", - "Daniel", - "Sheldon", - "Stonewall", - "Gerald", - "Ronald", - "Smith", - "Stanley", - "Reginald", - "Orson", - "Wilco", - "Caden", - "Glenn", - ], - [ - "Rebecca", - "Reina", - "Cassandra", - "Emilia", - "Grace", - "Marian", - "Elizabeth", - "Kathleen", - "Sayuri", - "Caroline", - "Judy", - ], - ], - [TrainerType.RICH_KID]: [ - [ - "Garret", - "Winston", - "Dawson", - "Enrique", - "Jason", - "Roman", - "Trey", - "Liam", - "Anthony", - "Brad", - "Cody", - "Manuel", - "Martin", - "Pierce", - "Rolan", - "Keenan", - "Filbert", - "Antoin", - "Cyus", - "Diek", - "Dugo", - "Flitz", - "Jurek", - "Lond", - "Perd", - "Quint", - "Basto", - "Benit", - "Brot", - "Denc", - "Guyit", - "Marcon", - "Perc", - "Puros", - "Roex", - "Sainz", - "Symin", - "Tark", - "Venak", - ], - [ - "Anette", - "Brianna", - "Cindy", - "Colleen", - "Daphne", - "Elizabeth", - "Naomi", - "Sarah", - "Charlotte", - "Gillian", - "Jacki", - "Lady", - "Melissa", - "Celeste", - "Colette", - "Elizandra", - "Isabel", - "Lynette", - "Magnolia", - "Sophie", - "Lina", - "Dulcie", - "Auro", - "Brin", - "Caril", - "Eloos", - "Gwin", - "Illa", - "Kowly", - "Rima", - "Ristin", - "Vesey", - "Brena", - "Deasy", - "Denslon", - "Kylet", - "Nemi", - "Rene", - "Sanol", - "Stouner", - "Sturk", - "Talmen", - "Zoila", - ], - ], - [TrainerType.ROUGHNECK]: [ - "Camron", - "Corey", - "Gabriel", - "Isaiah", - "Jamal", - "Koji", - "Luke", - "Paxton", - "Raul", - "Zeek", - "Kirby", - "Chance", - "Dave", - "Fletcher", - "Johnny", - "Reese", - "Joey", - "Ricky", - "Silvester", - "Martin", - ], - [TrainerType.SAILOR]: [ - "Alberto", - "Bost", - "Brennan", - "Brenden", - "Claude", - "Cory", - "Damian", - "Dirk", - "Duncan", - "Dwayne", - "Dylan", - "Eddie", - "Edmond", - "Elijah", - "Ernest", - "Eugene", - "Garrett", - "Golos", - "Gratin", - "Grestly", - "Harry", - "Hols", - "Hudson", - "Huey", - "Jebol", - "Jeff", - "Leonald", - "Luther", - "Kelvin", - "Kenneth", - "Kent", - "Knook", - "Marc", - "Mifis", - "Monar", - "Morkor", - "Ordes", - "Oxlin", - "Parker", - "Paul", - "Philip", - "Roberto", - "Samson", - "Skyler", - "Stanly", - "Tebu", - "Terrell", - "Trevor", - "Yasu", - "Zachariah", - ], - [TrainerType.SCIENTIST]: [ - [ - "Jed", - "Marc", - "Mitch", - "Rich", - "Ross", - "Beau", - "Braydon", - "Connor", - "Ed", - "Ivan", - "Jerry", - "Jose", - "Joshua", - "Parker", - "Rodney", - "Taylor", - "Ted", - "Travis", - "Zackery", - "Darrius", - "Emilio", - "Fredrick", - "Shaun", - "Stefano", - "Travon", - "Daniel", - "Garett", - "Gregg", - "Linden", - "Lowell", - "Trenton", - "Dudley", - "Luke", - "Markus", - "Nathan", - "Orville", - "Randall", - "Ron", - "Ronald", - "Simon", - "Steve", - "William", - "Franklin", - "Clarke", - "Jacques", - "Terrance", - "Ernst", - "Justus", - "Ikaika", - "Jayson", - "Kyle", - "Reid", - "Tyrone", - "Adam", - "Albert", - "Alphonse", - "Cory", - "Donnie", - "Elton", - "Francis", - "Gordon", - "Herbert", - "Humphrey", - "Jordan", - "Julian", - "Keaton", - "Levi", - "Melvin", - "Murray", - "West", - "Craig", - "Coren", - "Dubik", - "Kotan", - "Lethco", - "Mante", - "Mort", - "Myron", - "Odlow", - "Ribek", - "Roeck", - "Vogi", - "Vonder", - "Zogo", - "Doimo", - "Doton", - "Durel", - "Hildon", - "Kukla", - "Messa", - "Nanot", - "Platen", - "Raburn", - "Reman", - "Acrod", - "Coffy", - "Elrok", - "Foss", - "Hardig", - "Hombol", - "Hospel", - "Kaller", - "Klots", - "Krilok", - "Limar", - "Loket", - "Mesak", - "Morbit", - "Newin", - "Orill", - "Tabor", - "Tekot", - ], - [ - "Blythe", - "Chan", - "Kathrine", - "Marie", - "Maria", - "Naoko", - "Samantha", - "Satomi", - "Shannon", - "Athena", - "Caroline", - "Lumi", - "Lumina", - "Marissa", - "Sonia", - ], - ], - [TrainerType.SMASHER]: ["Aspen", "Elena", "Mari", "Amy", "Lizzy"], - [TrainerType.SNOW_WORKER]: [ - [ - "Braden", - "Brendon", - "Colin", - "Conrad", - "Dillan", - "Gary", - "Gerardo", - "Holden", - "Jackson", - "Mason", - "Quentin", - "Willy", - "Noel", - "Arnold", - "Brady", - "Brand", - "Cairn", - "Cliff", - "Don", - "Eddie", - "Felix", - "Filipe", - "Glenn", - "Gus", - "Heath", - "Matthew", - "Patton", - "Rich", - "Rob", - "Ryan", - "Scott", - "Shelby", - "Sterling", - "Tyler", - "Victor", - "Zack", - "Friedrich", - "Herman", - "Isaac", - "Leo", - "Maynard", - "Mitchell", - "Morgann", - "Nathan", - "Niel", - "Pasqual", - "Paul", - "Tavarius", - "Tibor", - "Dimitri", - "Narek", - "Yusif", - "Frank", - "Jeff", - "Vaclav", - "Ovid", - "Francis", - "Keith", - "Russel", - "Sangon", - "Toway", - "Bomber", - "Chean", - "Demit", - "Hubor", - "Kebile", - "Laber", - "Ordo", - "Retay", - "Ronix", - "Wagel", - "Dobit", - "Kaster", - "Lobel", - "Releo", - "Saken", - "Rustix", - ], - ["Georgia", "Sandra", "Yvonne"], - ], - [TrainerType.STRIKER]: ["Marco", "Roberto", "Tony"], - [TrainerType.SCHOOL_KID]: [ - [ - "Alan", - "Billy", - "Chad", - "Danny", - "Dudley", - "Jack", - "Joe", - "Johnny", - "Kipp", - "Nate", - "Ricky", - "Tommy", - "Jerry", - "Paul", - "Ted", - "Chance", - "Esteban", - "Forrest", - "Harrison", - "Connor", - "Sherman", - "Torin", - "Travis", - "Al", - "Carter", - "Edgar", - "Jem", - "Sammy", - "Shane", - "Shayne", - "Alvin", - "Keston", - "Neil", - "Seymour", - "William", - "Carson", - "Clark", - "Nolan", - ], - [ - "Georgia", - "Karen", - "Meiko", - "Christine", - "Mackenzie", - "Tiera", - "Ann", - "Gina", - "Lydia", - "Marsha", - "Millie", - "Sally", - "Serena", - "Silvia", - "Alberta", - "Cassie", - "Mara", - "Rita", - "Georgie", - "Meena", - "Nitzel", - ], - ], - [TrainerType.SWIMMER]: [ - [ - "Berke", - "Cameron", - "Charlie", - "George", - "Harold", - "Jerome", - "Kirk", - "Mathew", - "Parker", - "Randall", - "Seth", - "Simon", - "Tucker", - "Austin", - "Barry", - "Chad", - "Cody", - "Darrin", - "David", - "Dean", - "Douglas", - "Franklin", - "Gilbert", - "Herman", - "Jack", - "Luis", - "Matthew", - "Reed", - "Richard", - "Rodney", - "Roland", - "Spencer", - "Stan", - "Tony", - "Clarence", - "Declan", - "Dominik", - "Harrison", - "Kevin", - "Leonardo", - "Nolen", - "Pete", - "Santiago", - "Axle", - "Braden", - "Finn", - "Garrett", - "Mymo", - "Reece", - "Samir", - "Toby", - "Adrian", - "Colton", - "Dillon", - "Erik", - "Evan", - "Francisco", - "Glenn", - "Kurt", - "Oscar", - "Ricardo", - "Sam", - "Sheltin", - "Troy", - "Vincent", - "Wade", - "Wesley", - "Duane", - "Elmo", - "Esteban", - "Frankie", - "Ronald", - "Tyson", - "Bart", - "Matt", - "Tim", - "Wright", - "Jeffery", - "Kyle", - "Alessandro", - "Estaban", - "Kieran", - "Ramses", - "Casey", - "Dakota", - "Jared", - "Kalani", - "Keoni", - "Lawrence", - "Logan", - "Robert", - "Roddy", - "Yasu", - "Derek", - "Jacob", - "Bruce", - "Clayton", - ], - [ - "Briana", - "Dawn", - "Denise", - "Diana", - "Elaine", - "Kara", - "Kaylee", - "Lori", - "Nicole", - "Nikki", - "Paula", - "Susie", - "Wendy", - "Alice", - "Beth", - "Beverly", - "Brenda", - "Dana", - "Debra", - "Grace", - "Jenny", - "Katie", - "Laurel", - "Linda", - "Missy", - "Sharon", - "Tanya", - "Tara", - "Tisha", - "Carlee", - "Imani", - "Isabelle", - "Kyla", - "Sienna", - "Abigail", - "Amara", - "Anya", - "Connie", - "Maria", - "Melissa", - "Nora", - "Shirley", - "Shania", - "Tiffany", - "Aubree", - "Cassandra", - "Claire", - "Crystal", - "Erica", - "Gabrielle", - "Haley", - "Jessica", - "Joanna", - "Lydia", - "Mallory", - "Mary", - "Miranda", - "Paige", - "Sophia", - "Vanessa", - "Chelan", - "Debbie", - "Joy", - "Kendra", - "Leona", - "Mina", - "Caroline", - "Joyce", - "Larissa", - "Rebecca", - "Tyra", - "Dara", - "Desiree", - "Kaoru", - "Ruth", - "Coral", - "Genevieve", - "Isla", - "Marissa", - "Romy", - "Sheryl", - "Alexandria", - "Alicia", - "Chelsea", - "Jade", - "Kelsie", - "Laura", - "Portia", - "Shelby", - "Sara", - "Tiare", - "Kyra", - "Natasha", - "Layla", - "Scarlett", - "Cora", - ], - ], - [TrainerType.TWINS]: [ - "Amy & May", - "Jo & Zoe", - "Meg & Peg", - "Ann & Anne", - "Lea & Pia", - "Amy & Liv", - "Gina & Mia", - "Miu & Yuki", - "Tori & Tia", - "Eli & Anne", - "Jen & Kira", - "Joy & Meg", - "Kiri & Jan", - "Miu & Mia", - "Emma & Lil", - "Liv & Liz", - "Teri & Tia", - "Amy & Mimi", - "Clea & Gil", - "Day & Dani", - "Kay & Tia", - "Tori & Til", - "Saya & Aya", - "Emy & Lin", - "Kumi & Amy", - "Mayo & May", - "Ally & Amy", - "Lia & Lily", - "Rae & Ula", - "Sola & Ana", - "Tara & Val", - "Faith & Joy", - "Nana & Nina", - ], - [TrainerType.VETERAN]: [ - [ - "Armando", - "Brenden", - "Brian", - "Clayton", - "Edgar", - "Emanuel", - "Grant", - "Harlan", - "Terrell", - "Arlen", - "Chester", - "Hugo", - "Martell", - "Ray", - "Shaun", - "Abraham", - "Carter", - "Claude", - "Jerry", - "Lucius", - "Murphy", - "Rayne", - "Ron", - "Sinan", - "Sterling", - "Vincent", - "Zach", - "Gerard", - "Gilles", - "Louis", - "Timeo", - "Akira", - "Don", - "Eric", - "Harry", - "Leon", - "Roger", - "Angus", - "Aristo", - "Brone", - "Johnny", - ], - [ - "Julia", - "Karla", - "Kim", - "Sayuri", - "Tiffany", - "Cathy", - "Cecile", - "Chloris", - "Denae", - "Gina", - "Maya", - "Oriana", - "Portia", - "Rhona", - "Rosaline", - "Catrina", - "Inga", - "Trisha", - "Heather", - "Lynn", - "Sheri", - "Alonsa", - "Ella", - "Leticia", - "Kiara", - ], - ], - [TrainerType.WAITER]: [ - ["Bert", "Clint", "Maxwell", "Lou"], - ["Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia"], - ], - [TrainerType.WORKER]: [ - [ - "Braden", - "Brendon", - "Colin", - "Conrad", - "Dillan", - "Gary", - "Gerardo", - "Holden", - "Jackson", - "Mason", - "Quentin", - "Willy", - "Noel", - "Arnold", - "Brady", - "Brand", - "Cairn", - "Cliff", - "Don", - "Eddie", - "Felix", - "Filipe", - "Glenn", - "Gus", - "Heath", - "Matthew", - "Patton", - "Rich", - "Rob", - "Ryan", - "Scott", - "Shelby", - "Sterling", - "Tyler", - "Victor", - "Zack", - "Friedrich", - "Herman", - "Isaac", - "Leo", - "Maynard", - "Mitchell", - "Morgann", - "Nathan", - "Niel", - "Pasqual", - "Paul", - "Tavarius", - "Tibor", - "Dimitri", - "Narek", - "Yusif", - "Frank", - "Jeff", - "Vaclav", - "Ovid", - "Francis", - "Keith", - "Russel", - "Sangon", - "Toway", - "Bomber", - "Chean", - "Demit", - "Hubor", - "Kebile", - "Laber", - "Ordo", - "Retay", - "Ronix", - "Wagel", - "Dobit", - "Kaster", - "Lobel", - "Releo", - "Saken", - "Rustix", - ], - ["Georgia", "Sandra", "Yvonne"], - ], - [TrainerType.YOUNGSTER]: [ - [ - "Albert", - "Gordon", - "Ian", - "Jason", - "Jimmy", - "Mikey", - "Owen", - "Samuel", - "Warren", - "Allen", - "Ben", - "Billy", - "Calvin", - "Dillion", - "Eddie", - "Joey", - "Josh", - "Neal", - "Timmy", - "Tommy", - "Breyden", - "Deandre", - "Demetrius", - "Dillon", - "Jaylen", - "Johnson", - "Shigenobu", - "Chad", - "Cole", - "Cordell", - "Dan", - "Dave", - "Destin", - "Nash", - "Tyler", - "Yasu", - "Austin", - "Dallas", - "Darius", - "Donny", - "Jonathon", - "Logan", - "Michael", - "Oliver", - "Sebastian", - "Tristan", - "Wayne", - "Norman", - "Roland", - "Regis", - "Abe", - "Astor", - "Keita", - "Kenneth", - "Kevin", - "Kyle", - "Lester", - "Masao", - "Nicholas", - "Parker", - "Wes", - "Zachary", - "Cody", - "Henley", - "Jaye", - "Karl", - "Kenny", - "Masahiro", - "Pedro", - "Petey", - "Sinclair", - "Terrell", - "Waylon", - "Aidan", - "Anthony", - "David", - "Jacob", - "Jayden", - "Cutler", - "Ham", - "Caleb", - "Kai", - "Honus", - "Kenway", - "Bret", - "Chris", - "Cid", - "Dennis", - "Easton", - "Ken", - "Robby", - "Ronny", - "Shawn", - "Benjamin", - "Jake", - "Travis", - "Adan", - "Aday", - "Beltran", - "Elian", - "Hernan", - "Julen", - "Luka", - "Roi", - "Bernie", - "Dustin", - "Jonathan", - "Wyatt", - ], - [ - "Alice", - "Bridget", - "Carrie", - "Connie", - "Dana", - "Ellen", - "Krise", - "Laura", - "Linda", - "Michelle", - "Shannon", - "Andrea", - "Crissy", - "Janice", - "Robin", - "Sally", - "Tiana", - "Haley", - "Ali", - "Ann", - "Dalia", - "Dawn", - "Iris", - "Joana", - "Julia", - "Kay", - "Lisa", - "Megan", - "Mikaela", - "Miriam", - "Paige", - "Reli", - "Blythe", - "Briana", - "Caroline", - "Cassidy", - "Kaitlin", - "Madeline", - "Molly", - "Natalie", - "Samantha", - "Sarah", - "Cathy", - "Dye", - "Eri", - "Eva", - "Fey", - "Kara", - "Lurleen", - "Maki", - "Mali", - "Maya", - "Miki", - "Sibyl", - "Daya", - "Diana", - "Flo", - "Helia", - "Henrietta", - "Isabel", - "Mai", - "Persephone", - "Serena", - "Anna", - "Charlotte", - "Elin", - "Elsa", - "Lise", - "Sara", - "Suzette", - "Audrey", - "Emmy", - "Isabella", - "Madison", - "Rika", - "Rylee", - "Salla", - "Ellie", - "Alexandra", - "Amy", - "Lass", - "Brittany", - "Chel", - "Cindy", - "Dianne", - "Emily", - "Emma", - "Evelyn", - "Hana", - "Harleen", - "Hazel", - "Jocelyn", - "Katrina", - "Kimberly", - "Lina", - "Marge", - "Mila", - "Mizuki", - "Rena", - "Sal", - "Satoko", - "Summer", - "Tomoe", - "Vicky", - "Yue", - "Yumi", - "Lauren", - "Rei", - "Riley", - "Lois", - "Nancy", - "Tammy", - "Terry", - ], - ], - [TrainerType.HEX_MANIAC]: [ - "Kindra", - "Patricia", - "Tammy", - "Tasha", - "Valerie", - "Alaina", - "Kathleen", - "Leah", - "Makie", - "Sylvia", - "Anina", - "Arachna", - "Carrie", - "Desdemona", - "Josette", - "Luna", - "Melanie", - "Osanna", - "Raziah", - ], -}; - // function used in a commented code // biome-ignore lint/correctness/noUnusedVariables: TODO make this into a script instead of having it be in src/data... function fetchAndPopulateTrainerNames( diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 98919ebfa93..2af3e25050f 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -14,7 +14,6 @@ import { import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; import type { PersistentModifier } from "#app/modifier/modifier"; -import { trainerNamePools } from "#app/data/trainer-names"; import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; @@ -61,11 +60,17 @@ export default class Trainer extends Phaser.GameObjects.Container { : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), this.config.partyTemplates.length - 1, ); - if (trainerNamePools.hasOwnProperty(trainerType)) { - const namePool = trainerNamePools[trainerType]; + if (i18next.exists("trainersCommon:" + TrainerType[trainerType], { returnObjects: true })) { + const namePool = i18next.t("trainersCommon:" + TrainerType[trainerType], { returnObjects: true }); this.name = name || - Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); + Utils.randSeedItem( + Object.values( + namePool.hasOwnProperty("MALE") + ? namePool[variant === TrainerVariant.FEMALE ? "FEMALE" : "MALE"] + : namePool, + ), + ); if (variant === TrainerVariant.DOUBLE) { if (this.config.doubleOnly) { if (partnerName) { @@ -74,7 +79,9 @@ export default class Trainer extends Phaser.GameObjects.Container { [this.name, this.partnerName] = this.name.split(" & "); } } else { - this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); + this.partnerName = + partnerName || + Utils.randSeedItem(Object.values(namePool.hasOwnProperty("FEMALE") ? namePool["FEMALE"] : namePool)); } } } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 92b0e15dbb9..008bd03dc9e 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -237,6 +237,7 @@ export async function initI18n(): Promise { "terrain", "titles", "trainerClasses", + "trainersCommon", "trainerNames", "tutorial", "voucher", From 35e733e87a9ab3ac09b58c6bc41d3811774ea6d8 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:30:38 -0500 Subject: [PATCH 40/48] [Test] [Refactor] [GitHub] Enable no isolate for vitest (#5566) * Reuse global scene between tests Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> * Add missing each method to mockContainer * Fix select-modifier-phase test * Sanitize overrides before tests Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> * Sanitize overrides before tests Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> * [WIP] fix things * Fix tests not working with --no-isolate * Update npm tests to use no isolate * Update test-shard-template * Update package.json Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- .github/workflows/test-shard-template.yml | 2 +- .github/workflows/tests.yml | 21 --- lefthook.yml | 2 +- package-lock.json | 174 +++++++++--------- package.json | 12 +- src/@types/DexData.ts | 16 ++ src/battle-scene.ts | 17 +- src/overrides.ts | 5 + src/system/game-data.ts | 78 ++++---- src/ui/starter-select-ui-handler.ts | 9 + test/abilities/steely_spirit.test.ts | 4 +- test/abilities/supreme_overlord.test.ts | 7 +- test/abilities/unseen_fist.test.ts | 16 +- test/abilities/wonder_skin.test.ts | 13 +- test/achievements/achievement.test.ts | 22 ++- test/battlerTags/substitute.test.ts | 28 ++- test/data/status_effect.test.ts | 6 - test/moves/copycat.test.ts | 3 +- test/moves/dynamax_cannon.test.ts | 4 +- test/moves/fusion_flare_bolt.test.ts | 19 +- test/moves/hard_press.test.ts | 4 +- test/moves/last_respects.test.ts | 7 +- test/moves/metronome.test.ts | 3 +- test/moves/rage_fist.test.ts | 4 +- test/moves/retaliate.test.ts | 4 +- test/moves/shell_side_arm.test.ts | 7 +- test/moves/spit_up.test.ts | 4 +- test/moves/tera_blast.test.ts | 8 +- test/moves/triple_arrows.test.ts | 10 +- .../mystery-encounter/encounter-test-utils.ts | 10 - test/phases/phases.test.ts | 6 +- test/phases/select-modifier-phase.test.ts | 4 +- .../plugins/api/pokerogue-account-api.test.ts | 10 +- test/plugins/api/pokerogue-admin-api.test.ts | 10 +- test/plugins/api/pokerogue-api.test.ts | 10 +- test/plugins/api/pokerogue-daily-api.test.ts | 10 +- .../api/pokerogue-savedata-api.test.ts | 10 +- .../pokerogue-session-savedata-api.test.ts | 10 +- .../api/pokerogue-system-savedata-api.test.ts | 11 +- test/pre.test.ts | 6 - test/testUtils/gameManager.ts | 34 +++- test/testUtils/gameWrapper.ts | 37 +--- test/testUtils/helpers/overridesHelper.ts | 29 +-- test/testUtils/listenersManager.ts | 41 +++++ test/testUtils/mocks/mockConsoleLog.ts | 156 ++++++++-------- test/testUtils/mocks/mockContextCanvas.ts | 26 +++ test/testUtils/mocks/mockLocalStorage.ts | 4 +- test/testUtils/mocks/mockTextureManager.ts | 2 +- .../mocks/mocksContainer/mockContainer.ts | 6 + .../mocks/mocksContainer/mockImage.ts | 2 +- .../mocks/mocksContainer/mockRectangle.ts | 3 + test/testUtils/testFileInitialization.ts | 117 ++++++++++++ test/vitest.setup.ts | 23 +-- vitest.config.ts | 30 ++- 54 files changed, 714 insertions(+), 402 deletions(-) create mode 100644 src/@types/DexData.ts delete mode 100644 test/pre.test.ts create mode 100644 test/testUtils/listenersManager.ts create mode 100644 test/testUtils/mocks/mockContextCanvas.ts create mode 100644 test/testUtils/testFileInitialization.ts diff --git a/.github/workflows/test-shard-template.yml b/.github/workflows/test-shard-template.yml index 185764c86a8..9fc41d1b965 100644 --- a/.github/workflows/test-shard-template.yml +++ b/.github/workflows/test-shard-template.yml @@ -29,4 +29,4 @@ jobs: - name: Install Node.js dependencies run: npm ci - name: Run tests - run: npx vitest --project ${{ inputs.project }} --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }} + run: npx vitest --project ${{ inputs.project }} --no-isolate --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d30d8adba38..167a108e58c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,29 +15,8 @@ on: types: [checks_requested] jobs: - pre-test: - name: Run Pre-test - runs-on: ubuntu-latest - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - with: - submodules: 'recursive' - path: tests-action - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install Node.js dependencies - working-directory: tests-action - run: npm ci - - name: Run Pre-test - working-directory: tests-action - run: npx vitest run --project pre ${{ !runner.debug && '--silent' || '' }} - run-tests: name: Run Tests - needs: [pre-test] strategy: matrix: shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] diff --git a/lefthook.yml b/lefthook.yml index 4eff2ad1f8e..aa64a176191 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -13,7 +13,7 @@ pre-push: commands: biome-lint: glob: "*.{js,ts,jsx,tsx}" - run: npx @biomejs/biome check --write --reporter=summary {push_files} --no-errors-on-unmatched + run: npx @biomejs/biome check --reporter=summary {push_files} --no-errors-on-unmatched post-merge: commands: diff --git a/package-lock.json b/package-lock.json index 87e2e150c65..40ef47965ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@types/node": "^20.12.13", "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.1.9", + "@vitest/coverage-istanbul": "^3.0.9", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", "eslint-plugin-import-x": "^4.2.1", @@ -43,7 +43,7 @@ "typescript-eslint": "^8.0.0-alpha.54", "vite": "^5.4.14", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.9", + "vitest": "^3.0.9", "vitest-canvas-mock": "^0.3.3" }, "engines": { @@ -2312,14 +2312,14 @@ } }, "node_modules/@vitest/coverage-istanbul": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.9.tgz", - "integrity": "sha512-vdYE4FkC/y2lxcN3Dcj54Bw+ericmDwiex0B8LV5F/YNYEYP1mgVwhPnHwWGAXu38qizkjOuyczKbFTALfzFKw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-3.0.9.tgz", + "integrity": "sha512-/TXh2qmOhclmVPjOnPTpIO4Xr6l2P5EwyXQygenwq4/ZQ/vPsrz+GCRZF9kBeQi6xrGcHv368Si9PGImWQawVg==", "dev": true, "license": "MIT", "dependencies": { "@istanbuljs/schema": "^0.1.3", - "debug": "^4.3.7", + "debug": "^4.4.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", @@ -2327,48 +2327,48 @@ "istanbul-reports": "^3.1.7", "magicast": "^0.3.5", "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.1.9" + "vitest": "3.0.9" } }, "node_modules/@vitest/expect": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", + "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", + "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.9", + "@vitest/spy": "3.0.9", "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" + "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0" + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "msw": { @@ -2380,51 +2380,51 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", + "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.9", - "pathe": "^1.1.2" + "@vitest/utils": "3.0.9", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", + "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" + "@vitest/pretty-format": "3.0.9", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", + "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2435,15 +2435,15 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "3.0.9", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2738,9 +2738,9 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", "dependencies": { @@ -5450,9 +5450,9 @@ } }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6308,9 +6308,9 @@ } }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -6677,23 +6677,23 @@ } }, "node_modules/vite-node": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", + "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -6720,47 +6720,48 @@ } }, "node_modules/vitest": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", + "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.9", - "@vitest/mocker": "2.1.9", - "@vitest/pretty-format": "^2.1.9", - "@vitest/runner": "2.1.9", - "@vitest/snapshot": "2.1.9", - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "debug": "^4.3.7", + "@vitest/expect": "3.0.9", + "@vitest/mocker": "3.0.9", + "@vitest/pretty-format": "^3.0.9", + "@vitest/runner": "3.0.9", + "@vitest/snapshot": "3.0.9", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", + "debug": "^4.4.0", "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.9", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.9", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.9", - "@vitest/ui": "2.1.9", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.9", + "@vitest/ui": "3.0.9", "happy-dom": "*", "jsdom": "*" }, @@ -6768,6 +6769,9 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, diff --git a/package.json b/package.json index ce9e8b4a07b..6048b0bae36 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "build": "vite build", "build:beta": "vite build --mode beta", "preview": "vite preview", - "test": "vitest run --project pre && vitest run --project main", - "test:cov": "vitest run --project pre && vitest run --project main --coverage", - "test:watch": "vitest run --project pre && vitest watch --project main --coverage", - "test:silent": "vitest run --project pre && vitest run --project main --silent", + "test": "vitest run", + "test:cov": "vitest run --coverage --no-isolate", + "test:watch": "vitest watch --coverage --no-isolate", + "test:silent": "vitest run --silent --no-isolate", "typecheck": "tsc --noEmit", "eslint": "eslint --fix .", "eslint-ci": "eslint .", @@ -36,7 +36,7 @@ "@types/node": "^20.12.13", "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.1.9", + "@vitest/coverage-istanbul": "^3.0.9", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", "eslint-plugin-import-x": "^4.2.1", @@ -50,7 +50,7 @@ "typescript-eslint": "^8.0.0-alpha.54", "vite": "^5.4.14", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.9", + "vitest": "^3.0.9", "vitest-canvas-mock": "^0.3.3" }, "dependencies": { diff --git a/src/@types/DexData.ts b/src/@types/DexData.ts new file mode 100644 index 00000000000..19bb0357471 --- /dev/null +++ b/src/@types/DexData.ts @@ -0,0 +1,16 @@ +/** + * Dex entry for a single Pokemon Species + */ +export interface DexEntry { + seenAttr: bigint; + caughtAttr: bigint; + natureAttr: number; + seenCount: number; + caughtCount: number; + hatchedCount: number; + ivs: number[]; +} + +export interface DexData { + [key: number]: DexEntry; +} diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 544dbc40350..443113daef6 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1403,7 +1403,10 @@ export default class BattleScene extends SceneBase { this.field.add(newTrainer); } } else { - if (!this.gameMode.hasTrainers) { + if ( + !this.gameMode.hasTrainers || + (Overrides.DISABLE_STANDARD_TRAINERS_OVERRIDE && isNullOrUndefined(trainerData)) + ) { newBattleType = BattleType.WILD; } else if (battleType === undefined) { newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; @@ -2721,6 +2724,18 @@ export default class BattleScene extends SceneBase { this.phaseQueue.splice(0, this.phaseQueue.length); } + /** + * Clears all phase-related stuff, including all phase queues, the current and standby phases, and a splice index + */ + clearAllPhases(): void { + for (const queue of [this.phaseQueue, this.phaseQueuePrepend, this.conditionalQueue, this.nextCommandPhaseQueue]) { + queue.splice(0, queue.length); + } + this.currentPhase = null; + this.standbyPhase = null; + this.clearPhaseQueueSplice(); + } + /** * Used by function unshiftPhase(), sets index to start inserting at current length instead of the end of the array, useful if phaseQueuePrepend gets longer with Phases */ diff --git a/src/overrides.ts b/src/overrides.ts index 882a634ff90..3a9a54e740b 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -254,6 +254,11 @@ class DefaultOverrides { * Note that, for all items in the array, `count` is not used. */ readonly ITEM_REWARD_OVERRIDE: ModifierOverride[] = []; + + /** + * If `true`, disable all non-scripted opponent trainer encounters. + */ + readonly DISABLE_STANDARD_TRAINERS_OVERRIDE: boolean = false; } export const defaultOverrides = new DefaultOverrides(); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 82ad2276fef..7845d50b2ad 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -98,12 +98,13 @@ export function getDataTypeKey(dataType: GameDataType, slotId = 0): string { switch (dataType) { case GameDataType.SYSTEM: return "data"; - case GameDataType.SESSION: + case GameDataType.SESSION: { let ret = "sessionData"; if (slotId) { ret += slotId; } return ret; + } case GameDataType.SETTINGS: return "settings"; case GameDataType.TUTORIALS: @@ -201,39 +202,6 @@ export interface DexEntry { ivs: number[]; } -export const DexAttr = { - NON_SHINY: 1n, - SHINY: 2n, - MALE: 4n, - FEMALE: 8n, - DEFAULT_VARIANT: 16n, - VARIANT_2: 32n, - VARIANT_3: 64n, - DEFAULT_FORM: 128n, -}; - -export interface DexAttrProps { - shiny: boolean; - female: boolean; - variant: Variant; - formIndex: number; -} - -export const AbilityAttr = { - ABILITY_1: 1, - ABILITY_2: 2, - ABILITY_HIDDEN: 4, -}; - -export type RunHistoryData = Record; - -export interface RunEntry { - entry: SessionSaveData; - isVictory: boolean; - /*Automatically set to false at the moment - implementation TBD*/ - isFavorite: boolean; -} - export type StarterMoveset = [Moves] | [Moves, Moves] | [Moves, Moves, Moves] | [Moves, Moves, Moves, Moves]; export interface StarterFormMoveData { @@ -260,6 +228,39 @@ export interface StarterPreferences { [key: number]: StarterAttributes; } +export interface DexAttrProps { + shiny: boolean; + female: boolean; + variant: Variant; + formIndex: number; +} + +export type RunHistoryData = Record; + +export interface RunEntry { + entry: SessionSaveData; + isVictory: boolean; + /*Automatically set to false at the moment - implementation TBD*/ + isFavorite: boolean; +} + +export const DexAttr = { + NON_SHINY: 1n, + SHINY: 2n, + MALE: 4n, + FEMALE: 8n, + DEFAULT_VARIANT: 16n, + VARIANT_2: 32n, + VARIANT_3: 64n, + DEFAULT_FORM: 128n, +}; + +export const AbilityAttr = { + ABILITY_1: 1, + ABILITY_2: 2, + ABILITY_HIDDEN: 4, +}; + // the latest data saved/loaded for the Starter Preferences. Required to reduce read/writes. Initialize as "{}", since this is the default value and no data needs to be stored if present. // if they ever add private static variables, move this into StarterPrefs const StarterPrefers_DEFAULT: string = "{}"; @@ -1553,16 +1554,18 @@ export class GameData { try { dataName = GameDataType[dataType].toLowerCase(); switch (dataType) { - case GameDataType.SYSTEM: + case GameDataType.SYSTEM: { dataStr = this.convertSystemDataStr(dataStr); const systemData = this.parseSystemData(dataStr); valid = !!systemData.dexData && !!systemData.timestamp; break; - case GameDataType.SESSION: + } + case GameDataType.SESSION: { const sessionData = this.parseSessionData(dataStr); valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; break; - case GameDataType.RUN_HISTORY: + } + case GameDataType.RUN_HISTORY: { const data = JSON.parse(dataStr); const keys = Object.keys(data); dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); @@ -1572,6 +1575,7 @@ export class GameData { ["isFavorite", "isVictory", "entry"].every(v => entryKeys.includes(v)) && entryKeys.length === 3; }); break; + } case GameDataType.SETTINGS: case GameDataType.TUTORIALS: valid = true; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 91940d3af76..1599c86aa87 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -4553,4 +4553,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { icon.setFrame(species.getIconId(female, formIndex, false, variant)); } } + + /** + * Clears this UI's starter preferences. + * + * Designed to be used for unit tests that utilize this UI. + */ + clearStarterPreferences() { + this.starterPreferences = {}; + } } diff --git a/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts index 9b4d32efcae..b180ff8919e 100644 --- a/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -12,7 +12,8 @@ describe("Abilities - Steely Spirit", () => { let game: GameManager; const steelySpiritMultiplier = 1.5; const moveToCheck = Moves.IRON_HEAD; - const ironHeadPower = allMoves[moveToCheck].power; + + let ironHeadPower: number; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -25,6 +26,7 @@ describe("Abilities - Steely Spirit", () => { }); beforeEach(() => { + ironHeadPower = allMoves[moveToCheck].power; game = new GameManager(phaserGame); game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); diff --git a/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts index b70acbd8d17..a71bf0a9354 100644 --- a/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -1,4 +1,5 @@ import { Moves } from "#app/enums/moves"; +import type Move from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; @@ -12,8 +13,8 @@ describe("Abilities - Supreme Overlord", () => { let phaserGame: Phaser.Game; let game: GameManager; - const move = allMoves[Moves.TACKLE]; - const basePower = move.power; + let move: Move; + let basePower: number; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -26,6 +27,8 @@ describe("Abilities - Supreme Overlord", () => { }); beforeEach(() => { + move = allMoves[Moves.TACKLE]; + basePower = move.power; game = new GameManager(phaserGame); game.override .battleType("single") diff --git a/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts index 73ae25ff3b0..459bb00628c 100644 --- a/test/abilities/unseen_fist.test.ts +++ b/test/abilities/unseen_fist.test.ts @@ -32,22 +32,22 @@ describe("Abilities - Unseen Fist", () => { game.override.enemyLevel(100); }); - it("should cause a contact move to ignore Protect", () => - testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true)); + it("should cause a contact move to ignore Protect", async () => + await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true)); - it("should not cause a non-contact move to ignore Protect", () => - testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false)); + it("should not cause a non-contact move to ignore Protect", async () => + await testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false)); it("should not apply if the source has Long Reach", async () => { game.override.passiveAbility(Abilities.LONG_REACH); await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); }); - it("should cause a contact move to ignore Wide Guard", () => - testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true)); + it("should cause a contact move to ignore Wide Guard", async () => + await testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true)); - it("should not cause a non-contact move to ignore Wide Guard", () => - testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false)); + it("should not cause a non-contact move to ignore Wide Guard", async () => + await testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false)); it("should cause a contact move to ignore Protect, but not Substitute", async () => { game.override.enemyLevel(1); diff --git a/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts index f2cb0faed72..db746831753 100644 --- a/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -56,16 +56,21 @@ describe("Abilities - Wonder Skin", () => { expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); }); - const bypassAbilities = [Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE]; + const bypassAbilities = [ + [Abilities.MOLD_BREAKER, "Mold Breaker"], + [Abilities.TERAVOLT, "Teravolt"], + [Abilities.TURBOBLAZE, "Turboblaze"], + ]; bypassAbilities.forEach(ability => { - it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { + it(`does not affect pokemon with ${ability[1]}`, async () => { const moveToCheck = allMoves[Moves.CHARM]; - game.override.ability(ability); + // @ts-ignore ts doesn't know that ability[0] is an ability and not a string... + game.override.ability(ability[0]); vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.CHARM); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts index 26d33adb00a..5c53e38e208 100644 --- a/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -14,7 +14,7 @@ import { NumberHolder } from "#app/utils"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { it("should check Achievement creation", () => { @@ -77,6 +77,25 @@ describe("Achv", () => { }); describe("MoneyAchv", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + scene = game.scene; + }); + it("should create an instance of MoneyAchv", () => { const moneyAchv = new MoneyAchv("", "Test Money Achievement", 10000, "money_icon", 10); expect(moneyAchv).toBeInstanceOf(MoneyAchv); @@ -85,7 +104,6 @@ describe("MoneyAchv", () => { it("should validate the achievement based on the money amount", () => { const moneyAchv = new MoneyAchv("", "Test Money Achievement", 10000, "money_icon", 10); - const scene = new BattleScene(); scene.money = 5000; expect(moneyAchv.validate([])).toBe(false); diff --git a/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts index e80453d2933..fca3dc5ef7e 100644 --- a/test/battlerTags/substitute.test.ts +++ b/test/battlerTags/substitute.test.ts @@ -1,22 +1,40 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { PokemonTurnData, TurnMove, PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { BattlerTagLapseType, BindTag, SubstituteTag } from "#app/data/battler-tags"; import { Moves } from "#app/enums/moves"; import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; import * as messages from "#app/messages"; import { allMoves } from "#app/data/moves/move"; import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/testUtils/gameManager"; describe("BattlerTag - SubstituteTag", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + let mockPokemon: Pokemon; describe("onAdd behavior", () => { beforeEach(() => { mockPokemon = { - scene: new BattleScene(), + scene: game.scene, hp: 101, id: 0, getMaxHp: vi.fn().mockReturnValue(101) as Pokemon["getMaxHp"], @@ -77,7 +95,7 @@ describe("BattlerTag - SubstituteTag", () => { describe("onRemove behavior", () => { beforeEach(() => { mockPokemon = { - scene: new BattleScene(), + scene: game.scene, hp: 101, id: 0, isFainted: vi.fn().mockReturnValue(false) as Pokemon["isFainted"], @@ -109,7 +127,7 @@ describe("BattlerTag - SubstituteTag", () => { describe("lapse behavior", () => { beforeEach(() => { mockPokemon = { - scene: new BattleScene(), + scene: game.scene, hp: 101, id: 0, turnData: { acted: true } as PokemonTurnData, diff --git a/test/data/status_effect.test.ts b/test/data/status_effect.test.ts index 61dafc1c9b8..0fd2daa308b 100644 --- a/test/data/status_effect.test.ts +++ b/test/data/status_effect.test.ts @@ -13,17 +13,12 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { mockI18next } from "#test/testUtils/testUtils"; -import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const pokemonName = "PKM"; const sourceText = "SOURCE"; describe("Status Effect Messages", () => { - beforeAll(async () => { - await i18next.init(); - }); - describe("NONE", () => { const statusEffect = StatusEffect.NONE; @@ -31,7 +26,6 @@ describe("Status Effect Messages", () => { mockI18next(); const text = getStatusEffectObtainText(statusEffect, pokemonName); - console.log("text:", text); expect(text).toBe(""); const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); diff --git a/test/moves/copycat.test.ts b/test/moves/copycat.test.ts index c7242f0940e..0d9b0951f89 100644 --- a/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -13,7 +13,7 @@ describe("Moves - Copycat", () => { let phaserGame: Phaser.Game; let game: GameManager; - const randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; + let randomMoveAttr: RandomMoveAttr; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -26,6 +26,7 @@ describe("Moves - Copycat", () => { }); beforeEach(() => { + randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; game = new GameManager(phaserGame); game.override .moveset([Moves.COPYCAT, Moves.SPIKY_SHIELD, Moves.SWORDS_DANCE, Moves.SPLASH]) diff --git a/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts index 0ff0712710d..9cf3106b9c1 100644 --- a/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -3,6 +3,7 @@ import { allMoves } from "#app/data/moves/move"; import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; +import type Move from "#app/data/moves/move"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; @@ -12,7 +13,7 @@ describe("Moves - Dynamax Cannon", () => { let phaserGame: Phaser.Game; let game: GameManager; - const dynamaxCannon = allMoves[Moves.DYNAMAX_CANNON]; + let dynamaxCannon: Move; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -25,6 +26,7 @@ describe("Moves - Dynamax Cannon", () => { }); beforeEach(() => { + dynamaxCannon = allMoves[Moves.DYNAMAX_CANNON]; game = new GameManager(phaserGame); game.override.moveset([dynamaxCannon.id]); diff --git a/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts index 9a379cb4588..c340aeea63f 100644 --- a/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -1,6 +1,7 @@ import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; @@ -15,8 +16,8 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { let phaserGame: Phaser.Game; let game: GameManager; - const fusionFlare = allMoves[Moves.FUSION_FLARE]; - const fusionBolt = allMoves[Moves.FUSION_BOLT]; + let fusionFlare: Move; + let fusionBolt: Move; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -29,6 +30,8 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }); beforeEach(() => { + fusionFlare = allMoves[Moves.FUSION_FLARE]; + fusionBolt = allMoves[Moves.FUSION_BOLT]; game = new GameManager(phaserGame); game.override.moveset([fusionFlare.id, fusionBolt.id]); game.override.startingLevel(1); @@ -45,7 +48,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }); it("FUSION_FLARE should double power of subsequent FUSION_BOLT", async () => { - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); @@ -65,7 +68,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_BOLT should double power of subsequent FUSION_FLARE", async () => { - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionBolt.id, 0, BattlerIndex.ENEMY); game.move.select(fusionFlare.id, 1, BattlerIndex.ENEMY); @@ -85,7 +88,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE should double power of subsequent FUSION_BOLT if a move failed in between", async () => { - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.PLAYER); game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); @@ -111,7 +114,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { it("FUSION_FLARE should not double power of subsequent FUSION_BOLT if a move succeeded in between", async () => { game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); @@ -156,7 +159,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async () => { game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); @@ -210,7 +213,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves if moves are aimed at allies", async () => { game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); - await game.startBattle([Species.ZEKROM, Species.ZEKROM]); + await game.classicMode.startBattle([Species.ZEKROM, Species.ZEKROM]); const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); diff --git a/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts index 1bb6adc8e90..8891f0bf0e2 100644 --- a/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -6,12 +6,13 @@ import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type Move from "#app/data/moves/move"; describe("Moves - Hard Press", () => { let phaserGame: Phaser.Game; let game: GameManager; - const moveToCheck = allMoves[Moves.HARD_PRESS]; + let moveToCheck: Move; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -24,6 +25,7 @@ describe("Moves - Hard Press", () => { }); beforeEach(() => { + moveToCheck = allMoves[Moves.HARD_PRESS]; game = new GameManager(phaserGame); game.override.battleType("single"); game.override.ability(Abilities.BALL_FETCH); diff --git a/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts index 57752cea1af..ccab8a43415 100644 --- a/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -4,6 +4,7 @@ import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import GameManager from "#test/testUtils/gameManager"; import { allMoves } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -12,8 +13,8 @@ describe("Moves - Last Respects", () => { let phaserGame: Phaser.Game; let game: GameManager; - const move = allMoves[Moves.LAST_RESPECTS]; - const basePower = move.power; + let move: Move; + let basePower: number; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -27,6 +28,8 @@ describe("Moves - Last Respects", () => { beforeEach(() => { game = new GameManager(phaserGame); + move = allMoves[Moves.LAST_RESPECTS]; + basePower = move.power; game.override .battleType("single") .disableCrits() diff --git a/test/moves/metronome.test.ts b/test/moves/metronome.test.ts index 15790777ed3..80f32a3a6fb 100644 --- a/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -13,7 +13,7 @@ describe("Moves - Metronome", () => { let phaserGame: Phaser.Game; let game: GameManager; - const randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; + let randomMoveAttr: RandomMoveAttr; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -26,6 +26,7 @@ describe("Moves - Metronome", () => { }); beforeEach(() => { + randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; game = new GameManager(phaserGame); game.override .moveset([Moves.METRONOME, Moves.SPLASH]) diff --git a/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts index 8bcb212d60e..f44901c5aba 100644 --- a/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -3,6 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { allMoves } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -10,7 +11,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite describe("Moves - Rage Fist", () => { let phaserGame: Phaser.Game; let game: GameManager; - const move = allMoves[Moves.RAGE_FIST]; + let move: Move; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -23,6 +24,7 @@ describe("Moves - Rage Fist", () => { }); beforeEach(() => { + move = allMoves[Moves.RAGE_FIST]; game = new GameManager(phaserGame); game.override .battleType("single") diff --git a/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts index 5cc0b08ccc6..e916c9ffeaa 100644 --- a/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -4,12 +4,13 @@ import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { allMoves } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; describe("Moves - Retaliate", () => { let phaserGame: Phaser.Game; let game: GameManager; - const retaliate = allMoves[Moves.RETALIATE]; + let retaliate: Move; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -22,6 +23,7 @@ describe("Moves - Retaliate", () => { }); beforeEach(() => { + retaliate = allMoves[Moves.RETALIATE]; game = new GameManager(phaserGame); game.override .battleType("single") diff --git a/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts index 47da5e1c2f7..a5b065b76cb 100644 --- a/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -1,5 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { allMoves, ShellSideArmCategoryAttr } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -10,8 +11,8 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite describe("Moves - Shell Side Arm", () => { let phaserGame: Phaser.Game; let game: GameManager; - const shellSideArm = allMoves[Moves.SHELL_SIDE_ARM]; - const shellSideArmAttr = shellSideArm.getAttrs(ShellSideArmCategoryAttr)[0]; + let shellSideArm: Move; + let shellSideArmAttr: ShellSideArmCategoryAttr; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -24,6 +25,8 @@ describe("Moves - Shell Side Arm", () => { }); beforeEach(() => { + shellSideArm = allMoves[Moves.SHELL_SIDE_ARM]; + shellSideArmAttr = shellSideArm.getAttrs(ShellSideArmCategoryAttr)[0]; game = new GameManager(phaserGame); game.override .moveset([Moves.SHELL_SIDE_ARM, Moves.SPLASH]) diff --git a/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts index d986ae4d141..d71647bda52 100644 --- a/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -7,6 +7,7 @@ import { MoveResult } from "#app/field/pokemon"; import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; +import type Move from "#app/data/moves/move"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -17,7 +18,7 @@ describe("Moves - Spit Up", () => { let phaserGame: Phaser.Game; let game: GameManager; - const spitUp = allMoves[Moves.SPIT_UP]; + let spitUp: Move; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); @@ -28,6 +29,7 @@ describe("Moves - Spit Up", () => { }); beforeEach(() => { + spitUp = allMoves[Moves.SPIT_UP]; game = new GameManager(phaserGame); game.override.battleType("single"); diff --git a/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts index dffe39f4d87..c1a2b999fa0 100644 --- a/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -1,6 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { Stat } from "#enums/stat"; import { allMoves, TeraMoveCategoryAttr } from "#app/data/moves/move"; +import type Move from "#app/data/moves/move"; import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; @@ -13,13 +14,16 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite describe("Moves - Tera Blast", () => { let phaserGame: Phaser.Game; let game: GameManager; - const moveToCheck = allMoves[Moves.TERA_BLAST]; - const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; + + let moveToCheck: Move; + let teraBlastAttr: TeraMoveCategoryAttr; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); + moveToCheck = allMoves[Moves.TERA_BLAST]; + teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; }); afterEach(() => { diff --git a/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts index c1114b69b99..eb434b25815 100644 --- a/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -1,6 +1,7 @@ import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; +import type Move from "#app/data/moves/move"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; @@ -9,14 +10,17 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite describe("Moves - Triple Arrows", () => { let phaserGame: Phaser.Game; let game: GameManager; - const tripleArrows = allMoves[Moves.TRIPLE_ARROWS]; - const flinchAttr = tripleArrows.getAttrs(FlinchAttr)[0]; - const defDropAttr = tripleArrows.getAttrs(StatStageChangeAttr)[0]; + let tripleArrows: Move; + let flinchAttr: FlinchAttr; + let defDropAttr: StatStageChangeAttr; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); + tripleArrows = allMoves[Moves.TRIPLE_ARROWS]; + flinchAttr = tripleArrows.getAttrs(FlinchAttr)[0]; + defDropAttr = tripleArrows.getAttrs(StatStageChangeAttr)[0]; }); afterEach(() => { diff --git a/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts index 19ec364618e..8c54e0dd606 100644 --- a/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -48,16 +48,6 @@ export async function runMysteryEncounterToEnd( ); if (isBattle) { - game.onNextPrompt( - "DamageAnimPhase", - Mode.MESSAGE, - () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, - () => game.isCurrentPhase(CommandPhase), - ); - game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, diff --git a/test/phases/phases.test.ts b/test/phases/phases.test.ts index 4aabeb55b9e..96225c9151c 100644 --- a/test/phases/phases.test.ts +++ b/test/phases/phases.test.ts @@ -31,7 +31,7 @@ describe("Phases", () => { it("should start the login phase", async () => { const loginPhase = new LoginPhase(); scene.unshiftPhase(loginPhase); - await game.phaseInterceptor.run(LoginPhase); + await game.phaseInterceptor.to(LoginPhase); expect(scene.ui.getMode()).to.equal(Mode.MESSAGE); }); }); @@ -40,7 +40,7 @@ describe("Phases", () => { it("should start the title phase", async () => { const titlePhase = new TitlePhase(); scene.unshiftPhase(titlePhase); - await game.phaseInterceptor.run(TitlePhase); + await game.phaseInterceptor.to(TitlePhase); expect(scene.ui.getMode()).to.equal(Mode.TITLE); }); }); @@ -49,7 +49,7 @@ describe("Phases", () => { it("should start the unavailable phase", async () => { const unavailablePhase = new UnavailablePhase(); scene.unshiftPhase(unavailablePhase); - await game.phaseInterceptor.run(UnavailablePhase); + await game.phaseInterceptor.to(UnavailablePhase); expect(scene.ui.getMode()).to.equal(Mode.UNAVAILABLE); }, 20000); }); diff --git a/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts index bb3d5debc7c..d352acea77a 100644 --- a/test/phases/select-modifier-phase.test.ts +++ b/test/phases/select-modifier-phase.test.ts @@ -48,8 +48,8 @@ describe("SelectModifierPhase", () => { it("should start a select modifier phase", async () => { initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); const selectModifierPhase = new SelectModifierPhase(); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); + scene.unshiftPhase(selectModifierPhase); + await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); }); diff --git a/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts index 9ec98b6a59f..e7e1b2d52b0 100644 --- a/test/plugins/api/pokerogue-account-api.test.ts +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -4,11 +4,17 @@ import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import * as Utils from "#app/utils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const accountApi = new PokerogueAccountApi(apiBase); -const { server } = global; +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts index 0ce727b88da..08c4cf0dc45 100644 --- a/test/plugins/api/pokerogue-admin-api.test.ts +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -9,11 +9,17 @@ import type { import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const adminApi = new PokerogueAdminApi(apiBase); -const { server } = global; +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-api.test.ts b/test/plugins/api/pokerogue-api.test.ts index 241453866a5..c53a38e23ab 100644 --- a/test/plugins/api/pokerogue-api.test.ts +++ b/test/plugins/api/pokerogue-api.test.ts @@ -2,10 +2,16 @@ import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); -const { server } = global; +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-daily-api.test.ts b/test/plugins/api/pokerogue-daily-api.test.ts index 95d938e6625..563e6d09009 100644 --- a/test/plugins/api/pokerogue-daily-api.test.ts +++ b/test/plugins/api/pokerogue-daily-api.test.ts @@ -3,11 +3,17 @@ import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { ScoreboardCategory, type RankingEntry } from "#app/ui/daily-run-scoreboard"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const dailyApi = new PokerogueDailyApi(apiBase); -const { server } = global; +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-savedata-api.test.ts b/test/plugins/api/pokerogue-savedata-api.test.ts index 47eafa0a933..481ba62c19d 100644 --- a/test/plugins/api/pokerogue-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-savedata-api.test.ts @@ -2,11 +2,17 @@ import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi" import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const savedataApi = new PokerogueSavedataApi(apiBase); -const { server } = global; +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts index 67abc9c9336..d4c235ac51a 100644 --- a/test/plugins/api/pokerogue-session-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -10,11 +10,17 @@ import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session- import type { SessionSaveData } from "#app/system/game-data"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const sessionSavedataApi = new PokerogueSessionSavedataApi(apiBase); -const { server } = global; + +let server: SetupServerApi; +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts index 81d863049f0..0c69ab8f922 100644 --- a/test/plugins/api/pokerogue-system-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -6,13 +6,20 @@ import type { } from "#app/@types/PokerogueSystemSavedataApi"; import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; import type { SystemSaveData } from "#app/system/game-data"; +import { initServerForApiTests } from "#test/testUtils/testFileInitialization"; import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type { SetupServerApi } from "msw/node"; const apiBase = getApiBaseUrl(); const systemSavedataApi = new PokerogueSystemSavedataApi(getApiBaseUrl()); -const { server } = global; + +let server: SetupServerApi; + +beforeAll(async () => { + server = await initServerForApiTests(); +}); afterEach(() => { server.resetHandlers(); diff --git a/test/pre.test.ts b/test/pre.test.ts deleted file mode 100644 index 6ed29dce481..00000000000 --- a/test/pre.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Overrides, { defaultOverrides } from "#app/overrides"; -import { expect, test } from "vitest"; - -test("Overrides are default values", () => { - expect(Overrides).toEqual(defaultOverrides); -}); diff --git a/test/testUtils/gameManager.ts b/test/testUtils/gameManager.ts index 3289c0ade01..390e71af126 100644 --- a/test/testUtils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -55,6 +55,9 @@ import TextInterceptor from "#test/testUtils/TextInterceptor"; import { AES, enc } from "crypto-js"; import fs from "node:fs"; import { expect, vi } from "vitest"; +import { globalScene } from "#app/global-scene"; +import type StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; +import { MockFetch } from "#test/testUtils/mocks/mockFetch"; /** * Class to manage the game state and transitions between phases. @@ -84,10 +87,34 @@ export default class GameManager { ErrorInterceptor.getInstance().clear(); BattleScene.prototype.randBattleSeedInt = (range, min = 0) => min + range - 1; // This simulates a max roll this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); - this.scene = new BattleScene(); + + let firstTimeScene = false; + + if (globalScene) { + this.scene = globalScene; + } else { + this.scene = new BattleScene(); + this.gameWrapper.setScene(this.scene); + firstTimeScene = true; + } + this.phaseInterceptor = new PhaseInterceptor(this.scene); + + if (!firstTimeScene) { + this.scene.reset(false, true); + (this.scene.ui.handlers[Mode.STARTER_SELECT] as StarterSelectUiHandler).clearStarterPreferences(); + this.scene.clearAllPhases(); + + // Must be run after phase interceptor has been initialized. + + this.scene.pushPhase(new LoginPhase()); + this.scene.pushPhase(new TitlePhase()); + this.scene.shiftPhase(); + + this.gameWrapper.scene = this.scene; + } + this.textInterceptor = new TextInterceptor(this.scene); - this.gameWrapper.setScene(this.scene); this.override = new OverridesHelper(this); this.move = new MoveHelper(this); this.classicMode = new ClassicModeHelper(this); @@ -96,9 +123,12 @@ export default class GameManager { this.settings = new SettingsHelper(this); this.reload = new ReloadHelper(this); this.modifiers = new ModifierHelper(this); + this.override.sanitizeOverrides(); // Disables Mystery Encounters on all tests (can be overridden at test level) this.override.mysteryEncounterChance(0); + + global.fetch = vi.fn(MockFetch) as any; } /** diff --git a/test/testUtils/gameWrapper.ts b/test/testUtils/gameWrapper.ts index 6af36f22d24..28c7c4af80f 100644 --- a/test/testUtils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -6,11 +6,11 @@ import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; import { blobToString } from "#test/testUtils/gameManagerUtils"; import { MockClock } from "#test/testUtils/mocks/mockClock"; -import mockConsoleLog from "#test/testUtils/mocks/mockConsoleLog"; +import { MockConsoleLog } from "#test/testUtils/mocks/mockConsoleLog"; import { MockFetch } from "#test/testUtils/mocks/mockFetch"; import MockLoader from "#test/testUtils/mocks/mockLoader"; -import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; -import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import { mockLocalStorage } from "#test/testUtils/mocks/mockLocalStorage"; +import { MockImage } from "#test/testUtils/mocks/mocksContainer/mockImage"; import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import fs from "node:fs"; import Phaser from "phaser"; @@ -27,18 +27,6 @@ import UpdateList = Phaser.GameObjects.UpdateList; import { version } from "../../package.json"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; -Object.defineProperty(window, "localStorage", { - value: mockLocalStorage(), -}); -Object.defineProperty(window, "console", { - value: mockConsoleLog(false), -}); - -BBCodeText.prototype.destroy = () => null; -BBCodeText.prototype.resize = () => null; -InputText.prototype.setElement = () => null; -InputText.prototype.resize = () => null; -Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); @@ -53,25 +41,6 @@ window.matchMedia = () => ({ matches: false, }); -/** - * Sets this object's position relative to another object with a given offset - * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x The relative x position - * @param y The relative y position - */ -const setPositionRelative = function (guideObject: any, x: number, y: number) { - const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); - const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); - this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); -}; - -Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; - export default class GameWrapper { public game: Phaser.Game; public scene: BattleScene; diff --git a/test/testUtils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts index e69e05bce45..2d56ae35fce 100644 --- a/test/testUtils/helpers/overridesHelper.ts +++ b/test/testUtils/helpers/overridesHelper.ts @@ -6,7 +6,7 @@ import type { GameModes } from "#app/game-mode"; import { getGameMode } from "#app/game-mode"; import type { ModifierOverride } from "#app/modifier/modifier-type"; import type { BattleStyle } from "#app/overrides"; -import Overrides from "#app/overrides"; +import Overrides, { defaultOverrides } from "#app/overrides"; import type { Unlockables } from "#app/system/unlockables"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; @@ -15,8 +15,9 @@ import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import type { WeatherType } from "#enums/weather-type"; -import { vi } from "vitest"; +import { expect, vi } from "vitest"; import { GameManagerHelper } from "./gameManagerHelper"; +import { shiftCharCodes } from "#app/utils"; /** * Helper to handle overrides in tests @@ -226,12 +227,7 @@ export class OverridesHelper extends GameManagerHelper { * @returns `this` */ public disableTrainerWaves(): this { - const realFn = getGameMode; - vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { - const mode = realFn(gameMode); - mode.hasTrainers = false; - return mode; - }); + vi.spyOn(Overrides, "DISABLE_STANDARD_TRAINERS_OVERRIDE", "get").mockReturnValue(true); this.log("Standard trainer waves are disabled!"); return this; } @@ -263,11 +259,8 @@ export class OverridesHelper extends GameManagerHelper { * @returns `this` */ public seed(seed: string): this { - vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { - this.game.scene.waveSeed = seed; - Phaser.Math.RND.sow([seed]); - this.game.scene.rngCounter = 0; - }); + // Shift the seed here with a negative wave number, to compensate for `resetSeed()` shifting the seed itself. + this.game.scene.setSeed(shiftCharCodes(seed, (this.game.scene.currentBattle?.waveIndex ?? 0) * -1)); this.game.scene.resetSeed(); this.log(`Seed set to "${seed}"!`); return this; @@ -539,4 +532,14 @@ export class OverridesHelper extends GameManagerHelper { private log(...params: any[]) { console.log("Overrides:", ...params); } + + public sanitizeOverrides(): void { + for (const key of Object.keys(defaultOverrides)) { + if (Overrides[key] !== defaultOverrides[key]) { + vi.spyOn(Overrides, key as any, "get").mockReturnValue(defaultOverrides[key]); + } + } + expect(Overrides).toEqual(defaultOverrides); + this.log("Sanitizing all overrides!"); + } } diff --git a/test/testUtils/listenersManager.ts b/test/testUtils/listenersManager.ts new file mode 100644 index 00000000000..da624aa8a56 --- /dev/null +++ b/test/testUtils/listenersManager.ts @@ -0,0 +1,41 @@ +import { expect } from "vitest"; + +/** + * Whether or not it is currently the first time running this manager. + */ +let firstTime = true; + +/** + * The list of listeners that were present during the first time this manager is run. + * These initial listeners are needed throughout the entire test suite, so we never remove them. + */ +const initialListeners: NodeJS.MessageListener[] = []; + +/** + * The current listener that is only needed for the current test file. + * We plan to delete it during the next test file, when it is no longer needed. + */ +let currentListener: NodeJS.MessageListener | null; + +export function manageListeners() { + if (firstTime) { + initialListeners.push(...process.listeners("message")); + } else { + expect(process.listeners("message").length).toBeLessThan(7); + + // Remove the listener that was used during the previous test file + if (currentListener) { + process.removeListener("message", currentListener); + currentListener = null; + } + + // Find the new listener that is being used for the current test file + process.listeners("message").forEach(fn => { + if (!initialListeners.includes(fn)) { + currentListener = fn; + } + }); + } + + firstTime = false; +} diff --git a/test/testUtils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts index 808b6ea4d4d..f54d41fea3e 100644 --- a/test/testUtils/mocks/mockConsoleLog.ts +++ b/test/testUtils/mocks/mockConsoleLog.ts @@ -1,82 +1,80 @@ -const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { - let logs: any[] = []; - const logDisabled: boolean = _logDisabled; - const phaseText: boolean = _phaseText; - const originalLog = console.log; - const originalError = console.error; - const originalDebug = console.debug; - const originalWarn = console.warn; - const notified: any[] = []; +const originalLog = console.log; +const originalError = console.error; +const originalDebug = console.debug; +const originalWarn = console.warn; - const blacklist = ["Phaser", "variant icon does not exist", 'Texture "%s" not found']; - const whitelist = ["Phase"]; +const blacklist = ["Phaser", "variant icon does not exist", 'Texture "%s" not found']; +const whitelist = ["Phase"]; - return { - log(...args) { - const argsStr = this.getStr(args); - logs.push(argsStr); - if (logDisabled && !phaseText) { - return; - } - if ((phaseText && !whitelist.some(b => argsStr.includes(b))) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalLog(args); - }, - error(...args) { - const argsStr = this.getStr(args); - logs.push(argsStr); - originalError(args); // Appelle le console.error originel - }, - debug(...args) { - const argsStr = this.getStr(args); - logs.push(argsStr); - if (logDisabled && !phaseText) { - return; - } - if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalDebug(args); - }, - warn(...args) { - const argsStr = this.getStr(args); - logs.push(args); - if (logDisabled && !phaseText) { - return; - } - if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { - return; - } - originalWarn(args); - }, - notify(msg) { - originalLog(msg); - notified.push(msg); - }, - getLogs() { - return logs; - }, - clearLogs() { - logs = []; - }, - getStr(...args) { - return args - .map(arg => { - if (typeof arg === "object" && arg !== null) { - // Handle objects including arrays - return JSON.stringify(arg, (_key, value) => (typeof value === "bigint" ? value.toString() : value)); - } - if (typeof arg === "bigint") { - // Handle BigInt values - return arg.toString(); - } - // Handle all other types +export class MockConsoleLog { + constructor( + private logDisabled = false, + private phaseText = false, + ) {} + private logs: any[] = []; + private notified: any[] = []; + + public log(...args) { + const argsStr = this.getStr(args); + this.logs.push(argsStr); + if (this.logDisabled && !this.phaseText) { + return; + } + if ((this.phaseText && !whitelist.some(b => argsStr.includes(b))) || blacklist.some(b => argsStr.includes(b))) { + return; + } + originalLog(args); + } + public error(...args) { + const argsStr = this.getStr(args); + this.logs.push(argsStr); + originalError(args); // Appelle le console.error originel + } + public debug(...args) { + const argsStr = this.getStr(args); + this.logs.push(argsStr); + if (this.logDisabled && !this.phaseText) { + return; + } + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { + return; + } + originalDebug(args); + } + warn(...args) { + const argsStr = this.getStr(args); + this.logs.push(args); + if (this.logDisabled && !this.phaseText) { + return; + } + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { + return; + } + originalWarn(args); + } + notify(msg) { + originalLog(msg); + this.notified.push(msg); + } + getLogs() { + return this.logs; + } + clearLogs() { + this.logs = []; + } + getStr(...args) { + return args + .map(arg => { + if (typeof arg === "object" && arg !== null) { + // Handle objects including arrays + return JSON.stringify(arg, (_key, value) => (typeof value === "bigint" ? value.toString() : value)); + } + if (typeof arg === "bigint") { + // Handle BigInt values return arg.toString(); - }) - .join(";"); - }, - }; -}; - -export default MockConsoleLog; + } + return arg.toString(); + }) + .join(";"); + } +} diff --git a/test/testUtils/mocks/mockContextCanvas.ts b/test/testUtils/mocks/mockContextCanvas.ts new file mode 100644 index 00000000000..a69f039c5e9 --- /dev/null +++ b/test/testUtils/mocks/mockContextCanvas.ts @@ -0,0 +1,26 @@ +/** + * A minimal stub object to mock HTMLCanvasElement + */ +export const mockCanvas: any = { + width: 0, + getContext() { + return mockContext; + }, +}; +/** + * A minimal stub object to mock CanvasRenderingContext2D + */ +export const mockContext: any = { + font: "", + measureText: () => { + return {}; + }, + save: () => {}, + scale: () => {}, + clearRect: () => {}, + fillRect: () => {}, + fillText: () => {}, + getImageData: () => {}, + canvas: mockCanvas, + restore: () => {}, +}; diff --git a/test/testUtils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts index 235aa76f664..6b336841ad6 100644 --- a/test/testUtils/mocks/mockLocalStorage.ts +++ b/test/testUtils/mocks/mockLocalStorage.ts @@ -1,4 +1,4 @@ -const mockLocalStorage = () => { +export const mockLocalStorage = () => { let store = {} as Storage; return { @@ -23,5 +23,3 @@ const mockLocalStorage = () => { }, }; }; - -export default mockLocalStorage; diff --git a/test/testUtils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts index fe249c5a5f7..585ee0a674a 100644 --- a/test/testUtils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -1,5 +1,5 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; -import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import { MockImage } from "#test/testUtils/mocks/mocksContainer/mockImage"; import MockNineslice from "#test/testUtils/mocks/mocksContainer/mockNineslice"; import MockPolygon from "#test/testUtils/mocks/mocksContainer/mockPolygon"; import MockRectangle from "#test/testUtils/mocks/mocksContainer/mockRectangle"; diff --git a/test/testUtils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts index 0a792c6fc79..5e739fbe3cc 100644 --- a/test/testUtils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -215,4 +215,10 @@ export default class MockContainer implements MockGameObject { } disableInteractive = () => null; + + each(method) { + for (const item of this.list) { + method(item); + } + } } diff --git a/test/testUtils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts index 768fcfeb765..d20b4663771 100644 --- a/test/testUtils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,6 +1,6 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; -export default class MockImage extends MockContainer { +export class MockImage extends MockContainer { private texture; constructor(textureManager, x, y, texture) { diff --git a/test/testUtils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts index eec431d8ada..854baed5915 100644 --- a/test/testUtils/mocks/mocksContainer/mockRectangle.ts +++ b/test/testUtils/mocks/mocksContainer/mockRectangle.ts @@ -1,3 +1,4 @@ +import { off } from "process"; import type { MockGameObject } from "../mockGameObject"; export default class MockRectangle implements MockGameObject { @@ -72,4 +73,6 @@ export default class MockRectangle implements MockGameObject { setScale(_scale) { // return this.phaserText.setScale(scale); } + + off() {} } diff --git a/test/testUtils/testFileInitialization.ts b/test/testUtils/testFileInitialization.ts new file mode 100644 index 00000000000..2b41f3aa29a --- /dev/null +++ b/test/testUtils/testFileInitialization.ts @@ -0,0 +1,117 @@ +import { SESSION_ID_COOKIE_NAME } from "#app/constants"; +import { initLoggedInUser } from "#app/account"; +import { initAbilities } from "#app/data/ability"; +import { initBiomes } from "#app/data/balance/biomes"; +import { initEggMoves } from "#app/data/balance/egg-moves"; +import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { initMoves } from "#app/data/moves/move"; +import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; +import { initPokemonForms } from "#app/data/pokemon-forms"; +import { initSpecies } from "#app/data/pokemon-species"; +import { initAchievements } from "#app/system/achv"; +import { initVouchers } from "#app/system/voucher"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; +import { setCookie } from "#app/utils"; +import { blobToString } from "#test/testUtils/gameManagerUtils"; +import { MockConsoleLog } from "#test/testUtils/mocks/mockConsoleLog"; +import { mockContext } from "#test/testUtils/mocks/mockContextCanvas"; +import { mockLocalStorage } from "#test/testUtils/mocks/mockLocalStorage"; +import { MockImage } from "#test/testUtils/mocks/mocksContainer/mockImage"; +import Phaser from "phaser"; +import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { manageListeners } from "./listenersManager"; + +let wasInitialized = false; +/** + * An initialization function that is run at the beginning of every test file (via `beforeAll()`). + */ +export function initTestFile() { + // Set the timezone to UTC for tests. + process.env.TZ = "UTC"; + + Object.defineProperty(window, "localStorage", { + value: mockLocalStorage(), + }); + Object.defineProperty(window, "console", { + value: new MockConsoleLog(false), + }); + Object.defineProperty(document, "fonts", { + writable: true, + value: { + add: () => {}, + }, + }); + + BBCodeText.prototype.destroy = () => null; + // @ts-ignore + BBCodeText.prototype.resize = () => null; + InputText.prototype.setElement = () => null as any; + InputText.prototype.resize = () => null as any; + Phaser.GameObjects.Image = MockImage as any; + window.URL.createObjectURL = (blob: Blob) => { + blobToString(blob).then((data: string) => { + localStorage.setItem("toExport", data); + }); + return null as any; + }; + navigator.getGamepads = () => []; + setCookie(SESSION_ID_COOKIE_NAME, "fake_token"); + + window.matchMedia = () => + ({ + matches: false, + }) as any; + + /** + * Sets this object's position relative to another object with a given offset + * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of + * @param x The relative x position + * @param y The relative y position + */ + const setPositionRelative = function (guideObject: any, x: number, y: number) { + const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); + const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); + this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); + }; + + Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; + Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; + Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; + Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative; + Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; + Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; + HTMLCanvasElement.prototype.getContext = () => mockContext; + + // Initialize all of these things if and only if they have not been initialized yet + // initSpecies(); + if (!wasInitialized) { + wasInitialized = true; + initVouchers(); + initAchievements(); + initStatsKeys(); + initPokemonPrevolutions(); + initBiomes(); + initEggMoves(); + initPokemonForms(); + initSpecies(); + initMoves(); + initAbilities(); + initLoggedInUser(); + initMysteryEncounters(); + } + + manageListeners(); +} + +/** + * Closes the current mock server and initializes a new mock server. + * This is run at the beginning of every API test file. + */ +export async function initServerForApiTests() { + global.server?.close(); + const { setupServer } = await import("msw/node"); + global.server = setupServer(); + global.server.listen({ onUnhandledRequest: "error" }); + return global.server; +} diff --git a/test/vitest.setup.ts b/test/vitest.setup.ts index 44175049042..b9da0850306 100644 --- a/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -14,8 +14,9 @@ import { initVouchers } from "#app/system/voucher"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { afterAll, beforeAll, vi } from "vitest"; +import { initTestFile } from "./testUtils/testFileInitialization"; + /** Set the timezone to UTC for tests. */ -process.env.TZ = "UTC"; /** Mock the override import to always return default values, ignoring any custom overrides. */ vi.mock("#app/overrides", async importOriginal => { @@ -63,28 +64,10 @@ vi.mock("i18next", async importOriginal => { return await importOriginal(); }); -initVouchers(); -initAchievements(); -initStatsKeys(); -initPokemonPrevolutions(); -initBiomes(); -initEggMoves(); -initPokemonForms(); -initSpecies(); -initMoves(); -initAbilities(); -initLoggedInUser(); -initMysteryEncounters(); - global.testFailed = false; beforeAll(() => { - Object.defineProperty(document, "fonts", { - writable: true, - value: { - add: () => {}, - }, - }); + initTestFile(); }); afterAll(() => { diff --git a/vitest.config.ts b/vitest.config.ts index b52c16ec00c..c781bde97ed 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,20 +1,31 @@ import { defineProject } from "vitest/config"; import { defaultConfig } from "./vite.config"; +import { BaseSequencer, type TestSpecification } from "vitest/node"; + +function getTestOrder(testName: string): number { + if (testName.includes("battle-scene.test.ts")) { + return 1; + } + if (testName.includes("inputs.test.ts")) { + return 2; + } + return 3; +} export default defineProject(({ mode }) => ({ ...defaultConfig, test: { testTimeout: 20000, setupFiles: ["./test/fontFace.setup.ts", "./test/vitest.setup.ts"], - server: { - deps: { - inline: ["vitest-canvas-mock"], - //@ts-ignore - optimizer: { - web: { - include: ["vitest-canvas-mock"], - }, - }, + sequence: { + sequencer: class CustomSequencer extends BaseSequencer { + async sort(files: TestSpecification[]) { + // use default sorting at first. + files = await super.sort(files); + // Except, forcibly reorder + + return files.sort((a, b) => getTestOrder(a.moduleId) - getTestOrder(b.moduleId)); + } }, }, environment: "jsdom" as const, @@ -34,7 +45,6 @@ export default defineProject(({ mode }) => ({ }, name: "main", include: ["./test/**/*.{test,spec}.ts"], - exclude: ["./test/pre.test.ts"], }, esbuild: { pure: mode === "production" ? ["console.log"] : [], From 4149d3600af2c48149557bbe84925ef891ff8f27 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:49:54 -0500 Subject: [PATCH 41/48] [Misc] Remove pre-push lefthook (#5572) Remove pre-push lefthook --- lefthook.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lefthook.yml b/lefthook.yml index aa64a176191..ddf875f15de 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -8,12 +8,6 @@ pre-commit: skip: - merge - rebase - -pre-push: - commands: - biome-lint: - glob: "*.{js,ts,jsx,tsx}" - run: npx @biomejs/biome check --reporter=summary {push_files} --no-errors-on-unmatched post-merge: commands: From 4a560d7185665775954c7bfffab959feaa92b3c1 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Sat, 29 Mar 2025 00:02:47 +0100 Subject: [PATCH 42/48] [Sprite] Reduce Mystical Rock sprite's size (#5570) * Updating the size to be smaller * Update item atlas * Fix Malicious Armor missing outline Noticed when exporting atlas that the item sprite broke --------- Co-authored-by: Madmadness65 Co-authored-by: damocleas --- public/images/items.json | 15378 +++++++++++----------- public/images/items.png | Bin 57986 -> 55816 bytes public/images/items/malicious_armor.png | Bin 686 -> 894 bytes public/images/items/mystical_rock.png | Bin 697 -> 915 bytes 4 files changed, 7689 insertions(+), 7689 deletions(-) diff --git a/public/images/items.json b/public/images/items.json index 64265382dea..5848b02dd6a 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,13 +4,13 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 431, - "h": 431 + "w": 435, + "h": 435 }, "scale": 1, "frames": [ { - "filename": "mystical_rock", + "filename": "relic_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -18,356 +18,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 29 + "x": 9, + "y": 11, + "w": 15, + "h": 11 }, "frame": { "x": 0, "y": 0, - "w": 32, - "h": 29 + "w": 15, + "h": 11 } }, { - "filename": "galarica_cuff", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 29, - "h": 30 - }, - "frame": { - "x": 0, - "y": 29, - "w": 29, - "h": 30 - } - }, - { - "filename": "galarica_wreath", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 27 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 27 - } - }, - { - "filename": "max_mushrooms", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 29, - "h": 28 - }, - "frame": { - "x": 0, - "y": 59, - "w": 29, - "h": 28 - } - }, - { - "filename": "ribbon_gen4", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 30, - "h": 28 - }, - "frame": { - "x": 64, - "y": 0, - "w": 30, - "h": 28 - } - }, - { - "filename": "leaders_crest", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 29, - "h": 27 - }, - "frame": { - "x": 0, - "y": 87, - "w": 29, - "h": 27 - } - }, - { - "filename": "ribbon_gen2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 28, - "h": 28 - }, - "frame": { - "x": 94, - "y": 0, - "w": 28, - "h": 28 - } - }, - { - "filename": "bronze_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 114, - "w": 22, - "h": 31 - } - }, - { - "filename": "great_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 145, - "w": 22, - "h": 31 - } - }, - { - "filename": "linking_cord", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 27, - "h": 26 - }, - "frame": { - "x": 122, - "y": 0, - "w": 27, - "h": 26 - } - }, - { - "filename": "master_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 176, - "w": 22, - "h": 31 - } - }, - { - "filename": "rogue_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 207, - "w": 22, - "h": 31 - } - }, - { - "filename": "ultra_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 0, - "y": 238, - "w": 22, - "h": 31 - } - }, - { - "filename": "inverse", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 30 - }, - "frame": { - "x": 0, - "y": 269, - "w": 22, - "h": 30 - } - }, - { - "filename": "ribbon_gen3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 29 - }, - "frame": { - "x": 0, - "y": 299, - "w": 22, - "h": 29 - } - }, - { - "filename": "ribbon_gen7", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 29 - }, - "frame": { - "x": 0, - "y": 328, - "w": 22, - "h": 29 - } - }, - { - "filename": "ribbon_gen9", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 29 - }, - "frame": { - "x": 0, - "y": 357, - "w": 22, - "h": 29 - } - }, - { - "filename": "cornerstone_mask", + "filename": "ability_capsule", "rotated": false, "trimmed": true, "sourceSize": { @@ -376,19 +40,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 3, + "y": 9, "w": 24, - "h": 26 + "h": 14 }, "frame": { - "x": 149, + "x": 15, "y": 0, "w": 24, - "h": 26 + "h": 14 } }, { - "filename": "ribbon_gen1", + "filename": "candy_overlay", "rotated": false, "trimmed": true, "sourceSize": { @@ -396,16 +60,1234 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 39, + "y": 0, + "w": 16, + "h": 15 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 55, + "y": 0, + "w": 15, + "h": 15 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 70, + "y": 0, + "w": 15, + "h": 15 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 85, + "y": 0, + "w": 24, + "h": 15 + } + }, + { + "filename": "ultranecrozium_z", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 30, + "h": 15 + }, + "frame": { + "x": 109, + "y": 0, + "w": 30, + "h": 15 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 139, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 155, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 171, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 187, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 203, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 219, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 235, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 251, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 267, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "beedrillite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 283, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "blastoisinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 299, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "blazikenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 315, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "cameruptite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 331, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 347, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 363, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "diancite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 379, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "galladite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 395, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "garchompite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 411, + "y": 0, + "w": 16, + "h": 16 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { "x": 0, - "y": 386, - "w": 22, - "h": 28 + "y": 11, + "w": 12, + "h": 17 + } + }, + { + "filename": "gardevoirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 12, + "y": 14, + "w": 16, + "h": 16 + } + }, + { + "filename": "gengarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 28, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "glalitite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 44, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "gyaradosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 60, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "heracronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 76, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "houndoominite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 92, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "kangaskhanite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 108, + "y": 15, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 124, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 140, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "lopunnite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 156, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "lucarionite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 172, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "manectite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 188, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "mawilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 204, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "medichamite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 220, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 236, + "y": 16, + "w": 20, + "h": 16 + } + }, + { + "filename": "metagrossite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 256, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 272, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 288, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 304, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "pidgeotite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 320, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "pinsirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 336, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "rayquazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 352, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 368, + "y": 16, + "w": 17, + "h": 16 + } + }, + { + "filename": "sablenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 385, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "salamencite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 401, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "sceptilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 417, + "y": 16, + "w": 16, + "h": 16 + } + }, + { + "filename": "scizorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 0, + "y": 30, + "w": 16, + "h": 16 + } + }, + { + "filename": "sharpedonite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 16, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "slowbronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 32, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "soul_dew", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 48, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "steelixite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 64, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "strawberry_sweet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 16, + "h": 16 + }, + "frame": { + "x": 80, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "swampertite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 96, + "y": 31, + "w": 16, + "h": 16 + } + }, + { + "filename": "tyranitarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 112, + "y": 32, + "w": 16, + "h": 16 + } + }, + { + "filename": "venusaurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 128, + "y": 32, + "w": 16, + "h": 16 } }, { @@ -423,432 +1305,12 @@ "h": 17 }, "frame": { - "x": 0, - "y": 414, + "x": 144, + "y": 32, "w": 23, "h": 17 } }, - { - "filename": "ability_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 23, - "h": 26 - }, - "frame": { - "x": 173, - "y": 0, - "w": 23, - "h": 26 - } - }, - { - "filename": "map", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 27, - "h": 22 - }, - "frame": { - "x": 196, - "y": 0, - "w": 27, - "h": 22 - } - }, - { - "filename": "mint_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 223, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 251, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_neutral", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 279, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spatk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 307, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spd", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 335, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "mint_spdef", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 28, - "h": 21 - }, - "frame": { - "x": 363, - "y": 0, - "w": 28, - "h": 21 - } - }, - { - "filename": "chipped_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 391, - "y": 0, - "w": 26, - "h": 20 - } - }, - { - "filename": "exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 114, - "w": 17, - "h": 31 - } - }, - { - "filename": "golden_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 145, - "w": 17, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 176, - "w": 17, - "h": 31 - } - }, - { - "filename": "prison_bottle", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 30 - }, - "frame": { - "x": 22, - "y": 207, - "w": 17, - "h": 30 - } - }, - { - "filename": "ribbon_gen5", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, - "frame": { - "x": 22, - "y": 237, - "w": 22, - "h": 28 - } - }, - { - "filename": "ribbon_gen6", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, - "frame": { - "x": 22, - "y": 265, - "w": 22, - "h": 28 - } - }, - { - "filename": "ribbon_gen8", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, - "frame": { - "x": 22, - "y": 293, - "w": 22, - "h": 28 - } - }, - { - "filename": "black_augurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 22, - "y": 321, - "w": 22, - "h": 25 - } - }, - { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 22, - "y": 346, - "w": 23, - "h": 24 - } - }, - { - "filename": "blank_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 22, - "y": 370, - "w": 24, - "h": 24 - } - }, - { - "filename": "cracked_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 22, - "y": 394, - "w": 26, - "h": 20 - } - }, { "filename": "burn_drive", "rotated": false, @@ -864,8 +1326,8 @@ "h": 17 }, "frame": { - "x": 23, - "y": 414, + "x": 167, + "y": 32, "w": 23, "h": 17 } @@ -885,2301 +1347,12 @@ "h": 17 }, "frame": { - "x": 46, - "y": 414, + "x": 190, + "y": 32, "w": 23, "h": 17 } }, - { - "filename": "ultranecrozium_z", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 9, - "w": 30, - "h": 15 - }, - "frame": { - "x": 122, - "y": 26, - "w": 30, - "h": 15 - } - }, - { - "filename": "legend_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 25, - "h": 20 - }, - "frame": { - "x": 152, - "y": 26, - "w": 25, - "h": 20 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 177, - "y": 26, - "w": 23, - "h": 21 - } - }, - { - "filename": "choice_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 200, - "y": 22, - "w": 24, - "h": 24 - } - }, - { - "filename": "draco_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 224, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "dread_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 248, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "earth_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 272, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 296, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "flame_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 320, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 344, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 368, - "y": 21, - "w": 24, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 392, - "y": 20, - "w": 24, - "h": 24 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 416, - "y": 20, - "w": 15, - "h": 23 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 416, - "y": 43, - "w": 15, - "h": 22 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 392, - "y": 44, - "w": 24, - "h": 23 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 416, - "y": 65, - "w": 15, - "h": 15 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 417, - "y": 0, - "w": 12, - "h": 17 - } - }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 29, - "y": 29, - "w": 16, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 29, - "y": 53, - "w": 16, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 29, - "y": 77, - "w": 21, - "h": 24 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 45, - "y": 27, - "w": 18, - "h": 24 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 63, - "y": 28, - "w": 24, - "h": 23 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 45, - "y": 51, - "w": 24, - "h": 24 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 87, - "y": 28, - "w": 24, - "h": 23 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 69, - "y": 51, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 50, - "y": 75, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 74, - "y": 75, - "w": 24, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 93, - "y": 51, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 98, - "y": 75, - "w": 18, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 111, - "y": 41, - "w": 24, - "h": 24 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 135, - "y": 41, - "w": 17, - "h": 24 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 152, - "y": 46, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 176, - "y": 47, - "w": 24, - "h": 22 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 200, - "y": 46, - "w": 24, - "h": 23 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 224, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 248, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 272, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 296, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 320, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 344, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 368, - "y": 45, - "w": 24, - "h": 24 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 392, - "y": 67, - "w": 24, - "h": 14 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 116, - "y": 65, - "w": 24, - "h": 24 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 116, - "y": 89, - "w": 24, - "h": 18 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 140, - "y": 68, - "w": 24, - "h": 24 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 140, - "y": 92, - "w": 24, - "h": 18 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 164, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "silk_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 188, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 212, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 236, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 260, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 284, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 308, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 332, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 356, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_net", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 21 - }, - "frame": { - "x": 164, - "y": 93, - "w": 24, - "h": 21 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 188, - "y": 93, - "w": 24, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 212, - "y": 93, - "w": 24, - "h": 23 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 236, - "y": 93, - "w": 24, - "h": 23 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 260, - "y": 93, - "w": 23, - "h": 23 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 283, - "y": 93, - "w": 23, - "h": 23 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 306, - "y": 93, - "w": 23, - "h": 23 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 329, - "y": 93, - "w": 23, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 352, - "y": 93, - "w": 23, - "h": 24 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 416, - "y": 80, - "w": 15, - "h": 15 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 375, - "y": 93, - "w": 16, - "h": 24 - } - }, - { - "filename": "leek", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 391, - "y": 81, - "w": 23, - "h": 23 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 414, - "y": 95, - "w": 17, - "h": 24 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 391, - "y": 104, - "w": 23, - "h": 21 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 414, - "y": 119, - "w": 17, - "h": 24 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 50, - "y": 99, - "w": 24, - "h": 20 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 74, - "y": 99, - "w": 24, - "h": 20 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 98, - "y": 99, - "w": 18, - "h": 22 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 116, - "y": 107, - "w": 24, - "h": 22 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 140, - "y": 110, - "w": 24, - "h": 20 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 164, - "y": 114, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 188, - "y": 116, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 212, - "y": 116, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 236, - "y": 116, - "w": 24, - "h": 20 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 260, - "y": 116, - "w": 23, - "h": 21 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 283, - "y": 116, - "w": 23, - "h": 22 - } - }, - { - "filename": "macho_brace", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 306, - "y": 116, - "w": 23, - "h": 23 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 329, - "y": 117, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 352, - "y": 117, - "w": 23, - "h": 23 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 375, - "y": 117, - "w": 16, - "h": 24 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 391, - "y": 125, - "w": 23, - "h": 20 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 414, - "y": 143, - "w": 17, - "h": 23 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 39, - "y": 119, - "w": 22, - "h": 24 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 119, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 39, - "y": 143, - "w": 22, - "h": 23 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 39, - "y": 166, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 142, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 39, - "y": 189, - "w": 22, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 165, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 39, - "y": 212, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 188, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 211, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 44, - "y": 235, - "w": 18, - "h": 24 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 62, - "y": 234, - "w": 21, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 44, - "y": 259, - "w": 18, - "h": 24 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 62, - "y": 258, - "w": 21, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 44, - "y": 283, - "w": 18, - "h": 24 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 62, - "y": 282, - "w": 21, - "h": 23 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 44, - "y": 307, - "w": 20, - "h": 24 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 305, - "w": 22, - "h": 23 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 44, - "y": 331, - "w": 24, - "h": 15 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 45, - "y": 346, - "w": 22, - "h": 23 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 369, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 48, - "y": 392, - "w": 22, - "h": 22 - } - }, { "filename": "douse_drive", "rotated": false, @@ -3195,1020 +1368,12 @@ "h": 17 }, "frame": { - "x": 69, - "y": 414, + "x": 213, + "y": 32, "w": 23, "h": 17 } }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 68, - "y": 328, - "w": 19, - "h": 20 - } - }, - { - "filename": "berry_juice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 21 - }, - "frame": { - "x": 67, - "y": 348, - "w": 22, - "h": 21 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 68, - "y": 369, - "w": 22, - "h": 23 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 70, - "y": 392, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 121, - "w": 22, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 144, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 167, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 190, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 213, - "w": 22, - "h": 23 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 236, - "w": 22, - "h": 23 - } - }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 259, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 83, - "y": 282, - "w": 22, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 86, - "y": 305, - "w": 21, - "h": 23 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 87, - "y": 328, - "w": 20, - "h": 20 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 89, - "y": 348, - "w": 20, - "h": 21 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 90, - "y": 369, - "w": 21, - "h": 23 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 92, - "y": 392, - "w": 20, - "h": 23 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 92, - "y": 415, - "w": 20, - "h": 16 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 105, - "y": 129, - "w": 23, - "h": 22 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 105, - "y": 151, - "w": 22, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 105, - "y": 174, - "w": 22, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 105, - "y": 197, - "w": 22, - "h": 23 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 105, - "y": 220, - "w": 22, - "h": 23 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 105, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 105, - "y": 265, - "w": 22, - "h": 22 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 105, - "y": 287, - "w": 23, - "h": 18 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 107, - "y": 305, - "w": 21, - "h": 23 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 107, - "y": 328, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 109, - "y": 348, - "w": 22, - "h": 21 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 111, - "y": 369, - "w": 21, - "h": 23 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 112, - "y": 392, - "w": 22, - "h": 22 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 112, - "y": 414, - "w": 23, - "h": 17 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 128, - "y": 130, - "w": 23, - "h": 21 - } - }, - { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 151, - "w": 22, - "h": 22 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 173, - "w": 22, - "h": 22 - } - }, - { - "filename": "electric_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 195, - "w": 22, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 217, - "w": 22, - "h": 22 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 239, - "w": 22, - "h": 22 - } - }, - { - "filename": "fighting_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 127, - "y": 261, - "w": 22, - "h": 22 - } - }, - { - "filename": "fire_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 128, - "y": 283, - "w": 22, - "h": 22 - } - }, - { - "filename": "flying_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 128, - "y": 305, - "w": 22, - "h": 22 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 129, - "y": 327, - "w": 21, - "h": 21 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 21 - }, - "frame": { - "x": 131, - "y": 348, - "w": 20, - "h": 21 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 132, - "y": 369, - "w": 18, - "h": 23 - } - }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 134, - "y": 392, - "w": 22, - "h": 22 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 135, - "y": 414, - "w": 23, - "h": 17 - } - }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 150, - "y": 369, - "w": 17, - "h": 23 - } - }, - { - "filename": "ghost_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 156, - "y": 392, - "w": 22, - "h": 22 - } - }, { "filename": "everstone", "rotated": false, @@ -4224,14 +1389,14 @@ "h": 17 }, "frame": { - "x": 158, - "y": 414, + "x": 236, + "y": 32, "w": 20, "h": 17 } }, { - "filename": "coupon", + "filename": "shock_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -4240,208 +1405,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 8, "w": 23, - "h": 19 + "h": 17 }, "frame": { - "x": 151, - "y": 134, + "x": 256, + "y": 32, "w": 23, - "h": 19 + "h": 17 } }, { - "filename": "grass_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "ground_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 175, - "w": 22, - "h": 22 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 149, - "y": 263, - "w": 22, - "h": 20 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 150, - "y": 283, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 150, - "y": 305, - "w": 22, - "h": 22 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 150, - "y": 327, - "w": 22, - "h": 21 - } - }, - { - "filename": "n_lunarizer", + "filename": "wise_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -4450,19 +1426,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 6, + "y": 8, "w": 23, - "h": 21 + "h": 17 }, "frame": { - "x": 151, - "y": 348, + "x": 279, + "y": 32, "w": 23, - "h": 21 + "h": 17 } }, { - "filename": "super_potion", + "filename": "baton", "rotated": false, "trimmed": true, "sourceSize": { @@ -4470,20 +1446,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 + "x": 7, + "y": 7, + "w": 18, + "h": 18 }, "frame": { - "x": 167, - "y": 369, - "w": 17, - "h": 23 + "x": 302, + "y": 32, + "w": 18, + "h": 18 } }, { - "filename": "max_repel", + "filename": "candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -4491,20 +1467,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 7, + "y": 11, + "w": 18, + "h": 18 }, "frame": { - "x": 178, - "y": 392, - "w": 16, - "h": 24 + "x": 320, + "y": 32, + "w": 18, + "h": 18 } }, { - "filename": "candy_overlay", + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -4512,20 +1488,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 + "x": 4, + "y": 8, + "w": 24, + "h": 18 }, "frame": { - "x": 178, - "y": 416, - "w": 16, - "h": 15 + "x": 338, + "y": 32, + "w": 24, + "h": 18 } }, { - "filename": "pp_max", + "filename": "dark_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4533,20 +1509,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 7, + "y": 7, + "w": 18, + "h": 18 }, "frame": { - "x": 171, - "y": 153, - "w": 16, - "h": 24 + "x": 362, + "y": 32, + "w": 18, + "h": 18 } }, { - "filename": "pp_up", + "filename": "dragon_scale", "rotated": false, "trimmed": true, "sourceSize": { @@ -4554,20 +1530,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 4, + "y": 8, + "w": 24, + "h": 18 }, "frame": { - "x": 171, - "y": 177, - "w": 16, - "h": 24 + "x": 380, + "y": 32, + "w": 24, + "h": 18 } }, { - "filename": "protein", + "filename": "flame_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -4575,62 +1551,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 7, + "y": 7, + "w": 18, + "h": 18 }, "frame": { - "x": 171, - "y": 201, - "w": 16, - "h": 24 + "x": 404, + "y": 32, + "w": 18, + "h": 18 } }, { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 171, - "y": 225, - "w": 16, - "h": 24 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 171, - "y": 249, - "w": 16, - "h": 24 - } - }, - { - "filename": "abomasite", + "filename": "mystery_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -4641,395 +1575,17 @@ "x": 8, "y": 8, "w": 16, - "h": 16 + "h": 18 }, "frame": { - "x": 174, - "y": 137, + "x": 0, + "y": 46, "w": 16, - "h": 16 + "h": 18 } }, { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 190, - "y": 136, - "w": 23, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 213, - "y": 136, - "w": 23, - "h": 19 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 236, - "y": 136, - "w": 23, - "h": 21 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 259, - "y": 137, - "w": 23, - "h": 20 - } - }, - { - "filename": "moon_flute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 187, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "normal_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 187, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 187, - "y": 199, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 187, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 199, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 187, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 282, - "y": 138, - "w": 23, - "h": 19 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 305, - "y": 139, - "w": 23, - "h": 20 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 328, - "y": 140, - "w": 23, - "h": 21 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 351, - "y": 140, - "w": 22, - "h": 22 - } - }, - { - "filename": "razor_fang", + "filename": "light_ball", "rotated": false, "trimmed": true, "sourceSize": { @@ -5038,712 +1594,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, + "y": 7, "w": 18, - "h": 20 + "h": 18 }, "frame": { - "x": 373, - "y": 141, + "x": 16, + "y": 47, "w": 18, - "h": 20 + "h": 18 } }, { - "filename": "sun_flute", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 231, - "y": 157, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 231, - "y": 179, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 253, - "y": 157, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 231, - "y": 201, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 253, - "y": 179, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 157, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 231, - "y": 223, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 253, - "y": 201, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 179, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 253, - "y": 223, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 201, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 223, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 231, - "y": 245, - "w": 22, - "h": 21 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 253, - "y": 245, - "w": 22, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 275, - "y": 245, - "w": 22, - "h": 21 - } - }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 391, - "y": 145, - "w": 22, - "h": 19 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 297, - "y": 159, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 297, - "y": 181, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 297, - "y": 203, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 297, - "y": 225, - "w": 22, - "h": 22 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 297, - "y": 247, - "w": 22, - "h": 19 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 319, - "y": 161, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 319, - "y": 183, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 319, - "y": 205, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 319, - "y": 227, - "w": 22, - "h": 22 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 319, - "y": 249, - "w": 22, - "h": 19 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 341, - "y": 162, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 341, - "y": 184, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 341, - "y": 206, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 341, - "y": 228, - "w": 22, - "h": 22 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 341, - "y": 250, - "w": 22, - "h": 20 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 363, - "y": 162, - "w": 16, - "h": 24 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 363, - "y": 186, - "w": 16, - "h": 24 - } - }, - { - "filename": "hard_meteorite", + "filename": "light_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5752,309 +1615,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 363, - "y": 210, - "w": 20, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 363, - "y": 232, - "w": 20, - "h": 22 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 363, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 379, - "y": 164, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 379, - "y": 186, - "w": 22, - "h": 22 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 383, - "y": 208, - "w": 19, - "h": 22 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 383, - "y": 230, - "w": 19, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 383, - "y": 252, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 401, - "y": 166, - "w": 22, - "h": 22 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 401, - "y": 188, - "w": 20, - "h": 20 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 402, - "y": 208, - "w": 22, - "h": 22 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 402, - "y": 230, - "w": 17, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 405, - "y": 252, - "w": 17, - "h": 22 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, "y": 7, - "w": 22, - "h": 19 + "w": 18, + "h": 18 }, "frame": { - "x": 187, - "y": 265, - "w": 22, - "h": 19 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 209, - "y": 265, - "w": 21, - "h": 19 + "x": 34, + "y": 47, + "w": 18, + "h": 18 } }, { @@ -6072,8 +1641,8 @@ "h": 18 }, "frame": { - "x": 230, - "y": 266, + "x": 52, + "y": 47, "w": 21, "h": 18 } @@ -6093,14 +1662,14 @@ "h": 18 }, "frame": { - "x": 251, - "y": 266, + "x": 73, + "y": 47, "w": 21, "h": 18 } }, { - "filename": "poison_barb", + "filename": "toxic_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6108,79 +1677,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 272, - "y": 266, - "w": 21, - "h": 21 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 293, - "y": 266, - "w": 21, - "h": 21 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 314, - "y": 268, - "w": 21, - "h": 21 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 7, "y": 7, - "w": 20, - "h": 19 + "w": 18, + "h": 18 }, "frame": { - "x": 335, - "y": 270, - "w": 20, - "h": 19 + "x": 94, + "y": 47, + "w": 18, + "h": 18 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 112, + "y": 48, + "w": 23, + "h": 18 } }, { @@ -6198,8 +1725,8 @@ "h": 18 }, "frame": { - "x": 355, - "y": 274, + "x": 135, + "y": 49, "w": 21, "h": 18 } @@ -6219,14 +1746,14 @@ "h": 18 }, "frame": { - "x": 376, - "y": 274, + "x": 156, + "y": 49, "w": 21, "h": 18 } }, { - "filename": "magnet", + "filename": "wl_ability_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -6235,166 +1762,250 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, + "y": 8, "w": 20, - "h": 20 + "h": 18 + }, + "frame": { + "x": 177, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 197, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 217, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 237, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 257, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 277, + "y": 49, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 297, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 317, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 337, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 357, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 377, + "y": 50, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 }, "frame": { "x": 397, - "y": 274, + "y": 50, "w": 20, - "h": 20 + "h": 18 } }, { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 172, - "y": 273, - "w": 15, - "h": 11 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 172, - "y": 284, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 192, - "y": 284, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 172, - "y": 304, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb_silver", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 212, - "y": 284, - "w": 20, - "h": 20 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 172, - "y": 324, - "w": 19, - "h": 21 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 192, - "y": 304, - "w": 20, - "h": 20 - } - }, - { - "filename": "smooth_meteorite", + "filename": "oval_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6403,19 +2014,607 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 417, + "y": 50, + "w": 18, + "h": 19 + } + }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, "w": 20, + "h": 18 + }, + "frame": { + "x": 0, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 20, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 40, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 60, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 80, + "y": 65, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 100, + "y": 66, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 120, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 140, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 160, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_reset_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 180, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 200, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 220, + "y": 67, + "w": 20, + "h": 18 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 240, + "y": 67, + "w": 19, + "h": 19 + } + }, + { + "filename": "black_sludge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 259, + "y": 67, + "w": 22, + "h": 19 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 281, + "y": 68, + "w": 22, + "h": 19 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 303, + "y": 68, + "w": 23, + "h": 19 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 326, + "y": 68, + "w": 22, + "h": 19 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 348, + "y": 68, + "w": 23, + "h": 19 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 371, + "y": 68, + "w": 20, + "h": 19 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 391, + "y": 68, + "w": 21, + "h": 19 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 412, + "y": 69, + "w": 19, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 0, + "y": 83, + "w": 23, + "h": 19 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 23, + "y": 83, + "w": 23, + "h": 19 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 46, + "y": 83, + "w": 20, + "h": 19 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 66, + "y": 83, + "w": 20, + "h": 19 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 86, + "y": 84, + "w": 22, + "h": 19 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 108, + "y": 85, + "w": 20, + "h": 19 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, "h": 20 }, "frame": { - "x": 232, - "y": 284, - "w": 20, + "x": 128, + "y": 85, + "w": 19, "h": 20 } }, { - "filename": "strange_ball", + "filename": "big_nugget", "rotated": false, "trimmed": true, "sourceSize": { @@ -6429,14 +2628,14 @@ "h": 20 }, "frame": { - "x": 252, - "y": 284, + "x": 147, + "y": 85, "w": 20, "h": 20 } }, { - "filename": "spell_tag", + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,20 +2643,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 5, "y": 6, - "w": 19, - "h": 21 + "w": 23, + "h": 20 }, "frame": { - "x": 191, - "y": 324, - "w": 19, - "h": 21 + "x": 167, + "y": 85, + "w": 23, + "h": 20 } }, { - "filename": "ub", + "filename": "blue_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6471,8 +2670,8 @@ "h": 20 }, "frame": { - "x": 212, - "y": 304, + "x": 190, + "y": 85, "w": 20, "h": 20 } @@ -6493,11 +2692,137 @@ }, "frame": { "x": 210, - "y": 324, + "y": 85, "w": 19, "h": 20 } }, + { + "filename": "chipped_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 26, + "h": 20 + }, + "frame": { + "x": 229, + "y": 86, + "w": 26, + "h": 20 + } + }, + { + "filename": "cracked_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 6, + "w": 26, + "h": 20 + }, + "frame": { + "x": 255, + "y": 86, + "w": 26, + "h": 20 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 281, + "y": 87, + "w": 22, + "h": 20 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 303, + "y": 87, + "w": 22, + "h": 20 + } + }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 325, + "y": 87, + "w": 20, + "h": 20 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 345, + "y": 87, + "w": 17, + "h": 20 + } + }, { "filename": "hard_stone", "rotated": false, @@ -6513,14 +2838,14 @@ "h": 20 }, "frame": { - "x": 232, - "y": 304, + "x": 362, + "y": 87, "w": 19, "h": 20 } }, { - "filename": "power_herb", + "filename": "icy_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -6528,20 +2853,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 4, "y": 7, - "w": 20, - "h": 19 + "w": 24, + "h": 20 }, "frame": { - "x": 229, - "y": 324, - "w": 20, - "h": 19 + "x": 381, + "y": 87, + "w": 24, + "h": 20 } }, { - "filename": "razor_claw", + "filename": "legend_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -6549,522 +2874,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 251, - "y": 304, - "w": 20, - "h": 19 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 18 - }, - "frame": { - "x": 272, - "y": 287, - "w": 20, - "h": 18 - } - }, - { - "filename": "white_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 292, - "y": 287, - "w": 20, - "h": 19 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 271, - "y": 305, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 306, - "w": 20, - "h": 18 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 3, "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 174, - "y": 345, - "w": 19, - "h": 19 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, + "w": 25, "h": 20 }, "frame": { - "x": 193, - "y": 345, - "w": 17, + "x": 405, + "y": 88, + "w": 25, "h": 20 } }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 210, - "y": 344, - "w": 19, - "h": 19 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 229, - "y": 343, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 312, - "y": 289, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 332, - "y": 289, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 311, - "y": 307, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 331, - "y": 307, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 352, - "y": 292, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 372, - "y": 292, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 351, - "y": 310, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 371, - "y": 310, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 392, - "y": 294, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 391, - "y": 312, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_item_drop", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 411, - "y": 312, - "w": 20, - "h": 18 - } - }, - { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 412, - "y": 294, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 184, - "y": 365, - "w": 20, - "h": 18 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 204, - "y": 365, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 194, - "y": 383, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 194, - "y": 401, - "w": 20, - "h": 18 - } - }, { "filename": "lucky_egg", "rotated": false, @@ -7080,14 +2901,14 @@ "h": 20 }, "frame": { - "x": 214, - "y": 383, + "x": 0, + "y": 102, "w": 17, "h": 20 } }, { - "filename": "dark_stone", + "filename": "magnet", "rotated": false, "trimmed": true, "sourceSize": { @@ -7095,20 +2916,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 214, - "y": 403, - "w": 18, - "h": 18 + "x": 17, + "y": 102, + "w": 20, + "h": 20 } }, { - "filename": "oval_stone", + "filename": "malicious_armor", "rotated": false, "trimmed": true, "sourceSize": { @@ -7116,20 +2937,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 + "x": 5, + "y": 6, + "w": 22, + "h": 20 }, "frame": { - "x": 222, - "y": 363, - "w": 18, - "h": 19 + "x": 37, + "y": 102, + "w": 22, + "h": 20 } }, { - "filename": "flame_orb", + "filename": "mb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7137,20 +2958,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 231, - "y": 382, - "w": 18, - "h": 18 + "x": 59, + "y": 102, + "w": 20, + "h": 20 } }, { - "filename": "light_ball", + "filename": "metal_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -7158,20 +2979,104 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 4, + "y": 6, + "w": 24, + "h": 20 }, "frame": { - "x": 232, - "y": 400, - "w": 18, - "h": 18 + "x": 79, + "y": 103, + "w": 24, + "h": 20 } }, { - "filename": "light_stone", + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 103, + "y": 104, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 123, + "y": 105, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb_silver", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 143, + "y": 105, + "w": 20, + "h": 20 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 163, + "y": 105, + "w": 24, + "h": 20 + } + }, + { + "filename": "razor_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -7180,19 +3085,481 @@ }, "spriteSourceSize": { "x": 7, - "y": 7, + "y": 6, "w": 18, - "h": 18 + "h": 20 + }, + "frame": { + "x": 187, + "y": 105, + "w": 18, + "h": 20 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 205, + "y": 105, + "w": 20, + "h": 20 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 225, + "y": 106, + "w": 23, + "h": 20 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 248, + "y": 106, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 272, + "y": 107, + "w": 24, + "h": 20 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 296, + "y": 107, + "w": 24, + "h": 20 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 320, + "y": 107, + "w": 23, + "h": 20 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 343, + "y": 107, + "w": 20, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 363, + "y": 107, + "w": 24, + "h": 20 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 387, + "y": 108, + "w": 20, + "h": 20 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 407, + "y": 108, + "w": 22, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 0, + "y": 122, + "w": 20, + "h": 20 + } + }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 20, + "y": 122, + "w": 23, + "h": 21 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 43, + "y": 122, + "w": 23, + "h": 21 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 66, + "y": 123, + "w": 23, + "h": 21 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 21 + }, + "frame": { + "x": 89, + "y": 124, + "w": 22, + "h": 21 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 111, + "y": 125, + "w": 20, + "h": 21 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 131, + "y": 125, + "w": 22, + "h": 21 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 153, + "y": 125, + "w": 21, + "h": 21 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 21 + }, + "frame": { + "x": 174, + "y": 125, + "w": 20, + "h": 21 + } + }, + { + "filename": "golden_net", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 21 + }, + "frame": { + "x": 194, + "y": 125, + "w": 24, + "h": 21 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 218, + "y": 126, + "w": 22, + "h": 21 + } + }, + { + "filename": "mint_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { "x": 240, - "y": 361, - "w": 18, - "h": 18 + "y": 126, + "w": 28, + "h": 21 } }, { - "filename": "mystery_egg", + "filename": "mint_def", "rotated": false, "trimmed": true, "sourceSize": { @@ -7200,419 +3567,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 249, - "y": 379, - "w": 16, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 250, - "y": 397, - "w": 18, - "h": 18 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 250, - "y": 415, - "w": 17, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 267, - "y": 415, - "w": 16, - "h": 16 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 251, - "y": 323, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 271, - "y": 323, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 324, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 311, - "y": 325, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 331, - "y": 325, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 249, - "y": 341, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 269, - "y": 341, - "w": 20, - "h": 18 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 351, - "y": 328, - "w": 16, - "h": 16 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 367, - "y": 328, - "w": 16, - "h": 16 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 258, - "y": 359, - "w": 16, - "h": 16 - } - }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 274, - "y": 359, - "w": 16, - "h": 16 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 289, - "y": 342, - "w": 16, - "h": 16 - } - }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 290, - "y": 358, - "w": 16, - "h": 16 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 265, - "y": 375, - "w": 16, - "h": 16 - } - }, - { - "filename": "beedrillite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 281, - "y": 375, - "w": 16, - "h": 16 - } - }, - { - "filename": "blastoisinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { "x": 268, - "y": 391, - "w": 16, - "h": 16 + "y": 127, + "w": 28, + "h": 21 } }, { - "filename": "blazikenite", + "filename": "mint_neutral", "rotated": false, "trimmed": true, "sourceSize": { @@ -7620,20 +3588,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { - "x": 284, - "y": 391, - "w": 16, - "h": 16 + "x": 296, + "y": 127, + "w": 28, + "h": 21 } }, { - "filename": "cameruptite", + "filename": "mint_spatk", "rotated": false, "trimmed": true, "sourceSize": { @@ -7641,20 +3609,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { - "x": 283, - "y": 407, - "w": 16, - "h": 16 + "x": 324, + "y": 127, + "w": 28, + "h": 21 } }, { - "filename": "charizardite_x", + "filename": "mint_spd", "rotated": false, "trimmed": true, "sourceSize": { @@ -7662,20 +3630,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { - "x": 297, - "y": 374, - "w": 16, - "h": 16 + "x": 352, + "y": 127, + "w": 28, + "h": 21 } }, { - "filename": "charizardite_y", + "filename": "mint_spdef", "rotated": false, "trimmed": true, "sourceSize": { @@ -7683,629 +3651,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 300, - "y": 390, - "w": 16, - "h": 16 - } - }, - { - "filename": "diancite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 383, - "y": 330, - "w": 16, - "h": 16 - } - }, - { - "filename": "galladite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 330, - "w": 16, - "h": 16 - } - }, - { - "filename": "garchompite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 415, - "y": 330, - "w": 16, - "h": 16 - } - }, - { - "filename": "gardevoirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 299, - "y": 407, - "w": 16, - "h": 16 - } - }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 313, - "y": 343, - "w": 16, - "h": 16 - } - }, - { - "filename": "glalitite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 329, - "y": 343, - "w": 16, - "h": 16 - } - }, - { - "filename": "gyaradosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 345, - "y": 344, - "w": 16, - "h": 16 - } - }, - { - "filename": "heracronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 361, - "y": 344, - "w": 16, - "h": 16 - } - }, - { - "filename": "houndoominite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 377, - "y": 346, - "w": 16, - "h": 16 - } - }, - { - "filename": "kangaskhanite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 393, - "y": 346, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 409, - "y": 346, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 313, - "y": 359, - "w": 16, - "h": 16 - } - }, - { - "filename": "lopunnite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 329, - "y": 359, - "w": 16, - "h": 16 - } - }, - { - "filename": "lucarionite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 345, - "y": 360, - "w": 16, - "h": 16 - } - }, - { - "filename": "manectite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 361, - "y": 360, - "w": 16, - "h": 16 - } - }, - { - "filename": "mawilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 377, - "y": 362, - "w": 16, - "h": 16 - } - }, - { - "filename": "medichamite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 393, - "y": 362, - "w": 16, - "h": 16 - } - }, - { - "filename": "metagrossite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 409, - "y": 362, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 316, - "y": 375, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 316, - "y": 391, - "w": 16, - "h": 16 - } - }, - { - "filename": "nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 315, - "y": 407, - "w": 16, - "h": 16 - } - }, - { - "filename": "pidgeotite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 332, - "y": 376, - "w": 16, - "h": 16 - } - }, - { - "filename": "pinsirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 348, - "y": 376, - "w": 16, - "h": 16 - } - }, - { - "filename": "rayquazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 332, - "y": 392, - "w": 16, - "h": 16 - } - }, - { - "filename": "sablenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 348, - "y": 392, - "w": 16, - "h": 16 - } - }, - { - "filename": "salamencite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 331, - "y": 408, - "w": 16, - "h": 16 - } - }, - { - "filename": "sceptilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 347, - "y": 408, - "w": 16, - "h": 16 - } - }, - { - "filename": "scizorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 364, - "y": 378, - "w": 16, - "h": 16 - } - }, - { - "filename": "sharpedonite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 2, + "y": 5, + "w": 28, + "h": 21 }, "frame": { "x": 380, - "y": 378, - "w": 16, - "h": 16 + "y": 128, + "w": 28, + "h": 21 } }, { - "filename": "slowbronite", + "filename": "moon_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -8313,20 +3672,377 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 396, - "y": 378, - "w": 16, - "h": 16 + "x": 408, + "y": 128, + "w": 23, + "h": 21 } }, { - "filename": "soul_dew", + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 0, + "y": 142, + "w": 19, + "h": 21 + } + }, + { + "filename": "n_lunarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 19, + "y": 143, + "w": 23, + "h": 21 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 42, + "y": 143, + "w": 23, + "h": 21 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 65, + "y": 144, + "w": 21, + "h": 21 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 86, + "y": 145, + "w": 21, + "h": 21 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 107, + "y": 146, + "w": 19, + "h": 21 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 126, + "y": 146, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 148, + "y": 146, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 170, + "y": 146, + "w": 22, + "h": 21 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 192, + "y": 146, + "w": 23, + "h": 21 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 215, + "y": 147, + "w": 21, + "h": 21 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 236, + "y": 147, + "w": 18, + "h": 22 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 254, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 276, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 298, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 320, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 342, + "y": 148, + "w": 22, + "h": 22 + } + }, + { + "filename": "leftovers", "rotated": false, "trimmed": true, "sourceSize": { @@ -8335,19 +4051,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, - "w": 16, - "h": 16 + "y": 5, + "w": 15, + "h": 22 }, "frame": { "x": 364, - "y": 394, - "w": 16, - "h": 16 + "y": 148, + "w": 15, + "h": 22 } }, { - "filename": "steelixite", + "filename": "dragon_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -8355,20 +4071,230 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 380, - "y": 394, - "w": 16, - "h": 16 + "x": 379, + "y": 149, + "w": 22, + "h": 22 } }, { - "filename": "strawberry_sweet", + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 401, + "y": 149, + "w": 22, + "h": 22 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 0, + "y": 163, + "w": 19, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 19, + "y": 164, + "w": 22, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 41, + "y": 164, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 165, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 85, + "y": 166, + "w": 22, + "h": 22 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 107, + "y": 167, + "w": 24, + "h": 22 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 131, + "y": 167, + "w": 24, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 155, + "y": 167, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 177, + "y": 167, + "w": 22, + "h": 22 + } + }, + { + "filename": "full_heal", "rotated": false, "trimmed": true, "sourceSize": { @@ -8377,19 +4303,166 @@ }, "spriteSourceSize": { "x": 9, - "y": 7, - "w": 16, - "h": 16 + "y": 4, + "w": 15, + "h": 23 }, "frame": { - "x": 396, - "y": 394, - "w": 16, - "h": 16 + "x": 199, + "y": 167, + "w": 15, + "h": 23 } }, { - "filename": "swampertite", + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 214, + "y": 168, + "w": 22, + "h": 22 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 236, + "y": 169, + "w": 17, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 341, + "y": 170, + "w": 20, + "h": 22 + } + }, + { + "filename": "soothe_bell", "rotated": false, "trimmed": true, "sourceSize": { @@ -8398,19 +4471,3694 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, - "w": 16, - "h": 16 + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 361, + "y": 170, + "w": 17, + "h": 22 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 378, + "y": 171, + "w": 23, + "h": 22 + } + }, + { + "filename": "ice_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 401, + "y": 171, + "w": 22, + "h": 22 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 0, + "y": 185, + "w": 19, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 19, + "y": 186, + "w": 22, + "h": 22 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 41, + "y": 186, + "w": 22, + "h": 22 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 187, + "w": 22, + "h": 22 + } + }, + { + "filename": "moon_flute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 85, + "y": 188, + "w": 22, + "h": 22 + } + }, + { + "filename": "map", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 5, + "w": 27, + "h": 22 + }, + "frame": { + "x": 107, + "y": 189, + "w": 27, + "h": 22 + } + }, + { + "filename": "normal_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 134, + "y": 189, + "w": 22, + "h": 22 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 156, + "y": 189, + "w": 24, + "h": 22 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 180, + "y": 189, + "w": 17, + "h": 23 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 197, + "y": 190, + "w": 22, + "h": 22 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 219, + "y": 190, + "w": 17, + "h": 23 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 236, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 258, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 280, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 302, + "y": 192, + "w": 23, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 325, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 347, + "y": 192, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 369, + "y": 193, + "w": 22, + "h": 22 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 391, + "y": 193, + "w": 20, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 411, + "y": 193, + "w": 22, + "h": 22 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 0, + "y": 207, + "w": 18, + "h": 23 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 18, + "y": 208, + "w": 22, + "h": 22 + } + }, + { + "filename": "sun_flute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 40, + "y": 208, + "w": 22, + "h": 22 + } + }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 62, + "y": 209, + "w": 22, + "h": 22 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 84, + "y": 210, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 106, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 128, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 172, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 194, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 216, + "y": 213, + "w": 20, + "h": 23 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 236, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 258, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 280, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 302, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 324, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 346, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 368, + "y": 215, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 390, + "y": 215, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { "x": 412, + "y": 215, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 0, + "y": 230, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 22, + "y": 230, + "w": 22, + "h": 22 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 44, + "y": 230, + "w": 17, + "h": 23 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 61, + "y": 231, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 83, + "y": 232, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 105, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 127, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 149, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 171, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_defense", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 193, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 215, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 237, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 259, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 281, + "y": 236, + "w": 23, + "h": 23 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 304, + "y": 236, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 326, + "y": 236, + "w": 22, + "h": 23 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 348, + "y": 236, + "w": 16, + "h": 24 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 364, + "y": 237, + "w": 24, + "h": 23 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 388, + "y": 237, + "w": 24, + "h": 23 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 412, + "y": 237, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 0, + "y": 252, + "w": 21, + "h": 23 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 21, + "y": 252, + "w": 22, + "h": 23 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 43, + "y": 253, + "w": 23, + "h": 23 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 66, + "y": 253, + "w": 16, + "h": 24 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 82, + "y": 254, + "w": 22, + "h": 23 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 104, + "y": 255, + "w": 24, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 128, + "y": 255, + "w": 22, + "h": 23 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 150, + "y": 255, + "w": 21, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 171, + "y": 256, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 193, + "y": 256, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 215, + "y": 258, + "w": 22, + "h": 23 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 237, + "y": 258, + "w": 22, + "h": 23 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 259, + "y": 258, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 281, + "y": 259, + "w": 22, + "h": 23 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 303, + "y": 259, + "w": 23, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 326, + "y": 259, + "w": 22, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 348, + "y": 260, + "w": 24, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 372, + "y": 260, + "w": 22, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 394, + "y": 260, + "w": 21, + "h": 23 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 415, + "y": 260, + "w": 18, + "h": 24 + } + }, + { + "filename": "leek", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 0, + "y": 275, + "w": 23, + "h": 23 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 23, + "y": 275, + "w": 18, + "h": 24 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 41, + "y": 276, + "w": 24, + "h": 23 + } + }, + { + "filename": "macho_brace", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 65, + "y": 277, + "w": 23, + "h": 23 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 88, + "y": 277, + "w": 16, + "h": 24 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 104, + "y": 278, + "w": 22, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 126, + "y": 278, + "w": 22, + "h": 23 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 148, + "y": 278, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 170, + "y": 279, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 192, + "y": 279, + "w": 22, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 214, + "y": 281, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 237, + "y": 281, + "w": 23, + "h": 23 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 260, + "y": 281, + "w": 21, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 281, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 303, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 325, + "y": 282, + "w": 22, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 347, + "y": 283, + "w": 24, + "h": 23 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 371, + "y": 283, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 393, + "y": 283, + "w": 22, + "h": 23 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 415, + "y": 284, + "w": 18, + "h": 24 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 0, + "y": 298, + "w": 21, + "h": 23 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 21, + "y": 299, + "w": 24, + "h": 23 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 45, + "y": 299, + "w": 16, + "h": 24 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 300, + "w": 22, + "h": 23 + } + }, + { + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 83, + "y": 301, + "w": 23, + "h": 24 + } + }, + { + "filename": "blank_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 106, + "y": 301, + "w": 24, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 130, + "y": 301, + "w": 21, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 151, + "y": 301, + "w": 17, + "h": 24 + } + }, + { + "filename": "choice_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 168, + "y": 302, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 192, + "y": 302, + "w": 18, + "h": 24 + } + }, + { + "filename": "draco_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 210, + "y": 304, + "w": 24, + "h": 24 + } + }, + { + "filename": "dread_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 234, + "y": 304, + "w": 24, + "h": 24 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 258, + "y": 304, + "w": 23, + "h": 24 + } + }, + { + "filename": "earth_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 281, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 305, + "y": 305, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 329, + "y": 305, + "w": 18, + "h": 24 + } + }, + { + "filename": "flame_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 347, + "y": 306, + "w": 24, + "h": 24 + } + }, + { + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 371, + "y": 306, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 395, + "y": 306, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 412, + "y": 308, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 0, + "y": 321, + "w": 16, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 16, + "y": 322, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 40, + "y": 323, + "w": 24, + "h": 24 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 64, + "y": 323, + "w": 16, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 80, + "y": 325, + "w": 24, + "h": 24 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 104, + "y": 325, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 128, + "y": 325, + "w": 24, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 152, + "y": 325, + "w": 16, + "h": 24 + } + }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 168, + "y": 326, + "w": 24, + "h": 24 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 192, + "y": 326, + "w": 16, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 208, + "y": 328, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 232, + "y": 328, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 256, + "y": 328, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 280, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 304, + "y": 329, + "w": 24, + "h": 24 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 328, + "y": 329, + "w": 16, + "h": 24 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 344, + "y": 330, + "w": 22, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 366, + "y": 330, + "w": 24, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 390, + "y": 330, + "w": 21, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 411, + "y": 332, + "w": 24, + "h": 24 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 0, + "y": 345, + "w": 16, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 16, + "y": 346, + "w": 24, + "h": 24 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 40, + "y": 347, + "w": 24, + "h": 24 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 64, + "y": 347, + "w": 16, + "h": 24 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 80, + "y": 349, + "w": 20, + "h": 24 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 100, + "y": 349, + "w": 23, + "h": 24 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 123, + "y": 349, + "w": 24, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 147, + "y": 349, + "w": 21, + "h": 24 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 168, + "y": 350, + "w": 24, + "h": 24 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 192, + "y": 350, + "w": 16, + "h": 24 + } + }, + { + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 208, + "y": 352, + "w": 24, + "h": 24 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 232, + "y": 352, + "w": 24, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 256, + "y": 352, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 280, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 304, + "y": 353, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 328, + "y": 354, + "w": 24, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 352, + "y": 354, + "w": 17, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 369, + "y": 354, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 393, + "y": 356, + "w": 24, + "h": 24 + } + }, + { + "filename": "prison_bottle", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 30 + }, + "frame": { + "x": 417, + "y": 356, + "w": 17, + "h": 30 + } + }, + { + "filename": "black_augurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 0, + "y": 370, + "w": 22, + "h": 25 + } + }, + { + "filename": "ability_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 23, + "h": 26 + }, + "frame": { + "x": 22, + "y": 371, + "w": 23, + "h": 26 + } + }, + { + "filename": "cornerstone_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 3, + "w": 24, + "h": 26 + }, + "frame": { + "x": 45, + "y": 371, + "w": 24, + "h": 26 + } + }, + { + "filename": "linking_cord", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 27, + "h": 26 + }, + "frame": { + "x": 69, + "y": 373, + "w": 27, + "h": 26 + } + }, + { + "filename": "mystical_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 96, + "y": 373, + "w": 28, + "h": 26 + } + }, + { + "filename": "galarica_wreath", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 32, + "h": 27 + }, + "frame": { + "x": 124, + "y": 373, + "w": 32, + "h": 27 + } + }, + { + "filename": "leaders_crest", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 29, + "h": 27 + }, + "frame": { + "x": 156, + "y": 374, + "w": 29, + "h": 27 + } + }, + { + "filename": "ribbon_gen1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 185, + "y": 374, + "w": 22, + "h": 28 + } + }, + { + "filename": "max_mushrooms", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 29, + "h": 28 + }, + "frame": { + "x": 207, + "y": 376, + "w": 29, + "h": 28 + } + }, + { + "filename": "ribbon_gen2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 28, + "h": 28 + }, + "frame": { + "x": 236, + "y": 376, + "w": 28, + "h": 28 + } + }, + { + "filename": "ribbon_gen4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 30, + "h": 28 + }, + "frame": { + "x": 264, + "y": 377, + "w": 30, + "h": 28 + } + }, + { + "filename": "ribbon_gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 294, + "y": 377, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 316, "y": 378, - "w": 16, - "h": 16 + "w": 22, + "h": 28 } }, { - "filename": "tyranitarite", + "filename": "ribbon_gen8", "rotated": false, "trimmed": true, "sourceSize": { @@ -8418,20 +8166,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 2, + "w": 22, + "h": 28 }, "frame": { - "x": 412, - "y": 394, - "w": 16, - "h": 16 + "x": 338, + "y": 378, + "w": 22, + "h": 28 } }, { - "filename": "venusaurite", + "filename": "ribbon_gen3", "rotated": false, "trimmed": true, "sourceSize": { @@ -8439,16 +8187,268 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 1, + "w": 22, + "h": 29 }, "frame": { - "x": 363, - "y": 410, - "w": 16, - "h": 16 + "x": 360, + "y": 378, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 382, + "y": 380, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 404, + "y": 386, + "w": 22, + "h": 29 + } + }, + { + "filename": "inverse", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 30 + }, + "frame": { + "x": 0, + "y": 395, + "w": 22, + "h": 30 + } + }, + { + "filename": "galarica_cuff", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 29, + "h": 30 + }, + "frame": { + "x": 22, + "y": 397, + "w": 29, + "h": 30 + } + }, + { + "filename": "exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 51, + "y": 397, + "w": 17, + "h": 31 + } + }, + { + "filename": "bronze_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 68, + "y": 399, + "w": 22, + "h": 31 + } + }, + { + "filename": "golden_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 90, + "y": 399, + "w": 17, + "h": 31 + } + }, + { + "filename": "super_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 107, + "y": 399, + "w": 17, + "h": 31 + } + }, + { + "filename": "great_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 124, + "y": 400, + "w": 22, + "h": 31 + } + }, + { + "filename": "master_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 146, + "y": 401, + "w": 22, + "h": 31 + } + }, + { + "filename": "rogue_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 168, + "y": 402, + "w": 22, + "h": 31 + } + }, + { + "filename": "ultra_ribbon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 31 + }, + "frame": { + "x": 190, + "y": 404, + "w": 22, + "h": 31 } } ] @@ -8457,6 +8457,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:22a2cc3d3e531d383cfd9c9c6d0ae90e:cf2116762e9ba52acbac985ed04a7bd6:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:7b927dc715c6335dfca9e369b61374b2:fb24603dd37bbe0cbdf1d74fcbcbd223:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index c510ecebd147b619feefdd0d58cd80fbde7d4170..4433ce43a40296587c71ae16307f1411b4188244 100644 GIT binary patch literal 55816 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 z zBrfVDBxCUcasV5fO5B>OMZ2J`+ta^o%ZYX`hA7C$$W1rpx*pEQ8dfd)Z*4jXgFLFn z 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

      N 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 UHuyZ|N&o-=07*qoM6N<$f_MKR6951J literal 57986 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%0A-{e@_E3&wHsrlYqLj2-T6$*Tj(55 z(M*$YTQ#N}9=fpvI0^3iX$p7&psmh|BFhb>Tr5XfAuBX8I3@alAUZ?`#E5kMmP~4vE}^LGZpa1w;9c8p7|B4L-CF02+UGy4T?g3> zI-EyE@1GAnIp0tx#q`=+qg4~&6D)l*-;N==ReN0uXQ0;|LH(mv^Fm2N6z*$LcJ#cu ze{oqf`baP%dguKUIxZA*ptJ)`3deQ>%&2#5b>oNjO`-A%zgZq*NO9dIF7Kt}kr&B= z8A%fq|Ks~J8r9b)OTTAm`l?Ug)cb>DNTEnCsc6J^Y?v<&c%4%P zJZPfD7_*L-3pcQ{{^3ehfXb_CfpJIJTN*rt2SgXE;;s}mzyKTb2EEB4 za!($o8WE4{1XqjU$U(|4)cb|vL|Z(U-qEHkfMw$+Q|7_a7F#`{!s=!j8)3==q5Vn& z=0WMVaeGLJJM;!|d0YWQ?1LJmsE2Bf>_7tc(MHP_W9L1el zFzaz?s6wEBHb*9g<-Gyr!iU$~09#8au&_1kWFqPN@nSL5s2>9 zfWwIEd6IcyJH^8EnycTh;S3D?3w=ke&lUg1IKiace-JLD(4m)rMH^9H#)9{%7QF`> zvQ2XQW0!T<(AX_e=`{P6B0dB6 zATreUA;o?!g>fITdUy^pjKm)XB-GTn(-{~7ISE1w8%Z*T;?DaT0VUq^uPW*f?Y<(8 z7#(pyV0z7O4b zmnQ@EaNa^DIIm%C3OUc#TJ>;)fbdQ-CMXz>Ck=2o!1!Qj zfkcZ7joxL89oba8y?l6yZansP>E;^N%Q6rGBG!)Lxi-%U<7rNGE`3Xo*f^_IMP2S?@oc|9|jP;n@{D>HTePWRBu62WTd%t8YCvw@UgWMKUAMA)alT1wZX3n1*=yrCtDp+ zT9Q`A0NdU!t$(=;IwI(__y2H$XW#Z+V!XBPslKnGwEu78a$sPqnq3`Qi(kRwdv+U70Z39Y9p!^4mA8-{dYel<{^B^#~v9B}(TdC^*Db8m+6QhT@ zzNe-#3F%pXr-roQcgk9RGQA%7Xl`gT&4kcRwE17L= zGVk;mY17G~_K#XabMX#He(Y%l7qJtDZx1cJR(#!H$5=)w+P16OO0Pvua<6IIZ|GI{y+3A&j`@Lq2WHc~fnYlTZ z7yb?p$((J`S&44@I?ZB=s^q1oC$QbM-QcwL0(Igv0~tJYF7*GFUNe6NI|mtmRx22k z9wMaKxrHRTg)Xi=Eb$T~#njz3EM93AqCyLC6%2!bXDRL+a28WMAa2I+$O^4{AND|S z5~dDjC#&~W&Ohy~iMg@Oe}L-*3v_YErxil~qx$183ja zxnCR{Z~r$hQPsI2oq{c~&fSTF>i9>X3shgiVXl326jlt|jf(`TNlwe-rVP=~x*gto9Kdez3YELjg*=3vh9OIk zdv(U6>ZY)omj_A~|K#5)s;Q4PzljJO#(fcVpGVGRAS#fXT;ve)Q?k!qQ)3gOxWNgr zJr=Ze9oJEe;>xssY~DtsCF#C8CL-Y-%RQ^e-P7ehGz}m@NDXzSf*T7=I0+S1hzh!19OwV8T419WVP8kGTvpFR{Pd5VD|al)F{!4V=i z_mk0ld*&a$cu0#f;yBcQJT4*>&PQK#j3bX=d@TD_gPOu%?@ZyIYcoeU7 zMh3^}!{n(Mpce^c1j>8J;UCaH@%^76xA;5;*1sBwuLk-7`hQJQ0qW7?|3e;tEk*gx z0RSnt$?P|RPIjO>&DYVviF_8^(Kvvc3|9rH`gp`j>dg#hJqA$S!Z_fb77uzs2hX%b z%@PlkvqKi4ZNT|Vup-N_*4!}U$T!fKEjUCu)yBt*ii=qyt2(i(ss%No#Ob3+OT&#| zt7{ubhR{w-;wMHo0L=Yo!B@aug#@7?$dDcU642PXD+QoTGZZ4HJX|m6obTt7{Sf-K z5^%c?=Qd46*v24eIf0U5*d9`-Fmc9ep;)KtT1_wt$nL1Cfpx+igfZIh!3hM7guyzs zL8!mFC&r7;E(&9HLM@un)W}xRd-!9%r`ssRs`F+(S^t;CO~n5tb6q1dkcc~O!xCOy z7Z94ba}i6l&MUYix$*iu^6&Dw;nm`=^*nNyx?SrB9lCwo0dF+OVOYmyArl`B)b~Hk zQ7z=eq{=l7I2Ry9+0PT`c=Ya}8s~bo$T&;5iJ2bW1pUHP^nbko-35M;V`_!S^#*4H zyba8PkE@C?s(E?TL{aMBj+I-5*?GMs{ySKHcQMn}`d0m4gD#kT2nL9mUOm18zLn`Z#72x)`JU~Jh`fXDygZ{|I`2i;{IsmkzC4fNE0 zLPz7Vl=(a2f&Pbk(>MM3G3`oDyt4&QsIyC*TE1WsgsNtkp_aXHG$hr_8o0Dy@G0+1Q{cYL^a(gTv=bQHTS3 z)i;TYZ`uR78_m^c57myX7^A)91zT;^Z}Zr}*oIsl+8^msBHx>234=7u&ja;yrjVH~ z;V@(}S@-kz?v)>mgH}AV-$N{7g()X90clPH;u>}FHr;ybU(aK|`1Iu$OHXL0Pqpbk zp^~0AE5|<@otBiJYYh!*#(u7bILI@=n8BW@5%;I!)A;N*$UHj5ID2c8t`>Cjb(Ht! zbH_Hv8=2sVl|pNp?SLHcgIad5Z&*5XjNbA>781C-sc)VRydDZe%Og3wsAy;=r1Lvl zwbv{P&nUe7eb={GTkkC~j@`M)I))AN1Dyc9dQO#0K9}DkBa+pff=Me)a9_-L?-%4R z+9JD;P`?_YShxlW^laI|Q<3`a%AxFFQeOXusU!Fq?(2Fdio7#ESkz6B%i>Y4+ZixB zaSAfe}i%aCXft-yZKZ+|%L;`3O*AQrO*2-OmlkpHZUt-m(<0liR2oqR?V zy1r>L$@#%-ZTI*IY)AJif?S86H8wnpFieRh`QFXTtk@CFhwH`Ym|lBN6pS9Do9@uh zgW)>gdsLnw=}Zh3vTkiSxI3)mq$T~P`bpjX+va4@_3k9ao6d_~m<(rUyt>F(u!sPe zUa;+U>zP}Nwb2>z;jQjt@8?Q%9TVudBG`=!jH!DiIYFT%=~33bFUHl@1j%-)pxR!k zZ7f^}{+Iw&&=LyB>^qqhS>!Y3cGy?;SRmR&Yt7e53+>?w|%w& zVK0|9X~)_0y`#Tlm;HIckla_mI7AHHZ@n+5L?^`PKy`DGc-M*LxO|~&l+2aC5E$M> zgW2m(jN;Fe;T|)B3pwR~fCq{=37c-vkw=UIwYYHCo%-GEO!R2> zj>rI@0tKH07vB=>y10$xOWvIHc*?($YIy+_E<&x|$sb6RkuE5IfMfBxlz-us*r9Kc z5O5RNd?T{+&J84BxT;E~bve49rThvOjsNBg7s0vBI2kJBLk$av8l<6x*My8pw|Lr&_70`D@wLFVVGYNO+A0oLR%?a6mRn4y)qw3w$i-{M9w{bf~7vx*n9S5FLsHn*Kc_QB3 zEoOqnv3W!^3(lOWztks%_48_R*2InE7V#(a@2xx*1=w1z7z*Y-Tugu(=mrYxC|->_0A*r#Mwg9 zUi>;8b5|@`1zc0V_D#@-Y~g_P^g)R@AQ?SKA1-KbZZuFWvVAXkraytE)upl=`WgG} zcZD>B8wPZl6RIl#761BoLJXKqtZ9yhzz8G}OeNNW9W|!#&dr(0nr9GfOqFou>9{xW zsuY4;zaq#I9k+?c?p-l|XE(36O4@V_aRjMXZd@D8nW)miz9UOkk*oSUT~0aJQ0XuL zbwYxokdP3K$X{+F?L@ukMc=lAE~k)iLzEi`ZCM|r0kDmNPninLBXl#lk+A33Z(2$p z@}-5R`soD?b^V3P76g*=t9>ES(bp@M--@oYRq5}ApN&iOItP}+k6yxUk5)SJ3t$ET zc02k8mlQzrkcvzd7?XsDDJ$^5>Y_G2qj9L;iSvIf|HUuScH@u)#25vTA@YWVr4gkf z^S_Jo1wh*E??G+f;B>yS_Y~`U%Vzx8t3+c8E7y0H&YuX4n?Iip!>dLRVB%q7(7)U$ z_ES8_E*UHa2cmKki>Dr$6a9nl^vKfk_MA#U8^x=!9RvE{+fezCL~4h|o70{``GyLx zFPrQRdDh5BblOFM$~WuqS6d^apI-vS|rmj6PH`o(5XKu=WfymLOR z6!e?U9&-4h`SY0?(f9;*$S}N-(Osn1aWR0@^8XW@Ok)YrLS7{P1#BqV*3CZAV$?45 z^s}gq(q`~(cyj#zc>9I|91rheSgeNDG57yYr8&ABC3+J5pq!a87vjI_q&*4y@zm;h z_&PR@lnjXnQCYj7+ri{9h%~HZ-Jn+J=QEG}HZdWxB>AWMn7u~w_RUw7wyKaQl=8Yd z7755-DfeWnFZz6Ct`n=1!oiNRBk0jVF3xsMeS3We-LfZ6AO)t~K@Z%*j0QK$X z!Gb5BhRzDiCOj4Yb{9(fb1au$TceYa32J$VfyN1p3o#p>_&+ZZFK+)73 zUG@6*LA=o@%hg1ZUYo}Dlvq^54_WF!@-#qO-2GMRvp8^Jj;CW3Qc;RSAhoY}Z?QEJ zpr93`{@(P%2Z2#1%^aZvT~1JxbVFJ?fGR~{apZrhP%1+9fVBh$Tl<~of21R(0kOD1 zqt~+Ps7oC%QB_q9;aYM@3c-t8_v8UfNDU)c6Ol8^#Q_O#MgVgvVmv=W)A{q-LO0p@ zA`xeFTU@tlTX6y1h@&mo>??N(zJp>Bg5sGdPoh)y|K)`a=$PP@%9!Lsf!lrvkA_J8 zXGJbzQp@GXhp8iO$BIDCJlY+ajUX~}28_1wfmH9q*`npS ze?XxtM&YkDIKUH6_Yee0NSzQ=lA&p^)zS6Zo z=}7Vo-aFL9Q1PJMT5yV)Z}2Vb{cdDjQ>M4nlqN{x|1#Du{KcKM+zf6~o@s3?wYw}? z399e<#MES1iz$e+bKB?2h+?l|2C0aGxH;1b>P}(miR`pB#pJuC=OI^@1?k`5F^Gnp zk4tdVdxp-*=aMNPcT=4i(#vwsqMe8v!qm&^nM(d<@Qfn$E22KM-#)X|KofQwY)Q)( zm(E7}m5zJA5ik$io4sgTKk4xe_o{wK6MUkFlb-Ba)Ug0uU_2l=LbA%ZwD&L{Dl~mqk*@i`FvsZl@E<) z>OvS$P31o%@cFW5_Bny-M^u6#A>;FpTkY2Gv15h=UNrs3J`EujJCYlJJ%4|5tOw$~ zN&2n`jZECNUnRFsBkuJ6xc|3UdC52MS%A@1ypacqs^46=btrFZHyV>nEwYwa8wPJVc`PERc6U}rIx3-oPYK9aucf7gX zEYva`F?2NI1cFz0{=q#Z9i^!RSd~EMpRgVLQQNvPY7CV9AIY6)vdQj(I#;|0E{4P) ze}PD3x6nuSG((kWZXj<>F%!Kp@-||*68XAIJ}?F;WJ|DvS#P=gA}$@higxp9vfODI zc8gN&HnScWLIFfL-J?Nw8yKV2x6%|Khoo?&|HKMyp|>~Pj1kyOmur;^EfZp>e>k z7LRIFz_7X}&1RY*XlMu$*))V!oeW@RkD>RN4G;*qmngn=%im#%+pHS^qvQOK$z1Mmm;u8;x6}*e(jc z#?wwB`IV`EQgsYAc&sUl?cE94(=RsO#JECYLOIh|F_z!60b6NYW1_AbR8&(UBFldJ z2_v|rieccS^zydm4}q9Kg3T@U%H|xOnI*Fg)c6CtdTY}&pH0__SM6hCGO_O?mW;v- z$$IpS=ij$1W^=Dy-O0qB-RTL7hB#17`bCi$K_))#_?2K23k!FnF3v`ilEEXM7ic$A z2?}1*UHCEzF0KVgTAXoI@Qk4*SZ=ZmZs}ugjFF{dT$EA(V~0vugW9;-%K#0x?L|%4 z&(_TC_y85>mG;1aFN@V_3sG+Sv4w(nOc^!N@ww99&Td89%4061wcWF0oD^Q2;Hgou zlGiSpic)$dBj5ygp}26ok(uSf$A_V$+1XQ_4J#`!+j_iP%D|4aJ7^h3@r4?*^FWin zH?7~}gY5>`YH~244X_wpyZU!IHS@y_YQ}0`__hN0czMO@{IcJBdo&2Unzp&M)qsfp zOWTJ97W22t@30Giy+W1)8l*#)8c^ z;7(y~;7yaY4b11N)=bgILw_ptt z57V9cjs>5}@fCl0+wyVxXQCz9{bQil!y^o4VIgm6tTeH^7$3izM}@e*6^|7%892E=$~whu<&{*hSj+e%>aenlAoD#=7oY6=>3GGSrq85|s5;|C^VRz3MP z8{naFxj3RZ!-A-D)N`n=CzUyZC}?zbg`HuYL4I_dvE#dQWbPl}Dt^4EroR~Jw=Gl2 z$P8chV0IRX^4$%y;*7T8+bL@j_LZE-o5C&)yK8THY-?R&7-h_R0mxdGCJr4#@2GX5*>y5O zEa3qqcwHcjNVS1$SWVJ~aROYlhLGbiwWZ|`zEPX)M2?7?&qu)%OEdw<785k@pA-il z;~P$BwV8gXSas#Lw<8UzF}d%-P({ocIdyTeVGd`yj>&>JFDB*WS9U&z(pYMz%oHLH zAV<&$^kt4cniu6;@f{Z#!8YV?&)hXY7M9Xr97@gb;7CSXlOm}Y?L5TdhLh($bDEQT z3z-eG=)posuVZAbEbcf`IZak3s02;oa5Gy8pA3H!Nj&4!n&6q>0cw=t*5;<}P;Bd( zGtux{qGfIjJLWaC+YWT&o%fS-0zXn~w^}Zw<2!wIY^y7z2!+clC@?eKKjL(BbB**n zVK*m>`l_zqR{0|RiMS_;;*&7(DM)gAz9}1OeXmA$S5)$O9dEd0L+~r;MIFo3IKGFR zzhqkyw$`SStwP+i_3+EhlCgcNvFOnK!Ea@!5k?@KCR5{%-G(q(tAATe zv_6W)*BqopRyJP^LToydGYVJb4Jv&w8#T>TRhRqlQ9hDFPc1u(CYhLcufKPySWI+#Zi}Fhy@Vo7{a#SZ z+lz1ZQg=;xff~6gYGD_DO%CDwKUy~T({xR7lkgX!@GJZ6C-zEi6pESdbqcE4<1*4# z&kY)65E@Y(X%2;QFX3nfQA;jsMQ|g9tU1CKf$c)B1M$QIR%>4y!=J!ykwH?yQzFp( zfC_`3SQU8IbK56KZ8fS>b})uUckc_goN2tFAP@M@dwZ(0XKlM8>5SuF;0CycWdL4r!=AH@?}C#-w*Sl!x~*nu^>%T1W*qf%hYIs7wFFXME5&iLS-V z?_JUCv0Q2=mKm3DCgA4Vp5>DbG=(Nc4uY?Y+X@R>U#l_B)*4+pD?EKY5Y-`Zw}i1y zL!`GDCw)-c{Fd;2txXL1ETh_`M)2a{W?QY3%BL>OCXpu6^4vO)#*#O zCV?lgPWVD~EZ>7R#DLm>0M1(`Ve@Dw-HSXa|J6Kn=J&=fWm~av4J-{u*hKJ~QW+*n zM?hu|`&HOSMF9{7cErN7!gcwDZG*Vj1_y+)l1znm>;S2}rT)#rZ~mzcgxMrFQYtRW&YMYT4uw%%-Xv4#;cpLq85 zg)s8}MUeoWqD9UWeg$#~c%VXecL|1v_oO10G$A@h^$xPOUZ9ZZq}fy7a?@K)6qC7# zZ&2rIXZb1C6`?sS0?1)j1okFf*Z$AXOI>4$)ve|>-Sfti6w^ejj$SY{=NkTWPaV87 zBg^^|*Kj?{aXOyX#Q<(bOBObXzu63#ft*cqZ_t2Cb5wm#mKG8f&D>{rd|&>gq4MAZ zBrpdhvZss_p`*;-jN15*5?(XtmenFQ!q}NtN0Sr$S zBCZv60R2+tbSyY^cN%~#Y9P$W$oP_yJTr~tg+4#oYy(kRNPc4cD>Lsd*&Usnk8-+z zYSn<%M-dMjlYJg5!$}CWB}(SoUY8^$US9dNt%FI&K#C9qnah$RO^i29ET1VgpHJm` z3kKe>lK51vU~*ZZFJ+L)#nS(#UY@;Xs4+s6148^w5zaQZPX00?|KM@hAMNo$=HB8X z3$JPr&0H+jcV?e78zsJ|Uc3ig@bikL#wgMC5}Z>CZZ4Hhp1niK*wD-c zz}||#YIY=7###^C?p4{>9pjZURx;(@vZCaub>8|e7f$iCGPFN07v9q7wi0BRod7`T zDg2?z%4;o1AoKYYTW(koxGrYwAWG~B4PXkvHSM@tQrTl8q3WcjdZWu}{+uj5$BA*8 zT{0pgS{+2jaM&`;(-Ll8FO}S)Wy`$ma4|sZi`|5}H_tm&h^BEUC#$AKi0_9NCS7xS zt7DMJ;^1)2Ha#T@)vs7r3hP99k1_LCB`(7xG5rlG9S_|f0_!y$HD~AU^;^FMBtxZ) z+>IR&gKD|nzEy!5jKy57nilh9MVr*;c=q70qvmvge zXW{Jx^bQ}rpzQl9l}@(9`Nnte8$~LpKC_N(G`@E~#6e&Gd0KFsPuF=&ER`LZJuVg- zgdxdn_}&jgY-wE7G)hT3B(!27c6JsfI;`{gxacXnRj@DE;+pJ4Y9d*buA>@3<> zxmiP3hkrA>qdw3#;>G`Q_4IEE=(IjFZA$!iKb({pvl@w16M%3mMH_C~7?=OmVry=! zmt`_2EHz*hUhUImmJn#!JO8(C>7Ph(;E(6*VS2zlrt$&qQ%j+I0CVn)*DI?I!4IJ& z>8w9rM1DMgW`4^9@qSm@wzK6o|17Yh;BH<}-Q7)mdi!SiL-MN_s2Aj?=`unLV z61syu-LD*c0<^>MKL;a_H6ayp(D*6GRMqcgl*5_0`WdbYI11%zED79_2h?|WdHCzX z-ou>IBm4gW4ngt0F)IPcDgRd?@`86>SeTp3|HTWZDrb3RLvlaxIv@jM@}gt-_yC}3 z60b~3%LGQYHZ**QW7_+d^jp%;qcu?*U;Co-sqz6I4aj9Fk(3I3FY@Uj7ucoBMKdg9d+q5c}8T19!qK{||uB4(Da;?w&ulpd`B zYB@A*Rvg^L`bR=Olvhh4u%n+WL|(aqmvO4H(z|#qTD0iE{S=qUE4O?L_SL3up}61! zN3`}JtHX!)@8`g>883!w^ZpM>r*@tCEpf5#pY&h6WMD zC2*a_F(Keptn_GM0mJ#-5V3Kwet*JR$T;h z$liG;Wj-09r?hX{RQDp_vh-CBvI1dE-jNHqn7%rfe#~y2Tc5tcS|G9 zM~)D=aD6m+#{iUAMn-vn%lt!6UIn{%Q(OhIzCQo_bABiBB9%DrrIOfr73$Vikm4{0 zGF&dafEC0#SB23Guqs0CIRswxwr`)kM~fQ{Fd9wpXk?RwYrNl|Tc|_rf`9BuZ(OWt zkIk;q(nV-C7FoEkeqkPj*un%x9U_?zyfT3o0HeJ292UJkP`k*IcI?t5?WBYV@`|Sm zrb9-Qms8y_0C5cfU|=^mFWdY>kA6-9v?_5$cxwVB=<9QK9yC0V)b;Sg5BKj6cV>d^ z#(?SNJ3JLjW$9F0hf>VhjWJd@q@oKP4pv^I-0i zK#OoMzvh&EMD>*5RXS$Om_>`m9ato{mvIe{*@aNHwt%v5YBo3YhkyV3`PuV-KlMh+ z>+oT*E9gakI)TCnnKg?jylOYaQ(lVKK$r0m**lqG$^hkDlc#v6jz4e)yn)s-g9pP>ksPcUn#f1P*^n5Bwn8aEsXx3 z@+%=SUOEfnILp?7>qJft74Rlo-wOZ@*9S+X3ZLb zYcOAlvGjoBtTr^<(_oXA$bsZTdrt@1M0tVLP>hqu=FJ90nEi6Z1H|QeNmU5g8SAZ|{#0kI^3L5jd%jMdD zHOVcn@qtl+QRAah{Nt6Ty;0c_{5&5~J!Qu=IA%=g{f=|pQD23#r%jtJkF;iI?{8?h z@kXV3Ssp{`>EL@|(~%c9q1TXb;ZZO-BX=@-4HFlie|YYk^GZU5U)r^EBFkDQE72kL zuRLkx!<$mYU`pyu60c&$tN2s)i{+G3p}7c>+)~E#%Za^sAueEc!WEa_Kl18(zKtfR zTvE#m)D?(hwv?CD_y9lOkrG4avBrNv!3Dr5FWb@?*y>70Q=e`F2C+xQB?QKLI+o1Z zPbY!D2&Jp8_QfNcAS`cKo(rXG$AH|7$q*STFI-LEjTf8Xk;pDUnU#g*tJ0jh36yRM z3}m_2<Y`dT<5?A-T*~{tte>! zN_+B|iT=&t8vs|=tLXD@Wmy&15mm3B*HBd&?T50T7>d9SA9i}~C7rORW7cMl3xU13 zX;ZwjlXr6N~Dm1e)&)`O6ScgVhyvW&So_S{CW*RAHNn1z%e!O6i+y}=G11*nIOM5zm zJtRjUBf9X)fQ;zi<+!pM;mX2c-86G#7kHhVff@Fs#S7CQ`i!8PSYmYDPekDAY2#&e z`AQx1Ag|Dz6D~%c_EVsYnhe>NKLeQ%1O^H_dzM|YPu(-R{vTYLs1*l9h=mJ*0Wsn- z>IK9cylnFi38lsChSa;EpUeVSGfo~kl6CURyvVQ;Q#^=^ltb;Z^I|?8dwVTh`sL8e z?nZ+W17J$&qPU&`T#yk{p4m(swA#qaV}7YM)%Zu(sck_aa>Q*|xx74MvV)gx{vq%p zmYcVJ4pALp0+Y(uK{lD~psj$Bl1!pb)at2LFSBc&D30D28hYZgSFeUhiPjeXGqjHa z>lYXfl@}qez8dIk?zv+bI#hGpymTq=uc!&Fxe~C(#(>6=KXl?lYtuI5J|}DbA;%@$ zyu|Cs$uf+SM_T1Y@qpKGq$US1*0a%z^&tv*L0j1q*T`7xYL|GCXK3AG*${+AR9dgT zI$q{Q$olmKbb3JX%ai=uQbJP`$d5CFjCu{1 z!4)zC-@LgPtTazlo-#@*q471GT+?yp^X@SuI2+ABlGZR$QqQJrrkEHn3m4T^ZEfw; zKuKVLOV_*VHef)j!_eq?c3wa$|Lxx_k_1Lb7}5$0YX#UXw~Tb7<>ZCOXsX;xkN}}w zeZzzCN+TX)Ve0%t6BWM`bFx8T*LvXiJo|S^9K(f0%;fb9I7h> zz$mXI9f1*9ThX|}fhsW6)^FZ^TNW6;0MLSj>;%>f5kMCk9_iR&IXNyRloWtW*``#6 ztL*W|A1~7wH~UKr4~z^9AFiw#NSwghyvuEq=da01U8x)1F#G}+JdU$?ZBC)aaPwK< zC2+m^>g~7RJ}nS%-7X1?)Ybjir-wA;MExvllP+4F=>un4`CJ791g@yV33l`Xc zH8=Ox_1<7M0!ChJbkItlZY!aoF}gl6G%SWMBc5R5LSXoyOeO}j!UJ)Yd_8iw*_Sc! zg@L5)J*Ph`+{n1ktg&?&3S8JP#s5uaG*ZwSZiZwiHor=xHI4HEfiW8eydVlFFk;rN z;0_(=3L=!6#xEXmZ>TgxBSU&<=0EdDEta)#5eJ|qL+q=0D5229~t(=_c z={Y%42@Q=23(Jm)iJ2G^S^$svA`%Jgde3EJALo%^;o`g^#kr*P5e0)UgF7d?Jp@NzA8j9kq4q)=}yczUT6j@Df52M+dL^dOBOi{{Kv5exvI|`!MV6 zAgyU&HI$QOadsantgFu60JR#yCNF`7T8&_nmvUWUR2bx0JkOp3YwW$30RvpkdjD=d6^|NR1d@QrH7)*LK6zu$fvdwF_k4HA+WKMz@WJZz`_Fq!;#jZL)ZsI z1}=dY0ATi>oa4uj+iVD<1-zvBQ9;4@8O$FbG3m^1JFkMRxQ2O@qA;Ic1_FBvZq{Ze zuO^4M_&5r7_BxI%b``vaf~Y!l2*%PST?YC$Z$tgc&kx4>W$$pO z3PY0^%Yila22{O!CnhHLZl)&=Hew5mAg+S|Y{1 zC4iM_3>N?k-$h7Aq{Vq5F8z8NFmn9q;lrPP`na-fNTg0_6&$j71&0O);lwlgz{bl4 z%%^_=0*iv11k9)RC@X`PRdMP2>QJ zKXh5~IyM$vB4$JetTBOECV)H<`s@h_mfzFCG!G-rOK%z==jriU^uz;a3oG=lX=OD{PT=xB|@KytM3faq_zACjYCix({O%6s+%R%|we3v=K&kcQaKM2mQh}~PC+>GBDl{FT_4+#^17Z2OyxEF>7XDA%se>e9|m4Y5-!eb z8eVm7n#_x7%a#pCz4|KP8U-4YRkCsI6}!N7WX~hY2V#*j1^7Bv|iF zW4!bv#tYicw0t2gw1(km4IvwL-_%yn;kh#0#7qIyC?N!%98`R>8p( zn5wTEZ&YmHD1B5^6l6qIUT>AX_14!(x`c~xUi(Nqaqz+xTqng}5>i_=m-g4pts6<;3rE6f$_3PEk=&ova^!?KRFTGD!hO$V*#wed|k>3_7q0gdKhi zV5AM5KJM2Aiit^}5u=Zn3uzh3OV`UdFE)g;D^T=AwLfIZ%K|25pB=}-g{kmqsx$aX z#7`AaUWYASVPUDM{39$#>Eeiqk$nZ!Eii^rDlRaGKm#&Xq^MUfN3E>%^D%o0=zh%_E-EV}5u=Yy;{T?BD=e%8XNNEhm+6 zT;g9NyrUO+$+$#Hyk77+9yFW*qiNCPRiNvK4&nUb_YV_GU)a`XcM>n(ylycu-RAiu za|pDe)WI!~S5n#6>NYqimIAJ&l+`{xK3)dq)7OB&y26bC!=F zytXo6WL`R5;HyJA<)yXjSEYIH)2Bx0`iN)$Rm5Bl1^`x8hW)+rDI27{&{tqb1sA>u z65|<>03xhiOl8NP=J}9d%j*z3`^;1rUJ{Q6Jdo5iYSgH^?t(j?DX&pqysFzRNROl* zWj6B=ucNvE6Xms3;pNk(tXZRXGI0fvWy=6qRZ>z_64075IC1M%&Z`4k zVVCJk>(}!U4`75;FGF5HY?&B#(XJZ6)hZO*%+3p2bVOp2wCB*-Ie0xUVFW}Kgq3Uf z@Z+qG@!c?_0Mp_8_Ys(x5kslC!l*rzaIqykI521`kLvq{qoX$|>FXZ0jU+x^2S|X6 z@&aJ{q^TXd)~tbCXtv-07XYi;K>KTO6;H;C&fCCz7zygyDpW^=zF0c^tY6QbuE0oj z^)kk5#Iw&*U|LA;<*nFzele3<$Pe?Z?(-M%ow?DH4+%nR7NB}Mh}wps z8U%3dqnU6ivf7tp@q*%oxPaL%j*Bj+M@nfA$6fQ zcZHGXpQFG=j2Hp5m^QWM<(>*dT*wO*)5j%hJBr6+-KGhTtI^+Li}8sBlGH{ck0>|GNLK3*C1+>2*m}l>ZXn+FTe$l zrUNXK7X-rkRxHftsxb0A0$T=|@L8bs_S>`+X!TwSqqu-qgT$-tp7qCcqi)NCQ(&}u z%{TqwSJwGNUs?T!cV#eM8F%@-$hgm}A;iXOA2H|sc3so8>#k1v8q>_z*49>4B}Ec} zOO_XX2&|?*R)CwyhHoEw2!X-p2GI@VR2bj_V9TDP+Qcq;R=T|u#&8YGYiMYg`H;AH zn&MgKn!sE*LGfCWDO>x4SlMt>Fy#c?f;U+i(RbIpdE2+on|GJ5)j3Zd2MRWp zDXyi`|L23c1;((ei7S9qRaMPRLU)MP5VD~uua{oJsW$|Z;bR5U>8R}QM*Qv}l-Rc$ zez(EwpZ~0~^0O*sKoWTYF02UvOYlO44R9(<;F^iJ8U!!Nv*H3SRo=UFI@gh3J^RkW{1ddp}1&OZ$CxIi!Lw-#t;r-w1$ukI|^RG!OuMxEb)RibHB>U%6|P! zV6gXK|2<16E{Fri%~q<`TpzM_xq2N`q(v(i;+iS(VxF}Y>+5Un9iEj2@p7Yd^Xbzj zFAj`ej+PMO;6>;Hb)=2FFb$&52>Oa8#w#PZrul5xRPHoojlHp!#QJNJlG>ZND6ff; z;KE*_=CFY8FXV;dk$C~G;qCfW_WR7_g*$uMvm=PW)m~bVrFlT}T3KSG;T90rLp(rU zw-D8{*3!o|&l>p>{AUov=|-P=iVKXK6ueBwVsf$rBN2fS5&B0Fq%HHM{i(!06Q%=sJ@qWQ zL$rpF4XsWfXf*d8&^%zRRm6Z--po7`R|B<&l4speOX=G^>q`_JKZ+zbia%S;w*KlQ z1tuIz7F!d;I#-n_xS(02>k$!cP#r5@o7iNwO|}B&3t8xMna}oGiL)V=os^xOo#bnU ztxt!xvJ)w|xVcGs>v3T$TT!RL|o9)p< zK(-_L@NJL{r?{R6;nrV6 z+GDGf+Av9VZuxLHo?@-_8(t~eVT9tsV)9h`w{7xT-n;km0c-0`TTcKN^1`;V)e5&f zD`Z1OUfi?3%6N4osvBK~m9v^r{1wE>s*{jAv#RI?&D86mTI2{BR1$%>1_7@KMRlQv z4mnkayyyqzML#I7?b|zWD{teqqy*DNgl#_CVG!6-xY;)M8PTUtpAkOqwzXHI1Q>4J zsz+{>IlAd9K+`HgV8e%7?J)8zv)0c(+g`zi@PX)2guXW9 zS*q!eQ(81=IJbL*nhw&Q>+9L4)DaAAE#(!`d#z}PF#4i`lvcmI zzBg*IcYQN8i3GI8a5XfLHhWe8W~$C~qfafXevZpaax9PyUF0Pm*OPh*tVhY9db_$1 z*rDkuhYqELUMnvsUWf~r72D>sEnNy3(I&4EH{T4nMogKa`&w_oAuSq&w84q|pwN0Z zvlCdFxu@p?l|YMJg=dviXSq>mdOasp#~n*n*4(VqC%xo_`YI`@M|D9uED=|&Bftn@ zfwl965M)Lv8Nwe;}PrPWEgJsVCzT)^yRm$vmpYd*J0%Snuo?IF6p zJ^e={W}d*JT|u#J^sJH_1z@J?vZ{n*$pT=q>ygtTW<#N_L0intjiiwRJ9J`tqnoU_4thrt*wJ#6!aBlHo0fshfWINR2vCXO04YNF3UOC<)h_J-gz zBqY}A-fi<9|G`6wZmKigsHHl~u>h|ubyk#g85YF#QArPk)nkzLzEdC{Hln&99iDLD zLPnAJ8Oa}bUZ2PZbqkDPgo+EyVG_R22vM&$*z zum=D$c@fNpLS55S+|(8MQe+VJU(yGj*C#@A2(%*X^Vy(qRXZ$&59$^e!$22Y`d>j{ zec*;q5r3>qEGFjOdpVkP!3%JOgs`&k<~Sa2N-7Kw4W&aAKup@N*@_w|WDUax7z4jq9l zJnRDH<|#lc&}|Aq&%gdvpU82sMZyFzq{VrW=yVD!CME`G@ne*{DfDIXBH@97f|mu1 zbm@})Ea&9{OuOfv4a%SjdF(`|PA3ZNd-n4=BSt*+d0U9NaG1vGBybN{rDm zc_Fa9qekr=6=Kdx1YSG@FT}-pwQFatS_8N^FTgd)ah*=UbyqLD6iJq^$R-EiIpUoAQ zzI4RWDQ?YV--_?P16&g`GWhJ?*x0Z>eZnZQdo5lBPr*yyn{J<#D0rE;qM{HO;tCBl zXDOC+p}?@GandAb{QzF?Y}l~jL;f0%JyuXac|~@zfRV&R#tRgt0Q;eyRqdLmxNH+_ zrsIhbDJdyr`t(NEo(<&ndm46L0rDDN&{lThs;+iz4UZUc^HNt_`d<;(cbzA8=JTUs zWBXtrFiI=e;f5@US#q~nblozlH4yM3VeZBm$IkPD_ zxvlfrU^BFp-3KpM=qpZ~`0HOMX6P0#e;-tsKbO*?ya=6j9b%i6=(y$xJsB=4G>Q=2 zI+q)90kCJg*tBWkdgq?MY!JN2x^?Ri7k)k3B416EZnltC~Ry=E~ZuFYk z6bzWxFLGYNue=iM;AQFSYUZ=~oc7*)X7nSYM`umcA2H{%QC@x&Snj=S#VZ{E03ZNK zL_t)!CNG>vcjGAAtVG8(M<}n*DD_-!#tU%SW(-TXHr%t}9bUl5`t<;;05V~x6ZEuh zlUGsVvZtO}_S78g&;8unv$p0&9rL5Erq$5Oe4D@h?Uh&f$KTZTdvCdg|Kin*hIo&3 z`6fQ{$modx&FbCoWBrnN{fY9r@x~kX?j03lo0Vw0<_K1=sHjlex!kOJO|s7zmT=vJ zuy{7av-j5(tRsY-gb$AduA*f{gpBxn8D91x(Z#cdgls3Rx>4u+sMdQ^+CD$(rI-Hp zx4-c_d3n*-Z-IFI8rJ>td4bG&1Za(x=d;C{1&qTjAZD!r z6TE^%qb~JPAuJ<{EW_zGZ=gO3i2Z;9LxTsJx)v>3bnYD7+-lz3=2djP==yIRd&N|Q z$Y}{)k&&aCS~Wd-7*&amo+FH6`9_wxmmAL?-?L|UgsIISxYnS3LjPcyePi`!OBbf|076&J4_9*cd~*qX5@wP#78D5)#Eh#cpY;D}j!P@#Hw zKs34s&80p{&i4zXz6#88wv_ejwMq?^$Ecp*kw=0>94IWZKWMy004=n0BUs(_Y^*I- z7qtaoH5Uq;O4p9C@)i~ScAw>1aRaz0K2!xMFHq17!@6FT2)zFECqVYB&8v}RMbXw^ zwU?VAt_W+-z=66pU2)Ow#j#_PVwuFng#;rO7JxE|i(l1Z)*kdY+>Aye2Exw-3#gB> z_d^wA2rDoOYf>&>hF^C5dd`bATlwZA((ZSkfi*^Lz4n9ApU9n;V>N_u4HZ7#%P;`iB zhSm*$`@PGjn;@>sz^e(3zxTiS$bI)oUU@DVj(^zuiT!?e8H%XB7K1gULlO*vKlqg_j0p6hzke* za2?mFwG_siTUiiStcBFZKDS253wf388g4;kSau~%%1et`1uh{kI~sNJ;`LGXekgeN z7G&@bc}y?6y#Dm*s+FBB>-6c%Ri}y9{rA6lpJj1i&GPc{0@d{odq2@X?EK+^4V>48 z1uWQV2*(u}Ib=vqP7dI@VDmy)sIBDW+#FU<5|CJQ_B8 z&>5aO=lmIC`MM&eqQ=?^6`O;0Auu(1s+cvh#|w7|d1=w8z~!uuqFKVG$?o%gt}X<& z{&Lm&^;OvEhXJBD@3V2a@`~WRB6MCM?7+DL@M+@u;;y^w)ezj@!MmypUKiT(-W(w; zr<{Sf_Hc)o%Wj;G%eOdtjs#n^aJdTZ@YD>ayiki{lLRk)bvV3C^3p0b?3lF&0F$ay z(I|LBDKD))O5k#x?}sp8gs?zc40%ywCiZ4t-by)mA+Cn%3xDr(=NuIQ@Uy@d+PnLQ z3=z1H*Ss9TD+dQIaE9e8*5#C!=jPUXP%UFS+cs?)xwB4U0X;`jWVK|AKmJKItg zb=0Vxb?vEf^c=atN}CyL*M8+`*y?bQN(~jWYO1rN(SZOgpgxL%!%gnu2>izxivZo$HZz$Du zxk|nRd;rYn^MSsoZ;Fq(4_`#iF@Uj!Zy3BDupa2z6+GfyDmok@Xw92jQv*su3NW`t$+tBOnFs-z>465 z7f2zl@omSe)!;-M&4NBn5Z40WB~oj5(;Vkft+f+m0ABFRMLtmG%RdZEU6}x;{k17yYVq#0OQnzwZ*ZxE!Mg#yMS3OF8w*=*#o=b_LjCH@ znI$}wSbUr6qXK%2vMO#XHE&4YSlUw1DrG@eE$iz~1XJY)zPQVAavn^-o_<==vU5=@ zVBW=nIb&~JvaAAMsOs5BUb0dnF>&Hr5&M4qH2`~{4|`yN&P(d6QVMz9JDgZ@a(TJ) z2`7WP;=LNKK7INuC0?-_Fg9$M;I*}7O9c#Qb>qAuQd1Wj3scxXEw$t(V${I-J_qI| z&Qh{lDNgo2@Idkx&chgn3@PBeax`3Uz5M??EP&;jvt{oC{rdy12dYF#0NV-Xw<|T) ziu1m?x)9ii1>g@CgbH55Y+jrgye%#|d!2dXeIpxrOkA87;F>XmDO|&b5wETIj+R#! zOJ0CW^|m9`bxWljb8N{CtIlPCxc&=~TPTcac|rsmH?3{`y5*__Us z+{kc-ixw?HU=Rf$E+H^B?2R{2U|Y8mu7zA+EM_qQi-7T~1WXEybpwckmjR5itn-$2 zK8vxs7T#}Zz8~NW16-oM0}j057cTjAmV*YY%$N;vCFkJKg>Fi3Z3#2Dq9X8!vf>6C z&PI;H=nzB0iE6X(*X(NoHUd;8)P--*%DedocmM0w?MOyq_yU*$!_y6tNQ)i}@Xy<(aF3Br4HZ@gKT~=30(wzrl zCaj{Oq94)Ntx1nnitgC4V>H8}SN^EpvMHq0D57yAFnS<(c}QNiz-}xF z(BOJD5SU%5u~ubn5Z42JMj)&aYPmF^{&4zqB!-lnyu7|fBclUwEutWU^`XbKf;bE% zML`B5b-h7XsX-|XPplg~<`mC@bt~z{m^G8UWH(XemPNowU0_mRtSVOGx-)>+MUTlV zIx0Gl7i*H#q=}Upc)(2~%>*wGfbtyKuk_Why2E-yOc=QOJL=iO+cpiX)F63bDFOgn zpydb5`a=xl-+4#zDp$N<-WBhOHhv6g3VE?boENPiqNIoy;6kZ=NLL9)Dv|3({ZA4U zuaa)`4d@uVsj5Wa)fJ>gxRk(v7aHPn^168OV75A+9xX09Iyx?3y4EDAqQdon8&_UO zJX59wlh@6j&-U5_uT=%am6-TL=sS!-#QdheXMS~Yrxn+T>m{rylYwgA62v$_Zas7z6 zs${?slAR5-4xU(Doo!1jx?@~iT*o-4GfaB+S-@3M;mYeXFoW0rBU5%BIkMB!ATpS9 zAGoBx^VuGFp#N(w2Y$I^Zm84;r3J|B0fF*w6DAC)hZiNGJdT+n(!$ViDaW;lO9moB z9vZ&Ef$^&#uaZ=Z4#6AR@}giPmJezuwX=3rA~``;Mzw`9Vk#;+eR@3|^`-O5KKLrw ziPhQJ)vGTGE+8&&g;7y)P4so6XYXl(xSj=G&I4`)E&`^;uOmnc{x}wmkW90(z>P&q z1}<5$WMJLrv%y^1@-}F42%N~iUZ55G5U&YfF1(U$UhoV9aD_0$6>C9UIHOM=DX$RB zM8Q-UXtjJ}*c(D#$g3nZ!U7SMbep+Y$cs}fiM5!-#pOke$Ojs{Fg85RfxTT-b*JQ& zeQ@>a)hA9IT>YxeOB^L17Znw!Jjt^a_uTXB7MMA}9e@kq1*{?>2$G0?9GGKT2fQYb30`c6;)TE@FM#C< zC?f7NLuR7DGcJ;G=&+VD69u!dH{{jD;0!4fRRW4yEU!XDm>P@GA%L{yMZv~-d^TBS zc2y$D>m>k2xYYb>H3};mc%4|iI-B!i#0&IAyo5HlYyn`Y_psDwgYY_XBqAmz;>Z!3 z7e*VE9;D{r)ujwexTZS}+b9Qt<-v#J^1_YaaW>X>K3nj4iFwJf9wCT{S|gUsd3h6? zd)y9LU&>byXCN>;uz7IIvrXnyEvm!3bg2*tHfC(MJd$()X^PoC`OUVlt zOK81hJ>U}4uZzIz)e``V1~BBsIwG)+><88nyW7)o076{|tm0YlhtDQCc!h?>#E8#O zd;W#t;r=woBD&Yg1A$G4597#`n(}gMpc7Y!ci%!h)a+P;&Sz^t{%yCZFO}k9#^lo5 z-1U^j@TG#+Qlk<|>Z_%375yRc(ke9w7tNI+dXyL$Mug`vIs|WM$_vDGS}d5z+498` zFm|0dff@sWUF7k6G(7Jge)s{yL>|urFH#pkW5_EhFy6p@Is8VSFMBF0J)&Z`8pfMBIV}}o0 z8ykjeIN*XmxpnO)b*VqR)#{5ItB)!XymZwOE}AQs0kCjGUh5&;fLO!81@XqKuO58$ zAZRRmHAaUWY3>EMqN1WYHc|d?3#tp;;XO$%8L37ju22dO-SdY6L9+=H09UiTJVRdP zhzpplGjY9p_%Qgwfb-eh+Sm;ro|~A6z!J@Tsj=4NT7P(p)fYEdA61ene59>9jtg@e zWo1frRYgb(c-^U~>mm+a=nDZDj9xT=aeYO@{0lqSkiHmtL#3`~-A;6f2^AJ&k6vI$ z_8+O#$1fPX5En3;pr1%I&>EPR2OiNOuZ{1%3%E9d#!OsSo(`zN$Q_;=9ZkGiCDyUl z6l^`h?X~?Sy6d^CuB@xzrKzq814D;1gwYFm!3YMl$UIVC(W09d>5Cz*)O#urR>iYH z_7kDD8im@~Ue7~2r$D^%;gQNI8TO(|GppJ3>EIDfdF7So<*gfNIlbXw#0AXWb>b>_ zwm1;HazSOSS}E`6w$|jf9^ta~#BejojW@oy+4?9TcHXE3W>r7F{r1~Gnz)eHs~8^w zt=0I44`58=#WyRGydW%u&u3kE&9V0r%~ATw*x6=(oBbI(cRpmVsZ7tCK7B$n%a~?) zVcdei@I<*IHr!}!Ja!B`qA4$qt2vr|E>B`~ZZ6^Kn%GJL3%1r2_zDKDJuwc;t?|Xb zrap?{l z*P7}$h$3%D0EL3=hcNRFI{q0O*Kq)>_?0aPn#Dn9>ku(6lmDE zcs`2r;`t2>=ee{1nd^B(mm`Q1aErLid3henXoI9Y`E7ph(Sk#uHQf=k4}^hhUEuj_ zFm6F$c+3?S(7MmMPvb?jAVO@_DmS-Pz*>{qPa62rxUD@&Ts?#_gH~XjK4TMh_M@m_ z&jh1ts%6Vdc=gg7H(np*I(%MKuz=QTd(*p2NXc{*9a;dk<=G&k*X4)^&MQLlLU%~1 zUQe6f%kc~3)hus9fR1Vg)|9)P&-U(Npmod{8Y)~GFUDz+x^lbnkltQvGWL^(Fbi7& z+n&@|dy>1ld+4+@UhZ}JK&wkn;&pzH4UA#Y6!E&WwdET|rH0#Siw!c*YK#scFa%l` z^$y@JH@^FrOICwDeMLow zR`X(+(vi53*hI%#lh$7k)Rmr;l#YKou@H0Z$v!Cxcv0f@90wL3UuN@?b^2|={EF9v zojv#L>A9z0Pc+$c2-lsrZf!}pBro^V7Kv7jXk$LK?vraS;Tp`THCA^`w)@1b816=7iex-LJVEWpVc8XgM zN|ax?z=26#cAb7xe_QO~Jf2Bh6M9Zy?0lD=UC>kyn_(@7F?MO8QRSwewip#91;+Lc zjfs(6%!j)47`jyViU0Z1>Zy#XlNZJG`T0|(Oz{LK6YPAp#~yRdIyn3P&WL>nY z$O~}c0<@~aF;810V-lC(g-z!}%@T~Lef#R!50#&f@7~Ux;g1$^EMENinqbH2U8Yas zMV~UokLaQ^A?a#l>H5~i5c5U^Anq1Kv={(1+}JAt}z1WP}_^tC7R zq$rp!mkD0+=i=ivdGR`ZKRqTblDsI$U|r~OxU9k%#;c|lI;!0GX^Wvzp$ZLqb}s>o zjU`;VzyMcuHNe=nuZhdJCU8kwc+*+FD91N!2+qrGKM`MIh9T@GhQ?rQxxCDj5*wZi z?$Cf`t~KfX^$si`ZFNddKR~?H+LPm?D0YsBaa=-PcAfrs&WkFc@M;(8E;NDjN?@Y2 zZQ)iTxA3=iQxyBOMV@RG@1kcB7>sN&VwJ<5DOMLYL0r|q%h@`QZP>shE=db-n8s^O zkZ|60KatG&-okot5P3N=^IdbhwhCNIR%=aqf4u_>7A$!GeJm7Ey!hHvz)4X^tVh|o zb9S_$>h#Ck@&ZwH>C&_3p7TuN3b(6pwq9Zqmynlz+F~d^jN_Maszug2J(_?PsT}692gkH_3`rGsycoDP9?7p1_5EeJs2HwTod?J z3<-9i`(#07Sh1+QmwlULAUV7Ij!G+M>Y4<+T@$?{b(6fDCmp7CJG*Ahs8KEYZ8ziAVOPb2p!IAFgTjVq zaon=r$ZOK1ygbFrUVBP#WP}B;bMYc0rPb;C0hk;SC+yk7Gg1Az05H31YOBaZK`1{= zUR9?pf;Y6~g_4RvUTkm7v-S~hzzAW1wixnKC*!jxIIkY!eabpv*F!-oKVRpyCa6aY zx}PY->o*$uGTfDM_UxJ#{rWk9F?RK;Q(#!nRwV1$sJVCX4ZLFl_mcvzJmi%pc)6}U zDPTzK0_HdPNujDvAAo6RxsgOM71gDSeN`lS(Icv=Df_fV_>5CkiM);?mPuUF9kTfZ zY+qsZd|O>WD_*8G z*j>bTQtDBBL)YrfZ#l3akMqhCyn=SUpuZ~P8WV41yH4Mzgp!%werDB_)R(qqY@fCW zo-t0Uj;dZLG~Bya$qV&WSU4Zm1@5p=;UZ4*kCPn3AjSSZWy z1zeGlX>cFORff1y0oN$RmGAQ6g2tFx&sGFhD7L=V0mOZWzALY!1sbn9Ih&D@Tb({# z1!Cv-1YF%JY1x5-I&Be8G)+()3qoP4jMQR=?p5+aZz$DO{eeAp#VdK;!Fe%@X}lQ4 z8};&vx+AJF9&kzz6t6Tt;_}0NWR}fK$ZLCkehZgZ$sw=nAh1ICu<9#4blagHfCJ}W zosuTy;dJ@HzoR}%owlf{Zf~f}M8yCwsXD}Usc;{{+E?ueHKe?RKg6_#u+BW*Kwc0Z z1{uHr&>fm7j|jjBmtXiqk%mQi5w8~8UFPgMFR!)l`gNQU?Sci;dY+P$1fPZ z7T>ctn81Sb0$kXRB{DM0FL+f{oRyw(E*B$!wH~nKR z0M@^PKW&N+F}txK2(Msg1OKx1QBq%_n(92gXFOc*_XRq7qW4~cAkjvzK@za0FvF z_pZ1sdz{F}c$Q#J@f;TaF1Pv;IM6W+ZQ*j@cqi)Fs z6DB(F+6-&(Zt+RSlg~4$P0AMNNf^(8Rw1tN@{|QG%`tdW>U4X%`EuijOL>x~5gTO; znWSCx)a>+iD1{%`2L-tAUf{|$VoX2wb6t1DGdRa-xU84{bhXN?j3AhpS-tI~C)(&yw56hQ=SENoD;@Ad zwJ|E)9rbQ}F0y@KEFHG2pPye4KcQrBuxKW=Rapt=?HtCKAdsWE>rGEty!&Y8Qgs2i ziVkPlw9q#%h@)OmyvEHAI(trtvftkQW=|@0(3;a0a4px?u=14~GJJoXO`-MxLeL=j ze_Vh>_{K{q_=Xo$h16A%g5Is_CAZyB^e7zXL3_}Lz3RC{zAh zA{XPZ84{8pGaFfVf|L1ipKW_Q!JZg{@(#L`$v3M8dY!v3I^h!^TNQJUA4vVwD20aw zv^Tr`O3K7}{%h)2#9Xb|^%+?~S-OHhW>n3IDq__(*5XGLiCGaO0$VkTwLO_%6EiqgrZ!ROMs;F(q1oqXxJD{13qSDX?USximq@D=7E>8T`@8n zmKmxnlW76uKFP+;x?7QM#m56!@4rmR43Q+ip`?_#&%|2i&r=97InNM>G3gNKIy25p zcWv#?e$RQmo05VMnZV!93|Hya6`vjwhd8F=gu4qOuPptau8PL;=!V;kE|&GMPOi)% zxL$XXTH`;@Te?oQBu;Rr>Yv}cQ^DR^Ks>%^Ay~@IuGH6*SMn#1W!@AR-CvFldxhtI zYB3RXz?{A$xl7ShpT(!z(V*LmazFH%jbxB(gR(Lv^*@|pm~JovXLD`QNinn(*KVn0 z3yyr4>d+qLn#g4w&k!SUZF4i;iSbM2(FkO(^X?-MQc948GIsSdS^Y6OkGOf`n`2I3 z+J)Oo^S^@;dKZp%T~m0x&vvykRgclClHsRUoo4FcS>GsEqD5kW0&vwEd>-~edyT-^ z_r9tJ^j$T2NasK+)0JiUHOA2wdn~)|n2cYoF`JKJ3b`I+~aohq@e#be0C$2N+qK+Zj(&taW-!fTkupM}SMTWqV|ge>*CFW0KZ$JKK0 zSAt(S{YZ0uA+XtfU-8*leN1(E+U7C9|6e>`@@0sJ7g_1=!`?a;uQ87>06jYK8-KW) zmexS)l14k6(yIG7cB(q-FLcE2e7E_qFH3-m|)U^Dy`@KEZ z0>Bv2|4sj`QnP~MG&G|k8yVD({kXYazgB}UPJePO%o+Mqr`oY1Wiqs0ubk^m2))tA z0c`eOcc{6w+*V0{G$BLJ=s3Z^U)CZ8ZkPP-Gf+_E?v$|{TVD48m^wy`Y>S#yAL!n&+#mX;vZlG(II z{T~2e|2Tk37)LY6U*I&t2VLRLhH@%W+q(TwhC2~azw7({?~(!+u4}Uw^uhX5$USH1 zzjVI@FH?IPDMyoHr1mfhCryTi?Ty+ISA@)bz4$sgSpb}rz4A5Ic=)W++>1EFl>R4<40EG@TT8+f#NzcI zLeXId2$sz{8xu0cp@=U{A!?`&|9U#Fb+5U7O8B7X1L@D*uO!P;n5G%Pvu-%Ek6uWw z3t4Id-td(b3L_!leObi^8SK9M9J~_b5w}(I5Y6nI=5jobQt;rqYJ1&z#=fD{nw>a( z4tsa3u=fzrdP0rC58lgk`-%@Xd4Fie?NKZA-&%H;X8=d#ZE-kfpld zYQ2?P_Wk}GLY?*sXjgLZZbc%DD6gXnqLGFkko+Dc#ZGNw-aJ(*7|9p6 zx3cDLmOmSMQoDrT3l$Ey+!!DKc+&OqTjJH%bmli4VHgoy{VT^U_PK8H2JCjaZH7XD z*kL*iFQqC*|30tJ{=DR~y?M!%SE4~B>HQpH56+hSvW%pbsqKwh$9JyN{w@sN1>T<1 zk8(jcf1l1+B*YN}X*9OULU`aw%^+rFsOLmXf;$engz#{@>xul5HN2Urk=Z|if=uR{ zP3v%(Lr+>(?@5kZg%4R zwozB*{g1y`q`K2{IJk~kG)TFXHDiL2;H(72L%Pp((daX3aHND5<*a2#Suh=C)&6I( zJYhkfZrp%mBS`geBiiId6SFN2X9{qK{)(K9>x@&?zyplrN;aZnr6K&v07C< zA|6Fu2XdkRP_({4kSVxhNo8jP-~(Ui-Lg(_goH&5?d?A58ex3)ll$n7rEBvIE*Q56 zXf|o)WX%5z?Rp1Ge`DG8q4csN6OlMsUFNCLBUKlQlnf*b`ug=D7&}$F=kuX%@lORd znp38h5;fAwD^~?y+Up~>DBM7)p1}Jh24di z!>yGKD}r1#W(zE-XRH(0sMZ+JO1~?QLvk0mmZxwHW#%T55QQ5b;6JVP43)xJjDgAq zp@Xi|F8lhG%T(kB7q*_H0i~qxw2vPyW9$WYZ^SqO8k}e)p*YVIV`+Z4!oLG9SzlR? z#hHD@w3Cvj2M^UEBKK@PBY7(;bu*0p-q?K{|Ele?ZyIvrb@`QXE(sYKQ|=B)iv@a_ zG4nNo+6<{|k-(5c@q6?+Ftz@RBF_cS0dJUp(I-K74e~l2PH;tOY5JJE)uu1cH6b!- zfW4G@DU;1)ZnHq-h_uN(AxNQDV3RA)og%z-Pi0EN?~LK zK506GY90b2@_3?!VJyC@#@S}RZP$NBg6tfTCX?s$ry%8st8SuDUxK8P^y8 zE;e3wkldyH?WxVtr8HtbaLgZ01lJg4d#Nrdmd_Nlf@pCBNWHQR#YHKOJWNG}OcVD+ z+*h8N=711&#~M&VVIuTXNb-!4c&$r4>&ztf_`}aWg8`0DjXki4H@G_|E>ysG*eO{o&@%betFj~k z_x-&_Uz{qBu&`&ly;yq*7iJo9YeMhW1dz$HS?rX?A^*r>tv(fz|Bgq8?GbS|!HQ_# zsR5a|2b)qLBuKXH0yieH{USuNuu&pSx?*8S%*ysa>*Hx_Gzxb*phOgy$6YA0wy#5) zP9AFQJ={9|Hg1WK1uaZ`+}Er@m^XRaeor>{!3+>erw5fqN+eLJN^&--1sw4B6|U<~#A5yZ z?)T)-TM6J44p-NRWK^vGg*?4g{6iv(Mp=IS=UGbOp8XJ}qtAdls5RI>Fo6B|VHVK2 z81S)tr%^WC#GggsccS-{0Kgzcxs==7_vh4z5XPRuotGGqunf^b??>g zKZ`9iF^4|y^E+Y^%(LZMZH}X(aZUFRil6YQ{NZ{w;SnYx4bev7f+;^r7P!O>k^KDJ znc|fdJlB|*Hth5;!#eq%v}_JGDnJ?cMbw_W-Av5U6#!iowr0ikZdoYX()-`|vO@k& zyk?2@=XxrCKacB!i~oqftN*{HTza__Zqi{6{@(5id4w{KQT#I7p zjR@ZJ+B;s$nwhNc`$7yQM!i%m{~)lUba%XfPsTWWPk~d`>V-p=1=IetG1~RL#%X>d zv!a~9;HIij|Dzl}AjjrKu$#8ua?)F6tz#c;f*eHNjad=XTJ?0eQ|VBYZRfQ zt6U>aS5guo67aYW`#o8z-^SRn*X^1+JN&038E2iK_K%JRB^Vz!#_G{9;)gy_jOi7{EB%fIj4s^ zStGcAK1FB}Qz+1`2Qyn0Sv-aK`Py-omrGcK6@>%R?Hzt7iT&EY!wmlAg9P50d-le5 zi-^_Q^XH&8f8f|m4{B&@b66E357k$1bMlJAqE{ONu^;wMpxAOClk$d+UUc5R`l-ouSkJEkoI~l!T2QC$$c6agV zJ@%gF2;Wu(@uG7m=|eJyG{kxFaLR^*2PGrz-!FzGpa1ekrJCWOjh%l8D1ck>`vpVk zp~EJFLh5ZFC86`zMDRFKkH=8T(FTJt3@98Ug;zzMJj0YZ!?ff|?#~%~MQ_O|hN~w2 z{AG(zJQF92$OF0gtu<_Z=%Lk_${dt)F>94B_1oNDf9j&n#r*8cA#n6|EI~r0yE-trn+i}g2H~+liPK5Lk z!Ek@^G*I|0CGzs#bO-?>4pLg>O>RKu0n=f=Xza+n1;h^~&Shp1>vZ8HK*Y(y4?bJ#;)n#CP8mJj z-zt*KsDDh=vuvWQ&c(}qZXY5#kOdM^OF&hSi`p97Unu1v*)7tRhc@H36mFyiZlxXpaZ3tTg)S(dlfc}^f6kO_Mt zFV&?F2{ytk)ev^Yy)lpGFcPp>??0Hg6TH(PC|q%&^iOI7&VV&1CWK7Z{(x%2Qr}F^D{=wz z3?CSBf23NI<%Aj$4G&T>j_xkCo@>5`{V;W9e=v1Ji+}fpd6aCdDD3_?m)9Gzc5S$+bYXTK~6zY|o4tQ?Vky)#@ zz+KN_@GA{E)_aby=9_v$g)xAn3LeA(^ur~Yb$8jjTpoYni|5{6#P)Qj%9vQ>O0i5Q z!THQoPt!Q>TstU7imZFScBk;h{Uz-`UOn?%|JOJ)wUM(Gvn}y$Ma#F|+wJ_y%`!iORPyCal){w* zlznaKp!r?I!GZ59Xeq>^R1W;osFNpH7JhS>5cH2`U;OxCIkDz)<12ePk$gJ5#{4JV zlk@oK_WQ;!?`KgtVnV{h(}f%H#rp7cIEW#DlN+O1U?+1MWX*f`$QJ8OEWx`@H#AGX z+|%S@8G>5uRB;pgumI%|E#yI%2Q~2cyTfMmU^4Kxw~4`s1rS&<5C{DdU!;cwDfH#w zvQ8;P=^uB4WRUM4!L=hT(2JEqaW=-c0usD-dxm-7-az`|2$Wl>Y(XIlJ4Jw3$QR$x zWzV6Nqt++EgH-MhDrlC;y%8>Iz%K4LEZxM1y7}Z^(Hnj1$3#!EOY20&GDwTQXj^5` zZ+U00tzs($pk9&?DX^nva>mtnzVMZA%Z=G-!Zt6{j-EO(7&qrR0dd%S9s0L>Qm zrK7UWm1iNnF);!s%RG#@O)@x>tu`7u7;@0wu>9ZOqj`ALEh!-0?O*G*QjClX?~Wc4 z9G{fter6e9sDAE^F!|!?)xkXvtiXRR<2?ZVK^nytghfr;JW^1&c3Ar9{4mx2`0CKS zXHOk_YV8g!MPi!OJRpNfjASsF&w_58SgEZ!r8lJa>>ePR@Wd(Xcb3>9vwwczXjKiqSFRFTveHF{ z*l-;lYV{vTZhUV1@t;uaadh#u(53DVdS26yoXZ4_P&f{fs-hqnCE<+K!tm=tQu>`d zSy-E1%acGpt~`dP(tzVhR>@YqNBCGQK{dU9DoYsUeSUjo%c2d~b@JQWqFM8?DeOHI z9ZSSZuLky(2*x>t8;y>d#f2*s0&gXSE4w5NCg(L7#ao^n_{2%8#kMFfMf6tm8z}|l z5a&y~tllP)#1^fQz$^_o+GRMhqZxA%_P-?dQD_< z@R(+yD1tixy}he3^%)Q&WUZFhU{%uXc2ueq^nlJI;OP2$cbNb_(}z7xiD9P$g;YuS z0gR+jQflL4VMixN<#Wh=MmLZU`HzCEJYIC%z<*BBdiyKfyXXT>g78`>r?S;*59k%f zuy2fVYBFn3j)128C(GM|k3aT5?bG8E;t*|z!mBq#`UNd=6#OruHsKkQ~1UJPzSGH#o2q(@a9X0Ng4fqT7ZF}l)AQD6}VV1V78~z|?L=EP}gMN#^ zboOrH3B?fPtLX92!G~I;gWQ~*1?$CeAl7d$qD@~cy(-cE(SCcN6k1VI0q^ZwR{EFF zO@~{44@Li8-v<8uEL`Sn=W4z&NpJo=vu2FSnN&oVT-; z&u1SwMTebUBjBMFCf)i44&HNTQNQ1}<5`(4`O_dyi#>S#5Dwc%C(Z|9n{O`P?AUD~ zEkF+1irf6m@4_iA-)8ub&{TY<)ZR+!)dNJ#5~QCSYYR}-so0nv4OlifL19ymrBWRB z<87l?a5SYZRJ4<6po!tg^nr&EFlehhyQg#T9KrJ# zut`DGz2e31O{7OLEP25;Ry4^7H#d4f#xxIY+)@>u66>VpPEbdF+CKgev3K;``z^rh>)m#UkNG2u#+i6(8RSB->)Y~i zbxJdRXz&k31$;k9=c=pkEa=e_t1kzIp6_8uZ3-xnaHO;^3G`{%G4Be+Gjqmwj8V#I z0xj>37n9MM+jW(7BBJpdFe~!jHDv=^gZbBq)q6*am57}Z?Z%y-CN|QJx#a=LipbQ| zoUM}ETD7hXlQ62Ay)x*z14hGKZ^tM9?^4{Dp58Zc#7VDTPcsj7=9$#k?mIpxp5EIl zt$e)Qr*AUaN@N)Z1{G&Chy@=C`X4`(hD~z!%vDH_kDSxIb$YB3J2Btw9CR-!99dR7 zdD;yoCf0*qK6&$o;5CrUABsj(#MRNv7r$}b?7~AMS|tdy4MswPr=}Gz)4fj1I-7Dj zy;RC3CrK({g*a8QE`hr64T8G)7@Ew2d$Ykf5S{nQ&Y*GLD5sA@PMB`VrOneku^xek z&f}Y!nO(RJfLlq<4cCNeZth>cqrotx`nNPi1rLQ3M{VrC$k&?^?Mp}dIoBuFo-9gr zBy7NF`MzDrM@ieXj<4mElUy_~c5|aC{qViC2iCe(aAQ(4DJ)Y35gk8F4z&1%HX65c zjvYn)r216PW63usP9^PP`QPQdQGEM4P5fJb=Y-0{?|$5M`gB4}^b9UqqA4_;N;EUo z&)?)d*yP;yuG!H0u7?iiK6OUwws(M|uEfW-e7w1A8`c#8%_6e~&l@nrIOBxafUqI$ zrjw-R`;xDdPfTgZj5UDAF{2YjDARC$6xEQ)c1heh{LB?&e#vAYoa8e8_NLu32ln@g zs2-5RUvUBsNbJLu5hDHsCSV>hmH5FKuDiDDZQWSG)2eUH%=H zSJ|M$=LFK6-j*=$4d0`X^7{HWxB?X^7-BnZSPh8``o=n(m*>#&=Zoy{_&M}@Dp6$9 zzCRtKM|)`0;J)myr`~1ku}*b=aDL5^e4el1O=W zw}or!;5lAZqtEG)_=M zKw?rWh*;3v>#cnUObgXN>tfkYE4t{$Z%VzA{hmAp8@}}R=sC>i({}SQ9ozs>8nU#f zu)1vfk6jAfdrz+C+{qhdxJTzDHE8yI`%&;Oc%{L^_^6KxcwB;3;_sFWvyyh+6 z|8W6W&NA=)klGUXkM`jzZ=sB#GB9}aEZ1{g;{)P(K1h;(_2q?t^E z5`pEZrRAP-=)Mcgc~Oo$b_`P=;FrCzz9=z9%z93RTJ-a;UMB$B6h1CC6z=A!SHR`o znxw%|2$l10U+fweRF8@u^rc#R#dr7d?aPtChRyOS$qE%MrvEaVLQn|cj#9!YiX?e@ zNX!ghZc;dmX|1=yrytg!bZ@=n^*mAo;gK=^OWnWDz@~N6S78KKb6H(qZslY` zD8QeL$!;lX>=380(6wYt=hOiYAlU>R3o-KQmH**%#D(NU*9(JOK^t_3{^d z>8_$z2d&=2{yG0e1Vc9d({Q3a%qL%ou@^2br#<`q6#4?f%6M?}ixDgg9xk(H-LRLf z+A7r8$mOMLd_K($M`Pv#E7oj(;CKr7)x-H$?b35~sv z_&>*M-ZCT0K!_n}kChji)3cjlM~*)b-i7bv`cyGF&!IbtjekqvbPNr00v?(H$P$SF zNf%%=Q2AriRyvIe!#KWbbdYl&5*0Oh@Rj1hUIAgEUFSQtRj2(lvu$~cG7LE){lE0x zcS@Fxy2%xQaFY5zIC>8GNa1kxx^Z9-5$fi6qyCH#&+ua|3k!Re(WSY`ZHxQM-wzmX z?C28P)P*df~+5qGH!pdfdrbObFFS8d>KqPeBeGhY@+$@!ZZK!)zIm;j+e* zSByPTAt+p_X9u`I0^}D`g+AcdwMa_JnlXxa*r{xx2?f^s_a@Zax-uo#rmBbDEYK3J zy|A?{l5G(2X`3F3SbDeo)qlcTJ_U@m=i`}+P9QTAq!ETubitb{8NU^E=^ zcEpw(40O6pJ7`J0&)Bx6B;+#I^8Gr>3|GI_A>vXS)x4mOz-E~c*dw&!K-)SNINqa9 zpyMzw^n7nOB2=4=HhBElZF;E82>s*9U1O71-=%=0jD&u#+xUl{zN+GpBos1;Jj~T8 zO9~`M5CNztlZC|HgH+0_C(Oa+uk zOeZ=bjmowSZB|Vbr@n9UYz}Vw2Q$2n{8x*QD*E1D!GBuo*uyXhkf}daK8MOCRS=Oo z>jLWPdm2BzapxybRp)KS#^k_(7sUOJpT&el7+d%`3<$T=S{cH8HlGD^BARAK@az*A zr0O03wY_^2s#RJ0M~)fVLARfrRpxWpaqJqgw85!Suc_5VdH2H@f&$EZxO zn9|EGhNp55J=ne>ZcJ9MYKF?v#WIcjY*V;SrhVGDz+}eDCoDDqczAR)Qc*q$7j=QJ zPHYtjm~x9;fXq09k(h^-HnL_=(&0ogJ)V^jO$5OP-Riz9KQ&A>{%dLVmk+rW>t}QJ z-qY`@HX})pZ@WqlLVDwkzYhk|5CYM}i6-E0S_0nE6+BhbBic~iyW96biTie#GW%i! z_1rv|B%#FezkeY-qUffuVsJLYugj~=%+o_$?>H7B>_Mfr?E`Q$?BN$=t*cAc;6dPNNH+o9Wz(ZCcL1dSrU-Y523T;>*9kVhyLX_68K!M}zI!u%Nrw2UZqA z6%GMI2wj$vzR!4HcDzX76?*n5WE&f7kLj_-Jg#w{$*84-(=+;XZsh8&2t^4Q2VzRC zRRI(tP`zav286tq(y-|2B|N=BXO8`!w@rpTHrxQqj2bKe)R(bzwxVbUK zbO@Rp3=G=X+2Nf-Mb%S4PK&0w{522g@H?P6%eA-)=6HLwqxy4hLB%h!%G}CEhQw{6 z({9CSg$&gZS!rhO5ysy`)c^Fli+UECQ-ZLOD5OAPrJ9~M#lEyaba}bp@fL$T53Z=r zGKK%r#MSNf-;uosL=2!F{Z zlZW%d5b5c6z5I_qhneG(=I)B8@}|uy_v60Zz^R;OkBZUo-a7Xz8~NRkXq>?AHk67@ zoDK!Bp4L^4`xD+Z_kNgMkBv&_nIW>)r?7V;nF`b!Q)Xspn*fjEAA#u}g`6v_%BIsY z%9iEEO5a|uiXoHg|BMWV&eg4-PV(+hNGtFlhW>O6%HYg7565r{34<{Vq&T!A!`z~W zUh0CT_<FZ{;?RdoR_Ese?qm=A%WyffXl56_227fqj-^W>%JSB z#h`2ofx<`dE5Yp$mEtXX<)4f{J*kSJ3gAOd;WP_hWx44f{5K2rrVCyMZzLQNxfwr{ zne{m@?ml%tc;J1>Kk18K%}J9q9na?81@YL47`WQjF!uOBagCOjt!k9Ni(%S*ZZG39 zU%QneUrX_D8twtB@w*445kL7TO2+H$!`C|$+8hiR`T$w0q$(&HHyd-_{bzbyl^s2m416J#$x9xz=%1-6rt!riTA`M%D+?VPn|vO*kv( zO@F@V!>?pB=S^vxK4m2g@SZ2yj?`X zQLzv)|Hgl0BYcuA*ME>(BW3#@6=oxus5OVzk&>@{_c5!Io;LL}|Ak(lCTbU+uW`UH zQ0wV`tn)w75=p!^+p|Ecf?;p77KTi`}RQiL*@lImct@YCp zDw2rDP);LqDCoiwZ7{8l<5Wwc~{_jVb1xTbkWd=?q@`B_^LBso46OsA; z=*QE@`-uC{MrK&TQo5npnezL`1+B@=BU2Q2{$1>7tVjNCPElWt+k9DCXW4XU|Z)xlrMxCW@ zA}H!dz5ImO*D>^e76*Z5d|-swJI|gLu+F-lwj9=@hp)5sza#&#On|M8W@)Q?_RC@} zo>1g7!Km-vl~rV!p3WnXe&~QLb8GO-MoM2pZc{NluiF8XDH)T5p#@v&43yDdPs+jf z9Ypb;vOR|+{rha3I3vR?ygpoYAJ=L8VSIzH4G(rFw<~d~DlC+c3QS>yiXwrxUPj`d z^=Br}{BC$C#Ml*50j}v|_!F>CXA}cnx;Xm6}moqaWxSY2MGz;vRR-hB<*uOh0UI)E@9I>@J$|P@1Sm zmB|zr{G|0`qTunn7CV&VMvxH?YctUtaY3?BjBO%IAea#BKn}mlh+&+8WhYUfZ zM_mUbW!0S)6wfH?K>1YvPvYd%6~gQIC^JLz{D~PL*D~mQglChRs4I0;6Vos7+7nd= zP@57o{FyzFdFsv&;YdktSO|l$9H9D!<)suUUdi8A@x{rfWi;05OJl6&I9oZdP|G{e zV5$OKIR9Nl z*Gmmp$P6EFng#;MISk}HNYiv~DUI_@kFL&juO7v>Pub?|iwJYjIVKl}Ea%{j+S+j5xu_NkG2DtJc@(Em1GLe{*u-tjlyh41;N+cBz@eH`?MK7(Wec-gQ zJkB%DDpSctM-}0uH7;aQ=Ql1}Ob1>4zAKZPdzfyTJ%z>mEn0)SSltx5TVc~nzLzD(w=9FC%DH67=z@kkl?V9Bw-XcJ22UCxNjnSmS^pTh#uK` zr~J}X)w|)k7lhqQl1F-R%yfM7r8_HyRpo-(zcuAw5--&2`jg=*1K(MdL-6Nryn)}3 z1y9gzEuPKV_uRF-FM>tS=C7N-#mEqK*`U|vEN0x!!^-$)Iq4&WoD&J9*OLa_fL8WMTf_OrM@=2) zL8{DVgROBa$3xO_Lq8QL^>aqsr0nBCKDzf5$fA;ZD5z1y-uC?-Q9FRMJw=Z02N^tn z&S79!yUa4{)*R03&XZn^)0rjku^plsV!J;wo{O|qXwbd$y}8m-;MnN#l6JpCrLQHX zXb8s)SC&2WYOMH_9ckk4&-~VD^ufjk@o9BT*fyqi5`#Z&OLX!4UHET?L#V63ca1$) zv4_RC8^dqUUpn=3jSm@;{xoi5kPaRL-tX<_hER&mqIS_oDzVbjwZugNwe1zn%tmcr z@f4V^I=-Ydx{^^^FMbg9Tgm-zn4tsAy6`SqFTSYWTuHVBnd#}l=DsJ)1T|OQb!xJy z`;=>=8dSe5(V}Nxtyk==hljU4CF94jAuA;=_j=&5gIu}r3k;8)bs_&eoyb{D*_13u zS8SL}^mEbls%!c^;2=Ht?P`(ZUMyhnaWe7pdVgx8@V19ry;y(A_(_;sr9JZ#rD6ZA zRMciQXXfmyPs#ap9PvU}A1grEwA1!d^w3ja>^xbL5WQSs;attnO zn2ekO*=8{a@H78H|AGtNh!F51a702GK-Rb@+qYN{%9aVs=#(=f{c`4)`qbRi)r`^k zul8ThVi{sRp}yQ)|IWmms|*c&2o%L|<^1YQ7(W<2Qzl*vA@Ftt>r@$v;aH~TOS7ScSy znUP>&5RRj+GSTTHux7xe!8AXfK;+el!0S>QO$DG44@LOEReSh42e^ZLuvp)@z~h!* z0ijI~sTnf?4i;|yqR$Z>?ZYLqOy_vi%nx+_ZrZS9 zhFNc1UO3X0S|pnRBn}5I6(#FB-9e&O5xcHI&E!5P^1@$%6jz>*0|(e=js!^G%CCdm zaWU`7NpwL5JeDCb4suGcZ*8{%_3sf)ddbvKy-^-4fqKtpA~NT+@u9`Je! zGux2In1YvuCb=ckKLN#i2Mv#iN$I3qG76&3)FGBLLCHXZoJ~#gzZlp6@^_kci^As6 zH6s!Stp{Xp_W!c?SD;!VsQ)GF+U#@n9Qr+pDONQV3C4%`N+!=V`vRgO&j%I1oaft1 z3x(oUE;3Ak@!MV<;C{IXrSBP*efLOWltmbdnKk2aA8Wv=P{|zu^-@ktSf6C@q^gy^ zQaPHB$Nkv&d^Y1vfU1%=8A*L|R#Fl#vXoemp18aB@4IC#z;>(B0!*Dg|M2x}s((^x zYmC5e-{M&5#!j&!`C8z*`5uaN?A79Lrd>4czYks!2<2JZCV(dKuwdpPt;CJtsQ>!Gb zP`bOQ-@$W$jPbQQMSP7CFal3W^>I*(S6}PV-Rg;!vuK{YeD#Rz<(XgoZru#Xh|WPL z(8B6X?O$ndn*(U=Hqk0hC2+m9Rg4)8ciF;A>)dG0|J$5QIzwCGd)#VFf41f=t}ie1 z3wk-ggL>r7De~ZKu8)<0!C30PPA~AlPR;QzJqX)xZ!Zaid|xKA{KooST@+M2IOyp0 zn-Q+U1AfW0Z2Ap9sbfD@ETNkRUyU<=J#4pmvdK&DQ5~5+1`|WYAmXR15TU|>dmT3- zt%+lue*1RfAMVW2E5AJ5<$T+*(gh3mWzSy~UM$o4yTj^01aTc+lO+iTio^ur#Djxt z6~ub5lB!)tXl4{p7wrEED!u(p{XRm(GXCNFw5;+vb~&Gm+3GSE!37p}{!E{M#i*hIDjDbx3(d?d2=WHqDRDVPhvwpm63$0j-0K zB6_v8xBoIEop#UmDTgUa{Z#KPKFO1`9Zj)B>b}k4lh^)s&ogT3+ox1>E)*laQK83I zv5PL7Nro4gM3gYPD}qx5QtloGCpQnV|;8XP?I z#+(e6dU`)T4bu&Y}%d67qt6Kl+8l%(J#RO8h)v_2r64%rhVS-eh+`T|5}G zCRaR!eIQc~C=e3}$MW)8eTrmH3a);e&M#cs=Upc<;9A1?G{~g+jgl*-nk49a@7J6X z3}R`ChT`?bkr?N-G~f1|_FjBi6uw4T+;x6c4&+wtb+7Da#6LEAFgbccpuZud#3oh4 z%x-g{GAs!r^jVp&3wa7{#>iCU%g*bgLy&ut4K@#P3N(%1NRXrwZjuxnk_A1!NU}I< ze|cZw;$p4n@#7;+dY`?sJ&U`_s#h5C-s}cJ23T4`z+ul!4AkiG*Ziu_K41x8+wO8} z+VZ2MwzR)Z>3aHn*K+VtmWS^YJ)PR&15yi#YvO7oVxhL_>ZADmjV2#aqD0P0rx|=< zA`xY%Mp?fDZ>@36+9EA*68**sPF7@J=nPnC^jYVB7Py@*@N=_pulhk^htrs(trgQ5SC zg6A0ytj{pyHu?x{b%rU=5EDb-j}aaaUcjM z{rdMzW|X$7YQ>0CZ`*N(+zk@gGFg!49vuOen7GosF}&^7>T?*^!M~q17c$3$FzRv2m@<)QDvD8>&t$`1tqxT!VvhaI}Neb+SV{xJFyg(OQ zWsV=a({wMAg4i^T_5x#GtjGe1Jg!jTnxK(h*P zrFvQD&`k0^WCx~dxYm-APV``C=#H7N2-eob#RUeGyb`c-E0iq(=y<%T^=;t0@L7=H z>nRPr@Ep+@l>!#g1|NrE;&0)(I?by)}ia1qo0+?tZ{ zU?2sHkG9Z+bq_L2|G@`3ztsOy7%x076}Yb|)Blw&H2;6;0#q=FXN5_rVJuj8edoef z)v)TjskpXTv)n*Azcc6Ks+cOq3xcS$3gJOqXe7W;8+WGy3-AK7>$+l>{(R zFDU#E-+66(x+b=?OuTpIM8y$;ePy{&ZxVlzNLzoa`d_!n=F%5|{v>RE8yy_X@Leju zIDA?hY4l;4Kq@2nJ{0!x9#D3qYGbpwHB!61t!Z%Fx+=SX7i1zaq&|%)Xia z(z!$(Vg8`<5ndWAW;C2!6)KvS#aO>hhk5$HTvF{GhKm>Gy;t^tRtp4TAJ9~J_J&vd zQEHfIew6lx^$fcGVO2a=7@GqBZKg29vTo1@=!R2;7FXK%fMTue4NwY4^N0|Er?v;n z|DMW}KO=BK8ZpUx@0OwCGnK|`g4zW{o>)&=qhECQGJg-@RGzesdJt%_`X zBoKWZ{T%xHv81o}3ns0rkal7+vW;39@H&pDI?A!G=K*o#|I^ZU$Fudm@7tSFMQYb7 zg2dj`ZjIJxMU6;#Q;J$ej9N8nxAv%AyTpo82{D2SZBe31ZCYFG{f*D>mp@L<>%7h% z=RD6j=f3Xix$o=JWAjgNn9}}w;z3F|pvKpJnTo!olgWox7)LZD-U zC5>u}r@a9M70RW;y&^vTf;f3*X)7P&jlC7vTrQE7cBe~T{@_efe)BM!I8eN z^>lShF+X?)T^vPMGYWW1CG1|^#PUsG2MkCXDuXyMqI~UtY_F_e|4fe2LfTE7BNedU zI(3H3-t*k)39PFhQSbeRqpPcb;0yeTudFwTAP|BT9mUsd5M4mAGS-m$MuyVxr{{2E z)@-~AThQ9iDpL;=3Re%Mqb%PFZj`N8L?jzXiylr3i)7y!y!pIZq-As;8yMjtdY zCMhoY4s?{S9Oig`D(EG-(W9ejhZ01GoVVeiz1#44aP*)-G4W9=HK2#`6QS702l=|{ z_bJ8P$I3s3`-I>62GmPXxCd4EbPvjnzgymo!q5#_0#u1(W1n33+bg7}&0=*w`R5t% zNR{W)D*8w+(Bm!g?Zg&35<;lFqYDJ;9P+y!RP_oUP-g!Z0x)5E&&YZjvwm3+5=@Xhu;8g+1?Xs$yTJj%Y9ula$6?8W{&JG>KgOdSp!|mm!a&1tk4x&DQrkEmqWIDw4Ag4%a|Je?zH1^;6j( z#RVLmFhd`3f)EFL0kaXH=EVJUJg2%F`?22W3ud z3Jklv?IlT>^p8Ntqt59SO%yWpJkDC=N`9l6j=BdOeH9T{@TvCos0K}2i@)Mdb?ppr z_pzljDPnMtVRM5*sE=pCUD=-fNsO6HmlozN-r@l5zR~k8bg>_FvZHgt`lY{_N3+AY zV1vF@0!NyNm6(=;?-033)%bjyi!>HjX9WB?c2kHw5rWw%BQoRHhKt`<{`cpCV0U*{ zy5!i24(lR$|ENoi9GF65YamV?v~mB>SW`ts22VYtI+MS90cu2c5^U$;OO84ft2!f0Qs|ubgr!D%n{Uj;9W7B!IdfJb0$Y8cmisoCn$P zVO#X*FqaV3iet{6{xxy1(wF2J33*GMy-x@%T=ete2$nlDm?+-M!Kl)HxuflV9;+H9K;G3xQy2xplDQpHOR73c3H90M zMHQv9X75Cr8^ET4LS1qo(c2U;orFHFU&Ok4g#s3R(!Pn>;DxG+f*%i0#9gFK7#UjU zP9(u|k-ymiUOCQkldaxgvXmSiPKP}6p|R%J6wJ!zj+`j+2Lfgu zcV9_13gTlIw+Y?nJU`tTuL-C8+V{XvF;N>VWAZXu^J_wKh7-#Lm%0^Chg~!*M87-a z6O(sM>BNK;sNta4H>!uLXQ0esxyX*$9tbJmfOdg8yaWKpreW(*fqR$aU2}&NBjILI zdQgjDNG1t6LSjqafOx^LX!R>X*lwZlqXb?JQA$9FaGkuoT@O?Ny8OkqEjqgGnE4j$ zQ*m*5M+em`M5kw9)+`TV>eex5+NOLKo1F|DOWUYwn#I*YznmT@{D{<6j=g`QYfuQt zNW2-<0Uq3x1*->q4D|>v;Soj0* zs}UtY&nhryND&^T{D41boS^aQT;)CAT| zKWIcDf+{-Cz(jGRZ_~Q#f^7EK_9<#t+-!aKzWN0kiUG!Guwck!eJUy*f}#Ubhzew7;<_~8 z#Cn3y$SfUc49nqCnvWQ=jlZv(or4mfZ>1k&b#so9sb#rB@u!&mzgw^p6$vY$t|+_- ztq4jZ9oAi=7peE;?Zj;54&7*2^$F+m?gk%;EZY7-=_45zVja|%C`r69R*zIaL*PO# zRVZ7$k=!i2>Npi9z3WuOegkywI@v0e{XQ=@*V$D)dugB zVD;~|+J@ofSIm#PMhkDxBiR#_k4$Qn}RNyhp#m zK1O#sUXZwd<7VnJ{N}jl_lHn&Y5BbE^>RDgqvXc;hn5rX#`&;^5mtxXU3$ME0)W*L zl2RHQJKLga+r;{gXqnkL7R$U%a~+uEEm+HK?&i-u=LW7*Nq=XG^df2zc45al~q&>f_Zuce+ncby;bNb8cw^e5pe`{`v~7 zj^f2;{4zBOq_jH}Krd{^r@@mSM*6}R_CNO>cK!M4^SB#m!#0m~cH2|<2w_Yem&mrz zfqH5c&xwnPoeZ<9exP&M-ek5d8ASUxc}Dti`6O$OSN}HQxAYz8%g`Mw^?L2@mJq88 z?d*5BXX?6pFd#^ada(j~s}=4IVzQ*ShRkx}att~xeb;{S)NDT48rC@5)Er;?oR`b= znh*Wq&$(QOhJUVgCm!I`NDLJ?m65{Wf402;kVRBuNy_wcAlrl8H5<QN_iQI-SeMkdlK2gRv<&tQ_7w{wRlf zx+OSlMCxGHX#P3J-$Iio;|bmmV`1*4+XSas{Y^#hssxD<3pdp1fHxwmkXkliYu5mZ z3=ZsVPMS8aqr8(@<2+QHwb|n@FYo7niCy#LfzS6WEDS}EinPrs>5@CvC2@UrKWW#v zM80%|S6vo_ez`n62v&2bs!icpXG1jQHJqQz&pFjSZ4wJIFHqf}YbBG22T~=L&AIdT zHSRU5FLlK$2!F1v!6u)CWO@HQB}gAsQS7#;J(ST7S?27>g$(=&35-vNh}pa9@q+qK z2;^C=FJKs_T+ZvbSl(yx3f%Jg1UJ7ky7_xN)$Q&>)WxCw&s4Y4zF9_YyH;t#*Dkdw z7cN5#_6EL(VSQf9tE-A>_;eRAjnonyu--oPX0XTPyZrpD3jLU=_jLGlry(-O?|i=p z&{ErnJZb$8o@$9cT}T2H|L~^uSL;PPls8}x4X`!xQ5@mFP$Y@T0i72L74=~1;EllW z2Otv1NSvHJxTXG&oCl0(k~@p&pDoD`bu%1hRD3DE+EJX;qT*pBGXq24VGI`DpX*%@tO)h=jf zN}#Xv|6R24*5TY0ARY<%UGh9KG|cP0)o53P(CWbKnwz0-=D<}Lvf}bzh0SJ~hxazZ zph2WiQ*#hEe^4;>UH0(f_Av%}&UC_AEj0LDJMHdk?d{Tdvvq*dvSVKFVD- z|Mqa8dtk(qR8)FrjusSy)H0T;c1P3xgw%(fD9=5C`ou&=tc6(b4Hl>{>4#q_l2)*& zWZJ&giTk!3QrxYt=ZIq95rB)d|FYKED9Az9e_kwO?okrMkl{5P$;jGWF-i`LfUqBl zrx9;JkXGNQ?nLvlsJ42OoWGRBF@fDrbI(|@#pM=^87iMLjvpIs+TxNU7nvT@F%nuM zRoG%}_;8}5lmczmAw~2w_^m%L+$8}{dWJXwB$@t=8wdA4^Lh%6q!-sIU*-x5t;A%f z1@A`Q$bhI?*|3p<43*uX7)pE)sZo$*`6L|`nP7krmKXQS@ki^N(E$$$!e%y~6(+^| z44r=+h$ieM2s;160tC|XlrTn*`TwCQ5TPCA^^7qxf+K(QsH^{phX(7wl*Z*fxYh}X zOb21kT|iM6dS8Wm+DPiX%N}7MiF?UsC7ITOs7)jLFn{XHiwykPuf*Dl7VV_BqVuf3`pdWBawsU1jS8w!(E||VPm3J9xtIb>S z3)rwrSzCz~)Iti#03X`?*S_$UtklQya`O-|(1&40mWkha5)Zq$ifGoiv(nV4Dh(yF z`W+q4-CXV`hIy>Q{N^`bd_|^+V&HyCTn;siqvZK(nHf8 zdLeUE-91T$Xb~q6B&_$p6OlMCLA>@vM^kf+AJI_*$#;m;^^h#esj3>qS@WuXZSWn$ zWjuV&??o5i)L1lGbeNEg=FfSa3e@w8o|*I~g-rGdb0ozb3P_1MkW1549$Ht@@4;PD zbbHGSG-kJO#y%sy*r403>dI`b4noxzr=#X$Ki2oHnW&&bddr8Dfg)Bu1R(lQct`w{ z^+<7q_+D4PL>q)Vaads#IIqO?dZiy)iYTnQ~+g_-PJ=?|F6+pXF+AY%?atSjcbcW z5e7}kUk@fQ<@{zz+--WyFCDePY@t)hD4UMQ+;cA9moYVR7r&|_lTCd3tU`9f5;^M% z4`^NMjc-P}PA6DP4Jf_jd$;SyaS_%Ky1uqy^l7w zJ5ERta+g=02>pz4t*Uy=SEpn`N(KG=awd|bJ?Y6pbg(>`G~pP(@#~{}Uey}4Pjb_T z1VSLxCv!(bY=YY1Sw&xlS0@QY-qL|eel{O;`roZsdx@~5jX1**YfvS{9il2in@f|) zFm8chI{WPBS)!@O!9n~;=I1Qy8FQ+^)pYQY1DE^3DI8Ut#VfV2wt{7 zY?v%Z75yjQl#H~-pyqa4Yu1us_tZPBcfY2jjt^nf5?5R2C4r<6@Sn;DLfVp6!9oJ< zin<2dTQg$uMsO#|3G_;p0D31p$WloSx0T_4`YLx>cnWl%#Z!3yOFLWJmck`>N#d&x z9c_>bCBV*&yxNqP6HwC?F1&KOfuJyl87c6k=V`6 z>Lak;;r`2?1@y_Ckx$8U;H}0`=Ev3{BZ0dB=$syQQ@7pPdT%e%kZ&t(N$DftH_lEq?#JKe5E0iT|U30 zX1%QRYU1a|?Sy7EJA2VFwlD0X>iEL*-6eH4qk8-B#7Aq%4u_P@08RgR&Rsv*;8$k; z@bwAWb`Bh1cYKWZwR`Vs$vJbdB0CWA2?$Z*xX|S}l6aa9nfk}(8r0EsR?6Se9 zyKCe$Co^1EN|zXS@q2xAYf_Eu04rSIBy~ zzCKTfBq}|H{ro54&CU%X5-sW9I`jOThI4_B344hD&OrYDaQ9GT8$;fZ;tv2AzjX~dO9QZ>u4Ks<+*jcH5*v*~D#y8g)wIGE)6t~f9IIMW1Drr0NDzF1;iMeL=ui;mW}jB1=PaWAEICa65(n^@hm$nL z-{Dh_2exz`F`-0^!1LpRT>}Y+q|&aAwErlVXK9V$TEFhWzHo#$G=$kLhThD_`D9`{ zGzFJt){_DP3<3;>xMx~#_BA&SJB_5gbCI$6v3+os5Pvh_wxRK_s2-{(F)vY>^@lw+ zhr!KR7+!bRue#S+?azyA0Q7Ml*x{XkY>2`g6jQK518;uHEqv+ITCoa-qczG&7D4Z^ zy5 z)fH_Jv}vI|p+dsGv1tDRi#&q9kRVom=CWV}o|_=Mr6~Y=kX*__OxBz@UK5 zDJ&mP-Tt6O!~Gg}PB!^@fiB!VDNR1SM0L8wbCF~|O$}=acEQA5Hr@y~g1IQwIi>XF zf6qPt$eCRIYBDCW5|cwY4y!k=p^Bivwbv#8ldL+0%%U+P%-vTeD_m;br%ry8UM7(< zNIZ>vv8eK2VK+Txe98jwRw}aO$HFcfU7Yp%vaM0H|A@Aac0xa~9IC|9SP7EdZ&^=s zl|~w4OQGaYoUEG)v zKatHLvfl&ixR@9s*MQFo*jx@(I}E4(!$2|7=)}f$j}q?%;b(r+ey1J1H2#vAeUM8qagbFNpTz)jL5S zsZbTXJYBu?>(}XDG&C)$6^OfEzag7y@osc!(|z z&7}?AV{oKK9>-BHFFP&g;i`yd=qK<(zLd5bWix=FeC!Vpw3!fs70PzL?Af5=++9gj z$f5i1;XIE?RdMnS{Nd5UKVen(3o|>r^>MGeRK$7fdSjnFyuRB%v#@T=$9hC2DZ$3( zfRmi3w6;>=Y@L8!@5G#>Y`r9`VV{PFbjf{Sn#7?M#-fbgO4lKCP?qQo=e3!dtcZEx zW-u!Lhuebg*b+KA`v#U2kfDFjVS;B`F=(tyDJ9ZOVv*XuV3Z?4J`awqp)C)W3~UK%QgV(9||=}%1aH+vW~q?OCQ4ix8n0yyT| zCIoM8@|QBX_aAOOfzI^&CzrTs74VsG)AqAxn8n8hH(%x38IGzgflY*JTRl^ep9xdA z@Z)Y{!M9m@YN#TW50!)->eT+5_CMT53_qs9JG%J4zvTzCz>aGAT|TM5VzwSM3KQ!2 zD};!Trz^&?Y6iEA_3Mt@A8Jv}|z2~(c&2v1IPPsI?yMfy-b&cKYUEP6=|Sz1=6 zo$esBntNVbHTFV#B`1d6m=YO{K;uokIeI7LjlpE`S-;;SOxj1tW0fJaoMfot(P;DW z%rtH^b@#x;Pex$F9#oD z5L5j5MX|4Rg4{9W`(%4pf(rETjg`&P(f8=vPd{;l*3Yq3lrrxn!vo$xUU}NSulT$7 zeLhmJ_8$qfA%*!&rrxL~HU41RsYc#XdLyNzgtBdxPr3KD>wN;JzL{vPN()UDHoMgAX5G2MOu diff --git a/public/images/items/malicious_armor.png b/public/images/items/malicious_armor.png index a37e21db2f10b2057f9c3877ff424d4312e43491..b7bfb55195bbc871e9d817441e94639d5f57051e 100644 GIT binary patch literal 894 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 delta 613 zcmV-r0-F7k2e}21F@K^^OjJbx000mW5F#WjH!xBQ#ifC(^<(hNM-UhGK`AQ=6=Hi?3&exp1AcQ=+V2rZucsxWGuV-sX{_|F^LJ z`HR8(u8)$!^S1ny*Tjg>@c7Ws!1(y+`1rtH&vyU-05)_|PE!Dp@hp-734aiYt1bWl z0fR|IK~y-6wUXO*f-n$8O`!Cm0t%H7QIu+E6fYq8|6l7#6h!UvsXcFD?-_ zgWm{L5i%SO&)nDLv(f04bbq)iJT&KL!PdAdfR|-q@NS1$ecRTYbJ_|e1kH;AgJ4>2 zzlHituYwpC#Q_{oeP6>c&;o4)A-pk^v6+JJLle#!Z5s%W^W?}cLJ*)n2ty<25rq($ z*9!Z9G27-^p=|>p>`RLyc(qt8v=WfBptO)>oTusWm;_8!Frw&#F@Gb-Qf0td=A~(p zpvMYA6-Co`$6OVaN-51Vo2QzyRjr^z(-(62NGTg5VVtp*sOuU%*3EJ#naBFF@uq|! zj=M3&x;12;mtP39#6c`~voS{Vx2Tjcj5vaGlt{k|k*>9(6~wj%S!kU->aQ*VqX?0@qEdY3#cS51Ha00000NkvXXu0mjfHQ6JJ From fac20ca97a214acbdd83d0f1795bf73d499f5186 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 28 Mar 2025 22:24:19 -0500 Subject: [PATCH 43/48] [Ability] Fully implement Flower Gift and Victory Star (#5222) * Fully implement Flower Gift and Victory Star * Fully implement Flower Gift and Victory Star * Update src/field/pokemon.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/field/pokemon.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/ability.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/ability.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Accept suggested change Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Accept suggested change Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/ability.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/ability.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/ability.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/field/pokemon.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fix check for ignore_abilities move flag * Fix missing argument to getBaseDamage in getAttackDamage * Fix merge conflict due to same changed import line * Fix call to getAttackDamage that was reset after merge * Update calls to getEffectiveStat --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 88 ++++++++++++++++++++++++- src/data/battler-tags.ts | 10 ++- src/data/moves/move.ts | 4 +- src/field/pokemon.ts | 34 +++++++++- test/abilities/flower_gift.test.ts | 95 ++++++++++++++++++++++++--- test/abilities/protosynthesis.test.ts | 48 ++++++++++++-- test/abilities/victory_star.test.ts | 60 +++++++++++++++++ 7 files changed, 317 insertions(+), 22 deletions(-) create mode 100644 test/abilities/victory_star.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 5bf02cabf6c..6ffdc1f5403 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1712,6 +1712,62 @@ export class PostAttackAbAttr extends AbAttr { args: any[]): void {} } +/** + * Multiplies a Stat from an ally pokemon's ability. + * @see {@link applyAllyStatMultiplierAbAttrs} + * @see {@link applyAllyStat} + */ +export class AllyStatMultiplierAbAttr extends AbAttr { + private stat: BattleStat; + private multiplier: number; + private ignorable: boolean; + + /** + * @param stat - The stat being modified + * @param multipler - The multiplier to apply to the stat + * @param ignorable - Whether the multiplier can be ignored by mold breaker-like moves and abilities + */ + constructor(stat: BattleStat, multiplier: number, ignorable: boolean = true) { + super(false); + + this.stat = stat; + this.multiplier = multiplier; + this.ignorable = ignorable; + } + + /** + * Multiply a Pokemon's Stat due to an Ally's ability. + * @param _pokemon - The ally {@linkcode Pokemon} with the ability (unused) + * @param passive - unused + * @param _simulated - Whether the ability is being simulated (unused) + * @param _stat - The type of the checked {@linkcode Stat} (unused) + * @param statValue - {@linkcode Utils.NumberHolder} containing the value of the checked stat + * @param _checkedPokemon - The {@linkcode Pokemon} this ability is targeting (unused) + * @param _ignoreAbility - Whether the ability should be ignored if possible + * @param _args - unused + * @returns `true` if this changed the checked stat, `false` otherwise. + */ + applyAllyStat(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _stat: BattleStat, statValue: Utils.NumberHolder, _checkedPokemon: Pokemon, _ignoreAbility: boolean, _args: any[]) { + statValue.value *= this.multiplier; + } + + /** + * Check if this ability can apply to the checked stat. + * @param pokemon - The ally {@linkcode Pokemon} with the ability (unused) + * @param passive - unused + * @param simulated - Whether the ability is being simulated (unused) + * @param stat - The type of the checked {@linkcode Stat} + * @param statValue - {@linkcode Utils.NumberHolder} containing the value of the checked stat + * @param checkedPokemon - The {@linkcode Pokemon} this ability is targeting (unused) + * @param ignoreAbility - Whether the ability should be ignored if possible + * @param args - unused + * @returns `true` if this can apply to the checked stat, `false` otherwise. + */ + canApplyAllyStat(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, ignoreAbility: boolean, args: any[]): boolean { + return stat === this.stat && !(ignoreAbility && this.ignorable); + } +} + /** * Ability attribute for Gorilla Tactics * @extends PostAttackAbAttr @@ -5594,6 +5650,30 @@ export function applyStatMultiplierAbAttrs( args, ); } + +/** + * Applies an ally's Stat multiplier attribute + * @param attrType - {@linkcode AllyStatMultiplierAbAttr} should always be AllyStatMultiplierAbAttr for the time being + * @param pokemon - The {@linkcode Pokemon} with the ability + * @param stat - The type of the checked {@linkcode Stat} + * @param statValue - {@linkcode Utils.NumberHolder} containing the value of the checked stat + * @param checkedPokemon - The {@linkcode Pokemon} with the checked stat + * @param ignoreAbility - Whether or not the ability should be ignored by the pokemon or its move. + * @param args - unused + */ +export function applyAllyStatMultiplierAbAttrs(attrType: Constructor, + pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, checkedPokemon: Pokemon, ignoreAbility: boolean, ...args: any[] +): void { + return applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyAllyStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, ignoreAbility, args), + (attr, passive) => attr.canApplyAllyStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, ignoreAbility, args), + args, + simulated, + ); +} + export function applyPostSetStatusAbAttrs( attrType: Constructor, pokemon: Pokemon, @@ -5606,7 +5686,8 @@ export function applyPostSetStatusAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), - (attr, passive) => attr.canApplyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, + (attr, passive) => attr.canApplyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), + args, simulated, ); } @@ -6437,11 +6518,12 @@ export function initAbilities() { new Ability(Abilities.FLOWER_GIFT, 4) .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), StatMultiplierAbAttr, Stat.ATK, 1.5) .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), StatMultiplierAbAttr, Stat.SPDEF, 1.5) + .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), AllyStatMultiplierAbAttr, Stat.ATK, 1.5) + .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), AllyStatMultiplierAbAttr, Stat.SPDEF, 1.5) .attr(UncopiableAbilityAbAttr) .attr(NoFusionAbilityAbAttr) .attr(PostSummonFormChangeByWeatherAbAttr, Abilities.FLOWER_GIFT) .attr(PostWeatherChangeFormChangeAbAttr, Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]) - .partial() // Should also boosts stats of ally .ignorable(), new Ability(Abilities.BAD_DREAMS, 4) .attr(PostTurnHurtIfSleepingAbAttr), @@ -6577,7 +6659,7 @@ export function initAbilities() { .bypassFaint(), new Ability(Abilities.VICTORY_STAR, 5) .attr(StatMultiplierAbAttr, Stat.ACC, 1.1) - .partial(), // Does not boost ally's accuracy + .attr(AllyStatMultiplierAbAttr, Stat.ACC, 1.1, false), new Ability(Abilities.TURBOBLAZE, 5) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index c4004e9c582..8981644d885 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1644,7 +1644,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), { result: HitResult.INDIRECT }); + attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), { + result: HitResult.INDIRECT, + }); } } } @@ -1970,7 +1972,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { let highestStat: EffectiveStat; EFFECTIVE_STATS.map(s => - pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true), + pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true), ).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = EFFECTIVE_STATS[i]; @@ -2240,7 +2242,9 @@ export class SaltCuredTag extends BattlerTag { if (!cancelled.value) { const pokemonSteelOrWater = pokemon.isOfType(PokemonType.STEEL) || pokemon.isOfType(PokemonType.WATER); - pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), { result: HitResult.INDIRECT }); + pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), { + result: HitResult.INDIRECT, + }); globalScene.queueMessage( i18next.t("battlerTags:saltCuredLapse", { diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index c85ec7db295..e18e898bc68 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -4798,8 +4798,8 @@ export class ShellSideArmCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - const predictedPhysDmg = target.getBaseDamage(user, move, MoveCategory.PHYSICAL, true, true); - const predictedSpecDmg = target.getBaseDamage(user, move, MoveCategory.SPECIAL, true, true); + const predictedPhysDmg = target.getBaseDamage(user, move, MoveCategory.PHYSICAL, true, true, true, true); + const predictedSpecDmg = target.getBaseDamage(user, move, MoveCategory.SPECIAL, true, true, true, true); if (predictedPhysDmg > predictedSpecDmg) { category.value = MoveCategory.PHYSICAL; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a7532685bea..51a5a10b010 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -192,6 +192,9 @@ import { applyPreLeaveFieldAbAttrs, applyOnLoseAbAttrs, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + applyAllyStatMultiplierAbAttrs, + AllyStatMultiplierAbAttr, + MoveAbilityBypassAbAttr, } from "#app/data/ability"; import type PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; @@ -260,6 +263,7 @@ import { import { Nature } from "#enums/nature"; import { StatusEffect } from "#enums/status-effect"; import { doShinySparkleAnim } from "#app/field/anims"; +import { MoveFlags } from "#enums/MoveFlags"; export enum LearnMoveSituation { MISC, @@ -1389,6 +1393,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param move the {@linkcode Move} being used * @param ignoreAbility determines whether this Pokemon's abilities should be ignored during the stat calculation * @param ignoreOppAbility during an attack, determines whether the opposing Pokemon's abilities should be ignored during the stat calculation. + * @param ignoreAllyAbility during an attack, determines whether the ally Pokemon's abilities should be ignored during the stat calculation. * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated if `true`, nullifies any effects that produce any changes to game state from triggering * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` @@ -1400,6 +1405,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { move?: Move, ignoreAbility = false, ignoreOppAbility = false, + ignoreAllyAbility = false, isCritical = false, simulated = true, ignoreHeldItems = false, @@ -1441,6 +1447,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { ); } + const ally = this.getAlly(); + if (ally) { + applyAllyStatMultiplierAbAttrs(AllyStatMultiplierAbAttr, ally, stat, statValue, simulated, this, move?.hasFlag(MoveFlags.IGNORE_ABILITIES) || ignoreAllyAbility); + } + let ret = statValue.value * this.getStatStageMultiplier( @@ -3889,6 +3900,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { evasionMultiplier, ); + const ally = this.getAlly(); + if (ally) { + const ignore = this.hasAbilityWithAttr(MoveAbilityBypassAbAttr) || sourceMove.hasFlag(MoveFlags.IGNORE_ABILITIES); + applyAllyStatMultiplierAbAttrs(AllyStatMultiplierAbAttr, ally, Stat.ACC, accuracyMultiplier, false, this, ignore); + applyAllyStatMultiplierAbAttrs(AllyStatMultiplierAbAttr, ally, Stat.EVA, evasionMultiplier, false, this, ignore); + } + return accuracyMultiplier.value / evasionMultiplier.value; } @@ -3900,6 +3918,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param moveCategory the move's {@linkcode MoveCategory} after variable-category effects are applied. * @param ignoreAbility if `true`, ignores this Pokemon's defensive ability effects (defaults to `false`). * @param ignoreSourceAbility if `true`, ignore's the attacking Pokemon's ability effects (defaults to `false`). + * @param ignoreAllyAbility if `true`, ignores the ally Pokemon's ability effects (defaults to `false`). + * @param ignoreSourceAllyAbility if `true`, ignores the attacking Pokemon's ally's ability effects (defaults to `false`). * @param isCritical if `true`, calculates effective stats as if the hit were critical (defaults to `false`). * @param simulated if `true`, suppresses changes to game state during calculation (defaults to `true`). * @returns The move's base damage against this Pokemon when used by the source Pokemon. @@ -3910,6 +3930,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { moveCategory: MoveCategory, ignoreAbility = false, ignoreSourceAbility = false, + ignoreAllyAbility = false, + ignoreSourceAllyAbility = false, isCritical = false, simulated = true, ): number { @@ -3932,6 +3954,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { undefined, ignoreSourceAbility, ignoreAbility, + ignoreAllyAbility, isCritical, simulated, ), @@ -3949,6 +3972,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { move, ignoreAbility, ignoreSourceAbility, + ignoreSourceAllyAbility, isCritical, simulated, ), @@ -3983,6 +4007,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param move {@linkcode Pokemon} the move used in the attack * @param ignoreAbility If `true`, ignores this Pokemon's defensive ability effects * @param ignoreSourceAbility If `true`, ignores the attacking Pokemon's ability effects + * @param ignoreAllyAbility If `true`, ignores the ally Pokemon's ability effects + * @param ignoreSourceAllyAbility If `true`, ignores the ability effects of the attacking pokemon's ally * @param isCritical If `true`, calculates damage for a critical hit. * @param simulated If `true`, suppresses changes to game state during the calculation. * @returns a {@linkcode DamageCalculationResult} object with three fields: @@ -3995,6 +4021,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { move: Move, ignoreAbility = false, ignoreSourceAbility = false, + ignoreAllyAbility = false, + ignoreSourceAllyAbility = false, isCritical = false, simulated = true, ): DamageCalculationResult { @@ -4104,6 +4132,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { moveCategory, ignoreAbility, ignoreSourceAbility, + ignoreAllyAbility, + ignoreSourceAllyAbility, isCritical, simulated, ); @@ -4429,7 +4459,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { cancelled, result, damage: dmg, - } = this.getAttackDamage(source, move, false, false, isCritical, false); + } = this.getAttackDamage(source, move, false, false, false, false, isCritical, false); const typeBoost = source.findTag( t => @@ -7114,6 +7144,8 @@ export class EnemyPokemon extends Pokemon { move, !p.battleData.abilityRevealed, false, + !p.getAlly()?.battleData.abilityRevealed, + false, isCritical, ).damage >= p.hp ); diff --git a/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts index fff509a1f00..1104a3c111f 100644 --- a/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -1,12 +1,14 @@ import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { WeatherType } from "#app/enums/weather-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Flower Gift", () => { let phaserGame: Phaser.Game; @@ -28,6 +30,59 @@ describe("Abilities - Flower Gift", () => { expect(game.scene.getPlayerPokemon()?.formIndex).toBe(OVERCAST_FORM); }; + /** + * Tests damage dealt by a move used against a target before and after Flower Gift is activated. + * @param game The game manager instance + * @param move The move that should be used + * @param allyAttacker True if the ally is attacking the enemy, false if the enemy is attacking the ally + * @param ability The ability that the ally pokemon should have + * @param enemyAbility The ability that the enemy pokemon should have + * + * @returns Two numbers, the first being the damage done to the target without flower gift active, the second being the damage done with flower gift active + */ + const testDamageDealt = async (game: GameManager, move: Moves, allyAttacker: boolean, allyAbility = Abilities.BALL_FETCH, enemyAbility = Abilities.BALL_FETCH): Promise<[number, number]> => { + game.override.battleType("double"); + game.override.moveset([ Moves.SPLASH, Moves.SUNNY_DAY, move, Moves.HEAL_PULSE ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.HEAL_PULSE ]); + const target_index = allyAttacker ? BattlerIndex.ENEMY : BattlerIndex.PLAYER_2; + const attacker_index = allyAttacker ? BattlerIndex.PLAYER_2 : BattlerIndex.ENEMY; + const ally_move = allyAttacker ? move : Moves.SPLASH; + const enemy_move = allyAttacker ? Moves.SPLASH : move; + const ally_target = allyAttacker ? BattlerIndex.ENEMY : null; + + await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + const target = allyAttacker ? game.scene.getEnemyField()[0] : game.scene.getPlayerField()[1]; + const initialHp = target.getMaxHp(); + + // Override the ability for the target and attacker only + vi.spyOn(game.scene.getPlayerField()[1], "getAbility").mockReturnValue(allAbilities[allyAbility]); + vi.spyOn(game.scene.getEnemyField()[0], "getAbility").mockReturnValue(allAbilities[enemyAbility]); + + // turn 1 + game.move.select(Moves.SUNNY_DAY, 0); + game.move.select(ally_move, 1, ally_target); + await game.forceEnemyMove(enemy_move, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + // Ensure sunny day is used last. + await game.setTurnOrder([ attacker_index, target_index, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to(TurnEndPhase); + const damageWithoutGift = initialHp - target.hp; + + target.hp = initialHp; + + // turn 2. Make target use recover to reset hp calculation. + game.move.select(Moves.SPLASH, 0, target_index); + game.move.select(ally_move, 1, ally_target); + await game.forceEnemyMove(enemy_move, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, target_index, attacker_index ]); + await game.phaseInterceptor.to(TurnEndPhase); + const damageWithGift = initialHp - target.hp; + + return [ damageWithoutGift, damageWithGift ]; + }; + + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -41,23 +96,24 @@ describe("Abilities - Flower Gift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP]) + .moveset([Moves.SPLASH, Moves.SUNSTEEL_STRIKE, Moves.SUNNY_DAY, Moves.MUD_SLAP]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.BALL_FETCH); + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(100) + .startingLevel(100); }); - // TODO: Uncomment expect statements when the ability is implemented - currently does not increase stats of allies it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => { game.override.battleType("double"); await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); - const [cherrim] = game.scene.getPlayerField(); + const [cherrim, magikarp] = game.scene.getPlayerField(); const cherrimAtkStat = cherrim.getEffectiveStat(Stat.ATK); const cherrimSpDefStat = cherrim.getEffectiveStat(Stat.SPDEF); - // const magikarpAtkStat = magikarp.getEffectiveStat(Stat.ATK);; - // const magikarpSpDefStat = magikarp.getEffectiveStat(Stat.SPDEF); + const magikarpAtkStat = magikarp.getEffectiveStat(Stat.ATK); + const magikarpSpDefStat = magikarp.getEffectiveStat(Stat.SPDEF); game.move.select(Moves.SUNNY_DAY, 0); game.move.select(Moves.SPLASH, 1); @@ -68,8 +124,28 @@ describe("Abilities - Flower Gift", () => { expect(cherrim.formIndex).toBe(SUNSHINE_FORM); expect(cherrim.getEffectiveStat(Stat.ATK)).toBe(Math.floor(cherrimAtkStat * 1.5)); expect(cherrim.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(cherrimSpDefStat * 1.5)); - // expect(magikarp.getEffectiveStat(Stat.ATK)).toBe(Math.floor(magikarpAtkStat * 1.5)); - // expect(magikarp.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(magikarpSpDefStat * 1.5)); + expect(magikarp.getEffectiveStat(Stat.ATK)).toBe(Math.floor(magikarpAtkStat * 1.5)); + expect(magikarp.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(magikarpSpDefStat * 1.5)); + }); + + it("should not increase the damage of an ally using an ability ignoring move", async () => { + const [ damageWithGift, damageWithoutGift ] = await testDamageDealt(game, Moves.SUNSTEEL_STRIKE, true); + expect(damageWithGift).toBe(damageWithoutGift); + }); + + it("should not increase the damage of a mold breaker ally", async () => { + const [ damageWithGift, damageWithoutGift ] = await testDamageDealt(game, Moves.TACKLE, true, Abilities.MOLD_BREAKER); + expect(damageWithGift).toBe(damageWithoutGift); + }); + + it("should decrease the damage an ally takes from a special attack", async () => { + const [ damageWithoutGift, damageWithGift ] = await testDamageDealt(game, Moves.MUD_SLAP, false); + expect(damageWithGift).toBeLessThan(damageWithoutGift); + }); + + it("should not decrease the damage an ally takes from a mold breaker enemy using a special attack", async () => { + const [ damageWithoutGift, damageWithGift ] = await testDamageDealt(game, Moves.MUD_SLAP, false, Abilities.BALL_FETCH, Abilities.MOLD_BREAKER); + expect(damageWithGift).toBe(damageWithoutGift); }); it("changes the Pokemon's form during Harsh Sunlight", async () => { @@ -92,6 +168,7 @@ describe("Abilities - Flower Gift", () => { it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => { game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN); + game.override.moveset([ Moves.SKILL_SWAP ]); await game.classicMode.startBattle([Species.CHERRIM]); diff --git a/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts index d0ae46cd951..882474b7cef 100644 --- a/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -46,16 +46,56 @@ describe("Abilities - Protosynthesis", () => { // Nature of starting mon is randomized. We need to fix it to a neutral nature for the automated test. mew.setNature(Nature.HARDY); const enemy = game.scene.getEnemyPokemon()!; - const def_before_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); - const atk_before_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + const def_before_boost = mew.getEffectiveStat( + Stat.DEF, + undefined, + undefined, + false, + undefined, + undefined, + false, + false, + true, + ); + const atk_before_boost = mew.getEffectiveStat( + Stat.ATK, + undefined, + undefined, + false, + undefined, + undefined, + false, + false, + true, + ); const initialHp = enemy.hp; game.move.select(Moves.TACKLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const unboosted_dmg = initialHp - enemy.hp; enemy.hp = initialHp; - const def_after_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); - const atk_after_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + const def_after_boost = mew.getEffectiveStat( + Stat.DEF, + undefined, + undefined, + false, + undefined, + undefined, + false, + false, + true, + ); + const atk_after_boost = mew.getEffectiveStat( + Stat.ATK, + undefined, + undefined, + false, + undefined, + undefined, + false, + false, + true, + ); game.move.select(Moves.TACKLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); diff --git a/test/abilities/victory_star.test.ts b/test/abilities/victory_star.test.ts new file mode 100644 index 00000000000..456f8cd7ddd --- /dev/null +++ b/test/abilities/victory_star.test.ts @@ -0,0 +1,60 @@ +import { BattlerIndex } from "#app/battle"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Victory Star", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.TACKLE, Moves.SPLASH ]) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should increase the accuracy of its user", async () => { + await game.classicMode.startBattle([ Species.VICTINI, Species.MAGIKARP ]); + + const user = game.scene.getPlayerField()[0]; + + vi.spyOn(user, "getAccuracyMultiplier"); + game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(user.getAccuracyMultiplier).toHaveReturnedWith(1.1); + }); + + it("should increase the accuracy of its user's ally", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP, Species.VICTINI ]); + + const ally = game.scene.getPlayerField()[0]; + vi.spyOn(ally, "getAccuracyMultiplier"); + + game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(ally.getAccuracyMultiplier).toHaveReturnedWith(1.1); + }); +}); From 5f01caffae90556e879219108d6c6d80273bc2a9 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 28 Mar 2025 23:19:35 -0500 Subject: [PATCH 44/48] [Refactor] Minor refactor of trainer-config files (#5573) * Move trainer-config.ts * move TeraAIMode enum to its own file * Move TrainerPoolTier enum to its own file * Move TrainerSlot enum to its own file * Reorder and group imports * Move TrainerPartyTemplate to its own file * Remove speciesPoolPerEvilTeamAdmin method * Apply kev's suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fix typo in zinzolin's name --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/battle-scene.ts | 4 +- src/battle.ts | 2 +- src/data/dialogue.ts | 2 +- .../encounters/a-trainers-test-encounter.ts | 2 +- .../encounters/absolute-avarice-encounter.ts | 2 +- .../encounters/bug-type-superfan-encounter.ts | 11 +- .../encounters/clowning-around-encounter.ts | 4 +- .../encounters/dancing-lessons-encounter.ts | 2 +- .../encounters/fun-and-games-encounter.ts | 2 +- .../global-trade-system-encounter.ts | 2 +- .../mysterious-challengers-encounter.ts | 10 +- .../encounters/safari-zone-encounter.ts | 2 +- .../teleporting-hijinks-encounter.ts | 2 +- .../the-expert-pokemon-breeder-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 3 +- .../utils/encounter-phase-utils.ts | 5 +- src/data/trainers/TrainerPartyTemplate.ts | 255 ++++++ src/data/trainers/evil-admin-trainer-pools.ts | 436 ++++++++++ src/data/{ => trainers}/trainer-config.ts | 789 +----------------- src/data/trainers/typedefs.ts | 22 + src/enums/tera-ai-mode.ts | 5 + src/enums/trainer-pool-tier.ts | 7 + src/enums/trainer-slot.ts | 5 + src/field/pokemon.ts | 2 +- src/field/trainer.ts | 17 +- src/phases/battle-phase.ts | 2 +- src/phases/encounter-phase.ts | 2 +- src/phases/game-over-phase.ts | 2 +- src/phases/mystery-encounter-phases.ts | 2 +- src/phases/summon-phase.ts | 2 +- src/phases/switch-summon-phase.ts | 2 +- src/phases/trainer-message-test-phase.ts | 2 +- src/phases/trainer-victory-phase.ts | 2 +- src/system/game-data.ts | 2 +- src/system/pokemon-data.ts | 2 +- src/system/voucher.ts | 2 +- test/moves/effectiveness.test.ts | 2 +- .../mysterious-challengers-encounter.test.ts | 4 +- 38 files changed, 828 insertions(+), 795 deletions(-) create mode 100644 src/data/trainers/TrainerPartyTemplate.ts create mode 100644 src/data/trainers/evil-admin-trainer-pools.ts rename src/data/{ => trainers}/trainer-config.ts (88%) create mode 100644 src/data/trainers/typedefs.ts create mode 100644 src/enums/tera-ai-mode.ts create mode 100644 src/enums/trainer-pool-tier.ts create mode 100644 src/enums/trainer-slot.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 443113daef6..5797fda5611 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -72,8 +72,8 @@ import { GameModes, getGameMode } from "#app/game-mode"; import FieldSpritePipeline from "#app/pipelines/field-sprite"; import SpritePipeline from "#app/pipelines/sprite"; import PartyExpBar from "#app/ui/party-exp-bar"; -import type { TrainerSlot } from "#app/data/trainer-config"; -import { trainerConfigs } from "#app/data/trainer-config"; +import type { TrainerSlot } from "./enums/trainer-slot"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import Trainer, { TrainerVariant } from "#app/field/trainer"; import type TrainerData from "#app/system/trainer-data"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; diff --git a/src/battle.ts b/src/battle.ts index 5ada921bf5a..367c52568dc 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -5,7 +5,7 @@ import Trainer, { TrainerVariant } from "./field/trainer"; import type { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import type { PokeballType } from "#enums/pokeball"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import { SpeciesFormKey } from "#enums/species-form-key"; import type { EnemyPokemon, PlayerPokemon, TurnMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 0e755d54e15..fa640e92b00 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -1,6 +1,6 @@ import { BattleSpec } from "#enums/battle-spec"; import { TrainerType } from "#enums/trainer-type"; -import { trainerConfigs } from "./trainer-config"; +import { trainerConfigs } from "./trainers/trainer-config"; export interface TrainerTypeMessages { encounter?: string | string[]; diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index 6cea85346b3..a49157f8e88 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -6,7 +6,7 @@ import { setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index ca44782691d..85f40a41e51 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -31,7 +31,7 @@ import { catchPokemon, getHighestLevelPlayerPokemon, } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { PokeballType } from "#enums/pokeball"; import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; import type { BerryType } from "#enums/berry-type"; diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index 15cba1fa103..1e4c9a3b957 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -9,13 +9,10 @@ import { setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { - getRandomPartyMemberFunc, - trainerConfigs, - TrainerPartyCompoundTemplate, - TrainerPartyTemplate, - TrainerSlot, -} from "#app/data/trainer-config"; +import { getRandomPartyMemberFunc, trainerConfigs } from "#app/data/trainers/trainer-config"; +import { TrainerPartyCompoundTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerSlot } from "#enums/trainer-slot"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { globalScene } from "#app/global-scene"; diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index 2b499d938cd..eca99fc0c13 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -8,7 +8,9 @@ import { setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; +import { TrainerPartyCompoundTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; import { ModifierTier } from "#app/modifier/modifier-tier"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { ModifierPoolType, modifierTypes } from "#app/modifier/modifier-type"; diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 91f168371cf..75527e1f8c1 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -20,7 +20,7 @@ import { STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; diff --git a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts index c95810b94d0..282c6c149ff 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -10,7 +10,7 @@ import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { FieldPosition } from "#app/field/pokemon"; diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 4f10a657e4e..c13501c4511 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -3,7 +3,7 @@ import { selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MusicPreference } from "#app/system/settings/settings"; import type { ModifierTypeOption } from "#app/modifier/modifier-type"; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index bf60e982b15..11924f93df4 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -3,12 +3,10 @@ import { initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { - trainerConfigs, - TrainerPartyCompoundTemplate, - TrainerPartyTemplate, - trainerPartyTemplates, -} from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; +import { trainerPartyTemplates } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyCompoundTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index f231e4abdb8..8c45fde3079 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -10,7 +10,7 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; import type { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#enums/pokeball"; diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index c7220192caa..806a89a7131 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -24,7 +24,7 @@ import { Biome } from "#enums/biome"; import { getBiomeKey } from "#app/field/arena"; import { PokemonType } from "#enums/pokemon-type"; import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { BattlerTagType } from "#enums/battler-tag-type"; import { getPokemonNameWithAffix } from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 2b29046f738..84dd5002e83 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -4,7 +4,7 @@ import { initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import { randSeedShuffle } from "#app/utils"; diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 5d3f834ed75..22ec52e976c 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -41,7 +41,8 @@ import { TrainerType } from "#enums/trainer-type"; import PokemonData from "#app/system/pokemon-data"; import { Nature } from "#enums/nature"; import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; -import { trainerConfigs, TrainerPartyTemplate } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; +import { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; import { PartyMemberStrength } from "#enums/party-member-strength"; /** i18n namespace for encounter */ diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index d37ac340a7c..5c6acf43e26 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -43,8 +43,9 @@ import type { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { Status } from "#app/data/status-effect"; -import type { TrainerConfig } from "#app/data/trainer-config"; -import { trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; +import type { TrainerConfig } from "#app/data/trainers/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import type PokemonSpecies from "#app/data/pokemon-species"; import type { IEggOptions } from "#app/data/egg"; import { Egg } from "#app/data/egg"; diff --git a/src/data/trainers/TrainerPartyTemplate.ts b/src/data/trainers/TrainerPartyTemplate.ts new file mode 100644 index 00000000000..adbaacc6b55 --- /dev/null +++ b/src/data/trainers/TrainerPartyTemplate.ts @@ -0,0 +1,255 @@ +import { startingWave } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import { PartyMemberStrength } from "#enums/party-member-strength"; + +export class TrainerPartyTemplate { + public size: number; + public strength: PartyMemberStrength; + public sameSpecies: boolean; + public balanced: boolean; + + constructor(size: number, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { + this.size = size; + this.strength = strength; + this.sameSpecies = !!sameSpecies; + this.balanced = !!balanced; + } + + getStrength(_index: number): PartyMemberStrength { + return this.strength; + } + + isSameSpecies(_index: number): boolean { + return this.sameSpecies; + } + + isBalanced(_index: number): boolean { + return this.balanced; + } +} + +export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { + public templates: TrainerPartyTemplate[]; + + constructor(...templates: TrainerPartyTemplate[]) { + super( + templates.reduce((total: number, template: TrainerPartyTemplate) => { + total += template.size; + return total; + }, 0), + PartyMemberStrength.AVERAGE, + ); + this.templates = templates; + } + + getStrength(index: number): PartyMemberStrength { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.getStrength(index - t); + } + t += template.size; + } + + return super.getStrength(index); + } + + isSameSpecies(index: number): boolean { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.isSameSpecies(index - t); + } + t += template.size; + } + + return super.isSameSpecies(index); + } + + isBalanced(index: number): boolean { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.isBalanced(index - t); + } + t += template.size; + } + + return super.isBalanced(index); + } +} + +export const trainerPartyTemplates = { + ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), + TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + ), + TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + ), + TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), + THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), + THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true), + THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true), + FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER), + FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true), + FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK), + FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true), + FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true), + FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER), + FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK), + FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), + SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), + SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), + SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), + + GYM_LEADER_1: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + GYM_LEADER_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + + ELITE_FOUR: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + + CHAMPION: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONGER, false, true), + ), + + RIVAL: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + RIVAL_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + RIVAL_6: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), +}; + +/** + * The function to get variable strength grunts + * @returns the correct TrainerPartyTemplate + */ +export function getEvilGruntPartyTemplate(): TrainerPartyTemplate { + const waveIndex = globalScene.currentBattle?.waveIndex; + if (waveIndex < 40) { + return trainerPartyTemplates.TWO_AVG; + } + if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } + if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } + if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger + } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger +} + +export function getWavePartyTemplate(...templates: TrainerPartyTemplate[]) { + const { currentBattle, gameMode } = globalScene; + const wave = gameMode.getWaveForDifficulty(currentBattle?.waveIndex || startingWave, true); + const templateIndex = Math.ceil((wave - 20) / 30); + return templates[Phaser.Math.Clamp(templateIndex, 0, templates.length - 1)]; +} + +export function getGymLeaderPartyTemplate() { + return getWavePartyTemplate( + trainerPartyTemplates.GYM_LEADER_1, + trainerPartyTemplates.GYM_LEADER_2, + trainerPartyTemplates.GYM_LEADER_3, + trainerPartyTemplates.GYM_LEADER_4, + trainerPartyTemplates.GYM_LEADER_5, + ); +} diff --git a/src/data/trainers/evil-admin-trainer-pools.ts b/src/data/trainers/evil-admin-trainer-pools.ts new file mode 100644 index 00000000000..ecbd5952143 --- /dev/null +++ b/src/data/trainers/evil-admin-trainer-pools.ts @@ -0,0 +1,436 @@ +import type { TrainerTierPools } from "#app/data/trainers/typedefs"; +import { TrainerPoolTier } from "#enums/trainer-pool-tier"; +import { Species } from "#enums/species"; + +/** Team Rocket's admin trainer pool. */ +const ROCKET: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.RATICATE, + Species.ARBOK, + Species.VILEPLUME, + Species.ARCANINE, + Species.GENGAR, + Species.HYPNO, + Species.ELECTRODE, + Species.EXEGGUTOR, + Species.CUBONE, + Species.KOFFING, + Species.GYARADOS, + Species.CROBAT, + Species.STEELIX, + Species.HOUNDOOM, + Species.HONCHKROW, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.OMASTAR, + Species.KABUTOPS, + Species.MAGNEZONE, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.PORYGON_Z, + Species.ANNIHILAPE, + Species.ALOLA_SANDSLASH, + Species.ALOLA_PERSIAN, + Species.ALOLA_GOLEM, + Species.ALOLA_MUK, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.RARE]: [Species.DRAGONITE, Species.TYRANITAR], +}; + +/** Team Magma's admin trainer pool */ +const MAGMA: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.MAGCARGO, + Species.HOUNDOOM, + Species.TORKOAL, + Species.SOLROCK, + Species.CLAYDOL, + Species.HIPPOWDON, + Species.MAGMORTAR, + Species.GLISCOR, + Species.COALOSSAL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.AGGRON, + Species.FLYGON, + Species.CRADILY, + Species.ARMALDO, + Species.RHYPERIOR, + Species.TURTONATOR, + Species.SANDACONDA, + Species.TOEDSCRUEL, + Species.HISUI_ARCANINE, + ], + [TrainerPoolTier.RARE]: [Species.CHARCADET, Species.SCOVILLAIN], +}; + +const AQUA: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.TENTACRUEL, + Species.LANTURN, + Species.AZUMARILL, + Species.QUAGSIRE, + Species.OCTILLERY, + Species.LUDICOLO, + Species.PELIPPER, + Species.WAILORD, + Species.WHISCASH, + Species.CRAWDAUNT, + Species.WALREIN, + Species.CLAMPERL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.QUAGSIRE, + Species.MANTINE, + Species.KINGDRA, + Species.MILOTIC, + Species.DRAGALGE, + Species.DHELMISE, + Species.BARRASKEWDA, + Species.GRAPPLOCT, + Species.OVERQWIL, + ], + [TrainerPoolTier.RARE]: [Species.BASCULEGION, Species.DONDOZO], +}; + +const GALACTIC: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.ELECTRODE, + Species.GYARADOS, + Species.CROBAT, + Species.HONCHKROW, + Species.BRONZONG, + Species.DRAPION, + Species.LICKILICKY, + Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.YANMEGA, + Species.MAMOSWINE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ALAKAZAM, + Species.WEAVILE, + Species.GLISCOR, + Species.DUSKNOIR, + Species.ROTOM, + Species.OVERQWIL, + Species.HISUI_ARCANINE, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT], +}; + +const PLASMA_ZINZOLIN: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.GIGALITH, + Species.CONKELDURR, + Species.SEISMITOAD, + Species.KROOKODILE, + Species.DARMANITAN, + Species.COFAGRIGUS, + Species.VANILLUXE, + Species.AMOONGUSS, + Species.JELLICENT, + Species.GALVANTULA, + Species.FERROTHORN, + Species.BEARTIC, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.EXCADRILL, + Species.SIGILYPH, + Species.ZOROARK, + Species.KLINKLANG, + Species.EELEKTROSS, + Species.MIENSHAO, + Species.GOLURK, + Species.BISHARP, + Species.MANDIBUZZ, + Species.DURANT, + Species.GALAR_DARMANITAN, + ], + [TrainerPoolTier.RARE]: [Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY], +}; + +const PLASMA_COLRESS: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.ELECTRODE, + Species.BRONZONG, + Species.MAGNEZONE, + Species.PORYGON_Z, + Species.MUSHARNA, + Species.REUNICLUS, + Species.GALVANTULA, + Species.FERROTHORN, + Species.EELEKTROSS, + Species.BEHEEYEM, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.METAGROSS, + Species.ROTOM, + Species.CARRACOSTA, + Species.ARCHEOPS, + Species.GOLURK, + Species.DURANT, + Species.VIKAVOLT, + Species.ORBEETLE, + Species.REVAVROOM, + Species.ALOLA_MUK, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON], +}; + +const FLARE: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.MANECTRIC, + Species.DRAPION, + Species.LIEPARD, + Species.AMOONGUSS, + Species.DIGGERSBY, + Species.TALONFLAME, + Species.PYROAR, + Species.PANGORO, + Species.MEOWSTIC, + Species.MALAMAR, + Species.CLAWITZER, + Species.HELIOLISK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.HOUNDOOM, + Species.WEAVILE, + Species.CHANDELURE, + Species.AEGISLASH, + Species.BARBARACLE, + Species.DRAGALGE, + Species.GOODRA, + Species.TREVENANT, + Species.GOURGEIST, + ], + [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG], +}; + +const AETHER: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.ALAKAZAM, + Species.SLOWBRO, + Species.EXEGGUTOR, + Species.XATU, + Species.CLAYDOL, + Species.BEHEEYEM, + Species.ORANGURU, + Species.BRUXISH, + Species.ORBEETLE, + Species.FARIGIRAF, + Species.ALOLA_RAICHU, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.KIRLIA, + Species.MEDICHAM, + Species.METAGROSS, + Species.MALAMAR, + Species.HATTERENE, + Species.MR_RIME, + Species.GALAR_SLOWKING, + ], + [TrainerPoolTier.RARE]: [Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY], +}; + +const SKULL: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.NIDOQUEEN, + Species.GENGAR, + Species.KOFFING, + Species.CROBAT, + Species.ROSERADE, + Species.SKUNTANK, + Species.TOXICROAK, + Species.SCOLIPEDE, + Species.TOXAPEX, + Species.LURANTIS, + Species.ALOLA_MUK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.DRAPION, + Species.MANDIBUZZ, + Species.OVERQWIL, + Species.GLIMMORA, + Species.CLODSIRE, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.SNEASLER], +}; + +const MACRO_COSMOS: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.NINETALES, + Species.BELLOSSOM, + Species.MILOTIC, + Species.FROSLASS, + Species.GOTHITELLE, + Species.JELLICENT, + Species.SALAZZLE, + Species.TSAREENA, + Species.POLTEAGEIST, + Species.HATTERENE, + Species.GALAR_RAPIDASH, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.MANDIBUZZ, + Species.TOXAPEX, + Species.APPLETUN, + Species.CURSOLA, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.TINKATON, Species.HISUI_LILLIGANT], +}; + +const STAR_DARK: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.SHIFTRY, + Species.CACTURNE, + Species.HONCHKROW, + Species.SKUNTANK, + Species.KROOKODILE, + Species.OBSTAGOON, + Species.LOKIX, + Species.MABOSSTIFF, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.UMBREON, + Species.CRAWDAUNT, + Species.WEAVILE, + Species.ZOROARK, + Species.MALAMAR, + Species.BOMBIRDIER, + ], + [TrainerPoolTier.RARE]: [Species.HYDREIGON, Species.MEOWSCARADA], +}; + +const STAR_FIRE: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.HOUNDOOM, + Species.CAMERUPT, + Species.CHANDELURE, + Species.TALONFLAME, + Species.PYROAR, + Species.COALOSSAL, + Species.SCOVILLAIN, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.RAPIDASH, + Species.FLAREON, + Species.TORKOAL, + Species.MAGMORTAR, + Species.SALAZZLE, + Species.TURTONATOR, + ], + [TrainerPoolTier.RARE]: [Species.VOLCARONA, Species.SKELEDIRGE], +}; + +const STAR_POISON: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.CROBAT, + Species.SKUNTANK, + Species.AMOONGUSS, + Species.TOXAPEX, + Species.TOXTRICITY, + Species.GRAFAIAI, + Species.CLODSIRE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.GENGAR, + Species.SEVIPER, + Species.DRAGALGE, + Species.OVERQWIL, + Species.ALOLA_MUK, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.GLIMMORA, Species.VENUSAUR], +}; + +const STAR_FAIRY: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.CLEFABLE, + Species.WIGGLYTUFF, + Species.AZUMARILL, + Species.WHIMSICOTT, + Species.FLORGES, + Species.HATTERENE, + Species.GRIMMSNARL, + Species.TINKATON, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.GARDEVOIR, + Species.SYLVEON, + Species.KLEFKI, + Species.MIMIKYU, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.GALAR_RAPIDASH, Species.PRIMARINA], +}; + +const STAR_FIGHTING: TrainerTierPools = { + [TrainerPoolTier.COMMON]: [ + Species.BRELOOM, + Species.HARIYAMA, + Species.MEDICHAM, + Species.TOXICROAK, + Species.SCRAFTY, + Species.MIENSHAO, + Species.PAWMOT, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.LUCARIO, + Species.CONKELDURR, + Species.HAWLUCHA, + Species.PASSIMIAN, + Species.FALINKS, + Species.FLAMIGO, + ], + [TrainerPoolTier.RARE]: [Species.KOMMO_O, Species.QUAQUAVAL], +}; + +export type EvilTeam = + | "rocket" + | "magma" + | "aqua" + | "galactic" + | "plasma_zinzolin" + | "plasma_colress" + | "flare" + | "aether" + | "skull" + | "macro_cosmos" + | "star_dark" + | "star_fire" + | "star_poison" + | "star_fairy" + | "star_fighting"; + +/** Trainer pools for each evil admin team */ +export const evilAdminTrainerPools: Record = { + rocket: ROCKET, + magma: MAGMA, + aqua: AQUA, + galactic: GALACTIC, + plasma_zinzolin: PLASMA_ZINZOLIN, + plasma_colress: PLASMA_COLRESS, + flare: FLARE, + aether: AETHER, + macro_cosmos: MACRO_COSMOS, + skull: SKULL, + star_dark: STAR_DARK, + star_fire: STAR_FIRE, + star_poison: STAR_POISON, + star_fairy: STAR_FAIRY, + star_fighting: STAR_FIGHTING, +}; diff --git a/src/data/trainer-config.ts b/src/data/trainers/trainer-config.ts similarity index 88% rename from src/data/trainer-config.ts rename to src/data/trainers/trainer-config.ts index 0417e7abc32..f23027ffee8 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -1,29 +1,53 @@ -import { startingWave } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; -import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; -import type { EnemyPokemon } from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { PokeballType } from "#enums/pokeball"; import { pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import type { PokemonSpeciesFilter } from "#app/data/pokemon-species"; -import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { tmSpecies } from "#app/data/balance/tms"; -import { PokemonType } from "#enums/pokemon-type"; import { doubleBattleDialogue } from "#app/data/dialogue"; -import type { PersistentModifier } from "#app/modifier/modifier"; import { TrainerVariant } from "#app/field/trainer"; import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; -import { Moves } from "#enums/moves"; +import { Gender } from "#app/data/gender"; +import { signatureSpecies } from "../balance/signature-species"; +import { + getEvilGruntPartyTemplate, + getGymLeaderPartyTemplate, + getWavePartyTemplate, + TrainerPartyCompoundTemplate, + TrainerPartyTemplate, + trainerPartyTemplates, +} from "./TrainerPartyTemplate"; +import { evilAdminTrainerPools } from "./evil-admin-trainer-pools"; + +// Enum imports import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; -import { TrainerType } from "#enums/trainer-type"; -import { Gender } from "#app/data/gender"; -import { signatureSpecies } from "./balance/signature-species"; +import { PokeballType } from "#enums/pokeball"; +import { PokemonType } from "#enums/pokemon-type"; +import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; +import { TeraAIMode } from "#enums/tera-ai-mode"; +import { TrainerPoolTier } from "#enums/trainer-pool-tier"; +import { TrainerSlot } from "#enums/trainer-slot"; +import { TrainerType } from "#enums/trainer-type"; + +// Type imports +import type { PokemonSpeciesFilter } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import type { EvilTeam } from "./evil-admin-trainer-pools"; +import type { + PartyMemberFunc, + GenModifiersFunc, + GenAIFunc, + PartyTemplateFunc, + TrainerTierPools, + TrainerConfigs, + PartyMemberFuncs, +} from "./typedefs"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; @@ -31,253 +55,6 @@ const ELITE_FOUR_MINIMUM_BST = 460; /** The wave at which (non-Paldean) Gym Leaders start having Tera mons*/ const GYM_LEADER_TERA_WAVE = 100; -export enum TrainerPoolTier { - COMMON, - UNCOMMON, - RARE, - SUPER_RARE, - ULTRA_RARE, -} - -export interface TrainerTierPools { - [key: number]: Species[]; -} - -export enum TrainerSlot { - NONE, - TRAINER, - TRAINER_PARTNER, -} - -export class TrainerPartyTemplate { - public size: number; - public strength: PartyMemberStrength; - public sameSpecies: boolean; - public balanced: boolean; - - constructor(size: number, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { - this.size = size; - this.strength = strength; - this.sameSpecies = !!sameSpecies; - this.balanced = !!balanced; - } - - getStrength(_index: number): PartyMemberStrength { - return this.strength; - } - - isSameSpecies(_index: number): boolean { - return this.sameSpecies; - } - - isBalanced(_index: number): boolean { - return this.balanced; - } -} - -export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { - public templates: TrainerPartyTemplate[]; - - constructor(...templates: TrainerPartyTemplate[]) { - super( - templates.reduce((total: number, template: TrainerPartyTemplate) => { - total += template.size; - return total; - }, 0), - PartyMemberStrength.AVERAGE, - ); - this.templates = templates; - } - - getStrength(index: number): PartyMemberStrength { - let t = 0; - for (const template of this.templates) { - if (t + template.size > index) { - return template.getStrength(index - t); - } - t += template.size; - } - - return super.getStrength(index); - } - - isSameSpecies(index: number): boolean { - let t = 0; - for (const template of this.templates) { - if (t + template.size > index) { - return template.isSameSpecies(index - t); - } - t += template.size; - } - - return super.isSameSpecies(index); - } - - isBalanced(index: number): boolean { - let t = 0; - for (const template of this.templates) { - if (t + template.size > index) { - return template.isBalanced(index - t); - } - t += template.size; - } - - return super.isBalanced(index); - } -} - -export const trainerPartyTemplates = { - ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), - TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ), - TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ), - TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), - new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), - ), - TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ), - TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), - ), - TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), - THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), - THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), - THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), - THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true), - THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true), - FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER), - FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true), - FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK), - FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true), - FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true), - FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER), - FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK), - FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), - SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), - SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), - SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), - - GYM_LEADER_1: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - GYM_LEADER_2: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), - GYM_LEADER_3: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), - GYM_LEADER_4: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), - GYM_LEADER_5: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), - - ELITE_FOUR: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), - - CHAMPION: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(4, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(2, PartyMemberStrength.STRONGER, false, true), - ), - - RIVAL: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ), - RIVAL_2: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), - ), - RIVAL_3: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), - new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), - ), - RIVAL_4: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), - new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), - ), - RIVAL_5: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ), - RIVAL_6: new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - ), -}; - -type PartyTemplateFunc = () => TrainerPartyTemplate; -type PartyMemberFunc = (level: number, strength: PartyMemberStrength) => EnemyPokemon; -type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; -type GenAIFunc = (party: EnemyPokemon[]) => void; - -export interface PartyMemberFuncs { - [key: number]: PartyMemberFunc; -} - -export enum TeraAIMode { - NO_TERA, - INSTANT_TERA, - SMART_TERA, -} - /** * Stores data and helper functions about a trainers AI options. */ @@ -759,430 +536,6 @@ export class TrainerConfig { return this; } - /** - * Returns the pool of species for an evil team admin - * @param team - The evil team the admin belongs to. - * @returns {TrainerTierPools} - */ - speciesPoolPerEvilTeamAdmin(team): TrainerTierPools { - team = team.toLowerCase(); - switch (team) { - case "rocket": { - return { - [TrainerPoolTier.COMMON]: [ - Species.RATICATE, - Species.ARBOK, - Species.VILEPLUME, - Species.ARCANINE, - Species.GENGAR, - Species.HYPNO, - Species.ELECTRODE, - Species.EXEGGUTOR, - Species.CUBONE, - Species.KOFFING, - Species.GYARADOS, - Species.CROBAT, - Species.STEELIX, - Species.HOUNDOOM, - Species.HONCHKROW, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.OMASTAR, - Species.KABUTOPS, - Species.MAGNEZONE, - Species.ELECTIVIRE, - Species.MAGMORTAR, - Species.PORYGON_Z, - Species.ANNIHILAPE, - Species.ALOLA_SANDSLASH, - Species.ALOLA_PERSIAN, - Species.ALOLA_GOLEM, - Species.ALOLA_MUK, - Species.PALDEA_TAUROS, - ], - [TrainerPoolTier.RARE]: [Species.DRAGONITE, Species.TYRANITAR], - }; - } - case "magma": { - return { - [TrainerPoolTier.COMMON]: [ - Species.ARCANINE, - Species.MAGCARGO, - Species.HOUNDOOM, - Species.TORKOAL, - Species.SOLROCK, - Species.CLAYDOL, - Species.HIPPOWDON, - Species.MAGMORTAR, - Species.GLISCOR, - Species.COALOSSAL, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.AGGRON, - Species.FLYGON, - Species.CRADILY, - Species.ARMALDO, - Species.RHYPERIOR, - Species.TURTONATOR, - Species.SANDACONDA, - Species.TOEDSCRUEL, - Species.HISUI_ARCANINE, - ], - [TrainerPoolTier.RARE]: [Species.CHARCADET, Species.SCOVILLAIN], - }; - } - case "aqua": { - return { - [TrainerPoolTier.COMMON]: [ - Species.TENTACRUEL, - Species.LANTURN, - Species.AZUMARILL, - Species.QUAGSIRE, - Species.OCTILLERY, - Species.LUDICOLO, - Species.PELIPPER, - Species.WAILORD, - Species.WHISCASH, - Species.CRAWDAUNT, - Species.WALREIN, - Species.CLAMPERL, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.QUAGSIRE, - Species.MANTINE, - Species.KINGDRA, - Species.MILOTIC, - Species.DRAGALGE, - Species.DHELMISE, - Species.BARRASKEWDA, - Species.GRAPPLOCT, - Species.OVERQWIL, - ], - [TrainerPoolTier.RARE]: [Species.BASCULEGION, Species.DONDOZO], - }; - } - case "galactic": { - return { - [TrainerPoolTier.COMMON]: [ - Species.ELECTRODE, - Species.GYARADOS, - Species.CROBAT, - Species.HONCHKROW, - Species.BRONZONG, - Species.DRAPION, - Species.LICKILICKY, - Species.TANGROWTH, - Species.ELECTIVIRE, - Species.MAGMORTAR, - Species.YANMEGA, - Species.MAMOSWINE, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.ALAKAZAM, - Species.WEAVILE, - Species.GLISCOR, - Species.DUSKNOIR, - Species.ROTOM, - Species.OVERQWIL, - Species.HISUI_ARCANINE, - Species.HISUI_ELECTRODE, - ], - [TrainerPoolTier.RARE]: [Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT], - }; - } - case "plasma": { - return { - [TrainerPoolTier.COMMON]: [ - Species.GIGALITH, - Species.CONKELDURR, - Species.SEISMITOAD, - Species.KROOKODILE, - Species.DARMANITAN, - Species.COFAGRIGUS, - Species.VANILLUXE, - Species.AMOONGUSS, - Species.JELLICENT, - Species.GALVANTULA, - Species.FERROTHORN, - Species.BEARTIC, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.EXCADRILL, - Species.SIGILYPH, - Species.ZOROARK, - Species.KLINKLANG, - Species.EELEKTROSS, - Species.MIENSHAO, - Species.GOLURK, - Species.BISHARP, - Species.MANDIBUZZ, - Species.DURANT, - Species.GALAR_DARMANITAN, - ], - [TrainerPoolTier.RARE]: [Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY], - }; - } - case "plasma_2": { - return { - [TrainerPoolTier.COMMON]: [ - Species.MUK, - Species.ELECTRODE, - Species.BRONZONG, - Species.MAGNEZONE, - Species.PORYGON_Z, - Species.MUSHARNA, - Species.REUNICLUS, - Species.GALVANTULA, - Species.FERROTHORN, - Species.EELEKTROSS, - Species.BEHEEYEM, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.METAGROSS, - Species.ROTOM, - Species.CARRACOSTA, - Species.ARCHEOPS, - Species.GOLURK, - Species.DURANT, - Species.VIKAVOLT, - Species.ORBEETLE, - Species.REVAVROOM, - Species.ALOLA_MUK, - Species.HISUI_ELECTRODE, - ], - [TrainerPoolTier.RARE]: [Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON], - }; - } - case "flare": { - return { - [TrainerPoolTier.COMMON]: [ - Species.MANECTRIC, - Species.DRAPION, - Species.LIEPARD, - Species.AMOONGUSS, - Species.DIGGERSBY, - Species.TALONFLAME, - Species.PYROAR, - Species.PANGORO, - Species.MEOWSTIC, - Species.MALAMAR, - Species.CLAWITZER, - Species.HELIOLISK, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.HOUNDOOM, - Species.WEAVILE, - Species.CHANDELURE, - Species.AEGISLASH, - Species.BARBARACLE, - Species.DRAGALGE, - Species.GOODRA, - Species.TREVENANT, - Species.GOURGEIST, - ], - [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG], - }; - } - case "aether": { - return { - [TrainerPoolTier.COMMON]: [ - Species.ALAKAZAM, - Species.SLOWBRO, - Species.EXEGGUTOR, - Species.XATU, - Species.CLAYDOL, - Species.BEHEEYEM, - Species.ORANGURU, - Species.BRUXISH, - Species.ORBEETLE, - Species.FARIGIRAF, - Species.ALOLA_RAICHU, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.KIRLIA, - Species.MEDICHAM, - Species.METAGROSS, - Species.MALAMAR, - Species.HATTERENE, - Species.MR_RIME, - Species.GALAR_SLOWKING, - ], - [TrainerPoolTier.RARE]: [Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY], - }; - } - case "skull": { - return { - [TrainerPoolTier.COMMON]: [ - Species.NIDOQUEEN, - Species.GENGAR, - Species.KOFFING, - Species.CROBAT, - Species.ROSERADE, - Species.SKUNTANK, - Species.TOXICROAK, - Species.SCOLIPEDE, - Species.TOXAPEX, - Species.LURANTIS, - Species.ALOLA_MUK, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.DRAPION, - Species.MANDIBUZZ, - Species.OVERQWIL, - Species.GLIMMORA, - Species.CLODSIRE, - Species.GALAR_SLOWBRO, - ], - [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.SNEASLER], - }; - } - case "macro": { - return { - [TrainerPoolTier.COMMON]: [ - Species.NINETALES, - Species.BELLOSSOM, - Species.MILOTIC, - Species.FROSLASS, - Species.GOTHITELLE, - Species.JELLICENT, - Species.SALAZZLE, - Species.TSAREENA, - Species.POLTEAGEIST, - Species.HATTERENE, - Species.GALAR_RAPIDASH, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.TOGEKISS, - Species.MANDIBUZZ, - Species.TOXAPEX, - Species.APPLETUN, - Species.CURSOLA, - Species.ALOLA_NINETALES, - ], - [TrainerPoolTier.RARE]: [Species.TINKATON, Species.HISUI_LILLIGANT], - }; - } - case "star_1": { - return { - [TrainerPoolTier.COMMON]: [ - Species.SHIFTRY, - Species.CACTURNE, - Species.HONCHKROW, - Species.SKUNTANK, - Species.KROOKODILE, - Species.OBSTAGOON, - Species.LOKIX, - Species.MABOSSTIFF, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.UMBREON, - Species.CRAWDAUNT, - Species.WEAVILE, - Species.ZOROARK, - Species.MALAMAR, - Species.BOMBIRDIER, - ], - [TrainerPoolTier.RARE]: [Species.HYDREIGON, Species.MEOWSCARADA], - }; - } - case "star_2": { - return { - [TrainerPoolTier.COMMON]: [ - Species.ARCANINE, - Species.HOUNDOOM, - Species.CAMERUPT, - Species.CHANDELURE, - Species.TALONFLAME, - Species.PYROAR, - Species.COALOSSAL, - Species.SCOVILLAIN, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.RAPIDASH, - Species.FLAREON, - Species.TORKOAL, - Species.MAGMORTAR, - Species.SALAZZLE, - Species.TURTONATOR, - ], - [TrainerPoolTier.RARE]: [Species.VOLCARONA, Species.SKELEDIRGE], - }; - } - case "star_3": { - return { - [TrainerPoolTier.COMMON]: [ - Species.MUK, - Species.CROBAT, - Species.SKUNTANK, - Species.AMOONGUSS, - Species.TOXAPEX, - Species.TOXTRICITY, - Species.GRAFAIAI, - Species.CLODSIRE, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.GENGAR, - Species.SEVIPER, - Species.DRAGALGE, - Species.OVERQWIL, - Species.ALOLA_MUK, - Species.GALAR_SLOWBRO, - ], - [TrainerPoolTier.RARE]: [Species.GLIMMORA, Species.VENUSAUR], - }; - } - case "star_4": { - return { - [TrainerPoolTier.COMMON]: [ - Species.CLEFABLE, - Species.WIGGLYTUFF, - Species.AZUMARILL, - Species.WHIMSICOTT, - Species.FLORGES, - Species.HATTERENE, - Species.GRIMMSNARL, - Species.TINKATON, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.TOGEKISS, - Species.GARDEVOIR, - Species.SYLVEON, - Species.KLEFKI, - Species.MIMIKYU, - Species.ALOLA_NINETALES, - ], - [TrainerPoolTier.RARE]: [Species.GALAR_RAPIDASH, Species.PRIMARINA], - }; - } - case "star_5": { - return { - [TrainerPoolTier.COMMON]: [ - Species.BRELOOM, - Species.HARIYAMA, - Species.MEDICHAM, - Species.TOXICROAK, - Species.SCRAFTY, - Species.MIENSHAO, - Species.PAWMOT, - Species.PALDEA_TAUROS, - ], - [TrainerPoolTier.UNCOMMON]: [ - Species.LUCARIO, - Species.CONKELDURR, - Species.HAWLUCHA, - Species.PASSIMIAN, - Species.FALINKS, - Species.FLAMIGO, - ], - [TrainerPoolTier.RARE]: [Species.KOMMO_O, Species.QUAQUAVAL], - }; - } - } - - console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`); - return []; - } - /** * Initializes the trainer configuration for an evil team admin. * @param title The title of the evil team admin. @@ -1193,7 +546,7 @@ export class TrainerConfig { * **/ initForEvilTeamAdmin( title: string, - poolName: string, + poolName: EvilTeam, signatureSpecies: (Species | Species[])[], specialtyType?: PokemonType, ): TrainerConfig { @@ -1208,7 +561,7 @@ export class TrainerConfig { this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); // Set the species pools for the evil team admin. - this.speciesPools = this.speciesPoolPerEvilTeamAdmin(poolName); + this.speciesPools = evilAdminTrainerPools[poolName]; signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { @@ -1637,56 +990,6 @@ export class TrainerConfig { let t = 0; -interface TrainerConfigs { - [key: number]: TrainerConfig; -} - -/** - * The function to get variable strength grunts - * @returns the correct TrainerPartyTemplate - */ -function getEvilGruntPartyTemplate(): TrainerPartyTemplate { - const waveIndex = globalScene.currentBattle?.waveIndex; - if (waveIndex < 40) { - return trainerPartyTemplates.TWO_AVG; - } - if (waveIndex < 63) { - return trainerPartyTemplates.THREE_AVG; - } - if (waveIndex < 65) { - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - } - if (waveIndex < 112) { - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger -} - -function getWavePartyTemplate(...templates: TrainerPartyTemplate[]) { - return templates[ - Math.min( - Math.max( - Math.ceil( - (globalScene.gameMode.getWaveForDifficulty(globalScene.currentBattle?.waveIndex || startingWave, true) - 20) / - 30, - ), - 0, - ), - templates.length - 1, - ) - ]; -} - -function getGymLeaderPartyTemplate() { - return getWavePartyTemplate( - trainerPartyTemplates.GYM_LEADER_1, - trainerPartyTemplates.GYM_LEADER_2, - trainerPartyTemplates.GYM_LEADER_3, - trainerPartyTemplates.GYM_LEADER_4, - trainerPartyTemplates.GYM_LEADER_5, - ); -} - /** * Randomly selects one of the `Species` from `speciesPool`, determines its evolution, level, and strength. * Then adds Pokemon to globalScene. @@ -2878,7 +2181,7 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.ZINZOLIN]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]) + .initForEvilTeamAdmin("plasma_sage", "plasma_zinzolin", [Species.CRYOGONAL]) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_plasma_grunt") @@ -2886,7 +2189,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COLRESS]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("plasma_boss", "plasma_2", [Species.KLINKLANG]) + .initForEvilTeamAdmin("plasma_boss", "plasma_colress", [Species.KLINKLANG]) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_colress") .setMixedBattleBgm("battle_colress") @@ -3105,7 +2408,7 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.OLEANA]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]) + .initForEvilTeamAdmin("macro_admin", "macro_cosmos", [Species.GARBODOR]) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_oleana") @@ -3172,7 +2475,7 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.GIACOMO]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("star_admin", "star_1", [Species.KINGAMBIT], PokemonType.DARK) + .initForEvilTeamAdmin("star_admin", "star_dark", [Species.KINGAMBIT], PokemonType.DARK) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_star_admin") @@ -3192,7 +2495,7 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.MELA]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("star_admin", "star_2", [Species.ARMAROUGE], PokemonType.FIRE) + .initForEvilTeamAdmin("star_admin", "star_fire", [Species.ARMAROUGE], PokemonType.FIRE) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_star_admin") @@ -3212,7 +2515,7 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ATTICUS]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("star_admin", "star_3", [Species.REVAVROOM], PokemonType.POISON) + .initForEvilTeamAdmin("star_admin", "star_poison", [Species.REVAVROOM], PokemonType.POISON) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_star_admin") @@ -3232,7 +2535,7 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ORTEGA]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("star_admin", "star_4", [Species.DACHSBUN], PokemonType.FAIRY) + .initForEvilTeamAdmin("star_admin", "star_fairy", [Species.DACHSBUN], PokemonType.FAIRY) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_star_admin") @@ -3252,7 +2555,7 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ERI]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) - .initForEvilTeamAdmin("star_admin", "star_5", [Species.ANNIHILAPE], PokemonType.FIGHTING) + .initForEvilTeamAdmin("star_admin", "star_fighting", [Species.ANNIHILAPE], PokemonType.FIGHTING) .setEncounterBgm(TrainerType.PLASMA_GRUNT) .setBattleBgm("battle_plasma_grunt") .setMixedBattleBgm("battle_star_admin") diff --git a/src/data/trainers/typedefs.ts b/src/data/trainers/typedefs.ts new file mode 100644 index 00000000000..c6d286e961e --- /dev/null +++ b/src/data/trainers/typedefs.ts @@ -0,0 +1,22 @@ +import type { EnemyPokemon } from "#app/field/pokemon"; +import type { PersistentModifier } from "#app/modifier/modifier"; +import type { PartyMemberStrength } from "#enums/party-member-strength"; +import type { Species } from "#enums/species"; +import type { TrainerConfig } from "./trainer-config"; +import type { TrainerPartyTemplate } from "./TrainerPartyTemplate"; + +export type PartyTemplateFunc = () => TrainerPartyTemplate; +export type PartyMemberFunc = (level: number, strength: PartyMemberStrength) => EnemyPokemon; +export type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; +export type GenAIFunc = (party: EnemyPokemon[]) => void; + +export interface TrainerTierPools { + [key: number]: Species[]; +} +export interface TrainerConfigs { + [key: number]: TrainerConfig; +} + +export interface PartyMemberFuncs { + [key: number]: PartyMemberFunc; +} diff --git a/src/enums/tera-ai-mode.ts b/src/enums/tera-ai-mode.ts new file mode 100644 index 00000000000..35d4e4f3420 --- /dev/null +++ b/src/enums/tera-ai-mode.ts @@ -0,0 +1,5 @@ +export enum TeraAIMode { + NO_TERA, + INSTANT_TERA, + SMART_TERA +} diff --git a/src/enums/trainer-pool-tier.ts b/src/enums/trainer-pool-tier.ts new file mode 100644 index 00000000000..da6355d021b --- /dev/null +++ b/src/enums/trainer-pool-tier.ts @@ -0,0 +1,7 @@ +export enum TrainerPoolTier { + COMMON, + UNCOMMON, + RARE, + SUPER_RARE, + ULTRA_RARE +} diff --git a/src/enums/trainer-slot.ts b/src/enums/trainer-slot.ts new file mode 100644 index 00000000000..2dfa468f74c --- /dev/null +++ b/src/enums/trainer-slot.ts @@ -0,0 +1,5 @@ +export enum TrainerSlot { + NONE, + TRAINER, + TRAINER_PARTNER +} diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 51a5a10b010..aba13b2e51b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -225,7 +225,7 @@ import { SpeciesFormChangeStatusEffectTrigger, } from "#app/data/pokemon-forms"; import { TerrainType } from "#app/data/terrain"; -import type { TrainerSlot } from "#app/data/trainer-config"; +import type { TrainerSlot } from "#enums/trainer-slot"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 2af3e25050f..c52957eef75 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -2,15 +2,14 @@ import { globalScene } from "#app/global-scene"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import type { TrainerConfig, TrainerPartyTemplate } from "#app/data/trainer-config"; -import { - TrainerPartyCompoundTemplate, - TrainerPoolTier, - TrainerSlot, - trainerConfigs, - trainerPartyTemplates, - TeraAIMode, -} from "#app/data/trainer-config"; +import type { TrainerConfig } from "#app/data/trainers/trainer-config"; +import type { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; +import { trainerPartyTemplates } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyCompoundTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerSlot } from "#enums/trainer-slot"; +import { TrainerPoolTier } from "#enums/trainer-pool-tier"; +import { TeraAIMode } from "#enums/tera-ai-mode"; import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; import type { PersistentModifier } from "#app/modifier/modifier"; diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts index 3fc2b9c0467..72bcc85bc62 100644 --- a/src/phases/battle-phase.ts +++ b/src/phases/battle-phase.ts @@ -1,5 +1,5 @@ import { globalScene } from "#app/global-scene"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { Phase } from "#app/phase"; export class BattlePhase extends Phase { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 7afd4176788..ad2bf689e38 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -7,7 +7,7 @@ import { getCharVariantFromDialogue } from "#app/data/dialogue"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { doTrainerExclamation } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { getRandomWeatherType } from "#app/data/weather"; import { EncounterPhaseEvent } from "#app/events/battle-scene"; import type Pokemon from "#app/field/pokemon"; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index af948ad0632..2090592367d 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -5,7 +5,7 @@ import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { getCharVariantFromDialogue } from "#app/data/dialogue"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import type Pokemon from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BattlePhase } from "#app/phases/battle-phase"; diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 26012df191d..eb187617e69 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -22,7 +22,7 @@ import { globalScene } from "#app/global-scene"; import { getCharVariantFromDialogue } from "../data/dialogue"; import type { OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; import { transitionMysteryEncounterIntroVisuals } from "../data/mystery-encounters/utils/encounter-phase-utils"; -import { TrainerSlot } from "../data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { IvScannerModifier } from "../modifier/modifier"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts index 42463e7edb0..621c8c8c2a9 100644 --- a/src/phases/summon-phase.ts +++ b/src/phases/summon-phase.ts @@ -1,7 +1,7 @@ import { BattleType } from "#app/battle"; import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { PlayerGender } from "#app/enums/player-gender"; import { addPokeballOpenParticles } from "#app/field/anims"; import type Pokemon from "#app/field/pokemon"; diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index 48bcd0c4ebd..16868bf9bc0 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -3,7 +3,7 @@ import { applyPreSwitchOutAbAttrs, PostDamageForceSwitchAbAttr, PreSwitchOutAbAt import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; import { getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { SwitchEffectTransferModifier } from "#app/modifier/modifier"; diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts index fa3f553cdd6..23c2c86361c 100644 --- a/src/phases/trainer-message-test-phase.ts +++ b/src/phases/trainer-message-test-phase.ts @@ -1,5 +1,5 @@ import { globalScene } from "#app/global-scene"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import type { TrainerType } from "#app/enums/trainer-type"; import { BattlePhase } from "./battle-phase"; import { TestMessagePhase } from "./test-message-phase"; diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index 024c1e3f837..f7b2eb2bb66 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -7,7 +7,7 @@ import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; import { ModifierRewardPhase } from "./modifier-reward-phase"; import { MoneyRewardPhase } from "./money-reward-phase"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { globalScene } from "#app/global-scene"; import { Biome } from "#app/enums/biome"; import { achvs } from "#app/system/achv"; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 7845d50b2ad..3a098a55a56 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -17,7 +17,7 @@ import { Unlockables } from "#app/system/unlockables"; import { GameModes, getGameMode } from "#app/game-mode"; import { BattleType } from "#app/battle"; import TrainerData from "#app/system/trainer-data"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; import { resetSettings, setSetting, SettingKeys } from "#app/system/settings/settings"; import { achvs } from "#app/system/achv"; import EggData from "#app/system/egg-data"; diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 3fa07e8b085..a1d27394d9f 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -6,7 +6,7 @@ import type { PokeballType } from "#enums/pokeball"; import { getPokemonSpecies, getPokemonSpeciesForm } from "../data/pokemon-species"; import { Status } from "../data/status-effect"; import Pokemon, { EnemyPokemon, PokemonMove, PokemonSummonData } from "../field/pokemon"; -import { TrainerSlot } from "../data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import type { Variant } from "#app/data/variant"; import { loadBattlerTag } from "../data/battler-tags"; import type { Biome } from "#enums/biome"; diff --git a/src/system/voucher.ts b/src/system/voucher.ts index 39294bccf13..ce10560c3e2 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -3,7 +3,7 @@ import { AchvTier, achvs, getAchievementDescription } from "./achv"; import type { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; import type { ConditionFn } from "#app/@types/common"; -import { trainerConfigs } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainers/trainer-config"; export enum VoucherType { REGULAR, diff --git a/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts index dc55392f8bf..fb03f1c10a0 100644 --- a/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -1,6 +1,6 @@ import { allMoves } from "#app/data/moves/move"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { TrainerSlot } from "#app/data/trainer-config"; +import { TrainerSlot } from "#enums/trainer-slot"; import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; diff --git a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 8e825dc2c9b..f620cbd6c36 100644 --- a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -16,7 +16,9 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; -import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; +import { TrainerConfig } from "#app/data/trainers/trainer-config"; +import { TrainerPartyCompoundTemplate } from "#app/data/trainers/TrainerPartyTemplate"; +import { TrainerPartyTemplate } from "#app/data/trainers/TrainerPartyTemplate"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; From a727375730b2af8e76e357a4d45a7ef0b76538ed Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:51:28 -0700 Subject: [PATCH 45/48] [Bug] Fix Flash Fire has No Message (#5578) Add flash fire message --- src/data/battler-tags.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8981644d885..b139faaeb88 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2151,6 +2151,21 @@ export class TypeBoostTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); } + + override onAdd(pokemon: Pokemon): void { + globalScene.queueMessage( + i18next.t("abilityTriggers:typeImmunityPowerBoost", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.boostedType]}`), + }), + ); + } + + override onOverlap(pokemon: Pokemon): void { + globalScene.queueMessage( + i18next.t("abilityTriggers:moveImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), + ); + } } export class CritBoostTag extends BattlerTag { From 25b9fa793352d1d48213d572a0a344926b90d19a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 29 Mar 2025 03:24:23 -0700 Subject: [PATCH 46/48] [Biome] Add "no unused imports" rule (#5580) * Apply Biome to files * Add `lint/correctness/noUnusedImports` rule * Apply rule * Remove obsolete eslint directives * Fix variable naming in `game-speed.ts` --- biome.jsonc | 3 +- .../the-expert-pokemon-breeder-encounter.ts | 1 - .../mystery-encounters/mystery-encounters.ts | 1 - src/data/pokemon-species.ts | 2 +- src/data/splash-messages.ts | 15 +++---- src/phases/game-over-modifier-reward-phase.ts | 1 - src/phases/message-phase.ts | 2 +- src/phases/move-end-phase.ts | 1 - src/phases/post-summon-phase.ts | 1 - src/system/game-speed.ts | 8 ++-- src/system/pokemon-data.ts | 1 - src/system/settings/settings.ts | 2 +- src/ui/message-ui-handler.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 17 ++++---- src/ui/pokedex-ui-handler.ts | 2 +- src/ui/starter-select-ui-handler.ts | 4 +- src/ui/ui.ts | 2 +- test/abilities/desolate-land.test.ts | 6 +-- test/abilities/flower_gift.test.ts | 39 ++++++++++++------- test/abilities/neutralizing_gas.test.ts | 6 +-- test/abilities/victory_star.test.ts | 6 +-- test/abilities/wonder_skin.test.ts | 1 - test/data/splash_messages.test.ts | 2 +- test/items/reviver_seed.test.ts | 26 +++++-------- test/moves/endure.test.ts | 6 +-- test/moves/revival_blessing.test.ts | 8 +--- test/testUtils/gameWrapper.ts | 12 ++---- test/testUtils/helpers/overridesHelper.ts | 3 -- .../mocks/mocksContainer/mockRectangle.ts | 1 - test/vitest.setup.ts | 15 ------- 30 files changed, 79 insertions(+), 117 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 3ec4552d359..c5e1d713d86 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -50,7 +50,8 @@ "noUndeclaredVariables": "off", "noUnusedVariables": "error", "noSwitchDeclarations": "warn", // TODO: refactor and make this an error - "noVoidTypeReturn": "warn" // TODO: Refactor and make this an error + "noVoidTypeReturn": "warn", // TODO: Refactor and make this an error + "noUnusedImports": "error" }, "style": { "noVar": "error", diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 84dd5002e83..c189e341089 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -30,7 +30,6 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { modifierTypes } from "#app/modifier/modifier-type"; import { PokemonType } from "#enums/pokemon-type"; import { getPokeballTintColor } from "#app/data/pokeball"; -import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/theExpertPokemonBreeder"; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 354f69d0ca3..5dd952b2bce 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -332,7 +332,6 @@ export function initMysteryEncounters() { }); // Add ANY biome encounters to biome map - // eslint-disable-next-line let _encounterBiomeTableLog = ""; mysteryEncountersByBiome.forEach((biomeEncounters, biome) => { anyBiomeEncounters.forEach(encounter => { diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index eca7d65ac6a..15c60d28969 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -7,7 +7,7 @@ import i18next from "i18next"; import type { AnySound } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import type { GameMode } from "#app/game-mode"; -import { DexAttr, DexEntry, type StarterMoveset } from "#app/system/game-data"; +import { DexAttr, type StarterMoveset } from "#app/system/game-data"; import * as Utils from "#app/utils"; import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index de14e913664..3223bbb019e 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -214,7 +214,7 @@ const commonSplashMessages = [ "bornToBeAWinner", "onARollout", "itsAlwaysNightDeepInTheAbyss", - "folksThisIsInsane" + "folksThisIsInsane", ]; //#region Seasonal Messages @@ -224,10 +224,7 @@ const seasonalSplashMessages: Season[] = [ name: "New Year's", start: "01-01", end: "01-15", - messages: [ - "newYears.happyNewYear", - "newYears.andAHappyNewYear" - ], + messages: ["newYears.happyNewYear", "newYears.andAHappyNewYear"], }, { name: "Valentines", @@ -239,7 +236,7 @@ const seasonalSplashMessages: Season[] = [ "valentines.applinForYou", "valentines.thePowerOfLoveIsThreeThirtyBST", "valentines.haveAHeartScale", - "valentines.i<3You" + "valentines.i<3You", ], }, { @@ -279,7 +276,7 @@ const seasonalSplashMessages: Season[] = [ "aprilFools.nowWithQuickTimeEncounters", "aprilFools.timeYourInputsForHigherCatchrate", "aprilFools.certifiedButtonSimulator", - "aprilFools.iHopeYouGetSuckerPunched" + "aprilFools.iHopeYouGetSuckerPunched", ], }, { @@ -293,7 +290,7 @@ const seasonalSplashMessages: Season[] = [ "halloween.mayContainSpiders", "halloween.spookyScarySkeledirge", "halloween.gourgeistUsedTrickOrTreat", - "halloween.letsSnuggleForever" + "halloween.letsSnuggleForever", ], }, { @@ -316,7 +313,7 @@ const seasonalSplashMessages: Season[] = [ "winterHoliday.tisTheSeasonToBeSpeSpa", "winterHoliday.deckTheHalls", "winterHoliday.saveScummingGetsYouOnTheNaughtyList", - "winterHoliday.badTrainersGetRolycoly" + "winterHoliday.badTrainersGetRolycoly", ], }, ]; diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index f3f2aebd67d..d0a39a4031a 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -1,5 +1,4 @@ import { globalScene } from "#app/global-scene"; -import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index 2a5bcf6b99c..cff7249fcfa 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -29,7 +29,7 @@ export class MessagePhase extends Phase { if (this.text.indexOf("$") > -1) { const pokename: string[] = []; - const repname = [ "#POKEMON1", "#POKEMON2" ]; + const repname = ["#POKEMON1", "#POKEMON2"]; for (let p = 0; p < globalScene.getPlayerField().length; p++) { pokename.push(globalScene.getPlayerField()[p].getNameToRender()); this.text = this.text.split(pokename[p]).join(repname[p]); diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts index 4716370cc4e..46e266a32b7 100644 --- a/src/phases/move-end-phase.ts +++ b/src/phases/move-end-phase.ts @@ -1,5 +1,4 @@ import { globalScene } from "#app/global-scene"; -import type { BattlerIndex } from "#app/battle"; import { BattlerTagLapseType } from "#app/data/battler-tags"; import { PokemonPhase } from "./pokemon-phase"; diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index a7aa9389505..45b0a0f65ce 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -1,5 +1,4 @@ import { globalScene } from "#app/global-scene"; -import type { BattlerIndex } from "#app/battle"; import { applyAbAttrs, applyPostSummonAbAttrs, CommanderAbAttr, PostSummonAbAttr } from "#app/data/ability"; import { ArenaTrapTag } from "#app/data/arena-tag"; import { StatusEffect } from "#app/enums/status-effect"; diff --git a/src/system/game-speed.ts b/src/system/game-speed.ts index e2156c03728..d9c48664f80 100644 --- a/src/system/game-speed.ts +++ b/src/system/game-speed.ts @@ -5,8 +5,8 @@ import type BattleScene from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; -type FadeIn = typeof FadeIn; -type FadeOut = typeof FadeOut; +type FadeInType = typeof FadeIn; +type FadeOutType = typeof FadeOut; export function initGameSpeed() { const thisArg = this as BattleScene; @@ -101,7 +101,7 @@ export function initGameSpeed() { const originalFadeOut = SoundFade.fadeOut; SoundFade.fadeOut = ((_scene: Phaser.Scene, sound: Phaser.Sound.BaseSound, duration: number, destroy?: boolean) => - originalFadeOut(globalScene, sound, transformValue(duration), destroy)) as FadeOut; + originalFadeOut(globalScene, sound, transformValue(duration), destroy)) as FadeOutType; const originalFadeIn = SoundFade.fadeIn; SoundFade.fadeIn = (( @@ -110,5 +110,5 @@ export function initGameSpeed() { duration: number, endVolume?: number, startVolume?: number, - ) => originalFadeIn(globalScene, sound, transformValue(duration), endVolume, startVolume)) as FadeIn; + ) => originalFadeIn(globalScene, sound, transformValue(duration), endVolume, startVolume)) as FadeInType; } diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index a1d27394d9f..957d43797a1 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -14,7 +14,6 @@ import { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import type { PokemonType } from "#enums/pokemon-type"; -import { getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; export default class PokemonData { public id: number; diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index b2b1d3eb298..2db72dfecda 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -950,7 +950,7 @@ export function setSetting(setting: string, value: number): boolean { }, { label: "Català", - handler: () => changeLocaleHandler("ca-ES") + handler: () => changeLocaleHandler("ca-ES"), }, { label: i18next.t("settings:back"), diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 230b951de59..e927793e0ab 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -77,7 +77,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const actionPattern = /@(c|d|s|f)\{(.*?)\}/; let actionMatch: RegExpExecArray | null; const pokename: string[] = []; - const repname = [ "#POKEMON1", "#POKEMON2" ]; + const repname = ["#POKEMON1", "#POKEMON2"]; for (let p = 0; p < globalScene.getPlayerField().length; p++) { pokename.push(globalScene.getPlayerField()[p].getNameToRender()); text = text.split(pokename[p]).join(repname[p]); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index b359c188e0c..24812f62044 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -1150,15 +1150,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.blockInput = false; } else { - ui.revertMode() - .then(() => { - console.log("exitCallback", this.exitCallback); - if (this.exitCallback instanceof Function) { - const exitCallback = this.exitCallback; - this.exitCallback = null; - exitCallback(); - } - }); + ui.revertMode().then(() => { + console.log("exitCallback", this.exitCallback); + if (this.exitCallback instanceof Function) { + const exitCallback = this.exitCallback; + this.exitCallback = null; + exitCallback(); + } + }); success = true; } } else { diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index a98415f72d2..230b1bcb42b 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -12,7 +12,7 @@ import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUN import { catchableSpecies } from "#app/data/balance/biomes"; import { PokemonType } from "#enums/pokemon-type"; import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; -import { AbilityAttr, DexAttr, loadStarterPreferences, saveStarterPreferences } from "#app/system/game-data"; +import { AbilityAttr, DexAttr, loadStarterPreferences } from "#app/system/game-data"; import MessageUiHandler from "#app/ui/message-ui-handler"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "#app/ui/text"; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 1599c86aa87..c1e2b2ac568 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,6 +1,6 @@ import type { CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; import { BattleSceneEventType } from "#app/events/battle-scene"; -import { pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import type { Variant } from "#app/data/variant"; import { getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; @@ -19,7 +19,7 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 026e42ccf46..6605e5ef730 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -329,7 +329,7 @@ export default class UI extends Phaser.GameObjects.Container { promptDelay?: number | null, ): void { const pokename: string[] = []; - const repname = [ "#POKEMON1", "#POKEMON2" ]; + const repname = ["#POKEMON1", "#POKEMON2"]; for (let p = 0; p < globalScene.getPlayerField().length; p++) { pokename.push(globalScene.getPlayerField()[p].getNameToRender()); text = text.split(pokename[p]).join(repname[p]); diff --git a/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts index 405aab873aa..bb0b152418d 100644 --- a/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -135,10 +135,8 @@ describe("Abilities - Desolate Land", () => { }); it("should lift after fleeing from a wild pokemon", async () => { - game.override - .enemyAbility(Abilities.DESOLATE_LAND) - .ability(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyAbility(Abilities.DESOLATE_LAND).ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([Species.MAGIKARP]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); vi.spyOn(game.scene.getPlayerPokemon()!, "randSeedInt").mockReturnValue(0); diff --git a/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts index 1104a3c111f..5c3fd246b7a 100644 --- a/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -40,17 +40,23 @@ describe("Abilities - Flower Gift", () => { * * @returns Two numbers, the first being the damage done to the target without flower gift active, the second being the damage done with flower gift active */ - const testDamageDealt = async (game: GameManager, move: Moves, allyAttacker: boolean, allyAbility = Abilities.BALL_FETCH, enemyAbility = Abilities.BALL_FETCH): Promise<[number, number]> => { + const testDamageDealt = async ( + game: GameManager, + move: Moves, + allyAttacker: boolean, + allyAbility = Abilities.BALL_FETCH, + enemyAbility = Abilities.BALL_FETCH, + ): Promise<[number, number]> => { game.override.battleType("double"); - game.override.moveset([ Moves.SPLASH, Moves.SUNNY_DAY, move, Moves.HEAL_PULSE ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.HEAL_PULSE ]); + game.override.moveset([Moves.SPLASH, Moves.SUNNY_DAY, move, Moves.HEAL_PULSE]); + game.override.enemyMoveset([Moves.SPLASH, Moves.HEAL_PULSE]); const target_index = allyAttacker ? BattlerIndex.ENEMY : BattlerIndex.PLAYER_2; const attacker_index = allyAttacker ? BattlerIndex.PLAYER_2 : BattlerIndex.ENEMY; const ally_move = allyAttacker ? move : Moves.SPLASH; const enemy_move = allyAttacker ? Moves.SPLASH : move; const ally_target = allyAttacker ? BattlerIndex.ENEMY : null; - await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); const target = allyAttacker ? game.scene.getEnemyField()[0] : game.scene.getPlayerField()[1]; const initialHp = target.getMaxHp(); @@ -64,7 +70,7 @@ describe("Abilities - Flower Gift", () => { await game.forceEnemyMove(enemy_move, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); // Ensure sunny day is used last. - await game.setTurnOrder([ attacker_index, target_index, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]); + await game.setTurnOrder([attacker_index, target_index, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(TurnEndPhase); const damageWithoutGift = initialHp - target.hp; @@ -75,14 +81,13 @@ describe("Abilities - Flower Gift", () => { game.move.select(ally_move, 1, ally_target); await game.forceEnemyMove(enemy_move, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, target_index, attacker_index ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, target_index, attacker_index]); await game.phaseInterceptor.to(TurnEndPhase); const damageWithGift = initialHp - target.hp; - return [ damageWithoutGift, damageWithGift ]; + return [damageWithoutGift, damageWithGift]; }; - beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -129,22 +134,28 @@ describe("Abilities - Flower Gift", () => { }); it("should not increase the damage of an ally using an ability ignoring move", async () => { - const [ damageWithGift, damageWithoutGift ] = await testDamageDealt(game, Moves.SUNSTEEL_STRIKE, true); + const [damageWithGift, damageWithoutGift] = await testDamageDealt(game, Moves.SUNSTEEL_STRIKE, true); expect(damageWithGift).toBe(damageWithoutGift); }); it("should not increase the damage of a mold breaker ally", async () => { - const [ damageWithGift, damageWithoutGift ] = await testDamageDealt(game, Moves.TACKLE, true, Abilities.MOLD_BREAKER); + const [damageWithGift, damageWithoutGift] = await testDamageDealt(game, Moves.TACKLE, true, Abilities.MOLD_BREAKER); expect(damageWithGift).toBe(damageWithoutGift); }); it("should decrease the damage an ally takes from a special attack", async () => { - const [ damageWithoutGift, damageWithGift ] = await testDamageDealt(game, Moves.MUD_SLAP, false); + const [damageWithoutGift, damageWithGift] = await testDamageDealt(game, Moves.MUD_SLAP, false); expect(damageWithGift).toBeLessThan(damageWithoutGift); }); - it("should not decrease the damage an ally takes from a mold breaker enemy using a special attack", async () => { - const [ damageWithoutGift, damageWithGift ] = await testDamageDealt(game, Moves.MUD_SLAP, false, Abilities.BALL_FETCH, Abilities.MOLD_BREAKER); + it("should not decrease the damage an ally takes from a mold breaker enemy using a special attack", async () => { + const [damageWithoutGift, damageWithGift] = await testDamageDealt( + game, + Moves.MUD_SLAP, + false, + Abilities.BALL_FETCH, + Abilities.MOLD_BREAKER, + ); expect(damageWithGift).toBe(damageWithoutGift); }); @@ -168,7 +179,7 @@ describe("Abilities - Flower Gift", () => { it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => { game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN); - game.override.moveset([ Moves.SKILL_SWAP ]); + game.override.moveset([Moves.SKILL_SWAP]); await game.classicMode.startBattle([Species.CHERRIM]); diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index aa5a48d5e4e..a10a246d855 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -160,10 +160,8 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should deactivate after fleeing from a wild pokemon", async () => { - game.override - .enemyAbility(Abilities.NEUTRALIZING_GAS) - .ability(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyAbility(Abilities.NEUTRALIZING_GAS).ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([Species.MAGIKARP]); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); vi.spyOn(game.scene.getPlayerPokemon()!, "randSeedInt").mockReturnValue(0); diff --git a/test/abilities/victory_star.test.ts b/test/abilities/victory_star.test.ts index 456f8cd7ddd..92db522871a 100644 --- a/test/abilities/victory_star.test.ts +++ b/test/abilities/victory_star.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Victory Star", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.SPLASH ]) + .moveset([Moves.TACKLE, Moves.SPLASH]) .battleType("double") .disableCrits() .enemySpecies(Species.MAGIKARP) @@ -33,7 +33,7 @@ describe("Abilities - Victory Star", () => { }); it("should increase the accuracy of its user", async () => { - await game.classicMode.startBattle([ Species.VICTINI, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.VICTINI, Species.MAGIKARP]); const user = game.scene.getPlayerField()[0]; @@ -46,7 +46,7 @@ describe("Abilities - Victory Star", () => { }); it("should increase the accuracy of its user's ally", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.VICTINI ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.VICTINI]); const ally = game.scene.getPlayerField()[0]; vi.spyOn(ally, "getAccuracyMultiplier"); diff --git a/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts index db746831753..18d5be36aef 100644 --- a/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -1,4 +1,3 @@ -import { allAbilities } from "#app/data/ability"; import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; diff --git a/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts index bd29a17339a..773b2715825 100644 --- a/test/data/splash_messages.test.ts +++ b/test/data/splash_messages.test.ts @@ -9,7 +9,7 @@ describe("Data - Splash Messages", () => { // Make sure to adjust this test if the weight is changed! it("should add contain 15 `battlesWon` splash messages", () => { - const battlesWonMessages = getSplashMessages().filter((message) => message === "splashMessages:battlesWon"); + const battlesWonMessages = getSplashMessages().filter(message => message === "splashMessages:battlesWon"); expect(battlesWonMessages).toHaveLength(15); }); diff --git a/test/items/reviver_seed.test.ts b/test/items/reviver_seed.test.ts index ab249d48a23..c06f354a94a 100644 --- a/test/items/reviver_seed.test.ts +++ b/test/items/reviver_seed.test.ts @@ -26,7 +26,7 @@ describe("Items - Reviver Seed", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.TACKLE, Moves.ENDURE ]) + .moveset([Moves.SPLASH, Moves.TACKLE, Moves.ENDURE]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -47,13 +47,10 @@ describe("Items - Reviver Seed", () => { { moveType: "Fixed Damage Move", move: Moves.SEISMIC_TOSS }, { moveType: "Final Gambit", move: Moves.FINAL_GAMBIT }, { moveType: "Counter", move: Moves.COUNTER }, - { moveType: "OHKO", move: Moves.SHEER_COLD } + { moveType: "OHKO", move: Moves.SHEER_COLD }, ])("should activate the holder's reviver seed from a $moveType", async ({ move }) => { - game.override - .enemyLevel(100) - .startingLevel(1) - .enemyMoveset(move); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + game.override.enemyLevel(100).startingLevel(1).enemyMoveset(move); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.hp - 1); @@ -67,11 +64,8 @@ describe("Items - Reviver Seed", () => { }); it("should activate the holder's reviver seed from confusion self-hit", async () => { - game.override - .enemyLevel(1) - .startingLevel(100) - .enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + game.override.enemyLevel(1).startingLevel(100).enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.hp - 1); player.addTag(BattlerTagType.CONFUSED, 3); @@ -100,7 +94,7 @@ describe("Items - Reviver Seed", () => { .enemySpecies(Species.MAGIKARP) .moveset(move) .enemyMoveset(Moves.ENDURE); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; enemy.damageAndUpdate(enemy.hp - 1); @@ -124,7 +118,7 @@ describe("Items - Reviver Seed", () => { .moveset(move) .enemyAbility(Abilities.LIQUID_OOZE) .enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.GASTLY, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.GASTLY, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.hp - 1); @@ -145,13 +139,13 @@ describe("Items - Reviver Seed", () => { .moveset(Moves.DESTINY_BOND) .startingHeldItems([]) // reset held items to nothing so user doesn't revive and not trigger Destiny Bond .enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.hp - 1); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.DESTINY_BOND); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.isFainted()).toBeTruthy(); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts index d706d5d9581..8fbb2272ece 100644 --- a/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -22,7 +22,7 @@ describe("Moves - Endure", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC, Moves.SHEER_COLD ]) + .moveset([Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC, Moves.SHEER_COLD]) .ability(Abilities.SKILL_LINK) .startingLevel(100) .battleType("single") @@ -51,7 +51,7 @@ describe("Moves - Endure", () => { }); it("should let the pokemon survive against OHKO moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.SHEER_COLD); @@ -74,7 +74,7 @@ describe("Moves - Endure", () => { .enemySpecies(Species.MAGIKARP) .moveset(move) .enemyMoveset(Moves.ENDURE); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; enemy.damageAndUpdate(enemy.hp - 1); diff --git a/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts index 1ceb850edea..87be20f60ad 100644 --- a/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -116,12 +116,8 @@ describe("Moves - Revival Blessing", () => { }); it("should not summon multiple pokemon to the same slot when reviving the enemy ally in doubles", async () => { - game.override - .battleType("double") - .enemyMoveset([ Moves.REVIVAL_BLESSING ]) - .moveset([ Moves.SPLASH ]) - .startingWave(25); // 2nd rival battle - must have 3+ pokemon - await game.classicMode.startBattle([ Species.ARCEUS, Species.GIRATINA ]); + game.override.battleType("double").enemyMoveset([Moves.REVIVAL_BLESSING]).moveset([Moves.SPLASH]).startingWave(25); // 2nd rival battle - must have 3+ pokemon + await game.classicMode.startBattle([Species.ARCEUS, Species.GIRATINA]); const enemyFainting = game.scene.getEnemyField()[0]; diff --git a/test/testUtils/gameWrapper.ts b/test/testUtils/gameWrapper.ts index 28c7c4af80f..388861e01c4 100644 --- a/test/testUtils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -1,31 +1,25 @@ -/* eslint-disable */ -// @ts-nocheck +// @ts-nocheck - TODO: remove this import BattleScene, * as battleScene from "#app/battle-scene"; import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; import { blobToString } from "#test/testUtils/gameManagerUtils"; import { MockClock } from "#test/testUtils/mocks/mockClock"; -import { MockConsoleLog } from "#test/testUtils/mocks/mockConsoleLog"; import { MockFetch } from "#test/testUtils/mocks/mockFetch"; import MockLoader from "#test/testUtils/mocks/mockLoader"; -import { mockLocalStorage } from "#test/testUtils/mocks/mockLocalStorage"; -import { MockImage } from "#test/testUtils/mocks/mocksContainer/mockImage"; import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import fs from "node:fs"; import Phaser from "phaser"; -import InputText from "phaser3-rex-plugins/plugins/inputtext"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { vi } from "vitest"; +import { version } from "../../package.json"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; +import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; import InputManager = Phaser.Input.InputManager; import KeyboardManager = Phaser.Input.Keyboard.KeyboardManager; import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import { version } from "../../package.json"; -import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { diff --git a/test/testUtils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts index 2d56ae35fce..9bb0369a31a 100644 --- a/test/testUtils/helpers/overridesHelper.ts +++ b/test/testUtils/helpers/overridesHelper.ts @@ -1,9 +1,6 @@ import type { Variant } from "#app/data/variant"; import { Weather } from "#app/data/weather"; import { Abilities } from "#app/enums/abilities"; -import * as GameMode from "#app/game-mode"; -import type { GameModes } from "#app/game-mode"; -import { getGameMode } from "#app/game-mode"; import type { ModifierOverride } from "#app/modifier/modifier-type"; import type { BattleStyle } from "#app/overrides"; import Overrides, { defaultOverrides } from "#app/overrides"; diff --git a/test/testUtils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts index 854baed5915..7bdf343759d 100644 --- a/test/testUtils/mocks/mocksContainer/mockRectangle.ts +++ b/test/testUtils/mocks/mocksContainer/mockRectangle.ts @@ -1,4 +1,3 @@ -import { off } from "process"; import type { MockGameObject } from "../mockGameObject"; export default class MockRectangle implements MockGameObject { diff --git a/test/vitest.setup.ts b/test/vitest.setup.ts index b9da0850306..93b439e540f 100644 --- a/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -1,17 +1,4 @@ import "vitest-canvas-mock"; - -import { initLoggedInUser } from "#app/account"; -import { initAbilities } from "#app/data/ability"; -import { initBiomes } from "#app/data/balance/biomes"; -import { initEggMoves } from "#app/data/balance/egg-moves"; -import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { initMoves } from "#app/data/moves/move"; -import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; -import { initPokemonForms } from "#app/data/pokemon-forms"; -import { initSpecies } from "#app/data/pokemon-species"; -import { initAchievements } from "#app/system/achv"; -import { initVouchers } from "#app/system/voucher"; -import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { afterAll, beforeAll, vi } from "vitest"; import { initTestFile } from "./testUtils/testFileInitialization"; @@ -20,13 +7,11 @@ import { initTestFile } from "./testUtils/testFileInitialization"; /** Mock the override import to always return default values, ignoring any custom overrides. */ vi.mock("#app/overrides", async importOriginal => { - // eslint-disable-next-line @typescript-eslint/consistent-type-imports const { defaultOverrides } = await importOriginal(); return { default: defaultOverrides, defaultOverrides, - // eslint-disable-next-line @typescript-eslint/consistent-type-imports } satisfies typeof import("#app/overrides"); }); From 4f19e4a1269052698a0a2a1ab0a4b46e201bf388 Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 29 Mar 2025 13:10:07 -0400 Subject: [PATCH 47/48] [Move] False Swipe/Hold Back don't fail if the target has 1 HP (#5577) * Remove condition from `SurviveDamageAttr` * Add test for False Swipe --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: EmberCM --- src/data/moves/move.ts | 4 --- test/moves/false_swipe.test.ts | 53 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 test/moves/false_swipe.test.ts diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index e18e898bc68..2f935b7cc16 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -1580,10 +1580,6 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { return Math.min(damage, target.hp - 1); } - getCondition(): MoveConditionFunc { - return (user, target, move) => target.hp > 1; - } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return target.hp > 1 ? 0 : -20; } diff --git a/test/moves/false_swipe.test.ts b/test/moves/false_swipe.test.ts new file mode 100644 index 00000000000..4fb5b81ef67 --- /dev/null +++ b/test/moves/false_swipe.test.ts @@ -0,0 +1,53 @@ +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - False Swipe", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.FALSE_SWIPE]) + .ability(Abilities.BALL_FETCH) + .startingLevel(1000) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should reduce the target to 1 HP", async () => { + await game.classicMode.startBattle([Species.MILOTIC]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + game.move.select(Moves.FALSE_SWIPE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.hp).toBe(1); + const falseSwipeHistory = player + .getMoveHistory() + .every(turnMove => turnMove.move === Moves.FALSE_SWIPE && turnMove.result === MoveResult.SUCCESS); + expect(falseSwipeHistory).toBe(true); + }); +}); From 27a16382436fd08208c1fe5666a65fe1f93a9802 Mon Sep 17 00:00:00 2001 From: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Date: Sat, 29 Mar 2025 14:25:34 -0400 Subject: [PATCH 48/48] [Bug] Fix interactions for Pollen Puff Parental Bond, Multi-Lens, Grip Claw Ally Healing (#5550) * Checks for hit result status on Grip Claw application * Adds a boolean check for the Pollen Puff edge case in canBeMultiStrikeEnhanced * Adds parental bond test * Adds grip claw and multi lens tests --- src/data/moves/move.ts | 6 +++++- src/phases/move-effect-phase.ts | 2 +- test/abilities/parental_bond.test.ts | 18 ++++++++++++++++++ test/items/grip_claw.test.ts | 25 +++++++++++++++++++++++++ test/items/multi_lens.test.ts | 17 +++++++++++++++++ 5 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 2f935b7cc16..aeab8a6490b 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -905,7 +905,7 @@ export default class Move implements Localizable { SacrificialAttrOnHit ]; - // ...and cannot enhance these specific moves. + // ...and cannot enhance these specific moves const exceptMoves: Moves[] = [ Moves.FLING, Moves.UPROAR, @@ -914,10 +914,14 @@ export default class Move implements Localizable { Moves.ENDEAVOR ]; + // ...and cannot enhance Pollen Puff when targeting an ally. + const exceptPollenPuffAlly: boolean = this.id === Moves.POLLEN_PUFF && targets.includes(user.getAlly().getBattlerIndex()) + return (!restrictSpread || !isMultiTarget) && !this.isChargingMove() && !exceptAttrs.some(attr => this.hasAttr(attr)) && !exceptMoves.some(id => this.id === id) + && !exceptPollenPuffAlly && this.category !== MoveCategory.STATUS; } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 4152fc243f0..995684f8c03 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -653,7 +653,7 @@ export class MoveEffectPhase extends PokemonPhase { this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); this.applyOnGetHitAbEffects(user, target, hitResult); applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult); - if (this.move.getMove() instanceof AttackMove) { + if (this.move.getMove() instanceof AttackMove && hitResult !== HitResult.STATUS) { globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); } } diff --git a/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts index 2aa24e78d6e..d4bf544e8c7 100644 --- a/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -9,6 +9,7 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; describe("Abilities - Parental Bond", () => { let phaserGame: Phaser.Game; @@ -426,4 +427,21 @@ describe("Abilities - Parental Bond", () => { // TODO: Update hit count to 1 once Future Sight is fixed to not activate abilities if user is off the field expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); }); + + it("should not allow Pollen Puff to heal ally more than once", async () => { + game.override.battleType("double").moveset([Moves.POLLEN_PUFF, Moves.ENDURE]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.OMANYTE]); + + const [, rightPokemon] = game.scene.getPlayerField(); + + rightPokemon.damageAndUpdate(rightPokemon.hp - 1); + + game.move.select(Moves.POLLEN_PUFF, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.ENDURE, 1); + + await game.toNextTurn(); + + // Pollen Puff heals with a ratio of 0.5, as long as Pollen Puff triggers only once the pokemon will always be <= (0.5 * Max HP) + 1 + expect(rightPokemon.hp).toBeLessThanOrEqual(0.5 * rightPokemon.getMaxHp() + 1); + }); }); diff --git a/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts index 1d169006116..aa7c23ca43d 100644 --- a/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -98,6 +98,31 @@ describe("Items - Grip Claw", () => { expect(enemy1HeldItemCountsAfter).toBe(enemy1HeldItemCount); expect(enemy2HeldItemCountsAfter).toBe(enemy2HeldItemCount); }); + + it("should not allow Pollen Puff to steal items when healing ally", async () => { + game.override + .battleType("double") + .moveset([Moves.POLLEN_PUFF, Moves.ENDURE]) + .startingHeldItems([ + { name: "GRIP_CLAW", count: 1 }, + { name: "BERRY", type: BerryType.LUM, count: 1 }, + ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.OMANYTE]); + + const [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + + const gripClaw = leftPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; + vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); + + const heldItemCountBefore = getHeldItemCount(rightPokemon); + + game.move.select(Moves.POLLEN_PUFF, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.ENDURE, 1); + + await game.toNextTurn(); + + expect(getHeldItemCount(rightPokemon)).toBe(heldItemCountBefore); + }); }); /* diff --git a/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts index 90e73ae88ea..176e8213f55 100644 --- a/test/items/multi_lens.test.ts +++ b/test/items/multi_lens.test.ts @@ -211,4 +211,21 @@ describe("Items - Multi Lens", () => { // TODO: Update hit count to 1 once Future Sight is fixed to not activate held items if user is off the field expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); }); + + it("should not allow Pollen Puff to heal ally more than once", async () => { + game.override.battleType("double").moveset([Moves.POLLEN_PUFF, Moves.ENDURE]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.OMANYTE]); + + const [, rightPokemon] = game.scene.getPlayerField(); + + rightPokemon.damageAndUpdate(rightPokemon.hp - 1); + + game.move.select(Moves.POLLEN_PUFF, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.ENDURE, 1); + + await game.toNextTurn(); + + // Pollen Puff heals with a ratio of 0.5, as long as Pollen Puff triggers only once the pokemon will always be <= (0.5 * Max HP) + 1 + expect(rightPokemon.hp).toBeLessThanOrEqual(0.5 * rightPokemon.getMaxHp() + 1); + }); });