From e1173eb0d0c2fe21682d396b6eb50d91be3609d0 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 8 Jun 2025 08:56:52 -0700 Subject: [PATCH] Add support for .ini loading --- ISLE/emscripten/filesystem.cpp | 29 +++++++++++++++++++++++++---- ISLE/emscripten/filesystem.h | 1 + ISLE/isleapp.cpp | 5 +++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ISLE/emscripten/filesystem.cpp b/ISLE/emscripten/filesystem.cpp index 0aa8e6f0..03b5b582 100644 --- a/ISLE/emscripten/filesystem.cpp +++ b/ISLE/emscripten/filesystem.cpp @@ -8,10 +8,29 @@ #include #include +static backend_t opfs = nullptr; +static backend_t fetchfs = nullptr; + +void Emscripten_SetupConfig(const char* p_iniConfig) +{ + if (!p_iniConfig || !*p_iniConfig) { + return; + } + + opfs = wasmfs_create_opfs_backend(); + MxString iniConfig = p_iniConfig; + + char* parse = iniConfig.GetData(); + while ((parse = SDL_strchr(++parse, '/'))) { + *parse = '\0'; + wasmfs_create_directory(iniConfig.GetData(), 0644, opfs); + *parse = '/'; + } +} + void Emscripten_SetupFilesystem() { - auto fetchfs = - wasmfs_create_fetch_backend((MxString(Emscripten_streamHost) + MxString("/LEGO")).GetData(), 512 * 1024); + fetchfs = wasmfs_create_fetch_backend((MxString(Emscripten_streamHost) + MxString("/LEGO")).GetData(), 512 * 1024); wasmfs_create_directory("/LEGO", 0644, fetchfs); wasmfs_create_directory("/LEGO/Scripts", 0644, fetchfs); @@ -26,7 +45,7 @@ void Emscripten_SetupFilesystem() wasmfs_create_directory("/LEGO/Scripts/Race", 0644, fetchfs); wasmfs_create_directory("/LEGO/data", 0644, fetchfs); - const auto registerFile = [&fetchfs](const char* p_path) { + const auto registerFile = [](const char* p_path) { MxString path = MxString(Emscripten_bundledPath) + MxString(p_path); path.MapPathToFilesystem(); @@ -89,7 +108,9 @@ void Emscripten_SetupFilesystem() registerFile("/LEGO/data/testinf.dta"); if (GameState()->GetSavePath() && *GameState()->GetSavePath()) { - auto opfs = wasmfs_create_opfs_backend(); + if (!opfs) { + opfs = wasmfs_create_opfs_backend(); + } MxString savePath = GameState()->GetSavePath(); if (savePath.GetData()[savePath.GetLength() - 1] != '/') { diff --git a/ISLE/emscripten/filesystem.h b/ISLE/emscripten/filesystem.h index 5c356eb1..131df1c8 100644 --- a/ISLE/emscripten/filesystem.h +++ b/ISLE/emscripten/filesystem.h @@ -10,6 +10,7 @@ inline static const char* Emscripten_savePath = "/save"; inline static const char* Emscripten_streamPath = "/"; inline static const char* Emscripten_streamHost = ISLE_EMSCRIPTEN_HOST; +void Emscripten_SetupConfig(const char* p_iniConfig); void Emscripten_SetupFilesystem(); #endif // EMSCRIPTEN_FILESYSTEM_H diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index e54cb4db..83682f3b 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -721,6 +721,10 @@ bool IsleApp::LoadConfig() } SDL_Log("Reading configuration from \"%s\"", iniConfig); +#ifdef __EMSCRIPTEN__ + Emscripten_SetupConfig(iniConfig); +#endif + dictionary* dict = iniparser_load(iniConfig); // [library:config] @@ -996,5 +1000,6 @@ MxResult IsleApp::ParseArguments(int argc, char** argv) return FAILURE; } } + return SUCCESS; }