From 48fd42ea36c833b4bea9ce018f1bd4d1eb3f0722 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 20 Jun 2025 15:45:21 -0700 Subject: [PATCH] Check for files (#352) * Check for files * Fix --- CMakeLists.txt | 1 + ISLE/emscripten/filesystem.cpp | 51 ++++------------------------------ ISLE/isleapp.cpp | 37 ++++++++++++++++++++++-- ISLE/isleapp.h | 1 + ISLE/islefiles.cpp | 48 ++++++++++++++++++++++++++++++++ LEGO1/omni/include/mxstring.h | 4 +-- 6 files changed, 91 insertions(+), 51 deletions(-) create mode 100644 ISLE/islefiles.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f5308a3..a604db22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -468,6 +468,7 @@ if (ISLE_BUILD_APP) add_executable(isle WIN32 ISLE/res/isle.rc ISLE/isleapp.cpp + ISLE/islefiles.cpp ) list(APPEND isle_targets isle) if (WIN32) diff --git a/ISLE/emscripten/filesystem.cpp b/ISLE/emscripten/filesystem.cpp index 03b5b582..395242a1 100644 --- a/ISLE/emscripten/filesystem.cpp +++ b/ISLE/emscripten/filesystem.cpp @@ -11,6 +11,8 @@ static backend_t opfs = nullptr; static backend_t fetchfs = nullptr; +extern const char* g_files[46]; + void Emscripten_SetupConfig(const char* p_iniConfig) { if (!p_iniConfig || !*p_iniConfig) { @@ -60,52 +62,9 @@ void Emscripten_SetupFilesystem() } }; - registerFile("/LEGO/Scripts/CREDITS.SI"); - registerFile("/LEGO/Scripts/INTRO.SI"); - registerFile("/LEGO/Scripts/NOCD.SI"); - registerFile("/LEGO/Scripts/SNDANIM.SI"); - registerFile("/LEGO/Scripts/Act2/ACT2MAIN.SI"); - registerFile("/LEGO/Scripts/Act3/ACT3.SI"); - registerFile("/LEGO/Scripts/Build/COPTER.SI"); - registerFile("/LEGO/Scripts/Build/DUNECAR.SI"); - registerFile("/LEGO/Scripts/Build/JETSKI.SI"); - registerFile("/LEGO/Scripts/Build/RACECAR.SI"); - registerFile("/LEGO/Scripts/Garage/GARAGE.SI"); - registerFile("/LEGO/Scripts/Hospital/HOSPITAL.SI"); - registerFile("/LEGO/Scripts/Infocntr/ELEVBOTT.SI"); - registerFile("/LEGO/Scripts/Infocntr/HISTBOOK.SI"); - registerFile("/LEGO/Scripts/Infocntr/INFODOOR.SI"); - registerFile("/LEGO/Scripts/Infocntr/INFOMAIN.SI"); - registerFile("/LEGO/Scripts/Infocntr/INFOSCOR.SI"); - registerFile("/LEGO/Scripts/Infocntr/REGBOOK.SI"); - registerFile("/LEGO/Scripts/Isle/ISLE.SI"); - registerFile("/LEGO/Scripts/Isle/JUKEBOX.SI"); - registerFile("/LEGO/Scripts/Isle/JUKEBOXW.SI"); - registerFile("/LEGO/Scripts/Police/POLICE.SI"); - registerFile("/LEGO/Scripts/Race/CARRACE.SI"); - registerFile("/LEGO/Scripts/Race/CARRACER.SI"); - registerFile("/LEGO/Scripts/Race/JETRACE.SI"); - registerFile("/LEGO/Scripts/Race/JETRACER.SI"); - registerFile("/LEGO/data/ACT1INF.DTA"); - registerFile("/LEGO/data/ACT2INF.DTA"); - registerFile("/LEGO/data/ACT3INF.DTA"); - registerFile("/LEGO/data/BLDDINF.DTA"); - registerFile("/LEGO/data/BLDHINF.DTA"); - registerFile("/LEGO/data/BLDJINF.DTA"); - registerFile("/LEGO/data/BLDRINF.DTA"); - registerFile("/LEGO/data/GMAININF.DTA"); - registerFile("/LEGO/data/HOSPINF.DTA"); - registerFile("/LEGO/data/ICUBEINF.DTA"); - registerFile("/LEGO/data/IELEVINF.DTA"); - registerFile("/LEGO/data/IISLEINF.DTA"); - registerFile("/LEGO/data/IMAININF.DTA"); - registerFile("/LEGO/data/IREGINF.DTA"); - registerFile("/LEGO/data/OBSTINF.DTA"); - registerFile("/LEGO/data/PMAININF.DTA"); - registerFile("/LEGO/data/RACCINF.DTA"); - registerFile("/LEGO/data/RACJINF.DTA"); - registerFile("/LEGO/data/WORLD.WDB"); - registerFile("/LEGO/data/testinf.dta"); + for (const char* file : g_files) { + registerFile(file); + } if (GameState()->GetSavePath() && *GameState()->GetSavePath()) { if (!opfs) { diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index ae7010ea..ae8760ff 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -87,6 +87,8 @@ MxS32 g_reqEnableRMDevice = FALSE; SDL_Window* window; +extern const char* g_files[46]; + // FUNCTION: ISLE 0x401000 IsleApp::IsleApp() { @@ -689,9 +691,9 @@ MxResult IsleApp::SetupWindow() GameState()->SetSavePath(m_savePath); -#ifdef __EMSCRIPTEN__ - Emscripten_SetupFilesystem(); -#endif + if (VerifyFilesystem() != SUCCESS) { + return FAILURE; + } GameState()->SerializePlayersInfo(LegoStorage::c_read); GameState()->SerializeScoreHistory(LegoStorage::c_read); @@ -1048,6 +1050,35 @@ MxResult IsleApp::ParseArguments(int argc, char** argv) return SUCCESS; } +MxResult IsleApp::VerifyFilesystem() +{ +#ifdef __EMSCRIPTEN__ + Emscripten_SetupFilesystem(); +#else + for (const char* file : g_files) { + MxString path(&file[1]); + path.MapPathToFilesystem(); + + if (!SDL_GetPathInfo(path.GetData(), NULL)) { + char buffer[512]; + SDL_snprintf( + buffer, + sizeof(buffer), + "\"LEGO® Island\" failed to start.\nPlease make sure the file %s is located in either diskpath or " + "cdpath.\nSDL error: %s", + file, + SDL_GetError() + ); + + Any_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "LEGO® Island Error", buffer, NULL); + return FAILURE; + } + } +#endif + + return SUCCESS; +} + IDirect3DRMMiniwinDevice* GetD3DRMMiniwinDevice() { LegoVideoManager* videoManager = LegoOmni::GetInstance()->GetVideoManager(); diff --git a/ISLE/isleapp.h b/ISLE/isleapp.h index b0b7805e..d76a291b 100644 --- a/ISLE/isleapp.h +++ b/ISLE/isleapp.h @@ -55,6 +55,7 @@ class IsleApp { void SetGameStarted(MxS32 p_gameStarted) { m_gameStarted = p_gameStarted; } MxResult ParseArguments(int argc, char** argv); + MxResult VerifyFilesystem(); private: char* m_hdPath; // 0x00 diff --git a/ISLE/islefiles.cpp b/ISLE/islefiles.cpp new file mode 100644 index 00000000..6e0bb482 --- /dev/null +++ b/ISLE/islefiles.cpp @@ -0,0 +1,48 @@ +const char* g_files[46] = { + "/LEGO/Scripts/CREDITS.SI", + "/LEGO/Scripts/INTRO.SI", + "/LEGO/Scripts/NOCD.SI", + "/LEGO/Scripts/SNDANIM.SI", + "/LEGO/Scripts/Act2/ACT2MAIN.SI", + "/LEGO/Scripts/Act3/ACT3.SI", + "/LEGO/Scripts/Build/COPTER.SI", + "/LEGO/Scripts/Build/DUNECAR.SI", + "/LEGO/Scripts/Build/JETSKI.SI", + "/LEGO/Scripts/Build/RACECAR.SI", + "/LEGO/Scripts/Garage/GARAGE.SI", + "/LEGO/Scripts/Hospital/HOSPITAL.SI", + "/LEGO/Scripts/Infocntr/ELEVBOTT.SI", + "/LEGO/Scripts/Infocntr/HISTBOOK.SI", + "/LEGO/Scripts/Infocntr/INFODOOR.SI", + "/LEGO/Scripts/Infocntr/INFOMAIN.SI", + "/LEGO/Scripts/Infocntr/INFOSCOR.SI", + "/LEGO/Scripts/Infocntr/REGBOOK.SI", + "/LEGO/Scripts/Isle/ISLE.SI", + "/LEGO/Scripts/Isle/JUKEBOX.SI", + "/LEGO/Scripts/Isle/JUKEBOXW.SI", + "/LEGO/Scripts/Police/POLICE.SI", + "/LEGO/Scripts/Race/CARRACE.SI", + "/LEGO/Scripts/Race/CARRACER.SI", + "/LEGO/Scripts/Race/JETRACE.SI", + "/LEGO/Scripts/Race/JETRACER.SI", + "/LEGO/data/ACT1INF.DTA", + "/LEGO/data/ACT2INF.DTA", + "/LEGO/data/ACT3INF.DTA", + "/LEGO/data/BLDDINF.DTA", + "/LEGO/data/BLDHINF.DTA", + "/LEGO/data/BLDJINF.DTA", + "/LEGO/data/BLDRINF.DTA", + "/LEGO/data/GMAININF.DTA", + "/LEGO/data/HOSPINF.DTA", + "/LEGO/data/ICUBEINF.DTA", + "/LEGO/data/IELEVINF.DTA", + "/LEGO/data/IISLEINF.DTA", + "/LEGO/data/IMAININF.DTA", + "/LEGO/data/IREGINF.DTA", + "/LEGO/data/OBSTINF.DTA", + "/LEGO/data/PMAININF.DTA", + "/LEGO/data/RACCINF.DTA", + "/LEGO/data/RACJINF.DTA", + "/LEGO/data/WORLD.WDB", + "/LEGO/data/testinf.dta", +}; diff --git a/LEGO1/omni/include/mxstring.h b/LEGO1/omni/include/mxstring.h index 8e7fba10..89ebcd5f 100644 --- a/LEGO1/omni/include/mxstring.h +++ b/LEGO1/omni/include/mxstring.h @@ -11,7 +11,7 @@ class MxString : public MxCore { public: MxString(); MxString(const MxString& p_str); - MxString(const char* p_str); + LEGO1_EXPORT MxString(const char* p_str); MxString(const char* p_str, MxU16 p_maxlen); LEGO1_EXPORT ~MxString() override; @@ -27,7 +27,7 @@ class MxString : public MxCore { MxString& operator+=(const char* p_str); static void CharSwap(char* p_a, char* p_b); - static void MapPathToFilesystem(char* p_path); + LEGO1_EXPORT static void MapPathToFilesystem(char* p_path); // FUNCTION: BETA10 0x10017c50 char* GetData() const { return m_data; }