mirror of
https://github.com/EmulatorJS/EmulatorJS.git
synced 2024-09-20 02:46:23 +00:00
Start adding save files support
This commit is contained in:
parent
899f8c1a82
commit
0f96beabf4
2 changed files with 46 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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", '<svg viewBox="0 0 512 512"><path d="M496 48V192c0 17.69-14.31 32-32 32H320c-17.69 0-32-14.31-32-32s14.31-32 32-32h63.39c-29.97-39.7-77.25-63.78-127.6-63.78C167.7 96.22 96 167.9 96 256s71.69 159.8 159.8 159.8c34.88 0 68.03-11.03 95.88-31.94c14.22-10.53 34.22-7.75 44.81 6.375c10.59 14.16 7.75 34.22-6.375 44.81c-39.03 29.28-85.36 44.86-134.2 44.86C132.5 479.9 32 379.4 32 256s100.5-223.9 223.9-223.9c69.15 0 134 32.47 176.1 86.12V48c0-17.69 14.31-32 32-32S496 30.31 496 48z"/></svg>', () => {
|
||||
this.gameManager.saveSaveFiles();
|
||||
this.gameManager.restart();
|
||||
});
|
||||
const pauseButton = addButton("Pause", '<svg viewBox="0 0 320 512"><path d="M272 63.1l-32 0c-26.51 0-48 21.49-48 47.1v288c0 26.51 21.49 48 48 48L272 448c26.51 0 48-21.49 48-48v-288C320 85.49 298.5 63.1 272 63.1zM80 63.1l-32 0c-26.51 0-48 21.49-48 48v288C0 426.5 21.49 448 48 448l32 0c26.51 0 48-21.49 48-48v-288C128 85.49 106.5 63.1 80 63.1z"/></svg>', () => {
|
||||
|
@ -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", '<svg viewBox="0 0 640 512"><path fill="currentColor" d="M480 96H160C71.6 96 0 167.6 0 256s71.6 160 160 160c44.8 0 85.2-18.4 114.2-48h91.5c29 29.6 69.5 48 114.2 48 88.4 0 160-71.6 160-160S568.4 96 480 96zM256 276c0 6.6-5.4 12-12 12h-52v52c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-52H76c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h52v-52c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h52c6.6 0 12 5.4 12 12v40zm184 68c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-80c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z"/></svg>', () => {
|
||||
this.controlMenu.style.display = "";
|
||||
|
@ -1118,6 +1120,32 @@ class EmulatorJS {
|
|||
this.openCacheMenu();
|
||||
});
|
||||
|
||||
let savUrl;
|
||||
|
||||
const saveSavFiles = addButton("Export Save File", '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 23 23"><path d="M3 6.5V5C3 3.89543 3.89543 3 5 3H16.1716C16.702 3 17.2107 3.21071 17.5858 3.58579L20.4142 6.41421C20.7893 6.78929 21 7.29799 21 7.82843V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V17.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M8 3H16V8.4C16 8.73137 15.7314 9 15.4 9H8.6C8.26863 9 8 8.73137 8 8.4V3Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M18 21V13.6C18 13.2686 17.7314 13 17.4 13H15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M6 21V17.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M12 12H1M1 12L4 9M1 12L4 15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></svg>', 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", '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 23 23"><path d="M3 7.5V5C3 3.89543 3.89543 3 5 3H16.1716C16.702 3 17.2107 3.21071 17.5858 3.58579L20.4142 6.41421C20.7893 6.78929 21 7.29799 21 7.82843V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V16.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M6 21V17" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M18 21V13.6C18 13.2686 17.7314 13 17.4 13H15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M16 3V8.4C16 8.73137 15.7314 9 15.4 9H13.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="transparent"></path><path d="M8 3V6" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1 12H12M12 12L9 9M12 12L9 15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></svg>', 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<paths.length-1; i++) {
|
||||
if (paths[i] === "") continue;
|
||||
cp += "/"+paths[i];
|
||||
if (!FS.analyzePath(cp).exists) FS.mkdir(cp);
|
||||
}
|
||||
if (FS.analyzePath(path).exists) FS.unlink(path);
|
||||
FS.writeFile(path, sav);
|
||||
});
|
||||
|
||||
const spacer = this.createElement("span");
|
||||
spacer.style = "flex:1;";
|
||||
this.elements.menu.appendChild(spacer);
|
||||
|
|
Loading…
Reference in a new issue