diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index eb1084b4..dc561b87 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -113,6 +113,8 @@ IsleApp::IsleApp() m_cursorCurrent = NULL; LegoOmni::CreateInstance(); + + m_iniPath = NULL; } // FUNCTION: ISLE 0x4011a0 @@ -251,6 +253,16 @@ int SDL_AppInit(void** appstate, int argc, char** argv) // Create global app instance g_isle = new IsleApp(); + if (g_isle->ParseArguments(argc, argv) != SUCCESS) { + SDL_ShowSimpleMessageBox( + SDL_MESSAGEBOX_ERROR, + "LEGO® Island Error", + "\"LEGO® Island\" failed to start. Invalid CLI arguments.", + NULL + ); + return SDL_APP_FAILURE; + } + // Create window if (g_isle->SetupWindow() != SUCCESS) { SDL_ShowSimpleMessageBox( @@ -499,9 +511,18 @@ void IsleApp::LoadConfig() { char* basePath = SDL_GetBasePath(); char* prefPath = SDL_GetPrefPath("isledecomp", "isle"); - char* iniConfig = new char[strlen(prefPath) + strlen("isle.ini") + 1](); - strcat(iniConfig, prefPath); - strcat(iniConfig, "isle.ini"); + char* iniConfig; + if (m_iniPath) { + iniConfig = new char[strlen(m_iniPath) + 1]; + strcpy(iniConfig, m_iniPath); + } + else { + iniConfig = new char[strlen(prefPath) + strlen("isle.ini") + 1](); + strcat(iniConfig, prefPath); + strcat(iniConfig, "isle.ini"); + } + SDL_Log("Reading configuration from \"%s\"", iniConfig); + dictionary* dict = iniparser_load(iniConfig); const char* hdPath = iniparser_getstring(dict, "isle:diskpath", basePath); @@ -674,3 +695,21 @@ void IsleApp::SetupCursor(Cursor p_cursor) SDL_HideCursor(); } } + +MxResult IsleApp::ParseArguments(int argc, char** argv) +{ + + for (int i = 1, consumed; i < argc; i += consumed) { + consumed = -1; + + if (strcmp(argv[i], "--ini") == 0 && i + 1 < argc) { + m_iniPath = argv[i + 1]; + consumed = 2; + } + if (consumed <= 0) { + SDL_Log("Invalid argument(s): %s", argv[i]); + return FAILURE; + } + } + return SUCCESS; +} diff --git a/ISLE/isleapp.h b/ISLE/isleapp.h index 7acea89c..f8206e18 100644 --- a/ISLE/isleapp.h +++ b/ISLE/isleapp.h @@ -47,6 +47,8 @@ class IsleApp { inline void SetWindowActive(MxS32 p_windowActive) { m_windowActive = p_windowActive; } + MxResult ParseArguments(int argc, char** argv); + private: char* m_hdPath; // 0x00 char* m_cdPath; // 0x04 @@ -75,6 +77,8 @@ class IsleApp { SDL_Cursor* m_cursorBusy; // 0x80 SDL_Cursor* m_cursorNo; // 0x84 SDL_Cursor* m_cursorCurrent; // 0x88 + + char* m_iniPath; }; #endif // ISLEAPP_H