aboutsummaryrefslogtreecommitdiff
path: root/emccpre.js
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2017-09-05 20:10:16 +0100
committerSimon Tatham <anakin@pobox.com>2017-09-05 20:56:55 +0100
commit1bf591a5735068d1853be13c5a4255962835d5fe (patch)
tree9b7ee6b9396ccc38ef70ca6ba377e5b25fd0df66 /emccpre.js
parentb31ea221673a8f49a383a4a119d6edaabd39642d (diff)
downloadpuzzles-1bf591a5735068d1853be13c5a4255962835d5fe.zip
puzzles-1bf591a5735068d1853be13c5a4255962835d5fe.tar.gz
puzzles-1bf591a5735068d1853be13c5a4255962835d5fe.tar.bz2
puzzles-1bf591a5735068d1853be13c5a4255962835d5fe.tar.xz
Support for saving games in Javascript puzzles.
This is done by getting midend_serialise to produce the complete saved-game file as an in-memory string buffer, and then encoding that into a data: URI which we provide to the user as a hyperlink in a dialog box. The hyperlink has the 'download' attribute, which means clicking on it should automatically offer to save the file, and also lets me specify a not-too-silly default file name.
Diffstat (limited to 'emccpre.js')
-rw-r--r--emccpre.js26
1 files changed, 26 insertions, 0 deletions
diff --git a/emccpre.js b/emccpre.js
index efd54ae..16702bb 100644
--- a/emccpre.js
+++ b/emccpre.js
@@ -296,6 +296,32 @@ function initPuzzle() {
command(9);
};
+ // 'number' is used for C pointers
+ get_save_file = Module.cwrap('get_save_file', 'number', []);
+ free_save_file = Module.cwrap('free_save_file', 'void', ['number']);
+
+ document.getElementById("save").onclick = function(event) {
+ if (dlg_dimmer === null) {
+ var savefile_ptr = get_save_file();
+ var savefile_text = Pointer_stringify(savefile_ptr);
+ free_save_file(savefile_ptr);
+ dialog_init("Download saved-game file");
+ dlg_form.appendChild(document.createTextNode(
+ "Click to download the "));
+ var a = document.createElement("a");
+ a.download = "puzzle.sav";
+ a.href = "data:application/octet-stream," +
+ encodeURIComponent(savefile_text);
+ a.appendChild(document.createTextNode("saved-game file"));
+ dlg_form.appendChild(a);
+ dlg_form.appendChild(document.createTextNode("."));
+ dlg_form.appendChild(document.createElement("br"));
+ dialog_launch(function(event) {
+ dialog_cleanup();
+ });
+ }
+ };
+
gametypelist = document.getElementById("gametype");
gametypesubmenus.push(gametypelist);