added persistent personal game data for Emscripten platform
authorHolger Schemel <info@artsoft.org>
Mon, 15 Feb 2021 23:20:27 +0000 (00:20 +0100)
committerHolger Schemel <info@artsoft.org>
Mon, 15 Feb 2021 23:31:44 +0000 (00:31 +0100)
src/Makefile
src/libgame/setup.c
src/libgame/system.c
src/libgame/system.h
src/screens.c

index e525f1f0a1bfb3a2c78e69526ea8443e932c91fc..39029a0ce9989fe885c29bc3e43df555c1886dca 100644 (file)
@@ -97,7 +97,7 @@ ifeq ($(PLATFORM),emscripten)
 SDL_LIBS = -s USE_SDL_IMAGE=2 -s USE_SDL_MIXER=2 -s USE_SDL_NET=2 -s USE_ZLIB=1
 SDL_FMTS = -s SDL2_IMAGE_FORMATS='["bmp","png","pcx","xpm"]'
 EXTRA_CFLAGS = $(SDL_LIBS)
-EXTRA_LDFLAGS = $(SDL_FMTS) -s INITIAL_MEMORY=81920000 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../graphics/ --preload-file ../sounds/ --preload-file ../levels/ --preload-file ../music/ -s NO_EXIT_RUNTIME=0 -s ASYNCIFY -O2
+EXTRA_LDFLAGS = $(SDL_FMTS) -s INITIAL_MEMORY=81920000 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../graphics/ --preload-file ../sounds/ --preload-file ../levels/ --preload-file ../music/ -s NO_EXIT_RUNTIME=0 -s ASYNCIFY -O2 -lidbfs.js
 else
 SDL_LIBS = -lSDL2_image -lSDL2_mixer -lSDL2_net
 endif
index a135b0d58cf694259d16568d5f4d45dd1aee30f3..dc470a814a741ae88722af47959c47f23489492c 100644 (file)
@@ -1511,6 +1511,8 @@ char *getHomeDir(void)
     if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, dir)))
       strcpy(dir, ".");
   }
+#elif defined(PLATFORM_EMSCRIPTEN)
+  dir = "/persistent";
 #elif defined(PLATFORM_UNIX)
   if (dir == NULL)
   {
index e852d2ed4aa99eccc7bb282fc74c74a6cfafc1e3..a2f7ebeccd7d199716400db3fbeb14363f8fdbb4 100644 (file)
@@ -104,6 +104,25 @@ void InitProgramInfo(char *argv0, char *config_filename, char *userdata_subdir,
   program.log_file[LOG_ERR_ID] = program.log_file_default[LOG_ERR_ID] = stderr;
 
   program.headless = FALSE;
+
+#if defined(PLATFORM_EMSCRIPTEN)
+  EM_ASM
+  (
+    Module.sync_done = 0;
+
+    FS.mkdir('/persistent');           // create persistent data directory
+    FS.mount(IDBFS, {}, '/persistent');        // mount with IDBFS filesystem type
+    FS.syncfs(true, function(err)      // sync persistent data into memory
+    {
+      assert(!err);
+      Module.sync_done = 1;
+    });
+  );
+
+  // wait for persistent data to be synchronized to memory
+  while (emscripten_run_script_int("Module.sync_done") == 0)
+    Delay(20);
+#endif
 }
 
 void InitNetworkInfo(boolean enabled, boolean connected, boolean serveronly,
index 9b3dfe752f127bb1b41ace4bd0005cbba18823bf..8ebd43dca41d15a869e75c98871f6ed1000c3636 100644 (file)
@@ -22,6 +22,8 @@
 #include "windows.h"
 #elif defined(PLATFORM_ANDROID)
 #include "android.h"
+#elif defined(PLATFORM_EMSCRIPTEN)
+#include "emscripten.h"
 #endif
 
 #include "sdl.h"
index 81a54b064ca2fbe7f52a214172f2b9d643409ca3..0ce46341598a59e72cd1e3ee354286111bc9836d 100644 (file)
@@ -1739,6 +1739,16 @@ void DrawMainMenu(void)
   SetMouseCursor(CURSOR_DEFAULT);
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
+
+#if defined(PLATFORM_EMSCRIPTEN)
+  EM_ASM
+  (
+    FS.syncfs(function(err)
+    {
+      assert(!err);
+    });
+  );
+#endif
 }
 
 static void gotoTopLevelDir(void)