From 9cfc09f6738893e6683ec8b5117f5b5529b60cea Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Fri, 10 May 2024 18:12:33 -0400 Subject: [PATCH] Restructure game over logic to save before clear --- public/battle-anims/lick.json | 2 +- src/battle-scene.ts | 2 + src/phases.ts | 117 +++++++++++++++++++--------------- src/system/game-data.ts | 9 ++- 4 files changed, 76 insertions(+), 54 deletions(-) diff --git a/public/battle-anims/lick.json b/public/battle-anims/lick.json index 41dea900f..0fc794e3d 100644 --- a/public/battle-anims/lick.json +++ b/public/battle-anims/lick.json @@ -1978,7 +1978,7 @@ }, { "frameIndex": 0, - "resourceName": "PRAS- Sketch and Lick", + "resourceName": "PRAS- Sketch + Lick", "bgX": 0, "bgY": 0, "opacity": 0, diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0171fb96c..40ac8ab32 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -759,6 +759,8 @@ export default class BattleScene extends SceneBase { this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); + this.field.setVisible(true); + this.arenaBgTransition.setPosition(0, 0); this.arenaPlayer.setPosition(300, 0); this.arenaPlayerTransition.setPosition(0, 0); diff --git a/src/phases.ts b/src/phases.ts index 20c4dc737..3d6fe7228 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -3484,19 +3484,14 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.gameData.saveSystem().then(success => { - if (success) { - this.scene.playSound('level_up_fanfare'); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.arenaBg.setVisible(false); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - resolve(); - }, null, true, 1500); - }); - } else - this.scene.reset(true); + this.scene.playSound('level_up_fanfare'); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.arenaBg.setVisible(false); + this.scene.ui.fadeIn(250).then(() => { + this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + resolve(); + }, null, true, 1500); }); }); }) @@ -3516,18 +3511,13 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.gameData.saveSystem().then(success => { - if (success) { - this.scene.playSound('level_up_fanfare'); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.arenaBg.setVisible(false); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { - resolve(); - }, null, true, 1500); - }); - } else - this.scene.reset(true); + this.scene.playSound('level_up_fanfare'); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.arenaBg.setVisible(false); + this.scene.ui.fadeIn(250).then(() => { + this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { + resolve(); + }, null, true, 1500); }); }); }) @@ -3548,7 +3538,7 @@ export class GameOverPhase extends BattlePhase { super.start(); if (this.victory || !this.scene.enableRetries) - this.handleClearSession(); + this.handleGameOver(); else { this.scene.ui.showText(`Would you like to retry from the start of the battle?`, null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { @@ -3573,18 +3563,16 @@ export class GameOverPhase extends BattlePhase { this.end(); }); }); - }, () => this.handleClearSession(), false, 0, 0, 1000); + }, () => this.handleGameOver(), false, 0, 0, 1000); }); } } - handleClearSession(): void { - this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) - return this.scene.reset(true); + handleGameOver(): void { + const doGameOver = (newClear: boolean) => { this.scene.time.delayedCall(1000, () => { let firstClear = false; - if (this.victory && success[1]) { + if (this.victory && newClear) { if (this.scene.gameMode.isClassic) { firstClear = this.scene.validateAchv(achvs.CLASSIC_VICTORY); this.scene.gameData.gameStats.sessionsWon++; @@ -3595,29 +3583,37 @@ export class GameOverPhase extends BattlePhase { this.awardRibbon(pokemon, true); } } - } else if (this.scene.gameMode.isDaily && success[1]) + } else if (this.scene.gameMode.isDaily && newClear) this.scene.gameData.gameStats.dailyRunSessionsWon++; } - this.scene.gameData.saveSystem(); const fadeDuration = this.victory ? 10000 : 5000; this.scene.fadeOutBgm(fadeDuration, true); + const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); + activeBattlers.map(p => p.hideInfo()); this.scene.ui.fadeOut(fadeDuration).then(() => { + [ this.scene.field, ...activeBattlers ].map(a => a.setVisible(false)); this.scene.setFieldScale(1, true); this.scene.clearPhaseQueue(); this.scene.ui.clearText(); - this.handleUnlocks(); - if (this.victory && success[1]) { + if (newClear) + this.handleUnlocks(); + if (this.victory && newClear) { for (let species of this.firstRibbons) this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); if (!firstClear) this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); } - this.scene.reset(); - this.scene.unshiftPhase(new TitlePhase(this.scene)); + this.scene.pushPhase(new PostGameOverPhase(this.scene)); this.end(); }); }); - }); + }; + if (this.victory) { + Utils.apiFetch(`savedata/newclear?slot=${this.scene.sessionSlotId}`, true) + .then(response => response.json()) + .then(newClear => doGameOver(newClear)); + } else + doGameOver(false); } handleUnlocks(): void { @@ -3653,19 +3649,36 @@ export class UnlockPhase extends Phase { start(): void { this.scene.time.delayedCall(2000, () => { this.scene.gameData.unlocks[this.unlockable] = true; - this.scene.gameData.saveSystem().then(success => { - if (success) { - this.scene.playSound('level_up_fanfare'); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.arenaBg.setVisible(false); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - this.end(); - }, null, true, 1500); - }); - } else - this.scene.reset(true); + this.scene.playSound('level_up_fanfare'); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.arenaBg.setVisible(false); + this.scene.ui.fadeIn(250).then(() => { + this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + this.end(); + }, null, true, 1500); + }); + }); + } +} + +export class PostGameOverPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.scene.gameData.saveSystem().then(success => { + if (!success) + return this.scene.reset(true); + this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { + if (!success[0]) + return this.scene.reset(true); + this.scene.reset(); + this.scene.unshiftPhase(new TitlePhase(this.scene)); + this.end(); }); }); } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 2be2ee155..bd1fcfae0 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -190,11 +190,14 @@ const systemShortKeys = { natureAttr: '$na', seenCount: '$s' , caughtCount: '$c', + hatchedCount: '$hc', ivs: '$i', moveset: '$m', eggMoves: '$em', candyCount: '$x', - passive: '$p', + friendship: '$f', + abilityAttr: '$a', + passiveAttr: '$pa', valueReduction: '$vr', classicWinCount: '$wc' }; @@ -454,6 +457,10 @@ export class GameData { } private convertSystemDataStr(dataStr: string, shorten: boolean = false): string { + if (!shorten) { + // Account for past key oversight + dataStr = dataStr.replace(/\$pAttr/g, '$pa'); + } const fromKeys = shorten ? Object.keys(systemShortKeys) : Object.values(systemShortKeys); const toKeys = shorten ? Object.values(systemShortKeys) : Object.keys(systemShortKeys); for (let k in fromKeys)