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