diff --git a/src/logger.ts b/src/logger.ts index 82a3090c9bb..0e2644873cd 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -40,6 +40,15 @@ export const logKeys: string[] = [ "d", // Debug ]; +export const autoCheckpoints: integer[] = [ + 1, + 11, + 21, + 31, + 41, + 50 +] + /** * Uses the save's RNG seed to create a log ID. Used to assign each save its own log. * @param scene The BattleScene. diff --git a/src/phases.ts b/src/phases.ts index b34f361150c..5e0adac600a 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -598,11 +598,11 @@ export class TitlePhase extends Phase { label: i18next.t("menu:loadGame"), handler: () => { this.scene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, - (slotId: integer) => { + (slotId: integer, autoSlot: integer) => { if (slotId === -1) { return this.showOptions(); } - this.loadSaveSlot(slotId); + this.loadSaveSlot(slotId, autoSlot); }); return true; } @@ -631,10 +631,10 @@ export class TitlePhase extends Phase { this.scene.ui.setMode(Mode.TITLE, config); } - loadSaveSlot(slotId: integer): void { + loadSaveSlot(slotId: integer, autoSlot?: integer): void { this.scene.sessionSlotId = slotId > -1 ? slotId : loggedInUser.lastSessionSlot; this.scene.ui.setMode(Mode.MESSAGE); - this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : null).then((success: boolean) => { + this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : null, autoSlot).then((success: boolean) => { if (success) { this.loaded = true; this.scene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index ff4b9fb686b..6d0c47e841b 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -124,6 +124,7 @@ export interface SessionSaveData { challenges: ChallengeData[]; slot: integer; description: string; + autoSlot: integer; } interface Unlocks { @@ -842,7 +843,7 @@ export class GameData { } as SessionSaveData; } - getSession(slotId: integer): Promise { + getSession(slotId: integer, autoSlot?: integer): Promise { return new Promise(async (resolve, reject) => { if (slotId < 0) { return resolve(null); @@ -850,14 +851,18 @@ export class GameData { const handleSessionData = async (sessionDataStr: string) => { try { const sessionData = this.parseSessionData(sessionDataStr); + sessionData.autoSlot = autoSlot; resolve(sessionData); } catch (err) { reject(err); return; } }; - - if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`)) { + var autokey = "" + if (autoSlot != undefined) { + autokey = "_auto" + autoSlot + } + if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}${autokey}`)) { Utils.apiFetch(`savedata/session/get?slot=${slotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(async response => { @@ -871,7 +876,8 @@ export class GameData { await handleSessionData(response); }); } else { - const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`); + const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}${autokey}`); + console.log(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}${autokey}`, sessionData) if (sessionData) { await handleSessionData(decrypt(sessionData, bypassLogin)); } else { @@ -881,7 +887,7 @@ export class GameData { }); } - loadSession(scene: BattleScene, slotId: integer, sessionData?: SessionSaveData): Promise { + loadSession(scene: BattleScene, slotId: integer, sessionData?: SessionSaveData, autoSlot?: integer): Promise { return new Promise(async (resolve, reject) => { try { const initSessionFromData = async (sessionData: SessionSaveData) => { @@ -981,7 +987,7 @@ export class GameData { if (sessionData) { initSessionFromData(sessionData); } else { - this.getSession(slotId) + this.getSession(slotId, autoSlot) .then(data => initSessionFromData(data)) .catch(err => { reject(err); diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 8a81ac4858d..6dedcca229c 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -10,6 +10,7 @@ import MessageUiHandler from "./message-ui-handler"; import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; +import * as LoggerTools from "../logger" const sessionSlotCount = 5; @@ -18,7 +19,7 @@ export enum SaveSlotUiMode { SAVE } -export type SaveSlotSelectCallback = (cursor: integer) => void; +export type SaveSlotSelectCallback = (cursor: integer, cursor2?: integer) => void; export default class SaveSlotSelectUiHandler extends MessageUiHandler { @@ -106,7 +107,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (this.uiMode) { case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - originalCallback(cursor); + originalCallback(this.sessionSlots[cursor].slotId, this.sessionSlots[cursor].autoSlot); break; case SaveSlotUiMode.SAVE: const saveAndCallback = () => { @@ -115,8 +116,11 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { ui.revertMode(); ui.showText(null, 0); ui.setMode(Mode.MESSAGE); - originalCallback(cursor); + originalCallback(this.sessionSlots[cursor].slotId, this.sessionSlots[cursor].autoSlot); }; + if (this.sessionSlots[cursor].autoSlot != undefined) { + return false; + } if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { ui.setOverlayMode(Mode.CONFIRM, () => { @@ -158,7 +162,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { case Button.DOWN: if (this.cursor < 2) { success = this.setCursor(this.cursor + 1); - } else if (this.scrollCursor < sessionSlotCount - 3) { + } else if (this.scrollCursor < this.sessionSlots.length - 3) { success = this.setScrollCursor(this.scrollCursor + 1); } break; @@ -175,12 +179,28 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } populateSessionSlots() { + var ui = this.getUi(); + var ypos = 0; for (let s = 0; s < sessionSlotCount; s++) { - const sessionSlot = new SessionSlot(this.scene, s); + const sessionSlot = new SessionSlot(this.scene, s, ypos); + ypos++ sessionSlot.load(); this.scene.add.existing(sessionSlot); this.sessionSlotsContainer.add(sessionSlot); this.sessionSlots.push(sessionSlot); + if (this.uiMode != SaveSlotUiMode.SAVE) { + for (var j = 0; j < LoggerTools.autoCheckpoints.length; j++) { + var k = "sessionData" + (s ? s : "") + "_Guest_auto" + j + if (localStorage.getItem(k) != null) { + const sessionSlot = new SessionSlot(this.scene, s, ypos, j); + ypos++ + sessionSlot.load(); + this.scene.add.existing(sessionSlot); + this.sessionSlotsContainer.add(sessionSlot); + this.sessionSlots.push(sessionSlot); + } + } + } } } @@ -251,13 +271,15 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { class SessionSlot extends Phaser.GameObjects.Container { public slotId: integer; + public autoSlot: integer; public hasData: boolean; private loadingLabel: Phaser.GameObjects.Text; - constructor(scene: BattleScene, slotId: integer) { - super(scene, 0, slotId * 56); + constructor(scene: BattleScene, slotId: integer, ypos: integer, autoSlot?: integer) { + super(scene, 0, ypos * 56); this.slotId = slotId; + this.autoSlot = autoSlot this.setup(); } @@ -273,8 +295,12 @@ class SessionSlot extends Phaser.GameObjects.Container { async setupWithData(data: SessionSaveData) { this.remove(this.loadingLabel, true); - - const gameModeLabel = addTextObject(this.scene, 8, 5, `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, TextStyle.WINDOW); + var lbl = `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}` + if (this.autoSlot != undefined) { + lbl = `Slot ${this.slotId} (Auto) - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}` + } + console.log(data, this.slotId, this.autoSlot, lbl) + const gameModeLabel = addTextObject(this.scene, 8, 5, lbl, TextStyle.WINDOW); this.add(gameModeLabel); const timestampLabel = addTextObject(this.scene, 8, 19, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); @@ -329,7 +355,7 @@ class SessionSlot extends Phaser.GameObjects.Container { load(): Promise { return new Promise(resolve => { - this.scene.gameData.getSession(this.slotId).then(async sessionData => { + this.scene.gameData.getSession(this.slotId, this.autoSlot).then(async sessionData => { if (!sessionData) { this.hasData = false; this.loadingLabel.setText(i18next.t("saveSlotSelectUiHandler:empty"));