1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-03-02 03:39:21 +00:00

Allow downloading savegames

This commit is contained in:
tobspr
2020-05-16 10:05:19 +02:00
parent 2c9867c837
commit a2b1342f55
5 changed files with 61 additions and 6 deletions

View File

@@ -79,6 +79,16 @@ export class ReadWriteProxy {
return this.currentData;
}
/**
*
* @param {object} obj
*/
static serializeObject(obj) {
const jsonString = JSON_stringify(compressObject(obj));
const checksum = sha1(jsonString + salt);
return compressionPrefix + compressX64(checksum + jsonString);
}
/**
* Writes the data asychronously, fails if verify() fails
* @returns {Promise<string>}

View File

@@ -859,3 +859,20 @@ export function formatSecondsToTimeAgo(secs) {
return days + " days ago";
}
}
/**
* Generates a file download
* @param {string} filename
* @param {string} text
*/
export function generateFileDownload(filename, text) {
var element = document.createElement("a");
element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(text));
element.setAttribute("download", filename);
element.style.display = "none";
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}

View File

@@ -1,7 +1,8 @@
import { GameState } from "../core/game_state";
import { cachebust } from "../core/cachebust";
import { globalConfig } from "../core/config";
import { makeDiv, formatSecondsToTimeAgo } from "../core/utils";
import { makeDiv, formatSecondsToTimeAgo, generateFileDownload } from "../core/utils";
import { ReadWriteProxy } from "../core/read_write_proxy";
export class MainMenuState extends GameState {
constructor() {
@@ -90,10 +91,15 @@ export class MainMenuState extends GameState {
formatSecondsToTimeAgo((new Date().getTime() - games[i].lastUpdate) / 1000.0)
);
const downloadButton = document.createElement("button");
downloadButton.classList.add("styledButton", "downloadGame");
elem.appendChild(downloadButton);
const resumeBtn = document.createElement("button");
resumeBtn.classList.add("styledButton", "resumeGame");
elem.appendChild(resumeBtn);
this.trackClicks(downloadButton, () => this.downloadGame(games[i]));
this.trackClicks(resumeBtn, () => this.resumeGame(games[i]));
}
}
@@ -111,6 +117,17 @@ export class MainMenuState extends GameState {
});
}
/**
* @param {object} game
*/
downloadGame(game) {
const savegame = this.app.savegameMgr.getSavegameById(game.internalId);
savegame.readAsync().then(() => {
const data = ReadWriteProxy.serializeObject(savegame.currentData);
generateFileDownload(savegame.filename, data);
});
}
onPlayButtonClicked() {
const savegame = this.app.savegameMgr.createNewSavegame();