diff --git a/loader/src/platform/windows/main.cpp b/loader/src/platform/windows/main.cpp index dd02a901..e4886417 100644 --- a/loader/src/platform/windows/main.cpp +++ b/loader/src/platform/windows/main.cpp @@ -138,11 +138,34 @@ void* mainTrampolineAddr; #include "gdTimestampMap.hpp" unsigned int gdTimestamp = 0; +// In case the game is launched from a different directory through command line +// this function will set the current working directory to the game's directory +// to avoid the game crashing due to not being able to find the resources +static void fixCWD() { + std::array cwd; + + DWORD size = GetModuleFileNameW(NULL, cwd.data(), cwd.size()); + if (size == cwd.size()) return; + + int i; + for (i = (int)size - 1; i >= 0; i--) { + if (cwd[i] == '\\') { + cwd[i] = 0; + break; + } + } + if (i < 0) return; + + SetCurrentDirectoryW(cwd.data()); +} + int WINAPI gdMainHook(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { // MessageBoxA(NULL, "Hello from gdMainHook!", "Hi", 0); updateGeode(); + fixCWD(); + if (versionToTimestamp(GEODE_STR(GEODE_GD_VERSION)) > gdTimestamp) { console::messageBox( "Unable to Load Geode!",