diff options
| author | Simon Tatham <anakin@pobox.com> | 2017-09-05 20:10:16 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2017-09-05 20:56:55 +0100 |
| commit | 1bf591a5735068d1853be13c5a4255962835d5fe (patch) | |
| tree | 9b7ee6b9396ccc38ef70ca6ba377e5b25fd0df66 /emccpre.js | |
| parent | b31ea221673a8f49a383a4a119d6edaabd39642d (diff) | |
| download | puzzles-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.js | 26 |
1 files changed, 26 insertions, 0 deletions
@@ -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); |