From 0f96beabf49fba238bc90a25d4d39da37c92b8f5 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Fri, 7 Jul 2023 10:02:00 -0500 Subject: [PATCH] Start adding save files support --- data/GameManager.js | 16 ++++++++++++++-- data/emulator.js | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/data/GameManager.js b/data/GameManager.js index 92fe869..ff614b7 100644 --- a/data/GameManager.js +++ b/data/GameManager.js @@ -28,7 +28,10 @@ class EJS_GameManager { this.mkdir("/home/web_user/retroarch"); this.mkdir("/home/web_user/retroarch/userdata"); - //this.FS.writeFile("/home/web_user/retroarch/userdata/retroarch.cfg", this.getRetroArchCfg()); + this.mkdir("/data"); + this.mkdir("/data/saves"); + + this.FS.writeFile("/home/web_user/retroarch/userdata/retroarch.cfg", this.getRetroArchCfg()); this.initShaders(); } @@ -38,7 +41,7 @@ class EJS_GameManager { } catch(e) {} } getRetroArchCfg() { - return "\n"; + return "autosave_interval = 10\nsavefile_directory = \"/data/saves\"\n"; } initShaders() { if (!window.EJS_SHADERS) return; @@ -218,6 +221,15 @@ class EJS_GameManager { supportsStates() { return !!this.functions.supportsStates(); } + getSaveFile() { + return new Promise((resolve) => { + this.saveSaveFiles(); + setTimeout(() => { + const exists = FS.analyzePath(this.getSaveFilePath()).exists; + resolve(exists ? FS.readFile(this.getSaveFilePath()) : null); + }, 250); + }) + } } window.EJS_GameManager = EJS_GameManager; diff --git a/data/emulator.js b/data/emulator.js index 2ee90c3..626c495 100644 --- a/data/emulator.js +++ b/data/emulator.js @@ -211,7 +211,7 @@ class EmulatorJS { color = color.toLowerCase(); if (color && /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(color)) { if (color.length === 4) { - let rv = '#' + let rv = '#'; for (let i=1; i<4; i++) { rv += color.slice(i, i+1)+color.slice(i, i+1); } @@ -621,7 +621,7 @@ class EmulatorJS { const gotGameData = (data) => { if (['arcade', 'mame2003'].includes(this.getCore(true))) { this.fileName = this.config.gameUrl.split('/').pop().split("#")[0].split("?")[0]; - FS.writeFile(this.fileName, data[k]); + FS.writeFile(this.fileName, new Uint8Array(data)); this.downloadBios(); return; } @@ -1041,6 +1041,7 @@ class EmulatorJS { //todo. Center text on not restart button const restartButton = addButton("Restart", '', () => { + this.gameManager.saveSaveFiles(); this.gameManager.restart(); }); const pauseButton = addButton("Pause", '', () => { @@ -1083,7 +1084,7 @@ class EmulatorJS { if (stateUrl) URL.revokeObjectURL(stateUrl); if (this.settings['save-state-location'] === "browser" && this.saveInBrowserSupported()) { this.storage.states.put(this.getBaseFileName()+".state", state); - this.displayMessage(this.localization("SAVED LOADED TO BROWSER")); + this.displayMessage(this.localization("SAVE SAVED TO BROWSER")); } else { const blob = new Blob([state]); stateUrl = URL.createObjectURL(blob); @@ -1099,13 +1100,14 @@ class EmulatorJS { if (this.settings['save-state-location'] === "browser" && this.saveInBrowserSupported()) { this.storage.states.get(this.getBaseFileName()+".state").then(e => { this.gameManager.loadState(e); - this.displayMessage(this.localization("SAVED LOADED FROM BROWSER")); + this.displayMessage(this.localization("SAVE LOADED FROM BROWSER")); }) } else { const file = await this.selectFile(); const state = new Uint8Array(await file.arrayBuffer()); this.gameManager.loadState(state); } + this.gameManager.saveSaveFiles(); }); const controlMenu = addButton("Control Settings", '', () => { this.controlMenu.style.display = ""; @@ -1118,6 +1120,32 @@ class EmulatorJS { this.openCacheMenu(); }); + let savUrl; + + const saveSavFiles = addButton("Export Save File", '', async () => { + const file = await this.gameManager.getSaveFile(); + const blob = new Blob([file]); + savUrl = URL.createObjectURL(blob); + const a = this.createElement("a"); + a.href = savUrl; + a.download = this.gameManager.getSaveFilePath().split("/").pop(); + a.click(); + }); + const loadSavFiles = addButton("Import Save File", '', async () => { + const file = await this.selectFile(); + const sav = new Uint8Array(await file.arrayBuffer()); + const path = this.gameManager.getSaveFilePath(); + const paths = path.split("/"); + let cp = ""; + for (let i=0; i