Pull XDG directory code from system_linux.cpp.

Index: src/common/system/system.cpp
--- src/common/system/system.cpp.orig
+++ src/common/system/system.cpp
@@ -20,6 +20,8 @@
 
 #include "common/system/system.h"
 
+#include "common/logger.h"
+
 #include "common/make_unique.h"
 
 #if defined(PLATFORM_WINDOWS)
@@ -179,11 +181,44 @@ std::string CSystemUtils::GetLangPath()
 
 std::string CSystemUtils::GetSaveDir()
 {
-    return GetBasePath() + "saves";
+#if PORTABLE_SAVES || DEV_BUILD
+    return CSystemUtils::GetSaveDir();
+#else
+    std::string savegameDir;
+
+    // Determine savegame dir according to XDG Base Directory Specification
+    auto envXDG_DATA_HOME = GetEnvVar("XDG_DATA_HOME");
+    if (envXDG_DATA_HOME.empty())
+    {
+        auto envHOME = GetEnvVar("HOME");
+        if (envHOME.empty())
+        {
+            GetLogger()->Warn("Unable to find directory for saves - using default directory");
+            savegameDir = CSystemUtils::GetSaveDir();
+        }
+        else
+        {
+            savegameDir = envHOME + "/.local/share/colobot";
+        }
+    }
+    else
+    {
+        savegameDir = envXDG_DATA_HOME + "/colobot";
+    }
+    GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());
+
+    return savegameDir;
+#endif
 }
 
 std::string CSystemUtils::GetEnvVar(const std::string& name)
 {
+    char* envVar = getenv(name.c_str());
+    if (envVar != nullptr)
+    {
+        GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), envVar);
+        return std::string(envVar);
+    }
     return "";
 }
 
