mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-22 00:15:46 -07:00
Support for loading games in Javascript puzzles.
This is done by showing a dialog containing an <input type="file"> through which the user can 'upload' a save file - though, of course, the 'upload' doesn't go to any HTTP server, but only into the mind of the Javascript running in the same browser. It would be even nicer to support drag-and-drop as an alternative UI for getting the save file into the browser, but that isn't critical to getting the first version of this feature out of the door.
This commit is contained in:
38
emcc.c
38
emcc.c
@ -766,9 +766,9 @@ struct savefile_write_ctx {
|
||||
size_t pos;
|
||||
};
|
||||
|
||||
static void savefile_write(void *wctx, void *buf, int len)
|
||||
static void savefile_write(void *vctx, void *buf, int len)
|
||||
{
|
||||
struct savefile_write_ctx *ctx = (struct savefile_write_ctx *)wctx;
|
||||
struct savefile_write_ctx *ctx = (struct savefile_write_ctx *)vctx;
|
||||
if (ctx->buffer)
|
||||
memcpy(ctx->buffer + ctx->pos, buf, len);
|
||||
ctx->pos += len;
|
||||
@ -799,6 +799,40 @@ void free_save_file(char *buffer)
|
||||
sfree(buffer);
|
||||
}
|
||||
|
||||
struct savefile_read_ctx {
|
||||
const char *buffer;
|
||||
int len_remaining;
|
||||
};
|
||||
|
||||
static int savefile_read(void *vctx, void *buf, int len)
|
||||
{
|
||||
struct savefile_read_ctx *ctx = (struct savefile_read_ctx *)vctx;
|
||||
if (ctx->len_remaining < len)
|
||||
return FALSE;
|
||||
memcpy(buf, ctx->buffer, len);
|
||||
ctx->len_remaining -= len;
|
||||
ctx->buffer += len;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void load_game(const char *buffer, int len)
|
||||
{
|
||||
struct savefile_read_ctx ctx;
|
||||
const char *err;
|
||||
|
||||
ctx.buffer = buffer;
|
||||
ctx.len_remaining = len;
|
||||
err = midend_deserialise(me, savefile_read, &ctx);
|
||||
|
||||
if (err) {
|
||||
js_error_box(err);
|
||||
} else {
|
||||
select_appropriate_preset();
|
||||
resize();
|
||||
midend_redraw(me);
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
* Setup function called at page load time. It's called main() because
|
||||
* that's the most convenient thing in Emscripten, but it's not main()
|
||||
|
Reference in New Issue
Block a user