From 9ee783e8cfeaa0479bc3d5e83e44657f98a3001b Mon Sep 17 00:00:00 2001 From: Francesco Bonazzi Date: Mon, 27 Jul 2026 08:47:01 +0200 Subject: [PATCH 1/5] Fix two things that only ever worked on Linux The macOS branch of ResourceManager::setupDataPath() does not compile: it builds the bundle path with applePath + "/", where applePath is a char array and "/" is another array, so it is adding a pointer to a pointer. Whatever else is true of the macOS build, it has not been attempted for a long time. The editor's load and save dialogs start in $HOME, which on Windows is only set if somebody has set it, so they opened on nothing. They now start in the folder the player's own levels are saved to, which ResourceManager already resolves per platform, and which is where a level being loaded or saved from the editor belongs anyway. That was getEnv()'s only caller, and its comment already said it should be doing something else on Windows. Neither of these is verified on the platform it concerns. There is no macOS in the build system beyond a single if(WIN32 OR APPLE), and the Windows CI is an AppVeyor file pinned to a branch this fork does not have. Co-Authored-By: Claude Opus 5 (cherry picked from commit db2e2300b26df608b6cf3ee2380b4c86ff5a67ea) --- source/modes/EditorMode.cpp | 30 +++++++++--------------------- source/modes/EditorMode.h | 1 - source/utils/ResourceManager.cpp | 3 ++- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/source/modes/EditorMode.cpp b/source/modes/EditorMode.cpp index 597854a03..b2137cf52 100755 --- a/source/modes/EditorMode.cpp +++ b/source/modes/EditorMode.cpp @@ -470,16 +470,21 @@ void EditorMode::activate() // Hide also the Replay check-box as it doesn't make sense for the editor guiSheet->getChild("ConfirmExit/SaveReplayCheckbox")->hide(); guiSheet->getChild("GameChatWindow/GameChatEditBox")->hide(); + // Start the file dialogs in the folder the player's own levels are saved to. That used + // to be $HOME, which is only set on Windows if someone has set it: there the dialogs + // opened on nothing at all. ResourceManager resolves this one per platform, and it is + // where a level being loaded or saved from the editor belongs anyway. + const std::string userLevelPath = ResourceManager::getSingleton().getUserLevelPathSkirmish(); guiSheet->getChild("MenuEditorLoad")->hide(); guiSheet->getChild("MenuEditorLoad")->getChild("LevelWindowFrame") - ->getChild("FilePath")->setText(getEnv("HOME")); + ->getChild("FilePath")->setText(userLevelPath); guiSheet->getChild("MenuEditorLoad")->getChild("LevelWindowFrame") - ->getChild("FilePath")->fireEvent(CEGUI::Editbox::EventTextAccepted,args); + ->getChild("FilePath")->fireEvent(CEGUI::Editbox::EventTextAccepted,args); guiSheet->getChild("MenuEditorSave")->hide(); guiSheet->getChild("MenuEditorSave")->getChild("LevelWindowFrame") - ->getChild("FilePath")->setText(getEnv("HOME")); + ->getChild("FilePath")->setText(userLevelPath); guiSheet->getChild("MenuEditorSave")->getChild("LevelWindowFrame") - ->getChild("FilePath")->fireEvent(CEGUI::Editbox::EventTextAccepted,args); + ->getChild("FilePath")->fireEvent(CEGUI::Editbox::EventTextAccepted,args); CEGUI::Combobox* levelTypeCb = static_cast (mRootWindow->getChild("LevelWindowFrame/LevelTypeSelect")); levelTypeCb->setItemSelectState(static_cast(0), true); @@ -2026,23 +2031,6 @@ bool EditorMode::updateDescription(const CEGUI::EventArgs&) return true; } -std::string EditorMode::getEnv( const std::string & var ) -{ - // WINDOWS: - // "you could look at HOMEDRIVE, HOMEPATH or USERPROFILE - // env variables on windows. or i guess SHGetFolderPathA()" - const char * val = std::getenv( var.c_str() ); - if ( val == nullptr ) - { // invalid to assign nullptr to std::string - return ""; - } - else - { - return val; - } -} - - void EditorMode::uninstallRecentlyUsedFilesButtons() { CEGUI::Window *pm = mRootWindow->getChild("Menubar")->getChild("File")->getChild("PopupMenu1")->getChild("RecentlyUsed")->getChild("PopupMenu2"); diff --git a/source/modes/EditorMode.h b/source/modes/EditorMode.h index 6de7bca85..f591780dd 100755 --- a/source/modes/EditorMode.h +++ b/source/modes/EditorMode.h @@ -116,7 +116,6 @@ friend class ODClient; void displayText(const Ogre::ColourValue& txtColour, const std::string& txt) override; bool updateDescription(const CEGUI::EventArgs& e = {}); - std::string getEnv( const std::string & var ); bool isCheckboxSelected(const CEGUI::String& checkbox); private: diff --git a/source/utils/ResourceManager.cpp b/source/utils/ResourceManager.cpp index 6774100c0..42febbd8c 100755 --- a/source/utils/ResourceManager.cpp +++ b/source/utils/ResourceManager.cpp @@ -115,7 +115,8 @@ void ResourceManager::setupDataPath(boost::program_options::variables_map& optio CFRelease(mainBundleURL); CFRelease(cfStringRef); - mMacBundlePath = std::string(applePath + "/"); + // Not applePath + "/": that is a pointer plus a pointer, which does not compile. + mMacBundlePath = std::string(applePath) + "/"; mGameDataPath = mMacBundlePath + "Contents/Resources/"; #else // Windows and linux From d20d9465ec3bdd5cd1eba0a2a72eedfe08c61e7a Mon Sep 17 00:00:00 2001 From: Francesco Bonazzi Date: Mon, 27 Jul 2026 09:12:58 +0200 Subject: [PATCH 2/5] Fix the rest of what only worked on Linux, and one level file bug it hid A level file written on Windows does not load anywhere else. Its lines end with a carriage return before the line feed, and only Windows takes that back off when reading, so everywhere else the carriage return stays at the end of the line. There it makes the last value on the line, or a section marker standing alone, into something the parser does not recognise, and loading fails outright: verified here by converting a level to CRLF, which turns into "The level file can't be loaded". Helper::readFile now strips it, which covers every level and every config file since they all come through there. The same level loads cleanly afterwards, as do all twelve config files converted the same way. Then the Windows specific parts: The window icon is installed with SetClassLong and a handle cast to LONG. A handle is 64 bits wide in a 64 bit build and LONG stays 32, so that does not compile there. SetClassLongPtr is the same call in a 32 bit build. The Discord link ran xdg-open, which is the freedesktop way and exists on neither of the other two. It now uses ShellExecute on Windows and open on macOS. The editor's file lists asked whether a name starts with a dot to decide whether a file is hidden. On Windows that is an attribute of the file rather than anything in its name, and the code that would have read it was commented out, so the "show hidden files" checkbox did nothing. It now reads the attribute, which needs the whole path rather than the file name. setupOgreResources treated a path as absolute if it starts with '/', which no absolute Windows path does. And the two places that make sure a folder ends with a separator only accepted '/', so a path ending in a backslash got a slash added after it. Only the level file fix is verified: it is the only one of these that can be reached from Linux. Co-Authored-By: Claude Opus 5 (cherry picked from commit f45b42750411f0e0559e4a37132c210babf2bb79) --- source/ODApplication.cpp | 6 +++++- source/modes/AdvertMode.cpp | 33 +++++++++++++++++++++++++++++++- source/modes/EditorMode.cpp | 26 +++++++++++++++---------- source/modes/EditorMode.h | 5 ++++- source/utils/Helper.cpp | 10 ++++++++++ source/utils/ResourceManager.cpp | 23 ++++++++++++++++++---- 6 files changed, 86 insertions(+), 17 deletions(-) diff --git a/source/ODApplication.cpp b/source/ODApplication.cpp index 70abe9154..f476e664d 100644 --- a/source/ODApplication.cpp +++ b/source/ODApplication.cpp @@ -231,7 +231,11 @@ void ODApplication::startClient() HWND hwnd; renderWindow->getCustomAttribute("WINDOW", static_cast(&hwnd)); HINSTANCE hInst = static_cast(GetModuleHandle(nullptr)); - SetClassLong(hwnd, GCL_HICON, reinterpret_cast(LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)))); + // SetClassLong takes a 32 bit value, so casting the icon handle to one only works + // while a handle is 32 bits wide: a 64 bit build does not compile. The Ptr form is + // the same call on a 32 bit build and the right one on a 64 bit build. + SetClassLongPtr(hwnd, GCLP_HICON, + reinterpret_cast(LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)))); #endif //Initialise RTshader system diff --git a/source/modes/AdvertMode.cpp b/source/modes/AdvertMode.cpp index 90b370b77..46fdf613b 100755 --- a/source/modes/AdvertMode.cpp +++ b/source/modes/AdvertMode.cpp @@ -23,6 +23,37 @@ #include #include +#include + +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#include +#endif + +namespace +{ + //! \brief Hands a link to whatever the system uses to open one. Each platform has its + //! own way: xdg-open is the freedesktop one and does not exist on the other two. + void openInBrowser(const std::string& url) + { +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 + ShellExecuteA(nullptr, "open", url.c_str(), nullptr, nullptr, SW_SHOWNORMAL); +#else +#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE + const std::string command = "open '" + url + "'"; +#else + const std::string command = "xdg-open '" + url + "'"; +#endif + // The result is worth looking at only to say so: there is nothing to fall back on, + // and the game is on its way out by the time this runs. + if(std::system(command.c_str()) != 0) + OD_LOG_WRN("Couldn't open " + url); +#endif + } +} + AdvertMode::AdvertMode(ModeManager* modeManager): AbstractApplicationMode(modeManager, ModeManager::ADVERTISMENT) @@ -85,7 +116,7 @@ void AdvertMode::activate() bool AdvertMode::showWWW() { ODFrameListener::getSingletonPtr()->requestExit(); - system("xdg-open 'https://discord.gg/K2JPXuchZV'"); + openInBrowser("https://discord.gg/K2JPXuchZV"); return true; } diff --git a/source/modes/EditorMode.cpp b/source/modes/EditorMode.cpp index b2137cf52..fb627f6b0 100755 --- a/source/modes/EditorMode.cpp +++ b/source/modes/EditorMode.cpp @@ -57,7 +57,9 @@ #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 -#include +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include #endif #include @@ -1570,7 +1572,7 @@ bool EditorMode::loadMenuFilePathTextChanged( const CEGUI::EventArgs& /*arg*/) int nn = 1; for (directory_entry& xx : directory_iterator(pp)) { - if(!(isFileHidden(xx.path().filename().generic_string()) + if(!(isFileHidden(xx.path()) && !isCheckboxSelected("MenuEditorLoad/LevelWindowFrame/HiddenFiles"))) { if(xx.path().has_extension() && xx.path().extension().compare(L".level") == 0) @@ -1724,7 +1726,7 @@ bool EditorMode::saveMenuFilePathTextChanged(const CEGUI::EventArgs& /*arg*/) int nn = 1; for (directory_entry& xx : directory_iterator(pp)) { - if(!(isFileHidden(xx.path().filename().generic_string()) && !isCheckboxSelected("MenuEditorSave/LevelWindowFrame/HiddenFiles"))) + if(!(isFileHidden(xx.path()) && !isCheckboxSelected("MenuEditorSave/LevelWindowFrame/HiddenFiles"))) { if(xx.path().has_extension() && xx.path().extension().compare(std::string(".level")) == 0) { @@ -2110,16 +2112,20 @@ bool EditorMode::isCheckboxSelected(const CEGUI::String& checkbox) } -bool EditorMode::isFileHidden(std::string path) +bool EditorMode::isFileHidden(const boost::filesystem::path& path) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 - - //DWORD attributes = GetFileAttributes(path); - //return (attributes & FILE_ATTRIBUTE_HIDDEN); - return false; + // Windows keeps it as an attribute of the file rather than in its name, so the whole + // path is needed to ask for it. A file we cannot read the attributes of is not hidden. + const DWORD attributes = GetFileAttributesA(path.string().c_str()); + if(attributes == INVALID_FILE_ATTRIBUTES) + return false; + + return (attributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) != 0; #else - return (path[0] == '.'); -#endif + const std::string filename = path.filename().string(); + return !filename.empty() && (filename[0] == '.'); +#endif } diff --git a/source/modes/EditorMode.h b/source/modes/EditorMode.h index f591780dd..f0a87a15a 100755 --- a/source/modes/EditorMode.h +++ b/source/modes/EditorMode.h @@ -186,7 +186,10 @@ friend class ODClient; bool loadLevelFromFile(const std::string&); //! \brief file path to currently choosen file via load / save menu - bool isFileHidden(std::string path); + //! \brief Whether the file should be kept out of the level lists unless the player + //! asked for hidden ones. Takes the whole path: on Windows being hidden is an attribute + //! of the file, not a dot in front of its name. + bool isFileHidden(const boost::filesystem::path& path); void addPathNameToList(boost::filesystem::directory_entry& xx, CEGUI::Listbox* levelSelectList, CEGUI::Colour cc, int& nn ); std::string dialogFullPath; diff --git a/source/utils/Helper.cpp b/source/utils/Helper.cpp index 7ee2a4f79..badec2e71 100755 --- a/source/utils/Helper.cpp +++ b/source/utils/Helper.cpp @@ -184,6 +184,16 @@ namespace Helper while (baseLevelFile.good()) { std::getline(baseLevelFile, nextParam); + + // A file written on Windows ends its lines with a carriage return before the + // line feed, and only Windows strips it back off when reading. Everywhere else + // it stays at the end of the line, where it makes the last value on it, or a + // section marker standing alone, something nothing here recognises: a level + // saved on Windows would not load anywhere at all. Take it off ourselves so + // that it makes no difference where a file was written. + if(!nextParam.empty() && (*nextParam.rbegin() == '\r')) + nextParam.erase(nextParam.size() - 1); + /* Find the first occurrence of the comment symbol on the * line and return everything before that character. */ diff --git a/source/utils/ResourceManager.cpp b/source/utils/ResourceManager.cpp index 42febbd8c..d299a0424 100755 --- a/source/utils/ResourceManager.cpp +++ b/source/utils/ResourceManager.cpp @@ -56,6 +56,20 @@ #include +namespace +{ + //! \brief Whether the character ends a folder name. Windows takes both, and the paths + //! here are a mix: some are built with '/', some come from the system or the player. + bool isDirectorySeparator(char c) + { +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 + return (c == '/') || (c == '\\'); +#else + return c == '/'; +#endif + } +} + template<> ResourceManager* Ogre::Singleton::msSingleton = nullptr; #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 && defined(OD_DEBUG) //On windows, if the application is compiled in debug mode, use the plugins with debug prefix. @@ -131,7 +145,7 @@ void ResourceManager::setupDataPath(boost::program_options::variables_map& optio if(!path.empty()) { mGameDataPath = path; - if (*mGameDataPath.rbegin() != '/') + if (!isDirectorySeparator(*mGameDataPath.rbegin())) { mGameDataPath.append("/"); } @@ -203,8 +217,7 @@ void ResourceManager::setupUserDataFolders(boost::program_options::variables_map mUserDataPath = itOption->second.as(); if(!mUserDataPath.empty()) { - uint32_t len = mUserDataPath.length(); - if((mUserDataPath.at(len - 1) != '/') && (mUserDataPath.at(len - 1) != '\\')) + if(!isDirectorySeparator(*mUserDataPath.rbegin())) mUserDataPath += '/'; mUserConfigPath = mUserDataPath + "cfg/"; @@ -496,7 +509,9 @@ void ResourceManager::setupOgreResources(uint16_t shaderLanguageVersion) const Ogre::String& typeName = setting.first; Ogre::String archName = setting.second; - if(!archName.empty() && archName.front() != '/') // do not modify absolute paths + // Do not modify absolute paths. A leading '/' is not what makes one on Windows, + // where they start with a drive letter, so let boost decide. + if(!archName.empty() && !boost::filesystem::path(archName).is_absolute()) archName = mGameDataPath + archName; else archName = Ogre::FileSystemLayer::resolveBundlePath(archName); From f876104137d332cb31ec87d6e639e7b43cf71b60 Mon Sep 17 00:00:00 2001 From: Francesco Bonazzi Date: Thu, 6 Aug 2026 11:56:58 +0200 Subject: [PATCH 3/5] Fix the two things that still did not compile on macOS Helper::toString calls with a size_t argument are ambiguous on macOS for the same reason they already were on OpenBSD: size_t is unsigned long, which is neither of the fixed-width 64 bit types there. Enable the same size_t overload on Apple. StackTraceUnix relies on struct sigcontext and the deprecated ucontext routines, neither of which macOS provides; give macOS the stub stack trace instead. Verified: the full game now compiles and links on macOS (Ogre 13.6.5, CEGUI, SFML 2.6.2, OIS 1.5.1 built from the versions pinned in snap/snapcraft.yaml). Co-Authored-By: Claude Fable 5 --- CMakeLists.txt | 4 ++++ source/utils/Helper.cpp | 2 +- source/utils/Helper.h | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b4db03d6..e6fb880e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -505,6 +505,10 @@ IF (MINGW) SET(OD_SOURCEFILES ${OD_SOURCEFILES} ${SRC}/utils/StackTraceWinMinGW.cpp) ELSEIF(MSVC) SET(OD_SOURCEFILES ${OD_SOURCEFILES} ${SRC}/utils/StackTraceWinMSVC.cpp) +ELSEIF(APPLE) + # StackTraceUnix relies on struct sigcontext and the deprecated ucontext + # routines, neither of which exists on macOS. + SET(OD_SOURCEFILES ${OD_SOURCEFILES} ${SRC}/utils/StackTraceStub.cpp) ELSEIF(UNIX) SET(OD_SOURCEFILES ${OD_SOURCEFILES} ${SRC}/utils/StackTraceUnix.cpp) ELSE() diff --git a/source/utils/Helper.cpp b/source/utils/Helper.cpp index badec2e71..1232d8d10 100755 --- a/source/utils/Helper.cpp +++ b/source/utils/Helper.cpp @@ -294,7 +294,7 @@ namespace Helper { return TTostring(d); } - #if defined(__OpenBSD__) && defined(__LP64__) + #if defined(__APPLE__) || (defined(__OpenBSD__) && defined(__LP64__)) std::string toString(size_t d) { return TTostring(d); diff --git a/source/utils/Helper.h b/source/utils/Helper.h index 30602fc7d..9f0610131 100755 --- a/source/utils/Helper.h +++ b/source/utils/Helper.h @@ -136,7 +136,10 @@ namespace Helper std::string toString(uint32_t d); std::string toString(int64_t d); std::string toString(uint64_t d); - #if defined(__OpenBSD__) && defined(__LP64__) + // On LP64 systems whose size_t is unsigned long while uint64_t is + // unsigned long long (macOS, OpenBSD), size_t matches none of the fixed + // width overloads and calls become ambiguous. + #if defined(__APPLE__) || (defined(__OpenBSD__) && defined(__LP64__)) std::string toString(size_t d); #endif std::string toString(const Ogre::Vector2& v); From 9ccaa1392f49ecad42300d5421b9f5b3ab412d10 Mon Sep 17 00:00:00 2001 From: Francesco Bonazzi Date: Thu, 6 Aug 2026 12:14:54 +0200 Subject: [PATCH 4/5] Guard the Windows macro definitions so -Werror builds survive MinGW's libstdc++ already defines NOMINMAX, so defining it again warns, and the game compiles with warnings treated as errors by default. Only define NOMINMAX and WIN32_LEAN_AND_MEAN when nothing else has. With this, every game translation unit compiles for Windows: checked with MinGW-w64 GCC (x86_64 and i686) against real Windows headers, Ogre 13.6.5, CEGUI and SFML 2.6. Co-Authored-By: Claude Fable 5 --- source/modes/AdvertMode.cpp | 6 ++++++ source/modes/EditorMode.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/source/modes/AdvertMode.cpp b/source/modes/AdvertMode.cpp index 46fdf613b..308ef9b7f 100755 --- a/source/modes/AdvertMode.cpp +++ b/source/modes/AdvertMode.cpp @@ -26,8 +26,14 @@ #include #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +// MinGW's libstdc++ predefines NOMINMAX, and the game builds with -Werror: +// an unconditional redefinition is fatal there. +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX #define NOMINMAX +#endif #include #include #endif diff --git a/source/modes/EditorMode.cpp b/source/modes/EditorMode.cpp index fb627f6b0..7deb58026 100755 --- a/source/modes/EditorMode.cpp +++ b/source/modes/EditorMode.cpp @@ -57,8 +57,14 @@ #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +// MinGW's libstdc++ predefines NOMINMAX, and the game builds with -Werror: +// an unconditional redefinition is fatal there. +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX #define NOMINMAX +#endif #include #endif From 2e2df09fcc59c3c83dc3152011342d3f7ca89579 Mon Sep 17 00:00:00 2001 From: Francesco Bonazzi Date: Thu, 6 Aug 2026 12:59:20 +0200 Subject: [PATCH 5/5] Let macOS find data and plugins outside an .app bundle On Apple the data path came only from the bundle layout, and nothing at all set the plugins.cfg path: outside a real .app bundle the game could not find its data and never loaded a render system. The current-folder overrides (data and plugins.cfg in "." win over the installed ones) and the plugins.cfg resolution were sitting in the Windows-and-Linux branch even though they are not platform specific; run them on every platform. Verified on macOS: the game now starts, loads all its data and runs a level in --server mode. (Graphics could not be exercised on the build machine, a VM with no GL driver; the rendering path is unchanged and assumes working drivers.) Co-Authored-By: Claude Fable 5 --- source/utils/ResourceManager.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/utils/ResourceManager.cpp b/source/utils/ResourceManager.cpp index d299a0424..3a6d33763 100755 --- a/source/utils/ResourceManager.cpp +++ b/source/utils/ResourceManager.cpp @@ -112,6 +112,7 @@ ResourceManager::ResourceManager(boost::program_options::variables_map& options) void ResourceManager::setupDataPath(boost::program_options::variables_map& options) { + std::string path; #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE //TODO - Test osx support char applePath[1024]; @@ -135,7 +136,6 @@ void ResourceManager::setupDataPath(boost::program_options::variables_map& optio mGameDataPath = mMacBundlePath + "Contents/Resources/"; #else // Windows and linux - std::string path; #ifdef OD_DATA_PATH path = std::string(OD_DATA_PATH); #else @@ -154,7 +154,12 @@ void ResourceManager::setupDataPath(boost::program_options::variables_map& optio mGameDataPath = Ogre::FileSystemLayer::resolveBundlePath(mGameDataPath); #endif } +#endif // Windows and Linux + // From here on the logic is the same on every platform: data or a plugins.cfg + // in the current folder win over the installed ones. This is also what lets a + // macOS build run at all outside an .app bundle: the Apple branch above knows + // only the bundle layout, and nothing used to set the plugins path there. // Test whether there is data in "./" and remove the system path in that case. // Useful for developers. std::string resourceCfg = "./" + RESOURCECFG; @@ -194,8 +199,6 @@ void ResourceManager::setupDataPath(boost::program_options::variables_map& optio mPluginsPath = pluginsCfg; } -#endif // Windows and Linux - OD_LOG_INF( PLUGINSCFG + " path is: " + mPluginsPath + '\n'); mScriptPath = mGameDataPath + SCRIPTSUBPATH;