From 835b00d457ef4b160d46cf67fd407ae9635d1433 Mon Sep 17 00:00:00 2001 From: Benjamin Odom Date: Tue, 14 May 2024 23:19:12 -0500 Subject: [PATCH 01/18] Added Comments to Base Classes (#860) --- src/data/move.ts | 88 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 3c99ad8c1..c89277c55 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -434,29 +434,66 @@ export class SelfStatusMove extends Move { } } +/** + * Base class defining all {@link Move} Attributes + * @abstract + */ export abstract class MoveAttr { + /** Should this {@link Move} target the user? */ public selfTarget: boolean; constructor(selfTarget: boolean = false) { this.selfTarget = selfTarget; } + /** + * Applies move attributes + * @see {@link applyMoveAttrsInternal} + * @virtual + * @param user The {@link Pokemon} using the move + * @param target The target {@link Pokemon} of the move + * @param move The {@link Move} being used + * @param args Set of unique arguments needed by this attribute + * @returns true if the application succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { return true; } + /** + * @virtual + * @returns the {@link MoveCondition} or {@link MoveConditionFunc} for this {@link Move} + */ getCondition(): MoveCondition | MoveConditionFunc { return null; } + /** + * @virtual + * @param user The {@link Pokemon} using the move + * @param target The target {@link Pokemon} of the move + * @param move The {@link Move} being used + * @param cancelled A {@link Utils.BooleanHolder} which stores if the move should fail + * @returns the string representing failure of this {@link Move} + */ getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { return null; } + /** + * Used by the Enemy AI to rank an attack based on a given user + * @see {@link EnemyPokemon.getNextMove} + * @virtual + */ getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { return 0; } + /** + * Used by the Enemy AI to rank an attack based on a given target + * @see {@link EnemyPokemon.getNextMove} + * @virtual + */ getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { return 0; } @@ -470,6 +507,9 @@ export enum MoveEffectTrigger { POST_TARGET, } +/** Base class defining all Move Effect Attributes + * @extends MoveAttr + */ export class MoveEffectAttr extends MoveAttr { public trigger: MoveEffectTrigger; public firstHitOnly: boolean; @@ -480,11 +520,21 @@ export class MoveEffectAttr extends MoveAttr { this.firstHitOnly = firstHitOnly; } + /** + * Determines whether the {@link Move}'s effects are valid to {@link apply} + * @virtual + * @param user The {@link Pokemon} using the move + * @param target The target {@link Pokemon} of the move + * @param move The {@link Move} being used + * @param args Set of unique arguments needed by this attribute + * @returns true if the application succeeds + */ canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp) && (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT)); } + /** Applies move effects so long as they are able based on {@link canApply} */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { return this.canApply(user, target, move, args); } @@ -806,8 +856,15 @@ export enum MultiHitType { _1_TO_10, } +/** + * Heals the user or target by {@link healRatio} depending on the value of {@link selfTarget} + * @extends MoveEffectAttr + * @see {@link apply} + */ export class HealAttr extends MoveEffectAttr { + /** The percentage of {@link Stat.HP} to heal */ private healRatio: number; + /** Should an animation be shown? */ private showAnim: boolean; constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) { @@ -822,6 +879,10 @@ export class HealAttr extends MoveEffectAttr { return true; } + /** + * Creates a new {@link PokemonHealPhase}. + * This heals the target and shows the appropriate message. + */ addHealPhase(target: Pokemon, healRatio: number) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim)); @@ -903,7 +964,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr { * @param user Pokemon that used the move * @param target N/A * @param move Move with this attribute - * @param args Utils.NumberHolder for arenaAttackTypeMultiplier + * @param args [0] Utils.NumberHolder for arenaAttackTypeMultiplier * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -963,27 +1024,19 @@ export class SandHealAttr extends WeatherHealAttr { } /** - * Heals the target by either {@link normalHealRatio} or {@link boostedHealRatio} + * Heals the target or the user by either {@link normalHealRatio} or {@link boostedHealRatio} * depending on the evaluation of {@link condition} + * @extends HealAttr * @see {@link apply} - * @param user The Pokemon using this move - * @param target The target Pokemon of this move - * @param move This move - * @param args N/A - * @returns if the move was successful */ export class BoostHealAttr extends HealAttr { + /** Healing received when {@link condition} is false */ private normalHealRatio?: number; + /** Healing received when {@link condition} is true */ private boostedHealRatio?: number; + /** The lambda expression to check against when boosting the healing value */ private condition?: MoveConditionFunc; - /** - * @param normalHealRatio Healing received when {@link condition} is false - * @param boostedHealRatio Healing received when {@link condition} is true - * @param showAnim Should a healing animation be showed? - * @param selfTarget Should the move target the user? - * @param condition The condition to check against when boosting the healing value - */ constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) { super(normalHealRatio, showAnim, selfTarget); this.normalHealRatio = normalHealRatio; @@ -991,6 +1044,13 @@ export class BoostHealAttr extends HealAttr { this.condition = condition; } + /** + * @param user The Pokemon using this move + * @param target The target Pokemon of this move + * @param move This move + * @param args N/A + * @returns true if the move was successful + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const healRatio = this.condition(user, target, move) ? this.boostedHealRatio : this.normalHealRatio; this.addHealPhase(target, healRatio); From 67c18a15e2c0f9bec28646d8dadb01ac2a478c21 Mon Sep 17 00:00:00 2001 From: Samuel H Date: Wed, 15 May 2024 00:52:06 -0400 Subject: [PATCH 02/18] Implement client session and re-implement hybrid saving (#888) * Implement client session and re-implement hybrid saving (WiP) * Fixes for hybrid saving * Add local data clears where applicable * Include client session ID in system update * Change save threshold from 5 waves to 10 waves or 5 minutes --- src/account.ts | 3 +- src/battle-scene.ts | 5 + src/phases.ts | 16 +- src/system/game-data.ts | 399 +++++++++++++++++---------------- src/ui/egg-gacha-ui-handler.ts | 2 +- 5 files changed, 231 insertions(+), 194 deletions(-) diff --git a/src/account.ts b/src/account.ts index afb9aca35..0d79f4d55 100644 --- a/src/account.ts +++ b/src/account.ts @@ -7,13 +7,14 @@ export interface UserInfo { } export let loggedInUser: UserInfo = null; +export const clientSessionId = Utils.randomString(32); export function updateUserInfo(): Promise<[boolean, integer]> { return new Promise<[boolean, integer]>(resolve => { if (bypassLogin) { let lastSessionSlot = -1; for (let s = 0; s < 2; s++) { - if (localStorage.getItem(`sessionData${s ? s : ''}`)) { + if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) { lastSessionSlot = s; break; } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 111e5439b..77c3b7ad4 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -88,6 +88,7 @@ export default class BattleScene extends SceneBase { public uiInputs: UiInputs; public sessionPlayTime: integer = null; + public lastSavePlayTime: integer = null; public masterVolume: number = 0.5; public bgmVolume: number = 1; public seVolume: number = 1; @@ -452,6 +453,8 @@ export default class BattleScene extends SceneBase { initSession(): void { if (this.sessionPlayTime === null) this.sessionPlayTime = 0; + if (this.lastSavePlayTime === null) + this.lastSavePlayTime = 0; if (this.playTimeTimer) this.playTimeTimer.destroy(); @@ -464,6 +467,8 @@ export default class BattleScene extends SceneBase { this.gameData.gameStats.playTime++; if (this.sessionPlayTime !== null) this.sessionPlayTime++; + if (this.lastSavePlayTime !== null) + this.lastSavePlayTime++; } }); diff --git a/src/phases.ts b/src/phases.ts index 123169021..a5439c228 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -330,6 +330,7 @@ export class TitlePhase extends Phase { this.scene.newBattle(); this.scene.arena.init(); this.scene.sessionPlayTime = 0; + this.scene.lastSavePlayTime = 0; this.end(); }); }; @@ -393,8 +394,12 @@ export class UnavailablePhase extends Phase { } export class ReloadSessionPhase extends Phase { - constructor(scene: BattleScene) { + private systemDataStr: string; + + constructor(scene: BattleScene, systemDataStr?: string) { super(scene); + + this.systemDataStr = systemDataStr; } start(): void { @@ -410,7 +415,9 @@ export class ReloadSessionPhase extends Phase { delayElapsed = true; }); - this.scene.gameData.loadSystem().then(() => { + this.scene.gameData.clearLocalData(); + + (this.systemDataStr ? this.scene.gameData.initSystem(this.systemDataStr) : this.scene.gameData.loadSystem()).then(() => { if (delayElapsed) this.end(); else @@ -531,6 +538,7 @@ export class SelectStarterPhase extends Phase { this.scene.newBattle(); this.scene.arena.init(); this.scene.sessionPlayTime = 0; + this.scene.lastSavePlayTime = 0; this.end(); }); }); @@ -784,7 +792,7 @@ export class EncounterPhase extends BattlePhase { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (!this.loaded) { - this.scene.gameData.saveAll(this.scene, true).then(success => { + this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 10).then(success => { this.scene.disableMenu = false; if (!success) return this.scene.reset(true); @@ -3692,7 +3700,7 @@ export class PostGameOverPhase extends Phase { start() { super.start(); - this.scene.gameData.saveSystem().then(success => { + this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { if (!success) return this.scene.reset(true); this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 5e942b4fa..e7537fc52 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -20,7 +20,7 @@ import { Egg } from "../data/egg"; import { VoucherType, vouchers } from "./voucher"; import { AES, enc } from "crypto-js"; import { Mode } from "../ui/ui"; -import { loggedInUser, updateUserInfo } from "../account"; +import { clientSessionId, loggedInUser, updateUserInfo } from "../account"; import { Nature } from "../data/nature"; import { GameStats } from "./game-stats"; import { Tutorial } from "../tutorial"; @@ -67,6 +67,18 @@ export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): str } } +function encrypt(data: string, bypassLogin: boolean): string { + return (bypassLogin + ? (data: string) => btoa(data) + : (data: string) => AES.encrypt(data, saveKey))(data); +} + +function decrypt(data: string, bypassLogin: boolean): string { + return (bypassLogin + ? (data: string) => atob(data) + : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); +} + interface SystemSaveData { trainerId: integer; secretId: integer; @@ -277,8 +289,10 @@ export class GameData { const maxIntAttrValue = Math.pow(2, 31); const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); + localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemData, bypassLogin)); + if (!bypassLogin) { - Utils.apiPost(`savedata/update?datatype=${GameDataType.SYSTEM}`, systemData, undefined, true) + Utils.apiPost(`savedata/update?datatype=${GameDataType.SYSTEM}&clientSessionId=${clientSessionId}`, systemData, undefined, true) .then(response => response.text()) .then(error => { this.scene.ui.savingIcon.hide(); @@ -296,10 +310,6 @@ export class GameData { resolve(true); }); } else { - localStorage.setItem('data_bak', localStorage.getItem('data')); - - localStorage.setItem('data', btoa(systemData)); - this.scene.ui.savingIcon.hide(); resolve(true); @@ -309,120 +319,13 @@ export class GameData { public loadSystem(): Promise { return new Promise(resolve => { - if (bypassLogin && !localStorage.hasOwnProperty('data')) + console.log('Client Session:', clientSessionId); + + if (bypassLogin && !localStorage.getItem(`data_${loggedInUser.username}`)) return resolve(false); - const handleSystemData = (systemDataStr: string) => { - try { - const systemData = this.parseSystemData(systemDataStr); - - console.debug(systemData); - - /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ]; - - if (versions[0] !== versions[1]) { - const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); - }*/ - - this.trainerId = systemData.trainerId; - this.secretId = systemData.secretId; - - this.gender = systemData.gender; - - this.saveSetting(Setting.Player_Gender, systemData.gender === PlayerGender.FEMALE ? 1 : 0); - - const initStarterData = !systemData.starterData; - - if (initStarterData) { - this.initStarterData(); - - if (systemData['starterMoveData']) { - const starterMoveData = systemData['starterMoveData']; - for (let s of Object.keys(starterMoveData)) - this.starterData[s].moveset = starterMoveData[s]; - } - - if (systemData['starterEggMoveData']) { - const starterEggMoveData = systemData['starterEggMoveData']; - for (let s of Object.keys(starterEggMoveData)) - this.starterData[s].eggMoves = starterEggMoveData[s]; - } - - this.migrateStarterAbilities(systemData, this.starterData); - } else { - if ([ '1.0.0', '1.0.1' ].includes(systemData.gameVersion)) - this.migrateStarterAbilities(systemData); - //this.fixVariantData(systemData); - this.fixStarterData(systemData); - // Migrate ability starter data if empty for caught species - Object.keys(systemData.starterData).forEach(sd => { - if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) - systemData.starterData[sd].abilityAttr = 1; - }); - this.starterData = systemData.starterData; - } - - if (systemData.gameStats) { - if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) - this.fixLegendaryStats(systemData); - this.gameStats = systemData.gameStats; - } - - if (systemData.unlocks) { - for (let key of Object.keys(systemData.unlocks)) { - if (this.unlocks.hasOwnProperty(key)) - this.unlocks[key] = systemData.unlocks[key]; - } - } - - if (systemData.achvUnlocks) { - for (let a of Object.keys(systemData.achvUnlocks)) { - if (achvs.hasOwnProperty(a)) - this.achvUnlocks[a] = systemData.achvUnlocks[a]; - } - } - - if (systemData.voucherUnlocks) { - for (let v of Object.keys(systemData.voucherUnlocks)) { - if (vouchers.hasOwnProperty(v)) - this.voucherUnlocks[v] = systemData.voucherUnlocks[v]; - } - } - - if (systemData.voucherCounts) { - Utils.getEnumKeys(VoucherType).forEach(key => { - const index = VoucherType[key]; - this.voucherCounts[index] = systemData.voucherCounts[index] || 0; - }); - } - - this.eggs = systemData.eggs - ? systemData.eggs.map(e => e.toEgg()) - : []; - - this.dexData = Object.assign(this.dexData, systemData.dexData); - this.consolidateDexData(this.dexData); - this.defaultDexData = null; - - if (initStarterData) { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - for (let s of starterIds) { - this.starterData[s].candyCount += this.dexData[s].caughtCount; - this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; - if (this.dexData[s].caughtAttr & DexAttr.SHINY) - this.starterData[s].candyCount += 4; - } - } - - resolve(true); - } catch (err) { - console.error(err); - resolve(false); - } - } - if (!bypassLogin) { - Utils.apiFetch(`savedata/get?datatype=${GameDataType.SYSTEM}`, true) + Utils.apiFetch(`savedata/system?clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(response => { if (!response.length || response[0] !== '{') { @@ -437,10 +340,132 @@ export class GameData { return resolve(false); } - handleSystemData(response); + const cachedSystem = localStorage.getItem(`data_${loggedInUser.username}`); + this.initSystem(response, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : null).then(resolve); }); } else - handleSystemData(atob(localStorage.getItem('data'))); + this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)).then(resolve); + }); + } + + public initSystem(systemDataStr: string, cachedSystemDataStr?: string): Promise { + return new Promise(resolve => { + try { + let systemData = this.parseSystemData(systemDataStr); + + if (cachedSystemDataStr) { + let cachedSystemData = this.parseSystemData(cachedSystemDataStr); + console.log(cachedSystemData.timestamp, systemData.timestamp) + if (cachedSystemData.timestamp > systemData.timestamp) { + console.debug('Use cached system'); + systemData = cachedSystemData; + } else + this.clearLocalData(); + } + + console.debug(systemData); + + /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ]; + + if (versions[0] !== versions[1]) { + const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); + }*/ + + this.trainerId = systemData.trainerId; + this.secretId = systemData.secretId; + + this.gender = systemData.gender; + + this.saveSetting(Setting.Player_Gender, systemData.gender === PlayerGender.FEMALE ? 1 : 0); + + const initStarterData = !systemData.starterData; + + if (initStarterData) { + this.initStarterData(); + + if (systemData['starterMoveData']) { + const starterMoveData = systemData['starterMoveData']; + for (let s of Object.keys(starterMoveData)) + this.starterData[s].moveset = starterMoveData[s]; + } + + if (systemData['starterEggMoveData']) { + const starterEggMoveData = systemData['starterEggMoveData']; + for (let s of Object.keys(starterEggMoveData)) + this.starterData[s].eggMoves = starterEggMoveData[s]; + } + + this.migrateStarterAbilities(systemData, this.starterData); + } else { + if ([ '1.0.0', '1.0.1' ].includes(systemData.gameVersion)) + this.migrateStarterAbilities(systemData); + //this.fixVariantData(systemData); + this.fixStarterData(systemData); + // Migrate ability starter data if empty for caught species + Object.keys(systemData.starterData).forEach(sd => { + if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) + systemData.starterData[sd].abilityAttr = 1; + }); + this.starterData = systemData.starterData; + } + + if (systemData.gameStats) { + if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) + this.fixLegendaryStats(systemData); + this.gameStats = systemData.gameStats; + } + + if (systemData.unlocks) { + for (let key of Object.keys(systemData.unlocks)) { + if (this.unlocks.hasOwnProperty(key)) + this.unlocks[key] = systemData.unlocks[key]; + } + } + + if (systemData.achvUnlocks) { + for (let a of Object.keys(systemData.achvUnlocks)) { + if (achvs.hasOwnProperty(a)) + this.achvUnlocks[a] = systemData.achvUnlocks[a]; + } + } + + if (systemData.voucherUnlocks) { + for (let v of Object.keys(systemData.voucherUnlocks)) { + if (vouchers.hasOwnProperty(v)) + this.voucherUnlocks[v] = systemData.voucherUnlocks[v]; + } + } + + if (systemData.voucherCounts) { + Utils.getEnumKeys(VoucherType).forEach(key => { + const index = VoucherType[key]; + this.voucherCounts[index] = systemData.voucherCounts[index] || 0; + }); + } + + this.eggs = systemData.eggs + ? systemData.eggs.map(e => e.toEgg()) + : []; + + this.dexData = Object.assign(this.dexData, systemData.dexData); + this.consolidateDexData(this.dexData); + this.defaultDexData = null; + + if (initStarterData) { + const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + for (let s of starterIds) { + this.starterData[s].candyCount += this.dexData[s].caughtCount; + this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; + if (this.dexData[s].caughtAttr & DexAttr.SHINY) + this.starterData[s].candyCount += 4; + } + } + + resolve(true); + } catch (err) { + console.error(err); + resolve(false); + } }); } @@ -474,6 +499,29 @@ export class GameData { return dataStr; } + public async verify(): Promise { + if (bypassLogin) + return true; + + const response = await Utils.apiPost(`savedata/system/verify`, JSON.stringify({ clientSessionId: clientSessionId }), undefined, true) + .then(response => response.json()); + + if (!response.valid) { + this.scene.clearPhaseQueue(); + this.scene.unshiftPhase(new ReloadSessionPhase(this.scene, JSON.stringify(response.systemData))); + this.clearLocalData(); + return false; + } + + return true; + } + + public clearLocalData(): void { + localStorage.removeItem(`data_${loggedInUser.username}`); + for (let s = 0; s < 5; s++) + localStorage.removeItem(`sessionData${s ? s : ''}_${loggedInUser.username}`); + } + public saveSetting(setting: Setting, valueIndex: integer): boolean { let settings: object = {}; if (localStorage.hasOwnProperty('settings')) @@ -557,40 +605,6 @@ export class GameData { } as SessionSaveData; } - saveSession(scene: BattleScene, skipVerification?: boolean): Promise { - return new Promise(resolve => { - Utils.executeIf(!skipVerification, updateUserInfo).then(success => { - if (success !== null && !success) - return resolve(false); - - const sessionData = this.getSessionSaveData(scene); - - if (!bypassLogin) { - Utils.apiPost(`savedata/update?datatype=${GameDataType.SESSION}&slot=${scene.sessionSlotId}&trainerId=${this.trainerId}&secretId=${this.secretId}`, JSON.stringify(sessionData), undefined, true) - .then(response => response.text()) - .then(error => { - if (error) { - if (error.startsWith('session out of date')) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); - } - console.error(error); - return resolve(false); - } - console.debug('Session data saved'); - resolve(true); - }); - } else { - localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}`, btoa(JSON.stringify(sessionData))); - - console.debug('Session data saved'); - - resolve(true); - } - }); - }); - } - getSession(slotId: integer): Promise { return new Promise(async (resolve, reject) => { if (slotId < 0) @@ -605,8 +619,8 @@ export class GameData { } }; - if (!bypassLogin) { - Utils.apiFetch(`savedata/get?datatype=${GameDataType.SESSION}&slot=${slotId}`, true) + if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`)) { + Utils.apiFetch(`savedata/session?slot=${slotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(async response => { if (!response.length || response[0] !== '{') { @@ -614,12 +628,14 @@ export class GameData { return resolve(null); } + localStorage.setItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`, encrypt(response, bypassLogin)); + await handleSessionData(response); }); } else { - const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ''}`); + const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`); if (sessionData) - await handleSessionData(atob(sessionData)); + await handleSessionData(decrypt(sessionData, bypassLogin)); else return resolve(null); } @@ -640,6 +656,7 @@ export class GameData { console.log('Seed:', scene.seed); scene.sessionPlayTime = sessionData.playTime || 0; + scene.lastSavePlayTime = 0; const loadPokemonAssets: Promise[] = []; @@ -731,16 +748,17 @@ export class GameData { deleteSession(slotId: integer): Promise { return new Promise(resolve => { if (bypassLogin) { - localStorage.removeItem('sessionData'); + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); return resolve(true); } updateUserInfo().then(success => { if (success !== null && !success) return resolve(false); - Utils.apiFetch(`savedata/delete?datatype=${GameDataType.SESSION}&slot=${slotId}`, true).then(response => { + Utils.apiFetch(`savedata/delete?datatype=${GameDataType.SESSION}&slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { if (response.ok) { loggedInUser.lastSessionSlot = -1; + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); resolve(true); } return response.text(); @@ -792,7 +810,7 @@ export class GameData { tryClearSession(scene: BattleScene, slotId: integer): Promise<[success: boolean, newClear: boolean]> { return new Promise<[boolean, boolean]>(resolve => { if (bypassLogin) { - localStorage.removeItem(`sessionData${slotId ? slotId : ''}`); + localStorage.removeItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`); return resolve([true, true]); } @@ -800,9 +818,11 @@ export class GameData { if (success !== null && !success) return resolve([false, false]); const sessionData = this.getSessionSaveData(scene); - Utils.apiPost(`savedata/clear?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}`, JSON.stringify(sessionData), undefined, true).then(response => { - if (response.ok) + Utils.apiPost(`savedata/clear?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, JSON.stringify(sessionData), undefined, true).then(response => { + if (response.ok) { loggedInUser.lastSessionSlot = -1; + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); + } return response.json(); }).then(jsonResponse => { if (!jsonResponse.error) @@ -855,14 +875,14 @@ export class GameData { }) as SessionSaveData; } - saveAll(scene: BattleScene, skipVerification?: boolean): Promise { + saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false): Promise { return new Promise(resolve => { Utils.executeIf(!skipVerification, updateUserInfo).then(success => { if (success !== null && !success) return resolve(false); - this.scene.ui.savingIcon.show(); - const data = this.getSystemSaveData(); - const sessionData = this.getSessionSaveData(scene); + if (sync) + this.scene.ui.savingIcon.show(); + const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); const maxIntAttrValue = Math.pow(2, 31); const systemData = this.getSystemSaveData(); @@ -870,14 +890,24 @@ export class GameData { const request = { system: systemData, session: sessionData, - sessionSlotId: scene.sessionSlotId + sessionSlotId: scene.sessionSlotId, + clientSessionId: clientSessionId }; - if (!bypassLogin) { + localStorage.setItem(`data_${loggedInUser.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); + + localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}_${loggedInUser.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); + + console.debug('Session data saved'); + + if (!bypassLogin && sync) { Utils.apiPost('savedata/updateall', JSON.stringify(request, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), undefined, true) .then(response => response.text()) .then(error => { - this.scene.ui.savingIcon.hide(); + if (sync) { + this.scene.lastSavePlayTime = 0; + this.scene.ui.savingIcon.hide(); + } if (error) { if (error.startsWith('client version out of date')) { this.scene.clearPhaseQueue(); @@ -892,17 +922,10 @@ export class GameData { resolve(true); }); } else { - localStorage.setItem('data_bak', localStorage.getItem('data')); - - localStorage.setItem('data', btoa(JSON.stringify(systemData, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v))); - - localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}`, btoa(JSON.stringify(sessionData))); - - console.debug('Session data saved'); - - this.scene.ui.savingIcon.hide(); - - resolve(true); + this.verify().then(success => { + this.scene.ui.savingIcon.hide(); + resolve(success); + }); } }); }); @@ -910,7 +933,7 @@ export class GameData { public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise { return new Promise(resolve => { - const dataKey: string = getDataTypeKey(dataType, slotId); + const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; const handleData = (dataStr: string) => { switch (dataType) { case GameDataType.SYSTEM: @@ -926,7 +949,7 @@ export class GameData { link.remove(); }; if (!bypassLogin && dataType < GameDataType.SETTINGS) { - Utils.apiFetch(`savedata/get?datatype=${dataType}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}`, true) + Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? 'system' : 'session'}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(response => { if (!response.length || response[0] !== '{') { @@ -941,14 +964,14 @@ export class GameData { } else { const data = localStorage.getItem(dataKey); if (data) - handleData(atob(data)); + handleData(decrypt(data, bypassLogin)); resolve(!!data); } }); } public importData(dataType: GameDataType, slotId: integer = 0): void { - const dataKey = getDataTypeKey(dataType, slotId); + const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; let saveFile: any = document.getElementById('saveFile'); if (saveFile) @@ -1009,11 +1032,13 @@ export class GameData { return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); + if (!bypassLogin && dataType < GameDataType.SETTINGS) { updateUserInfo().then(success => { if (!success) return displayError(`Could not contact the server. Your ${dataName} data could not be imported.`); - Utils.apiPost(`savedata/update?datatype=${dataType}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}&trainerId=${this.trainerId}&secretId=${this.secretId}`, dataStr, undefined, true) + Utils.apiPost(`savedata/update?datatype=${dataType}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, dataStr, undefined, true) .then(response => response.text()) .then(error => { if (error) { @@ -1023,10 +1048,8 @@ export class GameData { window.location = window.location; }); }); - } else { - localStorage.setItem(dataKey, btoa(dataStr)); + } else window.location = window.location; - } }, () => { this.scene.ui.revertMode(); this.scene.ui.showText(null, 0); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 315dfdbd3..5626405da 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -372,7 +372,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.scene.gameData.gameStats.eggsPulled++; } - this.scene.gameData.saveSystem().then(success => { + this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { if (!success) return this.scene.reset(true); doPull(); From c6973365cbb73e48dcb988cbfdd40d6f39a099bf Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 00:56:17 -0400 Subject: [PATCH 03/18] Change last save interval to correct value --- src/phases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index a5439c228..322f93870 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -792,7 +792,7 @@ export class EncounterPhase extends BattlePhase { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (!this.loaded) { - this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 10).then(success => { + this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { this.scene.disableMenu = false; if (!success) return this.scene.reset(true); From 7e0e4ecd6db57a02742373298ece3e4a17868c5a Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 01:29:07 -0400 Subject: [PATCH 04/18] Call saveSystem on gacha pull outside of current battle --- src/ui/egg-gacha-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 5626405da..a7fd61b30 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -372,7 +372,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.scene.gameData.gameStats.eggsPulled++; } - this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { + (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { if (!success) return this.scene.reset(true); doPull(); From 751120e77e88021d74ce6759640e9c825a752878 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 01:42:36 -0400 Subject: [PATCH 05/18] Fix crashing in offline mode --- src/account.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/account.ts b/src/account.ts index 0d79f4d55..357cd5af4 100644 --- a/src/account.ts +++ b/src/account.ts @@ -12,6 +12,7 @@ export const clientSessionId = Utils.randomString(32); export function updateUserInfo(): Promise<[boolean, integer]> { return new Promise<[boolean, integer]>(resolve => { if (bypassLogin) { + loggedInUser = { username: 'Guest', lastSessionSlot: -1 }; let lastSessionSlot = -1; for (let s = 0; s < 2; s++) { if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) { @@ -19,7 +20,7 @@ export function updateUserInfo(): Promise<[boolean, integer]> { break; } } - loggedInUser = { username: 'Guest', lastSessionSlot: lastSessionSlot }; + loggedInUser.lastSessionSlot = lastSessionSlot; return resolve([ true, 200 ]); } Utils.apiFetch('account/info', true).then(response => { From 70ecc51f505135aa1340e2997a19b490ece0854c Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 01:54:15 -0400 Subject: [PATCH 06/18] Don't clear local data in offline mode --- src/system/game-data.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index e7537fc52..45d050263 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -517,6 +517,8 @@ export class GameData { } public clearLocalData(): void { + if (bypassLogin) + return; localStorage.removeItem(`data_${loggedInUser.username}`); for (let s = 0; s < 5; s++) localStorage.removeItem(`sessionData${s ? s : ''}_${loggedInUser.username}`); From 4a7da3e5f68dd99afdc898d83ae02010d9a85f5a Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 02:01:30 -0400 Subject: [PATCH 07/18] Fix export not working --- src/system/game-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 45d050263..e7ffd281b 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -951,7 +951,7 @@ export class GameData { link.remove(); }; if (!bypassLogin && dataType < GameDataType.SETTINGS) { - Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? 'system' : 'session'}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}&clientSessionId=${clientSessionId}`, true) + Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? 'system' : 'session'}?clientSessionId=${clientSessionId}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}`, true) .then(response => response.text()) .then(response => { if (!response.length || response[0] !== '{') { From 1e224a6ac48ace2e4b64a2da341307c304289bca Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Wed, 15 May 2024 01:46:24 -0500 Subject: [PATCH 08/18] Allow Original Color Magearna to be obtained MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Another completely cosmetic Pokémon form (and a nice looking one at that!). --- src/battle-scene.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 77c3b7ad4..f15cf1a52 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1012,6 +1012,7 @@ export default class BattleScene extends SceneBase { case Species.FLORGES: case Species.FURFROU: case Species.ORICORIO: + case Species.MAGEARNA: case Species.SQUAWKABILLY: case Species.TATSUGIRI: case Species.PALDEA_TAUROS: From e89dbad5f1b0ac284a83fbe077f9e708ea850575 Mon Sep 17 00:00:00 2001 From: notpatchmaybe <104580041+notpatchmaybe@users.noreply.github.com> Date: Wed, 15 May 2024 09:56:06 +0100 Subject: [PATCH 09/18] Readded removed args, inverted 'simulated' instead of removing (#874) --- 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 0ff03ed67..4128f22e2 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1755,7 +1755,7 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : 'status problems'}!`); + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(this.immuneEffects[0]) : 'status problems'}!`); } } @@ -2825,7 +2825,7 @@ export function applyPostStatChangeAbAttrs(attrType: { new(...args: any[]): Post export function applyPreSetStatusAbAttrs(attrType: { new(...args: any[]): PreSetStatusAbAttr }, pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, simulated); } export function applyPreApplyBattlerTagAbAttrs(attrType: { new(...args: any[]): PreApplyBattlerTagAbAttr }, From 512016faef74ab77f821d3b22863be8bcee1c520 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Wed, 15 May 2024 11:10:20 +0200 Subject: [PATCH 10/18] =?UTF-8?q?Sacrifical=20Moves=20(that=20dont=20requi?= =?UTF-8?q?re=20a=20target=20like=20explosion=20or=20self=20d=E2=80=A6=20(?= =?UTF-8?q?#691)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Sacrifical Moves (that dont require a target like explosion or self destruct) now also work if the target is flying, diving etc. There is also a new catagorie of moves. "SacrificalMovesOnHit" for all moves that need to hit for them to be sacrifical like MEMENTO * Added comments, added (what i think is TSDoc) to functions and classes. Removed empty lines i introduced * . * Added fixes for the Review by TempsRay. * Added missing * * Remove Target Requirement of SacrificialAttr * Update move.ts --------- Co-authored-by: Benjamin Odom --- src/data/move.ts | 58 +++++++++++++++++++++++++++++++++++++++++++----- src/phases.ts | 16 ++++++++----- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index c89277c55..5f5765c1d 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -788,17 +788,65 @@ export class RecoilAttr extends MoveEffectAttr { } } + +/** + * Attribute used for moves which self KO the user regardless if the move hits a target + * @extends MoveEffectAttr + * @see {@link apply} + **/ export class SacrificialAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, MoveEffectTrigger.POST_TARGET); } + /** + * Deals damage to the user equal to their current hp + * @param user Pokemon that used the move + * @param target The target of the move + * @param move Move with this attribute + * @param args N/A + * @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.turnData.damageTaken += user.hp; + + return true; + } + + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + if (user.isBoss()) + return -20; + return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5)); + } +} + +/** + * Attribute used for moves which self KO the user but only if the move hits a target + * @extends MoveEffectAttr + * @see {@link apply} + **/ +export class SacrificialAttrOnHit extends MoveEffectAttr { + constructor() { + super(true, MoveEffectTrigger.POST_TARGET); + } + + /** + * Deals damage to the user equal to their current hp if the move lands + * @param user Pokemon that used the move + * @param target The target of the move + * @param move Move with this attribute + * @param args N/A + * @returns true if the function succeeds + **/ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + + // If the move fails to hit a target, then the user does not faint and the function returns false if (!super.apply(user, target, move, args)) return false; user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true); - user.turnData.damageTaken += user.hp; + user.turnData.damageTaken += user.hp; return true; } @@ -5020,7 +5068,7 @@ export function initMoves() { new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.BURN), new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) - .attr(SacrificialAttr) + .attr(SacrificialAttrOnHit) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2), new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => user.status @@ -5556,7 +5604,7 @@ export function initMoves() { new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) .attr(HighCritAttr), new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) - .attr(SacrificialAttr) + .attr(SacrificialAttrOnHit) .danceMove() .triageMove() .unimplemented(), @@ -5705,7 +5753,7 @@ export function initMoves() { .partial(), new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) .attr(UserHpDamageAttr) - .attr(SacrificialAttr), + .attr(SacrificialAttrOnHit), new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .unimplemented(), diff --git a/src/phases.ts b/src/phases.ts index 322f93870..a802582cb 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -2,7 +2,7 @@ import BattleScene, { AnySound, bypassLogin, startingWave } from "./battle-scene import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; import * as Utils from './utils'; import { Moves } from "./data/enums/moves"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr } from "./data/move"; +import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, SacrificialAttr } from "./data/move"; import { Mode } from './ui/ui'; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; @@ -2304,8 +2304,8 @@ export class MovePhase extends BattlePhase { if (this.move.moveId) this.showMoveText(); - - if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { + + if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || (!targets.length && !this.move.getMove().getAttrs(SacrificialAttr).length)) { moveQueue.shift(); this.cancel(); this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); @@ -2537,8 +2537,14 @@ export class MoveEffectPhase extends PokemonPhase { })); } // Trigger effect which should only apply one time after all targeted effects have already applied - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_TARGET, - user, null, this.move.getMove()) + const postTarget = applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_TARGET, + user, null, this.move.getMove()); + + if (applyAttrs.length) // If there is a pending asynchronous move effect, do this after + applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); + else // Otherwise, push a new asynchronous move effect + applyAttrs.push(postTarget); + Promise.allSettled(applyAttrs).then(() => this.end()); }); }); From 1f5b2726b5e80d1f6535162297571d38333fbf38 Mon Sep 17 00:00:00 2001 From: andrew-wilcox Date: Wed, 15 May 2024 06:36:34 -0600 Subject: [PATCH 11/18] added auto hit and 2x damage from certain moves when targeting a pokemon that used minimize (#824) * added auto hit and 2x damage from certain moves when targetting a pokemon who used minimize * review fixes and bad merge * review fixes and bad merge v2 * changed to be double damage instead of power for the minimize condition * added TSdocs for function] * remove ability to add minimize tag to dynamax-mons * status cannot be applied to max-mons, and falls off if they dynamax * updated doccumentation * Update move.ts --------- Co-authored-by: Cae Rulius Co-authored-by: Benjamin Odom --- src/data/battler-tags.ts | 29 +++++++++++++++++++++ src/data/enums/battler-tag-type.ts | 3 ++- src/data/move.ts | 42 +++++++++++++++++++++++++++++- src/field/pokemon.ts | 6 +++++ 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 257f56d46..f66b5b2a0 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -544,6 +544,33 @@ export class AquaRingTag extends BattlerTag { } } +/** Tag used to allow moves that interact with {@link Moves.MINIMIZE} to function */ +export class MinimizeTag extends BattlerTag { + constructor() { + super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE, undefined); + } + + canAdd(pokemon: Pokemon): boolean { + return !pokemon.isMax(); + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + } + + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + //If a pokemon dynamaxes they lose minimized status + if(pokemon.isMax()){ + return false + } + return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); + } + + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + } +} + export class DrowsyTag extends BattlerTag { constructor() { super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN); @@ -1358,6 +1385,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); case BattlerTagType.MAGNET_RISEN: return new MagnetRisenTag(tagType, sourceMove); + case BattlerTagType.MINIMIZED: + return new MinimizeTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/enums/battler-tag-type.ts b/src/data/enums/battler-tag-type.ts index d18ccf1c5..9411d70a6 100644 --- a/src/data/enums/battler-tag-type.ts +++ b/src/data/enums/battler-tag-type.ts @@ -55,5 +55,6 @@ export enum BattlerTagType { CURSED = "CURSED", CHARGED = "CHARGED", GROUNDED = "GROUNDED", - MAGNET_RISEN = "MAGNET_RISEN" + MAGNET_RISEN = "MAGNET_RISEN", + MINIMIZED = "MINIMIZED" } diff --git a/src/data/move.ts b/src/data/move.ts index 5f5765c1d..46216eb75 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2480,6 +2480,30 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { } } +/** + * Attribute used for moves which never miss + * against Pokemon with the {@link BattlerTagType.MINIMIZED} + * @see {@link apply} + * @param user N/A + * @param target Target of the move + * @param move N/A + * @param args [0] Accuracy of the move to be modified + * @returns true if the function succeeds + */ +export class MinimizeAccuracyAttr extends VariableAccuracyAttr{ + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (target.getTag(BattlerTagType.MINIMIZED)){ + const accuracy = args[0] as Utils.NumberHolder + accuracy.value = -1; + + return true; + } + + return false; + } +} + export class ToxicAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.isOfType(Type.POISON)) { @@ -3235,8 +3259,11 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { } } +/** Attribute used when a move hits a {@link BattlerTagType} for double damage */ export class HitsTagAttr extends MoveAttr { + /** The {@link BattlerTagType} this move hits */ public tagType: BattlerTagType; + /** Should this move deal double damage against {@link HitsTagAttr.tagType}? */ public doubleDamage: boolean; constructor(tagType: BattlerTagType, doubleDamage?: boolean) { @@ -4403,6 +4430,8 @@ export function initMoves() { new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) + .attr(MinimizeAccuracyAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .attr(FlinchAttr), new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2), @@ -4426,6 +4455,8 @@ export function initMoves() { .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) + .attr(MinimizeAccuracyAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1) .attr(TrapAttr, BattlerTagType.WRAP), @@ -4623,6 +4654,7 @@ export function initMoves() { new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1) .attr(StatChangeAttr, BattleStat.DEF, 1, true), new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1) + .attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false) .attr(StatChangeAttr, BattleStat.EVA, 2, true), new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) .attr(StatChangeAttr, BattleStat.ACC, -1), @@ -5073,7 +5105,7 @@ export function initMoves() { new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => user.status && (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1) - .attr(BypassBurnDamageReductionAttr), + .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .punchingMove() .ignoresVirtual() @@ -5462,6 +5494,8 @@ export function initMoves() { new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) .pulseMove(), new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) + .attr(MinimizeAccuracyAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .attr(FlinchAttr), new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) @@ -5671,7 +5705,9 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .danceMove(), new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + .attr(MinimizeAccuracyAttr) .attr(CompareWeightPowerAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .condition(failOnMaxCondition), new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) .target(MoveTarget.ALL_NEAR_OTHERS) @@ -5802,7 +5838,9 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.DEF, -1) .slicingMove(), new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + .attr(MinimizeAccuracyAttr) .attr(CompareWeightPowerAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .condition(failOnMaxCondition), new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) .attr(StatChangeAttr, BattleStat.ACC, -1), @@ -5873,7 +5911,9 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) + .attr(MinimizeAccuracyAttr) .attr(FlyingTypeMultiplierAttr) + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .condition(failOnGravityCondition), new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) .unimplemented(), diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 97d94bdba..48287cf39 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1544,6 +1544,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage); + /** + * For each {@link HitsTagAttr} the move has, doubles the damage of the move if: + * The target has a {@link BattlerTagType} that this move interacts with + * AND + * The move doubles damage when used against that tag + * */ move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { if (this.getTag(hta.tagType)) damage.value *= 2; From 0b75a5210aea737e18acbbadfe3013fed30136df Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Wed, 15 May 2024 13:41:40 +0100 Subject: [PATCH 12/18] Implemented Power Split and Guard Split (#699) * Implemented Power Split and Guard Split * Update changeStat method to use summonData for Pokemon stats This commit modifies the `changeStat` method in the `Pokemon` class to use the `summonData` object for updating Pokemon stats instead of directly modifying the `stats` object. This change ensures that the updated stats are correctly reflected in the `summonData` object, which is used for battle calculations and other related operations. Refactor the `getStat` method to check if `summonData` exists and return the corresponding stat value from `summonData.stats` if it does. Otherwise, return the stat value from the `stats` object. This change improves the accuracy of stat calculations during battles and ensures consistency between the `stats` and `summonData` objects. * Added documentation for Power Split and Guard Split + linting * removed incorrect files * Removed incorrect folder * removed unnecessary import * Added documentation for getStat and changeSummonStat methods * New description for getStat() * Adjusting function descriptions * adjusted descriptions according to guideline --------- Co-authored-by: Frederico Santos --- src/data/move.ts | 84 +++++++++++++++++++++++++++++++++++++- src/field/pokemon.ts | 22 +++++++++- src/system/pokemon-data.ts | 1 + 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 46216eb75..aa722b29e 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2005,6 +2005,86 @@ export class HpSplitAttr extends MoveEffectAttr { } } +/** + * Attribute used for moves which split the user and the target's offensive raw stats. + * @extends MoveEffectAttr + * @see {@link apply} +*/ +export class PowerSplitAttr extends MoveEffectAttr { + + /** + * Applying Power Split to the user and the target. + * @param user The pokemon using the move. {@link Pokemon} + * @param target The targeted pokemon of the move. {@link Pokemon} + * @param move The move used. {@link Move} + * @param args N/A + * @returns True if power split is applied successfully. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]) : Promise { + return new Promise(resolve => { + + if (!super.apply(user, target, move, args)) + return resolve(false); + + const infoUpdates = []; + + const attackValue = Math.floor((target.getStat(Stat.ATK) + user.getStat(Stat.ATK)) / 2); + user.changeSummonStat(Stat.ATK, attackValue); + infoUpdates.push(user.updateInfo()); + target.changeSummonStat(Stat.ATK, attackValue); + infoUpdates.push(target.updateInfo()); + + const specialAttackValue = Math.floor((target.getStat(Stat.SPATK) + user.getStat(Stat.SPATK)) / 2); + user.changeSummonStat(Stat.SPATK, specialAttackValue); + infoUpdates.push(user.updateInfo()); + target.changeSummonStat(Stat.SPATK, specialAttackValue); + infoUpdates.push(target.updateInfo()); + + return Promise.all(infoUpdates).then(() => resolve(true)); + }); + } +} + +/** + * Attribute used for moves which split the user and the target's defensive raw stats. + * @extends MoveEffectAttr + * @see {@link apply} +*/ +export class GuardSplitAttr extends MoveEffectAttr { + /** + * Applying Guard Split to the user and the target. + * @param user The pokemon using the move. {@link Pokemon} + * @param target The targeted pokemon of the move. {@link Pokemon} + * @param move The move used. {@link Move} + * @param args N/A + * @returns True if power split is applied successfully. + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + return new Promise(resolve => { + if (!super.apply(user, target, move, args)) + return resolve(false); + + const infoUpdates = []; + + const defenseValue = Math.floor((target.getStat(Stat.DEF) + user.getStat(Stat.DEF)) / 2); + user.changeSummonStat(Stat.DEF, defenseValue); + infoUpdates.push(user.updateInfo()); + target.changeSummonStat(Stat.DEF, defenseValue); + infoUpdates.push(target.updateInfo()); + + const specialDefenseValue = Math.floor((target.getStat(Stat.SPDEF) + user.getStat(Stat.SPDEF)) / 2); + user.changeSummonStat(Stat.SPDEF, specialDefenseValue); + infoUpdates.push(user.updateInfo()); + target.changeSummonStat(Stat.SPDEF, specialDefenseValue); + infoUpdates.push(target.updateInfo()); + + + return Promise.all(infoUpdates).then(() => resolve(true)); + }); + } + +} + export class VariablePowerAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { //const power = args[0] as Utils.NumberHolder; @@ -5664,9 +5744,9 @@ export function initMoves() { .target(MoveTarget.USER_SIDE) .unimplemented(), new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) - .unimplemented(), + .attr(GuardSplitAttr), new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) - .unimplemented(), + .attr(PowerSplitAttr), new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 48287cf39..8d6b11ae9 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -544,8 +544,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + /** + * Returns the value of the specified stat. + * @param stat Stat to get the value of. {@link Stat} + * @returns The value of the stat. If the pokemon is already summoned, it uses those values, otherwise uses the base stats. + */ getStat(stat: Stat): integer { - return this.stats[stat]; + if (!this.summonData) { + return this.stats[stat]; + } + + return this.summonData.stats[stat]; } getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer { @@ -1708,6 +1717,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return healAmount; } + /** + * Sets a specific stat to a specific value. + * Used for summon data, while the pokemon is out until the next time it is retrieved. + * @param stat Stat to change. {@link Stat} + * @param value Amount to set the stat to. + */ + changeSummonStat(stat: Stat, value: integer) : void { + this.summonData.stats[stat] = value; + } + isBossImmune(): boolean { return this.isBoss(); } @@ -2166,6 +2185,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.battleData) this.resetBattleData(); this.resetBattleSummonData(); + this.summonData.stats = this.stats; if (this.summonDataPrimer) { for (let k of Object.keys(this.summonData)) { if (this.summonDataPrimer[k]) diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index dfbb9be57..dcf4a5744 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -112,6 +112,7 @@ export default class PokemonData { this.summonData = new PokemonSummonData(); if (!forHistory && source.summonData) { this.summonData.battleStats = source.summonData.battleStats; + this.summonData.stats = source.summonData.stats; this.summonData.moveQueue = source.summonData.moveQueue; this.summonData.disabledMove = source.summonData.disabledMove; this.summonData.disabledTurns = source.summonData.disabledTurns; From 58e59369edb584829cac2d900abf90e71836ab7c Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 09:12:03 -0400 Subject: [PATCH 13/18] Revert "Readded removed args, inverted 'simulated' instead of removing (#874)" This reverts commit e89dbad5f1b0ac284a83fbe077f9e708ea850575. --- 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 4128f22e2..0ff03ed67 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1755,7 +1755,7 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(this.immuneEffects[0]) : 'status problems'}!`); + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : 'status problems'}!`); } } @@ -2825,7 +2825,7 @@ export function applyPostStatChangeAbAttrs(attrType: { new(...args: any[]): Post export function applyPreSetStatusAbAttrs(attrType: { new(...args: any[]): PreSetStatusAbAttr }, pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, simulated); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); } export function applyPreApplyBattlerTagAbAttrs(attrType: { new(...args: any[]): PreApplyBattlerTagAbAttr }, From 5f3fd17fddea2f03d4c1491ef61f52627a361c29 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 09:42:45 -0400 Subject: [PATCH 14/18] Add Quick Claw item --- public/images/items.json | 6355 ++++++++++++++-------------- public/images/items.png | Bin 50853 -> 51675 bytes public/images/items/quick_claw.png | Bin 0 -> 217 bytes src/modifier/modifier-type.ts | 6 + src/modifier/modifier.ts | 34 + src/phases.ts | 13 +- 6 files changed, 3240 insertions(+), 3168 deletions(-) create mode 100644 public/images/items/quick_claw.png diff --git a/public/images/items.json b/public/images/items.json index 939b3927e..05f715ff0 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 396, - "h": 396 + "w": 399, + "h": 399 }, "scale": 1, "frames": [ @@ -555,6 +555,27 @@ "h": 20 } }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 382, + "y": 0, + "w": 17, + "h": 24 + } + }, { "filename": "catching_charm", "rotated": false, @@ -703,7 +724,7 @@ } }, { - "filename": "mega_bracelet", + "filename": "coupon", "rotated": false, "trimmed": true, "sourceSize": { @@ -711,20 +732,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { "x": 0, "y": 380, - "w": 20, - "h": 16 + "w": 23, + "h": 19 } }, { - "filename": "relic_band", + "filename": "golden_mystic_ticket", "rotated": false, "trimmed": true, "sourceSize": { @@ -732,16 +753,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { - "x": 20, + "x": 23, "y": 380, - "w": 17, - "h": 16 + "w": 23, + "h": 19 } }, { @@ -1039,7 +1060,7 @@ } }, { - "filename": "elixir", + "filename": "oval_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1047,15 +1068,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 4, - "w": 18, + "w": 21, "h": 24 }, "frame": { "x": 378, - "y": 20, - "w": 18, + "y": 24, + "w": 21, "h": 24 } }, @@ -1102,7 +1123,7 @@ } }, { - "filename": "oval_charm", + "filename": "red_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -1112,13 +1133,13 @@ "spriteSourceSize": { "x": 6, "y": 4, - "w": 21, + "w": 20, "h": 24 }, "frame": { "x": 24, "y": 224, - "w": 21, + "w": 20, "h": 24 } }, @@ -1228,7 +1249,7 @@ } }, { - "filename": "abomasite", + "filename": "mega_bracelet", "rotated": false, "trimmed": true, "sourceSize": { @@ -1236,83 +1257,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 8, - "w": 16, + "w": 20, "h": 16 }, "frame": { "x": 24, "y": 364, - "w": 16, + "w": 20, "h": 16 } }, { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 37, - "y": 380, - "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": 40, - "y": 364, - "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": 53, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "ether", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -1333,7 +1291,7 @@ } }, { - "filename": "full_restore", + "filename": "ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -1354,7 +1312,7 @@ } }, { - "filename": "max_elixir", + "filename": "full_restore", "rotated": false, "trimmed": true, "sourceSize": { @@ -1417,7 +1375,7 @@ } }, { - "filename": "max_ether", + "filename": "max_elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -1438,7 +1396,7 @@ } }, { - "filename": "hp_up", + "filename": "max_ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -1446,20 +1404,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 7, "y": 4, - "w": 16, + "w": 18, "h": 24 }, "frame": { - "x": 45, + "x": 44, "y": 224, - "w": 16, + "w": 18, "h": 24 } }, { - "filename": "iron", + "filename": "hp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -1480,7 +1438,7 @@ } }, { - "filename": "lure", + "filename": "iron", "rotated": false, "trimmed": true, "sourceSize": { @@ -1490,13 +1448,13 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 17, + "w": 16, "h": 24 }, "frame": { "x": 47, "y": 272, - "w": 17, + "w": 16, "h": 24 } }, @@ -1563,69 +1521,6 @@ "h": 23 } }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 56, - "y": 364, - "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": 69, - "y": 380, - "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": 382, - "y": 0, - "w": 12, - "h": 17 - } - }, { "filename": "ability_capsule", "rotated": false, @@ -1641,12 +1536,33 @@ "h": 14 }, "frame": { - "x": 138, - "y": 46, + "x": 44, + "y": 364, "w": 24, "h": 14 } }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 46, + "y": 378, + "w": 23, + "h": 21 + } + }, { "filename": "choice_specs", "rotated": false, @@ -1662,29 +1578,8 @@ "h": 18 }, "frame": { - "x": 162, - "y": 45, - "w": 24, - "h": 18 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 186, - "y": 45, + "x": 138, + "y": 46, "w": 24, "h": 18 } @@ -1704,7 +1599,7 @@ "h": 22 }, "frame": { - "x": 210, + "x": 162, "y": 45, "w": 24, "h": 22 @@ -1725,7 +1620,7 @@ "h": 22 }, "frame": { - "x": 234, + "x": 186, "y": 45, "w": 24, "h": 22 @@ -1746,7 +1641,7 @@ "h": 23 }, "frame": { - "x": 258, + "x": 210, "y": 45, "w": 24, "h": 23 @@ -1767,7 +1662,7 @@ "h": 23 }, "frame": { - "x": 282, + "x": 234, "y": 45, "w": 24, "h": 23 @@ -1788,8 +1683,8 @@ "h": 23 }, "frame": { - "x": 306, - "y": 44, + "x": 258, + "y": 45, "w": 24, "h": 23 } @@ -1809,56 +1704,14 @@ "h": 22 }, "frame": { - "x": 330, - "y": 43, + "x": 282, + "y": 45, "w": 24, "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": 354, - "y": 43, - "w": 23, - "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": 377, - "y": 44, - "w": 19, - "h": 22 - } - }, - { - "filename": "icy_reins_of_unity", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -1867,141 +1720,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 330, - "y": 65, - "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": 354, - "y": 65, - "w": 23, - "h": 21 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 377, - "y": 66, - "w": 19, - "h": 22 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 + "h": 23 }, "frame": { "x": 306, - "y": 67, - "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": 330, - "y": 85, - "w": 24, - "h": 20 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, + "y": 44, "w": 23, - "h": 21 - }, - "frame": { - "x": 354, - "y": 86, - "w": 23, - "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": 377, - "y": 88, - "w": 19, - "h": 21 + "h": 23 } }, { @@ -2026,7 +1753,7 @@ } }, { - "filename": "red_orb", + "filename": "super_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -2034,102 +1761,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 8, "y": 4, - "w": 20, + "w": 17, "h": 24 }, "frame": { "x": 61, "y": 200, - "w": 20, + "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": 61, - "y": 224, - "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": 63, - "y": 247, - "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": 64, - "y": 270, - "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": 64, - "y": 293, - "w": 22, - "h": 23 - } - }, { "filename": "max_repel", "rotated": false, @@ -2145,8 +1788,8 @@ "h": 24 }, "frame": { - "x": 70, - "y": 316, + "x": 62, + "y": 224, "w": 16, "h": 24 } @@ -2166,14 +1809,14 @@ "h": 24 }, "frame": { - "x": 70, - "y": 340, + "x": 63, + "y": 248, "w": 16, "h": 24 } }, { - "filename": "ampharosite", + "filename": "pp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -2182,19 +1825,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 4, "w": 16, - "h": 16 + "h": 24 }, "frame": { - "x": 72, - "y": 364, + "x": 63, + "y": 272, "w": 16, - "h": 16 + "h": 24 } }, { - "filename": "audinite", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -2203,15 +1846,225 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 4, "w": 16, - "h": 16 + "h": 24 }, "frame": { - "x": 85, - "y": 380, + "x": 64, + "y": 296, "w": 16, - "h": 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": 70, + "y": 320, + "w": 16, + "h": 24 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 70, + "y": 344, + "w": 19, + "h": 20 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 69, + "y": 364, + "w": 22, + "h": 23 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 69, + "y": 387, + "w": 15, + "h": 11 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 330, + "y": 43, + "w": 24, + "h": 18 + } + }, + { + "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": 354, + "y": 43, + "w": 24, + "h": 20 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 378, + "y": 48, + "w": 21, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 329, + "y": 61, + "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": 353, + "y": 63, + "w": 24, + "h": 20 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 377, + "y": 71, + "w": 22, + "h": 23 } }, { @@ -2256,6 +2109,27 @@ "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": 115, + "y": 50, + "w": 23, + "h": 21 + } + }, { "filename": "binding_band", "rotated": false, @@ -2271,8 +2145,8 @@ "h": 20 }, "frame": { - "x": 115, - "y": 50, + "x": 138, + "y": 64, "w": 23, "h": 20 } @@ -2292,8 +2166,8 @@ "h": 17 }, "frame": { - "x": 138, - "y": 60, + "x": 161, + "y": 67, "w": 23, "h": 17 } @@ -2313,8 +2187,8 @@ "h": 17 }, "frame": { - "x": 161, - "y": 63, + "x": 184, + "y": 67, "w": 23, "h": 17 } @@ -2334,14 +2208,14 @@ "h": 17 }, "frame": { - "x": 184, - "y": 63, + "x": 207, + "y": 68, "w": 23, "h": 17 } }, { - "filename": "coupon", + "filename": "douse_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -2350,36 +2224,99 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 8, "w": 23, - "h": 19 - }, - "frame": { - "x": 207, - "y": 67, - "w": 23, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "h": 17 }, "frame": { "x": 230, + "y": 68, + "w": 23, + "h": 17 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 253, + "y": 68, + "w": 23, + "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": 276, + "y": 68, + "w": 18, + "h": 22 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 294, "y": 67, "w": 23, - "h": 19 + "h": 23 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 317, + "y": 67, + "w": 12, + "h": 17 } }, { @@ -2397,8 +2334,8 @@ "h": 21 }, "frame": { - "x": 253, - "y": 68, + "x": 60, + "y": 70, "w": 23, "h": 21 } @@ -2418,73 +2355,10 @@ "h": 21 }, "frame": { - "x": 276, - "y": 68, - "w": 23, - "h": 21 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 60, + "x": 83, "y": 70, "w": 23, - "h": 17 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 57, - "y": 87, - "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": 57, - "y": 110, - "w": 23, - "h": 23 + "h": 21 } }, { @@ -2503,13 +2377,13 @@ }, "frame": { "x": 57, - "y": 133, + "y": 91, "w": 23, "h": 23 } }, { - "filename": "apicot_berry", + "filename": "dragon_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2518,36 +2392,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 20 + "y": 4, + "w": 22, + "h": 23 }, "frame": { - "x": 63, - "y": 156, - "w": 19, - "h": 20 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 83, - "y": 70, - "w": 23, - "h": 19 + "x": 80, + "y": 91, + "w": 22, + "h": 23 } }, { @@ -2565,12 +2418,33 @@ "h": 23 }, "frame": { - "x": 80, - "y": 89, + "x": 57, + "y": 114, "w": 22, "h": 23 } }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 57, + "y": 137, + "w": 16, + "h": 24 + } + }, { "filename": "fairy_tera_shard", "rotated": false, @@ -2586,14 +2460,14 @@ "h": 23 }, "frame": { - "x": 80, - "y": 112, + "x": 79, + "y": 114, "w": 22, "h": 23 } }, { - "filename": "deep_sea_tooth", + "filename": "fighting_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2601,16 +2475,58 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, + "x": 6, + "y": 4, "w": 22, - "h": 21 + "h": 23 }, "frame": { - "x": 80, - "y": 135, + "x": 73, + "y": 137, "w": 22, - "h": 21 + "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": 63, + "y": 161, + "w": 16, + "h": 15 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 79, + "y": 160, + "w": 16, + "h": 24 } }, { @@ -2629,13 +2545,13 @@ }, "frame": { "x": 106, - "y": 70, + "y": 71, "w": 23, "h": 21 } }, { - "filename": "fighting_tera_shard", + "filename": "rusted_sword", "rotated": false, "trimmed": true, "sourceSize": { @@ -2643,16 +2559,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 5, + "w": 23, + "h": 22 }, "frame": { "x": 102, - "y": 91, - "w": 22, - "h": 23 + "y": 92, + "w": 23, + "h": 22 } }, { @@ -2670,54 +2586,12 @@ "h": 23 }, "frame": { - "x": 102, + "x": 101, "y": 114, "w": 22, "h": 23 } }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 102, - "y": 137, - "w": 22, - "h": 19 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 82, - "y": 156, - "w": 23, - "h": 20 - } - }, { "filename": "fire_tera_shard", "rotated": false, @@ -2733,8 +2607,8 @@ "h": 23 }, "frame": { - "x": 79, - "y": 176, + "x": 95, + "y": 137, "w": 22, "h": 23 } @@ -2754,12 +2628,33 @@ "h": 23 }, "frame": { - "x": 81, - "y": 199, + "x": 95, + "y": 160, "w": 22, "h": 23 } }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 79, + "y": 184, + "w": 16, + "h": 16 + } + }, { "filename": "focus_sash", "rotated": false, @@ -2775,8 +2670,8 @@ "h": 23 }, "frame": { - "x": 83, - "y": 222, + "x": 78, + "y": 200, "w": 22, "h": 23 } @@ -2796,12 +2691,33 @@ "h": 23 }, "frame": { - "x": 85, - "y": 245, + "x": 78, + "y": 223, "w": 22, "h": 23 } }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 95, + "y": 183, + "w": 23, + "h": 17 + } + }, { "filename": "grass_tera_shard", "rotated": false, @@ -2817,8 +2733,8 @@ "h": 23 }, "frame": { - "x": 85, - "y": 268, + "x": 79, + "y": 246, "w": 22, "h": 23 } @@ -2838,8 +2754,8 @@ "h": 23 }, "frame": { - "x": 86, - "y": 291, + "x": 79, + "y": 269, "w": 22, "h": 23 } @@ -2859,8 +2775,8 @@ "h": 23 }, "frame": { - "x": 86, - "y": 314, + "x": 100, + "y": 200, "w": 22, "h": 23 } @@ -2880,92 +2796,8 @@ "h": 23 }, "frame": { - "x": 86, - "y": 337, - "w": 22, - "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": 88, - "y": 360, - "w": 20, - "h": 20 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 101, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 105, - "y": 156, - "w": 20, - "h": 20 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 101, - "y": 176, + "x": 100, + "y": 223, "w": 22, "h": 23 } @@ -2985,8 +2817,8 @@ "h": 23 }, "frame": { - "x": 103, - "y": 199, + "x": 101, + "y": 246, "w": 21, "h": 23 } @@ -3006,12 +2838,33 @@ "h": 23 }, "frame": { - "x": 105, - "y": 222, + "x": 101, + "y": 269, "w": 21, "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": 80, + "y": 292, + "w": 22, + "h": 23 + } + }, { "filename": "mystic_water", "rotated": false, @@ -3027,8 +2880,8 @@ "h": 23 }, "frame": { - "x": 107, - "y": 245, + "x": 102, + "y": 292, "w": 20, "h": 23 } @@ -3048,12 +2901,33 @@ "h": 23 }, "frame": { - "x": 107, - "y": 268, + "x": 86, + "y": 315, "w": 22, "h": 23 } }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 108, + "y": 315, + "w": 15, + "h": 23 + } + }, { "filename": "poison_tera_shard", "rotated": false, @@ -3069,8 +2943,8 @@ "h": 23 }, "frame": { - "x": 108, - "y": 291, + "x": 89, + "y": 338, "w": 22, "h": 23 } @@ -3090,56 +2964,14 @@ "h": 23 }, "frame": { - "x": 108, - "y": 314, + "x": 91, + "y": 361, "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": 108, - "y": 337, - "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": 108, - "y": 360, - "w": 22, - "h": 20 - } - }, - { - "filename": "beedrillite", + "filename": "hyper_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -3148,246 +2980,78 @@ }, "spriteSourceSize": { "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 111, + "y": 338, + "w": 17, + "h": 23 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 113, + "y": 361, + "w": 17, + "h": 23 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 91, + "y": 384, + "w": 15, + "h": 15 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, "w": 16, - "h": 16 + "h": 24 }, "frame": { "x": 117, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, + "y": 137, "w": 16, "h": 24 - }, - "frame": { - "x": 124, - "y": 91, - "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": 124, - "y": 115, - "w": 16, - "h": 24 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 124, - "y": 139, - "w": 20, - "h": 17 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 125, - "y": 156, - "w": 19, - "h": 20 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 123, - "y": 176, - "w": 22, - "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": 124, - "y": 199, - "w": 21, - "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": 126, - "y": 222, - "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": 127, - "y": 245, - "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": 129, - "y": 268, - "w": 22, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 130, - "y": 291, - "w": 21, - "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": 130, - "y": 314, - "w": 22, - "h": 23 } }, { @@ -3405,533 +3069,8 @@ "h": 22 }, "frame": { - "x": 130, - "y": 337, - "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": 130, - "y": 359, - "w": 22, - "h": 21 - } - }, - { - "filename": "blastoisinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 133, - "y": 380, - "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": 149, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 140, - "y": 77, - "w": 21, - "h": 21 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 140, - "y": 98, - "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": 140, - "y": 120, - "w": 22, - "h": 19 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 161, - "y": 80, - "w": 23, - "h": 18 - } - }, - { - "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": 80, - "w": 23, - "h": 19 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 162, - "y": 98, - "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": 184, - "y": 99, - "w": 23, - "h": 22 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 207, - "y": 86, - "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": 229, - "y": 86, - "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": 162, - "y": 120, - "w": 22, - "h": 20 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 144, - "y": 139, - "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": 162, - "y": 140, - "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": 184, - "y": 121, - "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": 184, - "y": 143, - "w": 22, - "h": 22 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 251, - "y": 89, - "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": 274, - "y": 89, - "w": 23, - "h": 21 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 207, - "y": 108, - "w": 23, - "h": 17 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 206, - "y": 125, - "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": 206, - "y": 147, - "w": 22, - "h": 20 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 230, - "y": 108, - "w": 21, - "h": 18 - } - }, - { - "filename": "memory_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 228, - "y": 126, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 228, - "y": 148, + "x": 117, + "y": 161, "w": 22, "h": 22 } @@ -3951,12 +3090,579 @@ "h": 17 }, "frame": { - "x": 251, - "y": 109, + "x": 118, + "y": 183, "w": 23, "h": 17 } }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 122, + "y": 200, + "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": 122, + "y": 223, + "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": 122, + "y": 246, + "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": 122, + "y": 269, + "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": 122, + "y": 292, + "w": 22, + "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": 123, + "y": 315, + "w": 21, + "h": 23 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 128, + "y": 338, + "w": 18, + "h": 23 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 130, + "y": 361, + "w": 17, + "h": 23 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 123, + "y": 114, + "w": 21, + "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": 125, + "y": 92, + "w": 22, + "h": 22 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 147, + "y": 84, + "w": 22, + "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": 169, + "y": 84, + "w": 22, + "h": 22 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 191, + "y": 84, + "w": 15, + "h": 22 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 206, + "y": 85, + "w": 23, + "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": 229, + "y": 85, + "w": 22, + "h": 21 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 251, + "y": 90, + "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": 274, + "y": 90, + "w": 23, + "h": 19 + } + }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 297, + "y": 90, + "w": 20, + "h": 20 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 317, + "y": 84, + "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": 133, + "y": 137, + "w": 22, + "h": 22 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 139, + "y": 159, + "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": 141, + "y": 181, + "w": 22, + "h": 19 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 144, + "y": 200, + "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": 144, + "y": 222, + "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": 144, + "y": 244, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 144, + "y": 266, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 144, + "y": 288, + "w": 22, + "h": 22 + } + }, { "filename": "memory_dragon", "rotated": false, @@ -3972,701 +3678,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 126, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 250, - "y": 148, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 274, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 272, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 272, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 145, - "y": 162, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 145, - "y": 184, - "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": 167, - "y": 162, - "w": 17, - "h": 24 - } - }, - { - "filename": "memory_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 184, - "y": 165, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 206, - "y": 167, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 228, - "y": 170, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 250, - "y": 170, - "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": 250, - "y": 170, - "w": 22, - "h": 22 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 167, - "y": 186, - "w": 17, - "h": 20 - } - }, - { - "filename": "memory_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 184, - "y": 187, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 206, - "y": 189, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 228, - "y": 192, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 250, - "y": 192, - "w": 22, - "h": 22 - } - }, - { - "filename": "memory_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 272, - "y": 176, - "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": 272, - "y": 198, - "w": 22, - "h": 22 - } - }, - { - "filename": "cameruptite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 145, - "y": 206, - "w": 16, - "h": 16 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 161, - "y": 206, - "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": 183, - "y": 209, - "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": 205, - "y": 211, - "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": 227, - "y": 214, - "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": 249, - "y": 214, - "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": 271, - "y": 220, - "w": 22, - "h": 21 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 294, - "y": 132, - "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": 294, - "y": 156, - "w": 16, - "h": 24 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 294, - "y": 180, - "w": 16, - "h": 24 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 310, - "y": 87, - "w": 20, - "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": 296, - "y": 110, - "w": 18, - "h": 22 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 314, - "y": 108, - "w": 16, - "h": 24 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 330, - "y": 105, + "x": 144, + "y": 310, "w": 22, "h": 22 } @@ -4686,12 +3699,915 @@ "h": 22 }, "frame": { - "x": 310, - "y": 132, + "x": 146, + "y": 332, "w": 20, "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": 147, + "y": 354, + "w": 19, + "h": 22 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 147, + "y": 107, + "w": 22, + "h": 20 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 169, + "y": 106, + "w": 22, + "h": 21 + } + }, + { + "filename": "memory_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 191, + "y": 106, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 213, + "y": 106, + "w": 22, + "h": 22 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 235, + "y": 106, + "w": 16, + "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": 251, + "y": 109, + "w": 23, + "h": 18 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 274, + "y": 109, + "w": 23, + "h": 20 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 297, + "y": 110, + "w": 20, + "h": 20 + } + }, + { + "filename": "memory_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 317, + "y": 106, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 155, + "y": 127, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 339, + "y": 83, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 339, + "y": 105, + "w": 22, + "h": 22 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 361, + "y": 83, + "w": 16, + "h": 16 + } + }, + { + "filename": "memory_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 377, + "y": 94, + "w": 22, + "h": 22 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 361, + "y": 99, + "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": 361, + "y": 115, + "w": 16, + "h": 16 + } + }, + { + "filename": "memory_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 377, + "y": 116, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 177, + "y": 128, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 199, + "y": 128, + "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": 199, + "y": 128, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 221, + "y": 128, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 243, + "y": 127, + "w": 22, + "h": 22 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 265, + "y": 129, + "w": 23, + "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": 288, + "y": 130, + "w": 22, + "h": 19 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 147, + "y": 376, + "w": 19, + "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": 339, + "y": 127, + "w": 22, + "h": 20 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 317, + "y": 128, + "w": 22, + "h": 20 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 361, + "y": 131, + "w": 16, + "h": 16 + } + }, + { + "filename": "memory_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 377, + "y": 138, + "w": 22, + "h": 22 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 161, + "y": 149, + "w": 16, + "h": 16 + } + }, + { + "filename": "memory_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 177, + "y": 150, + "w": 22, + "h": 22 + } + }, + { + "filename": "memory_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 199, + "y": 150, + "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": 221, + "y": 150, + "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": 243, + "y": 149, + "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": 265, + "y": 149, + "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": 287, + "y": 149, + "w": 22, + "h": 22 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 161, + "y": 165, + "w": 16, + "h": 16 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 163, + "y": 181, + "w": 20, + "h": 19 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 166, + "y": 200, + "w": 19, + "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": 166, + "y": 222, + "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": 166, + "y": 244, + "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": 166, + "y": 266, + "w": 22, + "h": 22 + } + }, { "filename": "tm_bug", "rotated": false, @@ -4707,33 +4623,12 @@ "h": 22 }, "frame": { - "x": 330, - "y": 127, + "x": 166, + "y": 288, "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": 310, - "y": 154, - "w": 20, - "h": 22 - } - }, { "filename": "tm_dark", "rotated": false, @@ -4749,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 330, - "y": 149, + "x": 166, + "y": 310, "w": 22, "h": 22 } @@ -4770,8 +4665,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 107, + "x": 166, + "y": 332, "w": 22, "h": 22 } @@ -4791,12 +4686,33 @@ "h": 22 }, "frame": { - "x": 374, - "y": 109, + "x": 166, + "y": 354, "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": 166, + "y": 376, + "w": 22, + "h": 21 + } + }, { "filename": "tm_fairy", "rotated": false, @@ -4812,8 +4728,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 129, + "x": 183, + "y": 172, "w": 22, "h": 22 } @@ -4833,14 +4749,14 @@ "h": 22 }, "frame": { - "x": 374, - "y": 131, + "x": 205, + "y": 172, "w": 22, "h": 22 } }, { - "filename": "syrupy_apple", + "filename": "metronome", "rotated": false, "trimmed": true, "sourceSize": { @@ -4848,16 +4764,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 + "x": 7, + "y": 5, + "w": 17, + "h": 22 }, "frame": { - "x": 352, - "y": 151, - "w": 22, - "h": 21 + "x": 227, + "y": 172, + "w": 17, + "h": 22 } }, { @@ -4875,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 374, - "y": 153, + "x": 244, + "y": 171, "w": 22, "h": 22 } @@ -4896,54 +4812,12 @@ "h": 22 }, "frame": { - "x": 310, - "y": 176, + "x": 266, + "y": 171, "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": 332, - "y": 171, - "w": 20, - "h": 20 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 352, - "y": 172, - "w": 22, - "h": 21 - } - }, { "filename": "tm_ghost", "rotated": false, @@ -4959,54 +4833,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 175, + "x": 288, + "y": 171, "w": 22, "h": 22 } }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 294, - "y": 204, - "w": 19, - "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": 293, - "y": 223, - "w": 20, - "h": 19 - } - }, { "filename": "tm_grass", "rotated": false, @@ -5022,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 313, - "y": 198, + "x": 185, + "y": 194, "w": 22, "h": 22 } @@ -5043,33 +4875,12 @@ "h": 22 }, "frame": { - "x": 313, - "y": 220, + "x": 207, + "y": 194, "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": 335, - "y": 191, - "w": 17, - "h": 23 - } - }, { "filename": "tm_ice", "rotated": false, @@ -5085,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 193, + "x": 188, + "y": 216, "w": 22, "h": 22 } @@ -5106,33 +4917,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 197, + "x": 188, + "y": 238, "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": 335, - "y": 214, - "w": 17, - "h": 23 - } - }, { "filename": "tm_psychic", "rotated": false, @@ -5148,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 215, + "x": 188, + "y": 260, "w": 22, "h": 22 } @@ -5169,54 +4959,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 219, + "x": 188, + "y": 282, "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": 335, - "y": 237, - "w": 22, - "h": 20 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 357, - "y": 237, - "w": 17, - "h": 20 - } - }, { "filename": "tm_steel", "rotated": false, @@ -5232,33 +4980,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 241, + "x": 188, + "y": 304, "w": 22, "h": 22 } }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 165, - "y": 228, - "w": 18, - "h": 18 - } - }, { "filename": "tm_water", "rotated": false, @@ -5274,8 +5001,8 @@ "h": 22 }, "frame": { - "x": 183, - "y": 231, + "x": 188, + "y": 326, "w": 22, "h": 22 } @@ -5295,33 +5022,12 @@ "h": 22 }, "frame": { - "x": 205, - "y": 233, + "x": 188, + "y": 348, "w": 22, "h": 22 } }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 227, - "y": 236, - "w": 22, - "h": 19 - } - }, { "filename": "x_accuracy", "rotated": false, @@ -5337,12 +5043,33 @@ "h": 22 }, "frame": { - "x": 249, - "y": 236, + "x": 188, + "y": 370, "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": 210, + "y": 216, + "w": 20, + "h": 22 + } + }, { "filename": "x_attack", "rotated": false, @@ -5358,8 +5085,8 @@ "h": 22 }, "frame": { - "x": 271, - "y": 241, + "x": 210, + "y": 238, "w": 22, "h": 22 } @@ -5379,33 +5106,12 @@ "h": 22 }, "frame": { - "x": 293, - "y": 242, + "x": 210, + "y": 260, "w": 22, "h": 22 } }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 315, - "y": 242, - "w": 20, - "h": 20 - } - }, { "filename": "x_sp_atk", "rotated": false, @@ -5421,8 +5127,8 @@ "h": 22 }, "frame": { - "x": 149, - "y": 246, + "x": 210, + "y": 282, "w": 22, "h": 22 } @@ -5442,8 +5148,8 @@ "h": 22 }, "frame": { - "x": 151, - "y": 268, + "x": 210, + "y": 304, "w": 22, "h": 22 } @@ -5463,12 +5169,96 @@ "h": 22 }, "frame": { - "x": 151, - "y": 290, + "x": 210, + "y": 326, "w": 22, "h": 22 } }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 210, + "y": 348, + "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": 210, + "y": 369, + "w": 22, + "h": 21 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 229, + "y": 194, + "w": 17, + "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": 246, + "y": 193, + "w": 21, + "h": 21 + } + }, { "filename": "poison_barb", "rotated": false, @@ -5484,8 +5274,8 @@ "h": 21 }, "frame": { - "x": 152, - "y": 312, + "x": 267, + "y": 193, "w": 21, "h": 21 } @@ -5505,12 +5295,117 @@ "h": 21 }, "frame": { - "x": 152, - "y": 333, + "x": 288, + "y": 193, "w": 21, "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": 230, + "y": 216, + "w": 20, + "h": 21 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 250, + "y": 214, + "w": 22, + "h": 20 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 272, + "y": 214, + "w": 22, + "h": 19 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 232, + "y": 237, + "w": 19, + "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": 232, + "y": 258, + "w": 19, + "h": 21 + } + }, { "filename": "zoom_lens", "rotated": false, @@ -5526,35 +5421,14 @@ "h": 21 }, "frame": { - "x": 152, - "y": 354, + "x": 232, + "y": 279, "w": 21, "h": 21 } }, { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 149, - "y": 228, - "w": 16, - "h": 18 - } - }, - { - "filename": "metal_alloy", + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -5563,19 +5437,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, - "w": 21, - "h": 19 + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 335, - "y": 257, - "w": 21, - "h": 19 + "x": 232, + "y": 300, + "w": 20, + "h": 20 } }, { - "filename": "oval_stone", + "filename": "magnet", "rotated": false, "trimmed": true, "sourceSize": { @@ -5583,16 +5457,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 356, - "y": 257, - "w": 18, - "h": 19 + "x": 232, + "y": 320, + "w": 20, + "h": 20 } }, { @@ -5610,75 +5484,12 @@ "h": 20 }, "frame": { - "x": 315, - "y": 262, + "x": 232, + "y": 340, "w": 20, "h": 20 } }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 374, - "y": 263, - "w": 21, - "h": 18 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 335, - "y": 276, - "w": 21, - "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": 356, - "y": 276, - "w": 18, - "h": 18 - } - }, { "filename": "pb", "rotated": false, @@ -5694,161 +5505,14 @@ "h": 20 }, "frame": { - "x": 374, - "y": 281, + "x": 232, + "y": 360, "w": 20, "h": 20 } }, { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 173, - "y": 282, - "w": 15, - "h": 23 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 173, - "y": 305, - "w": 17, - "h": 23 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 173, - "y": 328, - "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": 173, - "y": 350, - "w": 17, - "h": 22 - } - }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 173, - "y": 264, - "w": 18, - "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": 171, - "y": 253, - "w": 15, - "h": 11 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 188, - "y": 282, - "w": 15, - "h": 22 - } - }, - { - "filename": "hard_stone", + "filename": "metal_alloy", "rotated": false, "trimmed": true, "sourceSize": { @@ -5857,15 +5521,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 20 + "y": 7, + "w": 21, + "h": 19 }, "frame": { - "x": 190, - "y": 304, - "w": 19, - "h": 20 + "x": 232, + "y": 380, + "w": 21, + "h": 19 } }, { @@ -5883,8 +5547,8 @@ "h": 20 }, "frame": { - "x": 190, - "y": 324, + "x": 251, + "y": 234, "w": 20, "h": 20 } @@ -5904,14 +5568,14 @@ "h": 20 }, "frame": { - "x": 190, - "y": 344, + "x": 251, + "y": 254, "w": 20, "h": 20 } }, { - "filename": "miracle_seed", + "filename": "candy_jar", "rotated": false, "trimmed": true, "sourceSize": { @@ -5920,15 +5584,57 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, + "y": 6, "w": 19, - "h": 19 + "h": 20 }, "frame": { - "x": 191, - "y": 263, + "x": 294, + "y": 214, "w": 19, - "h": 19 + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 253, + "y": 274, + "w": 19, + "h": 20 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 253, + "y": 294, + "w": 20, + "h": 17 } }, { @@ -5946,54 +5652,12 @@ "h": 20 }, "frame": { - "x": 210, - "y": 255, + "x": 252, + "y": 311, "w": 20, "h": 20 } }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 230, - "y": 255, - "w": 18, - "h": 20 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 248, - "y": 258, - "w": 20, - "h": 19 - } - }, { "filename": "strange_ball", "rotated": false, @@ -6009,8 +5673,8 @@ "h": 20 }, "frame": { - "x": 268, - "y": 263, + "x": 252, + "y": 331, "w": 20, "h": 20 } @@ -6030,12 +5694,138 @@ "h": 20 }, "frame": { - "x": 288, - "y": 264, + "x": 252, + "y": 351, "w": 20, "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": 253, + "y": 371, + "w": 19, + "h": 19 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 339, + "y": 147, + "w": 21, + "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": 360, + "y": 147, + "w": 17, + "h": 20 + } + }, + { + "filename": "sharp_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 377, + "y": 160, + "w": 21, + "h": 18 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 272, + "y": 233, + "w": 21, + "h": 18 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 271, + "y": 251, + "w": 20, + "h": 19 + } + }, { "filename": "wl_ability_urge", "rotated": false, @@ -6051,8 +5841,8 @@ "h": 18 }, "frame": { - "x": 190, - "y": 364, + "x": 293, + "y": 234, "w": 20, "h": 18 } @@ -6072,14 +5862,14 @@ "h": 18 }, "frame": { - "x": 210, - "y": 275, + "x": 291, + "y": 252, "w": 20, "h": 18 } }, { - "filename": "charizardite_x", + "filename": "razor_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -6087,16 +5877,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 7, + "y": 6, + "w": 18, + "h": 20 }, "frame": { - "x": 230, - "y": 275, - "w": 16, - "h": 16 + "x": 272, + "y": 270, + "w": 18, + "h": 20 } }, { @@ -6114,12 +5904,33 @@ "h": 18 }, "frame": { - "x": 246, - "y": 277, + "x": 290, + "y": 270, "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": 273, + "y": 290, + "w": 17, + "h": 20 + } + }, { "filename": "wl_burn_heal", "rotated": false, @@ -6135,8 +5946,8 @@ "h": 18 }, "frame": { - "x": 266, - "y": 283, + "x": 290, + "y": 288, "w": 20, "h": 18 } @@ -6156,12 +5967,54 @@ "h": 18 }, "frame": { - "x": 286, - "y": 284, + "x": 290, + "y": 306, "w": 20, "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": 272, + "y": 311, + "w": 18, + "h": 19 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 272, + "y": 330, + "w": 18, + "h": 18 + } + }, { "filename": "wl_custom_thief", "rotated": false, @@ -6177,12 +6030,33 @@ "h": 18 }, "frame": { - "x": 209, - "y": 293, + "x": 290, + "y": 324, "w": 20, "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": 272, + "y": 348, + "w": 18, + "h": 18 + } + }, { "filename": "wl_elixir", "rotated": false, @@ -6198,12 +6072,33 @@ "h": 18 }, "frame": { - "x": 210, - "y": 311, + "x": 290, + "y": 342, "w": 20, "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": 272, + "y": 366, + "w": 18, + "h": 18 + } + }, { "filename": "wl_ether", "rotated": false, @@ -6219,8 +6114,8 @@ "h": 18 }, "frame": { - "x": 210, - "y": 329, + "x": 290, + "y": 360, "w": 20, "h": 18 } @@ -6240,8 +6135,8 @@ "h": 18 }, "frame": { - "x": 210, - "y": 347, + "x": 290, + "y": 378, "w": 20, "h": 18 } @@ -6261,33 +6156,12 @@ "h": 18 }, "frame": { - "x": 210, - "y": 365, + "x": 311, + "y": 252, "w": 20, "h": 18 } }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 230, - "y": 291, - "w": 16, - "h": 15 - } - }, { "filename": "wl_guard_spec", "rotated": false, @@ -6303,33 +6177,12 @@ "h": 18 }, "frame": { - "x": 246, - "y": 295, + "x": 310, + "y": 270, "w": 20, "h": 18 } }, - { - "filename": "charizardite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 230, - "y": 306, - "w": 16, - "h": 16 - } - }, { "filename": "wl_hyper_potion", "rotated": false, @@ -6345,8 +6198,8 @@ "h": 18 }, "frame": { - "x": 230, - "y": 322, + "x": 310, + "y": 288, "w": 20, "h": 18 } @@ -6366,8 +6219,8 @@ "h": 18 }, "frame": { - "x": 230, - "y": 340, + "x": 310, + "y": 306, "w": 20, "h": 18 } @@ -6387,8 +6240,8 @@ "h": 18 }, "frame": { - "x": 230, - "y": 358, + "x": 310, + "y": 324, "w": 20, "h": 18 } @@ -6408,8 +6261,8 @@ "h": 18 }, "frame": { - "x": 266, - "y": 301, + "x": 310, + "y": 342, "w": 20, "h": 18 } @@ -6429,33 +6282,12 @@ "h": 18 }, "frame": { - "x": 286, - "y": 302, + "x": 310, + "y": 360, "w": 20, "h": 18 } }, - { - "filename": "diancite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 250, - "y": 313, - "w": 16, - "h": 16 - } - }, { "filename": "wl_max_ether", "rotated": false, @@ -6471,8 +6303,8 @@ "h": 18 }, "frame": { - "x": 250, - "y": 329, + "x": 310, + "y": 378, "w": 20, "h": 18 } @@ -6492,8 +6324,8 @@ "h": 18 }, "frame": { - "x": 250, - "y": 347, + "x": 309, + "y": 193, "w": 20, "h": 18 } @@ -6513,8 +6345,8 @@ "h": 18 }, "frame": { - "x": 250, - "y": 365, + "x": 313, + "y": 211, "w": 20, "h": 18 } @@ -6534,33 +6366,12 @@ "h": 18 }, "frame": { - "x": 230, - "y": 376, + "x": 313, + "y": 229, "w": 20, "h": 18 } }, - { - "filename": "galladite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 270, - "y": 319, - "w": 16, - "h": 16 - } - }, { "filename": "wl_potion", "rotated": false, @@ -6576,33 +6387,12 @@ "h": 18 }, "frame": { - "x": 286, - "y": 320, + "x": 309, + "y": 149, "w": 20, "h": 18 } }, - { - "filename": "garchompite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 270, - "y": 335, - "w": 16, - "h": 16 - } - }, { "filename": "wl_reset_urge", "rotated": false, @@ -6618,8 +6408,8 @@ "h": 18 }, "frame": { - "x": 270, - "y": 351, + "x": 310, + "y": 167, "w": 20, "h": 18 } @@ -6639,8 +6429,8 @@ "h": 18 }, "frame": { - "x": 270, - "y": 369, + "x": 330, + "y": 165, "w": 20, "h": 18 } @@ -6660,12 +6450,264 @@ "h": 18 }, "frame": { - "x": 165, - "y": 375, + "x": 350, + "y": 167, "w": 20, "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": 333, + "y": 183, + "w": 17, + "h": 16 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 350, + "y": 185, + "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": 333, + "y": 199, + "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": 333, + "y": 215, + "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": 333, + "y": 231, + "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": 349, + "y": 201, + "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": 349, + "y": 217, + "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": 349, + "y": 233, + "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": 331, + "y": 247, + "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": 347, + "y": 249, + "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": 331, + "y": 263, + "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": 330, + "y": 279, + "w": 16, + "h": 16 + } + }, { "filename": "gardevoirite", "rotated": false, @@ -6681,8 +6723,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 338, + "x": 330, + "y": 295, "w": 16, "h": 16 } @@ -6702,8 +6744,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 354, + "x": 330, + "y": 311, "w": 16, "h": 16 } @@ -6723,8 +6765,8 @@ "h": 16 }, "frame": { - "x": 290, - "y": 370, + "x": 330, + "y": 327, "w": 16, "h": 16 } @@ -6744,8 +6786,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 284, + "x": 330, + "y": 343, "w": 16, "h": 16 } @@ -6765,8 +6807,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 300, + "x": 330, + "y": 359, "w": 16, "h": 16 } @@ -6786,8 +6828,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 316, + "x": 330, + "y": 375, "w": 16, "h": 16 } @@ -6807,8 +6849,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 332, + "x": 347, + "y": 265, "w": 16, "h": 16 } @@ -6828,8 +6870,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 348, + "x": 346, + "y": 281, "w": 16, "h": 16 } @@ -6849,8 +6891,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 364, + "x": 346, + "y": 297, "w": 16, "h": 16 } @@ -6870,8 +6912,8 @@ "h": 16 }, "frame": { - "x": 306, - "y": 380, + "x": 346, + "y": 313, "w": 16, "h": 16 } @@ -6891,8 +6933,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 294, + "x": 346, + "y": 329, "w": 16, "h": 16 } @@ -6912,8 +6954,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 294, + "x": 346, + "y": 345, "w": 16, "h": 16 } @@ -6933,8 +6975,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 310, + "x": 346, + "y": 361, "w": 16, "h": 16 } @@ -6954,8 +6996,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 294, + "x": 346, + "y": 377, "w": 16, "h": 16 } @@ -6975,8 +7017,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 326, + "x": 366, + "y": 185, "w": 16, "h": 16 } @@ -6996,8 +7038,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 310, + "x": 365, + "y": 201, "w": 16, "h": 16 } @@ -7017,8 +7059,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 342, + "x": 365, + "y": 217, "w": 16, "h": 16 } @@ -7038,8 +7080,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 326, + "x": 365, + "y": 233, "w": 16, "h": 16 } @@ -7059,8 +7101,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 310, + "x": 363, + "y": 249, "w": 16, "h": 16 } @@ -7080,8 +7122,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 358, + "x": 363, + "y": 265, "w": 16, "h": 16 } @@ -7101,8 +7143,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 342, + "x": 362, + "y": 281, "w": 16, "h": 16 } @@ -7122,8 +7164,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 326, + "x": 362, + "y": 297, "w": 16, "h": 16 } @@ -7143,8 +7185,8 @@ "h": 16 }, "frame": { - "x": 322, - "y": 374, + "x": 362, + "y": 313, "w": 16, "h": 16 } @@ -7164,8 +7206,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 358, + "x": 362, + "y": 329, "w": 16, "h": 16 } @@ -7185,8 +7227,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 342, + "x": 362, + "y": 345, "w": 16, "h": 16 } @@ -7206,8 +7248,8 @@ "h": 16 }, "frame": { - "x": 338, - "y": 374, + "x": 362, + "y": 361, "w": 16, "h": 16 } @@ -7227,8 +7269,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 358, + "x": 362, + "y": 377, "w": 16, "h": 16 } @@ -7248,8 +7290,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 374, + "x": 382, + "y": 178, "w": 16, "h": 16 } @@ -7269,8 +7311,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 301, + "x": 382, + "y": 194, "w": 16, "h": 16 } @@ -7290,8 +7332,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 317, + "x": 381, + "y": 210, "w": 16, "h": 16 } @@ -7311,8 +7353,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 333, + "x": 381, + "y": 226, "w": 16, "h": 16 } @@ -7332,8 +7374,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 349, + "x": 381, + "y": 242, "w": 16, "h": 16 } @@ -7353,32 +7395,11 @@ "h": 16 }, "frame": { - "x": 370, - "y": 365, + "x": 379, + "y": 258, "w": 16, "h": 16 } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 370, - "y": 381, - "w": 15, - "h": 15 - } } ] } @@ -7386,6 +7407,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e6d832697add1029764f6145e5fa98b7:47250d3d95167f73038d290f7a73b96e:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:5676fc2ef4e2b6e18c96ca3c80e7521d:a6286201546cef975121cad6b35c7005:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 7ddd284fac7dbb81a9734e37a5316daca79876d2..9af295e16ad5205282e3d7fb3feb1486a3a6c1f2 100644 GIT binary patch literal 51675 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Ξ-O3I)TW0kwEt}#8M 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 VUQ#{dA}#KLV1+=j7I%sk_ZA86TA)~q6$+(T zDG;Ra64t42aZM+5)>NHo-+J_7)-Q2%uToCnU` zPlo^i00*G2ZKSI0^6G)Z!@(^qB*enPa({oXuC9N0eD***JVC+lpit=T?c&PD=E2pC zzJZ~&O~{YkeJu@*tE-!#p~2DV9~sZ(M<-`(Us%6QNV>i1|JMF@8?&)~f_aynasR_J zts8UOP%%-htEi%K$-`5>e0(>mjX5^|edIH>_2>F@%Oehj`CD_g^S*Utu_uGCtVH|f z{?GiywSP#+;L$%-X~~QAUeuSpZ%dYU=rg0jipw9n5zcfq$&tC27qOvXd*f8q(814p-8gk#%h+``XXNhm?)x3aHCzBS*!#J|NW$3X zmETu+m4YO?fe!I!DCLbv(EU}~=!9=T@py!W`au7`-0adysJCA-&vcIb#eVzT4Fn4$mbRx{#gQDUbH8&z#ty}JRs~=MOojte{*2) z^i5;c(B)0|`_UM61MjNq6(bL?CdY*-qb74@-^w`abdHb*?#NEx+X7Bg(sG(5ZQ!@cAOI6>4L&bjCp*5!P1zXei3q3|QHk~ppvfIO(2w_)dQ`%drMtMRS zsN(ESj&dcR?3eUU@H8qLOB%&C;sk>w+?XBSxtoHdnSSX3V)XFmoRQ>pC3NOyZ}??; z%_lII7}wQGvwPN;6{1F=^H!>SPGRab7O|}AYWPGBX{lo7Oht0ZwAKAHb#3fI`gtCS zv89I#K;-jG*AVc3N`Ln_RiZ$b;(<%(rEcyG0Fc4|>sS>E#=a}~S0}3D_NT4dq4bMa;jkAj=ydfQ~^ zXXXpp#lJXKU+#0HjvGQfYf4K$X?TZ(xmSYqWkxoA``FpovP&qwS5l%C$xlWcZV2St z&ol~S`nCKtb-)mSy_{h6!o z|5hYC(${zzdOn#Li+v~*M9!Noa}o~;{?z%#2jC3-oS+%=i7-4tqh zapgAenLq}nGCxV!m=g_mS5cl6y_g-THdy z<0HbDJ9WMa-ppsugAZ5Id0I^9_&GVtI$FIWm?ZJry_apGszl8w(2_xaiMg1vW7apD z7!dH1-pf#WTxfjWr3)*-uC?IjV;t1@)J^sx7Ah~y${T|ADlGc&p-b9pquRygx!VOf z5f`N8aTA>un&;GRi})^mWsVO4A4_*L^;mOm{3NRef%y=qk>*)!Nvt`PV1ar2eow4+h)jPv24t35D(Hu8D0XxWhBxs%A?0`f;@J$)@enMRV~GA- zP6B&^ZudK!`=Hc}Q4>3Y2dWTd)&QSbFR$5x6B6}8@Vuq7)^$h|3m zA5L49Sv(JM|0=4Yx%kJmwes zkUJ7bQ1K6n!@Zf*z_`b`&VYo+0!&YQyb)M>$S{fUXHUvL*dmGa?ic6Qi%$w$ur{23PBDIXjfa#=w~An|)TwijZzw|

{shFohoxN( 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%0A!W@ja9E0zZt4em+`~oF!WT!JI1iQWFv%_3`u} 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 v#Nkl@DtKo--E+XDH4hNB{}CE#|2!L zp^ljZ1@C2Jqb`AP28Nuk`Xv|~L%=ZW)awYmg{ufW!4W)<-8G*Iz-REe3mgR`xCGWa z{S92TgxK~CT)q9+_5$3b?XYOf;Z>m7-n{Ew;Pm|FXO{%b;Z(o{P9;(#5>d new PokemonHeldItemModifierType('Focus Band', 'Adds a 10% chance to survive with 1 HP after being damaged enough to faint', (type, args) => new Modifiers.SurviveDamageModifier(type, (args[0] as Pokemon).id)), + QUICK_CLAW: () => new PokemonHeldItemModifierType('Quick Claw', 'Adds a 10% chance to move first regardless of speed (after priority)', + (type, args) => new Modifiers.BypassSpeedChanceModifier(type, (args[0] as Pokemon).id)), + KINGS_ROCK: () => new PokemonHeldItemModifierType('King\'s Rock', 'Adds a 10% chance an attack move will cause the opponent to flinch', (type, args) => new Modifiers.FlinchChanceModifier(type, (args[0] as Pokemon).id)), @@ -1087,6 +1090,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), + new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 10), @@ -1138,6 +1142,7 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.REVIVER_SEED, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), + new WeightedModifierType(modifierTypes.QUICK_CLAW, 1), new WeightedModifierType(modifierTypes.GRIP_CLAW, 1), new WeightedModifierType(modifierTypes.WIDE_LENS, 1), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), @@ -1198,6 +1203,7 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), + new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 8a5fba17d..0736831a0 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -731,6 +731,40 @@ export class SurviveDamageModifier extends PokemonHeldItemModifier { } } +export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier) { + return modifier instanceof BypassSpeedChanceModifier; + } + + clone() { + return new BypassSpeedChanceModifier(this.type, this.pokemonId, this.stackCount); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[1] instanceof Utils.BooleanHolder; + } + + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + const bypassSpeed = args[1] as Utils.BooleanHolder; + + if (!bypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) { + bypassSpeed.value = true; + return true; + } + + return false; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 3; + } +} + export class FlinchChanceModifier extends PokemonHeldItemModifier { constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); diff --git a/src/phases.ts b/src/phases.ts index a802582cb..88957ba16 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -6,7 +6,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from './ui/ui'; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -1970,6 +1970,14 @@ export class TurnStartPhase extends FieldPhase { const field = this.scene.getField(); const order = this.getOrder(); + const battlerBypassSpeed = {}; + + this.scene.getField(true).filter(p => p.summonData).map(p => { + const bypassSpeed = new Utils.BooleanHolder(false); + this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); + battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; + }); + const moveOrder = order.slice(0); moveOrder.sort((a, b) => { @@ -1994,6 +2002,9 @@ export class TurnStartPhase extends FieldPhase { if (aPriority.value !== bPriority.value) return aPriority.value < bPriority.value ? 1 : -1; } + + if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) + return battlerBypassSpeed[a].value ? -1 : 1; const aIndex = order.indexOf(a); const bIndex = order.indexOf(b); From 3ef08e433a2e959a543bd14fa5f8e8d99e770d05 Mon Sep 17 00:00:00 2001 From: karl-police Date: Wed, 15 May 2024 15:35:48 +0200 Subject: [PATCH 15/18] Correct a translation due to misleading token --- src/locales/de/battle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index ca0e60bf9..1dc7b68fd 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -43,7 +43,7 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", "runAwaySuccess": "Du bist entkommen!", - "runAwayCannotEscape": 'Flucht unmöglich!', + "runAwayCannotEscape": 'Flucht gescheitert!', "escapeVerbSwitch": "auswechseln", "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", From 3aeef5050725e535915265352855aa41dec8233f Mon Sep 17 00:00:00 2001 From: Alessandro Bruzzese <69127023+Bruzzii@users.noreply.github.com> Date: Wed, 15 May 2024 16:08:32 +0200 Subject: [PATCH 16/18] Update Italian starter-select-ui-handler.ts (#901) --- src/locales/it/starter-select-ui-handler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 79c2e26c6..af95fc374 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -29,7 +29,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "cycleVariant": 'V: Alterna Variante', "enablePassive": "Attiva Passiva", "disablePassive": "Disattiva Passiva", - "locked": "Locked", - "disabled": "Disabled", - "uncaught": "Uncaught" + "locked": "Bloccato", + "disabled": "Disabilitato", + "uncaught": "Non Catturato" } \ No newline at end of file From 3c8d919ef8e1e69a063710e4d98cb27a0350d208 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Wed, 15 May 2024 10:13:29 -0400 Subject: [PATCH 17/18] Revert "Implemented Power Split and Guard Split (#699)" This reverts commit 0b75a5210aea737e18acbbadfe3013fed30136df. --- src/data/move.ts | 84 +------------------------------------- src/field/pokemon.ts | 22 +--------- src/system/pokemon-data.ts | 1 - 3 files changed, 3 insertions(+), 104 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index aa722b29e..46216eb75 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -2005,86 +2005,6 @@ export class HpSplitAttr extends MoveEffectAttr { } } -/** - * Attribute used for moves which split the user and the target's offensive raw stats. - * @extends MoveEffectAttr - * @see {@link apply} -*/ -export class PowerSplitAttr extends MoveEffectAttr { - - /** - * Applying Power Split to the user and the target. - * @param user The pokemon using the move. {@link Pokemon} - * @param target The targeted pokemon of the move. {@link Pokemon} - * @param move The move used. {@link Move} - * @param args N/A - * @returns True if power split is applied successfully. - */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]) : Promise { - return new Promise(resolve => { - - if (!super.apply(user, target, move, args)) - return resolve(false); - - const infoUpdates = []; - - const attackValue = Math.floor((target.getStat(Stat.ATK) + user.getStat(Stat.ATK)) / 2); - user.changeSummonStat(Stat.ATK, attackValue); - infoUpdates.push(user.updateInfo()); - target.changeSummonStat(Stat.ATK, attackValue); - infoUpdates.push(target.updateInfo()); - - const specialAttackValue = Math.floor((target.getStat(Stat.SPATK) + user.getStat(Stat.SPATK)) / 2); - user.changeSummonStat(Stat.SPATK, specialAttackValue); - infoUpdates.push(user.updateInfo()); - target.changeSummonStat(Stat.SPATK, specialAttackValue); - infoUpdates.push(target.updateInfo()); - - return Promise.all(infoUpdates).then(() => resolve(true)); - }); - } -} - -/** - * Attribute used for moves which split the user and the target's defensive raw stats. - * @extends MoveEffectAttr - * @see {@link apply} -*/ -export class GuardSplitAttr extends MoveEffectAttr { - /** - * Applying Guard Split to the user and the target. - * @param user The pokemon using the move. {@link Pokemon} - * @param target The targeted pokemon of the move. {@link Pokemon} - * @param move The move used. {@link Move} - * @param args N/A - * @returns True if power split is applied successfully. - */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) - return resolve(false); - - const infoUpdates = []; - - const defenseValue = Math.floor((target.getStat(Stat.DEF) + user.getStat(Stat.DEF)) / 2); - user.changeSummonStat(Stat.DEF, defenseValue); - infoUpdates.push(user.updateInfo()); - target.changeSummonStat(Stat.DEF, defenseValue); - infoUpdates.push(target.updateInfo()); - - const specialDefenseValue = Math.floor((target.getStat(Stat.SPDEF) + user.getStat(Stat.SPDEF)) / 2); - user.changeSummonStat(Stat.SPDEF, specialDefenseValue); - infoUpdates.push(user.updateInfo()); - target.changeSummonStat(Stat.SPDEF, specialDefenseValue); - infoUpdates.push(target.updateInfo()); - - - return Promise.all(infoUpdates).then(() => resolve(true)); - }); - } - -} - export class VariablePowerAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { //const power = args[0] as Utils.NumberHolder; @@ -5744,9 +5664,9 @@ export function initMoves() { .target(MoveTarget.USER_SIDE) .unimplemented(), new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) - .attr(GuardSplitAttr), + .unimplemented(), new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) - .attr(PowerSplitAttr), + .unimplemented(), new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 8d6b11ae9..48287cf39 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -544,17 +544,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } - /** - * Returns the value of the specified stat. - * @param stat Stat to get the value of. {@link Stat} - * @returns The value of the stat. If the pokemon is already summoned, it uses those values, otherwise uses the base stats. - */ getStat(stat: Stat): integer { - if (!this.summonData) { - return this.stats[stat]; - } - - return this.summonData.stats[stat]; + return this.stats[stat]; } getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer { @@ -1717,16 +1708,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return healAmount; } - /** - * Sets a specific stat to a specific value. - * Used for summon data, while the pokemon is out until the next time it is retrieved. - * @param stat Stat to change. {@link Stat} - * @param value Amount to set the stat to. - */ - changeSummonStat(stat: Stat, value: integer) : void { - this.summonData.stats[stat] = value; - } - isBossImmune(): boolean { return this.isBoss(); } @@ -2185,7 +2166,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.battleData) this.resetBattleData(); this.resetBattleSummonData(); - this.summonData.stats = this.stats; if (this.summonDataPrimer) { for (let k of Object.keys(this.summonData)) { if (this.summonDataPrimer[k]) diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index dcf4a5744..dfbb9be57 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -112,7 +112,6 @@ export default class PokemonData { this.summonData = new PokemonSummonData(); if (!forHistory && source.summonData) { this.summonData.battleStats = source.summonData.battleStats; - this.summonData.stats = source.summonData.stats; this.summonData.moveQueue = source.summonData.moveQueue; this.summonData.disabledMove = source.summonData.disabledMove; this.summonData.disabledTurns = source.summonData.disabledTurns; From d32dbddd480428327cce39b7cd1820426dde8da6 Mon Sep 17 00:00:00 2001 From: mbroll <39443552+mbroll@users.noreply.github.com> Date: Wed, 15 May 2024 09:21:52 -0500 Subject: [PATCH 18/18] Update ability.ts (#910) Water bubble should double the damage of water moves. The current multiplier in-game is x1. --- src/data/ability.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 0ff03ed67..a257525ef 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3456,7 +3456,7 @@ export function initAbilities() { .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), new Ability(Abilities.WATER_BUBBLE, 7) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) - .attr(MoveTypePowerBoostAbAttr, Type.WATER, 1) + .attr(MoveTypePowerBoostAbAttr, Type.WATER, 2) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .ignorable(), new Ability(Abilities.STEELWORKER, 7)