~ruther/guix-local

b4f567645a645ba4abc78d874e4953aaabcde1cf — Ada Stevenson 11 months ago 1a37374
gnu: Add serious-sam-classic.

* gnu/packages/games.scm: Add serious-sam-classic.
* gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch: Add patch.
* gnu/local.mk: Register it.

Change-Id: I65e830c9760294e567808d580e3083586d50c972
Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com>
M gnu/local.mk => gnu/local.mk +1 -0
@@ 2303,6 2303,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/scons-test-environment.patch		\
  %D%/packages/patches/scotch-cmake-remove-metis.patch		\
  %D%/packages/patches/screen-hurd-path-max.patch		\
  %D%/packages/patches/serious-sam-classic-engine-patch-paths.patch		\
  %D%/packages/patches/scsh-nonstring-search-path.patch	\
  %D%/packages/patches/seed-webkit.patch			\
  %D%/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch	\

M gnu/packages/games.scm => gnu/packages/games.scm +51 -0
@@ 3212,6 3212,57 @@ and defeat them with your bubbles!")
    ;; GPL2+ is for code, CC0 is for art.
    (license (list license:gpl2+ license:cc0))))

(define-public serious-sam-classic
  (package
    (name "serious-sam-classic")
    (version "1.10.7")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/tx00100xt/SeriousSamClassic")
             (commit version)))
       (sha256
        (base32 "1s1mbj2qpaxdrx0pfhdyk3v1vh7f2dp33w2i5ifpgphkchdx61jg"))
       (file-name (git-file-name name version))
       (modules '((guix build utils)))
       (patches (search-patches "serious-sam-classic-engine-patch-paths.patch"))))
    (build-system cmake-build-system)
    (arguments
     (list
      #:tests? #f                       ; no upstream tests
      #:configure-flags
      #~(list (string-append "-DCMAKE_INSTALL_PREFIX:PATH="
                             #$output))
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'fix-cmake
            (lambda _
              (substitute* (list "CMakeLists.txt"
                                 "SamTFE/Sources/CMakeLists.txt"
                                 "SamTSE/Sources/CMakeLists.txt")
                (("\"Install to systems directories\" Off")
                 "\"Install to systems directories\" On")
                (("march=native") "mtune=generic")
                (("CMAKE_SKIP_RPATH ON") "CMAKE_SKIP_RPATH OFF")
                (("/usr") #$output)
                (("lib64") "lib"))))
          (add-after 'fix-cmake 'fix-paths
            (lambda _
              (substitute* (list "SamTFE/Sources/Engine/Engine.cpp"
                                 "SamTSE/Sources/Engine/Engine.cpp")
                (("@OUTPUT_DIR@") #$output)))))))
    (inputs (list sdl2 libvorbis))
    (native-inputs (list flex bison nasm imagemagick))
    (home-page "https://github.com/tx00100xt/SeriousSamClassic")
    (synopsis "SeriousSam engine and Serious Sam: TFE and TSE")
    (description
     "This is an open-source port of the Serious Engine from
Serious Sam: The First Encounter and Serious Sam: The Second Encounter.
To run, you must put your official game data, @code{Levels} and @code{Help} in
@code{~/.local/share/Serious-Engine/{serioussam,serioussamse}/gamedata/}.}")
    (license license:gpl2)))

(define-public solarus
  (package
    (name "solarus")

A gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch => gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch +582 -0
@@ 0,0 1,582 @@
diff --git a/SamTFE/Sources/Engine/Base/Stream.cpp b/SamTFE/Sources/Engine/Base/Stream.cpp
index f30213a..8f2aa82 100644
--- a/SamTFE/Sources/Engine/Base/Stream.cpp
+++ b/SamTFE/Sources/Engine/Base/Stream.cpp
@@ -78,7 +78,9 @@ ULONG _ulVirtuallyAllocatedSpaceTotal = 0;
 // global string with application path (utf-8)
 CTFileName _fnmApplicationPath;
 CTFileName _fnmApplicationPathTMP; // home dir or application path
-
+#ifdef PLATFORM_UNIX
+CTFileName _fnmAdditionalDirPath; // additional search path
+#endif
 // global string with filename of the started application
 CTFileName _fnmApplicationExe;
 // global string with user-specific writable directory.
@@ -220,6 +222,17 @@ void InitStreams(void)
   }
   delete files;
 
+#ifdef PLATFORM_UNIX
+  // additional search path
+  files = _pFileSystem->FindFiles(_fnmAdditionalDirPath, "*.gro");
+  max = files->Count();
+  for (i = 0; i < max; i++) {
+    UNZIPAddArchive( _fnmAdditionalDirPath + ((*files)[i]) );
+  }
+  UNZIPAddArchive( _fnmApplicationPath + "share/serioussam/SE1_10b.gro");
+  delete files;
+#endif
+
   // if there is a mod active
   if (_fnmMod!="") {
     // for each group file in mod directory
@@ -1655,19 +1668,20 @@ INDEX ExpandFilePath(ULONG ulType, const CTFileName &fnmFile, CTFileName &fnmExp
 
   int _savegame       = strncmp((const char *)fnmFile, (const char *) "SaveGame", (size_t) 8 );
   int _usercontrols   = strncmp((const char *)fnmFile, (const char *) "Controls", (size_t) 8 );
-  int _persistentsym  = strncmp((const char *)fnmFile, (const char *) "Scripts/PersistentSymbols.ini", (size_t) 29 );
-  int _gamesgms       = strncmp((const char *)fnmFile, (const char *) "Data/SeriousSam.gms", (size_t) 19 );
-  int _comsolehistory = strncmp((const char *)fnmFile, (const char *) "Temp/ConsoleHistory.txt", (size_t) 23 );
-  int _userdemos      = strncmp((const char *)fnmFile, (const char *) "Demos/Demo", (size_t) 10 );
+  int _persistentsym  = strncmp((const char *)fnmFile, (const char *) "Scripts", (size_t) 7 );
+  int _gamesgms       = strncmp((const char *)fnmFile, (const char *) "Data", (size_t) 4 );
+  int _comsolehistory = strncmp((const char *)fnmFile, (const char *) "Temp", (size_t) 4 );
+  int _userdemos      = strncmp((const char *)fnmFile, (const char *) "Demo", (size_t) 4 );
   int _playersplr     = strncmp((const char *)fnmFile, (const char *) "Players", (size_t) 7 );
   int _screenshots    = strncmp((const char *)fnmFile, (const char *) "ScreenShots", (size_t) 11 );
   int _levelsvis      = strncmp((const char *)fnmFile, (const char *) "Levels", (size_t) 6 );
-
-  //CPrintF("ExpandFilePath: %s\n",(const char *) fnmFile);
+  int _help           = strncmp((const char *)fnmFile, (const char *) "Help", (size_t) 4 );
 
   if(( _savegame == 0 || _persistentsym == 0 || _gamesgms == 0 ||
     _comsolehistory == 0 || _userdemos == 0 || _playersplr == 0 || _screenshots == 0) && ( _bPortableVersion == FALSE)) {
        _fnmApplicationPathTMP = _fnmUserDir;
+  } else if (_help == 0) {
+    _fnmApplicationPathTMP = _fnmAdditionalDirPath;
   } else {
        _fnmApplicationPathTMP = _fnmApplicationPath;
   }
@@ -1675,6 +1689,8 @@ INDEX ExpandFilePath(ULONG ulType, const CTFileName &fnmFile, CTFileName &fnmExp
   if( _levelsvis == 0 && _bPortableVersion == FALSE) {
     if (fnmFileAbsolute.FileExt()==".vis") {
        _fnmApplicationPathTMP = _fnmUserDir;
+    } else {
+     _fnmApplicationPathTMP = _fnmAdditionalDirPath;
     }
   }
 
diff --git a/SamTFE/Sources/Engine/Base/Stream.h b/SamTFE/Sources/Engine/Base/Stream.h
index 8ff3de6..1e5aeae 100644
--- a/SamTFE/Sources/Engine/Base/Stream.h
+++ b/SamTFE/Sources/Engine/Base/Stream.h
@@ -391,6 +391,10 @@ ENGINE_API void MakeDirList(
 
 // global string with application path
 ENGINE_API extern CTFileName _fnmApplicationPath;
+#ifdef PLATFORM_UNIX
+// global string with additional search path
+ENGINE_API extern CTFileName _fnmAdditionalDirPath;
+#endif
 // global string with user-specific writable directory.
 ENGINE_API extern CTFileName _fnmUserDir;
 // global string with current MOD path
diff --git a/SamTFE/Sources/Engine/Engine.cpp b/SamTFE/Sources/Engine/Engine.cpp
index e6f7c4f..2b6cda5 100644
--- a/SamTFE/Sources/Engine/Engine.cpp
+++ b/SamTFE/Sources/Engine/Engine.cpp
@@ -115,6 +115,7 @@ static CTString sys_strModExt  = "";
 // Path vars
 static INDEX sys_iGameBits = 0;
 ENGINE_API INDEX sys_iSysPath = 0;
+ENGINE_API INDEX sys_iGameDataNotFound = 0;
 
 // Entities Adjesters
 ENGINE_API FLOAT _fPlayerFOVAdjuster = 1.0f;
@@ -676,10 +677,12 @@ ENGINE_API void SE_InitEngine(CTString strGameID)
   _fnmApplicationPath = CTString(strDirPath);
   _fnmApplicationExe = CTString(strExePath);
 #ifdef PLATFORM_UNIX
+  //_fnmAdditionalDirPath = "/usr/share/" + strGameID + "/";
     // rcg01012002 calculate user dir.
   char buf[MAX_PATH];
   _pFileSystem->GetUserDirectory(buf, sizeof (buf));
   _fnmUserDir = CTString(buf);
+  _fnmAdditionalDirPath = _fnmUserDir + "/gamedata/";
 #endif
   try {
     _fnmApplicationExe.RemoveApplicationPath_t();
@@ -742,147 +745,17 @@ ENGINE_API void SE_InitEngine(CTString strGameID)
   CPrintF(TRANSV("Running %d-bit version\n"), sys_iGameBits);
 
 #ifdef PLATFORM_UNIX
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/local/bin/", (size_t) 15 );
-#elif defined(__NetBSD__)
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/pkg/bin/", (size_t) 13 );
-#else
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/bin/", (size_t) 9 );
-#endif
-  if( _isystempath == 0 ) {
-       sys_iSysPath = 1; // using system path
-  } else {
-       sys_iSysPath = 0; // using standarted path
-  }
-
-  // get library path for mods
-  _fnmModLibPath = "";
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-  if( sys_iSysPath == 1 ) {
-    _fnmModLibPath = "/usr/local/lib/" + strGameID + "/";
-#elif defined(__NetBSD__)
-  if( sys_iSysPath == 1 ) {
-    _fnmModLibPath = "/usr/pkg/lib/" + strGameID + "/";
-#else
-  if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/aarch64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/aarch64-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib/arm-linux-gnueabihf/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/arm-linux-gnueabihf/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/riscv64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/riscv64-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/s390x-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/s390x-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/powerpc64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/powerpc64-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/x86_64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/x86_64-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib/i386-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/i386-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib64/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib64/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib//" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/" + strGameID + "/";
-#endif
-  } else if( sys_iSysPath == 0 ) {
-    _fnmModLibPath = _fnmApplicationPath;
-  } else {
-    CPrintF(TRANSV("ERROR: Game libraries not ound!\n"));
-    FatalError(TRANSV("Failed to search game libraries installed!\nPlease reinstall the game.\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID);
-  }
 
-  if( sys_iSysPath == 1 ) { // search game data
-    CTFileName _fnm_usr_TestFile, _fnm_local_TestFile, _fnm_home_TestFile;
-    CTString _fnmUserDataPath, _fnm_TestFile;
-    int _fd;
-
-    if( access((const char *) _fnmUserDir+_strLogFile+".cfg", F_OK) == 0 ) {
-      _fd = open((const char *) _fnmUserDir+_strLogFile+".cfg", O_RDONLY,S_IRUSR);
-      size_t x = read(_fd, _path, 2048);
-      _fnmUserDataPath = (CTString)_path + "/";
-      close(_fd);
-      CPrintF(TRANSV("Testing home path: %s\n"), (const char *) _fnmUserDataPath);
-    } else { 
-      _fnmUserDataPath = "";
-    }
-
-    // set testing files
-    if( strGameID == "serioussamse") {
-      _fnm_TestFile = "SE1_00_Levels.gro";
-    } else {
-      _fnm_TestFile = "1_00_music.gro";
-    }
-    CPrintF(TRANSV("Testing file: %s\n"), (const char *) _fnm_TestFile);
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-    _fnm_usr_TestFile = "/usr/local/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#elif defined(__NetBSD__)
-    _fnm_usr_TestFile = "/usr/pkg/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#else
-    _fnm_usr_TestFile = "/usr/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#endif
-    _fnm_local_TestFile = _fnmUserDir + _fnm_TestFile;                   //  data in home .local
-    _fnm_home_TestFile = (const char *)_fnmUserDataPath  + _fnm_TestFile;
-    // test
-    if( access((const char *) _fnm_home_TestFile, F_OK) != 0 ) {
-      CPrintF(TRANSV("Testing system path: %s\n"), (const char *) _fnm_usr_TestFile);
-      CPrintF(TRANSV("Testing local  path: %s\n"), (const char *) _fnm_local_TestFile);
-      if( access((const char *) _fnm_usr_TestFile, F_OK) == 0 ) {
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-        _fnmApplicationPath = "/usr/local/share/" + strGameID + "/";                       // all game data
-#elif defined(__NetBSD__)
-        _fnmApplicationPath = "/usr/pkg/share/" + strGameID + "/";                       // all game data
-#else
-        _fnmApplicationPath = "/usr/share/" + strGameID + "/";                       // all game data
-#endif
-        CPrintF(TRANSV("Found usr path: %s\n"), (const char *) _fnmUserDataPath);
-      } else if( access((const char *) _fnm_local_TestFile, F_OK) == 0 ) {
-        _fnmApplicationPath = _fnmUserDir;                                           // all game data
-        CPrintF(TRANSV("Found local path: %s\n"), (const char *) _fnmUserDataPath);
-      } else {
-        // search in home dir 
-        // BOOL YesNoMessage(const char *strFormat, ...)
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-        InfoMessage(TRANS("No game files were found in /usr/local/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#elif defined(__NetBSD__)
-        InfoMessage(TRANS("No game files were found in /usr/pkg/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#else
-        InfoMessage(TRANS("No game files were found in /usr/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#endif
-        struct passwd *pw = getpwuid(getuid());
-        const char *_homedir = pw->pw_dir;
-        _testfiledone = 0;
-        _list_dir(_homedir, 0, strGameID);
-        CTString _PATH;
-        _PATH = (CTString)_path;
-        _fnmApplicationPath = (CTFileName) _PATH + "/";
-        _fnm_home_TestFile  = (CTFileName) _PATH + "/" + _fnm_TestFile; 
-        if( access((const char *) _fnm_home_TestFile, F_OK) == 0 ) {
-          //_fnmApplicationPath = (CTFileName) _PATH + "/";
-          CPrintF(TRANSV("Found home path: %s\n"), (const char *) _fnm_home_TestFile);
-          _fd = open((const char *) _fnmUserDir+_strLogFile+".cfg", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
-          size_t x = write(_fd, _path, 2048);
-          close(_fd);
-        } else {
-          CPrintF(TRANSV("ERROR: Game data not ound!\n"));
-          _fnmUserDataPath = "";
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/local/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#elif defined(__NetBSD__)
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/pkg/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#else
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#endif
-        }
-      } 
-    } else {
-      CPrintF(TRANSV("Found path: %s\n"), (const char *) _fnmUserDataPath);
-      _fnmApplicationPath = _fnmUserDataPath;                                         // all game data
-    }
-  }
+  // using system path
+  sys_iSysPath = 1;
+  // library path for mods
+  _fnmModLibPath = _fnmApplicationPath + "lib/" + strGameID + "/";
 
   // print info on the started application
   CPrintF(TRANSV("Executable: %s\n"), (const char *) strExePath);
   CPrintF(TRANSV("Assumed engine data directory: %s\n"), (const char *) _fnmApplicationPath);
   CPrintF(TRANSV("Assumed mods library directory: %s\n"), (const char *) _fnmModLibPath);
+  CPrintF(TRANSV("Assumed additional data directory: %s\n"), (const char *) _fnmAdditionalDirPath);
 #endif
 
   CPrintF("\n");
diff --git a/SamTFE/Sources/Engine/Engine.h b/SamTFE/Sources/Engine/Engine.h
index 8307f70..6ba88a4 100644
--- a/SamTFE/Sources/Engine/Engine.h
+++ b/SamTFE/Sources/Engine/Engine.h
@@ -207,6 +207,7 @@ extern ENGINE_API BOOL _bWorldEditorApp; // is this world edtior app
 extern ENGINE_API CTString _strLogFile;
 extern ENGINE_API CTFileName _fnmModLibPath;
 extern ENGINE_API INDEX sys_iSysPath;
+extern ENGINE_API INDEX sys_iGameDataNotFound;
 #ifdef PLATFORM_WIN32
 //
 extern ENGINE_API FLOAT _fPlayerFOVAdjuster;
diff --git a/SamTSE/Sources/Engine/Base/Stream.cpp b/SamTSE/Sources/Engine/Base/Stream.cpp
index f30213a..9a2ffaf 100644
--- a/SamTSE/Sources/Engine/Base/Stream.cpp
+++ b/SamTSE/Sources/Engine/Base/Stream.cpp
@@ -78,7 +78,9 @@ ULONG _ulVirtuallyAllocatedSpaceTotal = 0;
 // global string with application path (utf-8)
 CTFileName _fnmApplicationPath;
 CTFileName _fnmApplicationPathTMP; // home dir or application path
-
+#ifdef PLATFORM_UNIX
+CTFileName _fnmAdditionalDirPath; // additional search path
+#endif
 // global string with filename of the started application
 CTFileName _fnmApplicationExe;
 // global string with user-specific writable directory.
@@ -194,15 +196,16 @@ void InitStreams(void)
     }
   }
   // find eventual extension for the mod's dlls
-  _strModExt = "";
+  _strModExt = "MP";
   // DG: apparently both ModEXT.txt and ModExt.txt exist in the wild.
+/*
   CTFileName tmp;
   if(ExpandFilePath(EFP_READ, CTString("ModEXT.txt"), tmp) != EFP_NONE) {
     LoadStringVar(CTString("ModEXT.txt"), _strModExt);
   } else {
     LoadStringVar(CTString("ModExt.txt"), _strModExt);
   }
-
+*/
 
   CPrintF(TRANSV("Loading group files...\n"));
 
@@ -220,6 +223,17 @@ void InitStreams(void)
   }
   delete files;
 
+#ifdef PLATFORM_UNIX
+  // additional search path
+  files = _pFileSystem->FindFiles(_fnmAdditionalDirPath, "*.gro");
+  max = files->Count();
+  for (i = 0; i < max; i++) {
+    UNZIPAddArchive( _fnmAdditionalDirPath + ((*files)[i]) );
+  }
+  UNZIPAddArchive( _fnmApplicationPath + "share/serioussamse/SE1_10b.gro");
+  delete files;
+#endif
+
   // if there is a mod active
   if (_fnmMod!="") {
     // for each group file in mod directory
@@ -1655,19 +1669,20 @@ INDEX ExpandFilePath(ULONG ulType, const CTFileName &fnmFile, CTFileName &fnmExp
 
   int _savegame       = strncmp((const char *)fnmFile, (const char *) "SaveGame", (size_t) 8 );
   int _usercontrols   = strncmp((const char *)fnmFile, (const char *) "Controls", (size_t) 8 );
-  int _persistentsym  = strncmp((const char *)fnmFile, (const char *) "Scripts/PersistentSymbols.ini", (size_t) 29 );
-  int _gamesgms       = strncmp((const char *)fnmFile, (const char *) "Data/SeriousSam.gms", (size_t) 19 );
-  int _comsolehistory = strncmp((const char *)fnmFile, (const char *) "Temp/ConsoleHistory.txt", (size_t) 23 );
-  int _userdemos      = strncmp((const char *)fnmFile, (const char *) "Demos/Demo", (size_t) 10 );
+  int _persistentsym  = strncmp((const char *)fnmFile, (const char *) "Scripts", (size_t) 7 );
+  int _gamesgms       = strncmp((const char *)fnmFile, (const char *) "Data", (size_t) 4 );
+  int _comsolehistory = strncmp((const char *)fnmFile, (const char *) "Temp", (size_t) 4 );
+  int _userdemos      = strncmp((const char *)fnmFile, (const char *) "Demo", (size_t) 4 );
   int _playersplr     = strncmp((const char *)fnmFile, (const char *) "Players", (size_t) 7 );
   int _screenshots    = strncmp((const char *)fnmFile, (const char *) "ScreenShots", (size_t) 11 );
   int _levelsvis      = strncmp((const char *)fnmFile, (const char *) "Levels", (size_t) 6 );
-
-  //CPrintF("ExpandFilePath: %s\n",(const char *) fnmFile);
+  int _help           = strncmp((const char *)fnmFile, (const char *) "Help", (size_t) 4 );
 
   if(( _savegame == 0 || _persistentsym == 0 || _gamesgms == 0 ||
     _comsolehistory == 0 || _userdemos == 0 || _playersplr == 0 || _screenshots == 0) && ( _bPortableVersion == FALSE)) {
        _fnmApplicationPathTMP = _fnmUserDir;
+  } else if (_help == 0) {
+    _fnmApplicationPathTMP = _fnmAdditionalDirPath;
   } else {
        _fnmApplicationPathTMP = _fnmApplicationPath;
   }
@@ -1675,6 +1690,8 @@ INDEX ExpandFilePath(ULONG ulType, const CTFileName &fnmFile, CTFileName &fnmExp
   if( _levelsvis == 0 && _bPortableVersion == FALSE) {
     if (fnmFileAbsolute.FileExt()==".vis") {
        _fnmApplicationPathTMP = _fnmUserDir;
+    } else {
+     _fnmApplicationPathTMP = _fnmAdditionalDirPath;
     }
   }
 
diff --git a/SamTSE/Sources/Engine/Base/Stream.h b/SamTSE/Sources/Engine/Base/Stream.h
index 8ff3de6..1e5aeae 100644
--- a/SamTSE/Sources/Engine/Base/Stream.h
+++ b/SamTSE/Sources/Engine/Base/Stream.h
@@ -391,6 +391,10 @@ ENGINE_API void MakeDirList(
 
 // global string with application path
 ENGINE_API extern CTFileName _fnmApplicationPath;
+#ifdef PLATFORM_UNIX
+// global string with additional search path
+ENGINE_API extern CTFileName _fnmAdditionalDirPath;
+#endif
 // global string with user-specific writable directory.
 ENGINE_API extern CTFileName _fnmUserDir;
 // global string with current MOD path
diff --git a/SamTSE/Sources/Engine/Engine.cpp b/SamTSE/Sources/Engine/Engine.cpp
index e6f7c4f..97baa59 100644
--- a/SamTSE/Sources/Engine/Engine.cpp
+++ b/SamTSE/Sources/Engine/Engine.cpp
@@ -110,11 +110,12 @@ static INDEX sys_iHDDMisc = 0;
 
 // MOD info
 static CTString sys_strModName = "";
-static CTString sys_strModExt  = "";
+static CTString sys_strModExt  = "MP";
 
 // Path vars
 static INDEX sys_iGameBits = 0;
 ENGINE_API INDEX sys_iSysPath = 0;
+ENGINE_API INDEX sys_iGameDataNotFound = 0;
 
 // Entities Adjesters
 ENGINE_API FLOAT _fPlayerFOVAdjuster = 1.0f;
@@ -676,10 +677,12 @@ ENGINE_API void SE_InitEngine(CTString strGameID)
   _fnmApplicationPath = CTString(strDirPath);
   _fnmApplicationExe = CTString(strExePath);
 #ifdef PLATFORM_UNIX
+  //_fnmAdditionalDirPath = "/usr/share/" + strGameID + "/";
     // rcg01012002 calculate user dir.
   char buf[MAX_PATH];
   _pFileSystem->GetUserDirectory(buf, sizeof (buf));
   _fnmUserDir = CTString(buf);
+  _fnmAdditionalDirPath = _fnmUserDir + "/gamedata/";
 #endif
   try {
     _fnmApplicationExe.RemoveApplicationPath_t();
@@ -742,147 +745,16 @@ ENGINE_API void SE_InitEngine(CTString strGameID)
   CPrintF(TRANSV("Running %d-bit version\n"), sys_iGameBits);
 
 #ifdef PLATFORM_UNIX
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/local/bin/", (size_t) 15 );
-#elif defined(__NetBSD__)
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/pkg/bin/", (size_t) 13 );
-#else
-  int _isystempath = strncmp((const char *)strExePath, (const char *) "/usr/bin/", (size_t) 9 );
-#endif
-  if( _isystempath == 0 ) {
-       sys_iSysPath = 1; // using system path
-  } else {
-       sys_iSysPath = 0; // using standarted path
-  }
-
-  // get library path for mods
-  _fnmModLibPath = "";
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-  if( sys_iSysPath == 1 ) {
-    _fnmModLibPath = "/usr/local/lib/" + strGameID + "/";
-#elif defined(__NetBSD__)
-  if( sys_iSysPath == 1 ) {
-    _fnmModLibPath = "/usr/pkg/lib/" + strGameID + "/";
-#else
-  if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/aarch64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/aarch64-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib/arm-linux-gnueabihf/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/arm-linux-gnueabihf/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/riscv64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/riscv64-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/s390x-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/s390x-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/powerpc64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/powerpc64-linux-gnu/" + strGameID + "/"; 
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib/x86_64-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/x86_64-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib/i386-linux-gnu/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/i386-linux-gnu/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 64 && _pFileSystem->IsDirectory((const char *) "/usr/lib64/" + strGameID)) {
-    _fnmModLibPath = "/usr/lib64/" + strGameID + "/";
-  } else if( sys_iSysPath == 1 && sys_iGameBits == 32 && _pFileSystem->IsDirectory((const char *) "/usr/lib//" + strGameID)) {
-    _fnmModLibPath = "/usr/lib/" + strGameID + "/";
-#endif
-  } else if( sys_iSysPath == 0 ) {
-    _fnmModLibPath = _fnmApplicationPath;
-  } else {
-    CPrintF(TRANSV("ERROR: Game libraries not ound!\n"));
-    FatalError(TRANSV("Failed to search game libraries installed!\nPlease reinstall the game.\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID);
-  }
-
-  if( sys_iSysPath == 1 ) { // search game data
-    CTFileName _fnm_usr_TestFile, _fnm_local_TestFile, _fnm_home_TestFile;
-    CTString _fnmUserDataPath, _fnm_TestFile;
-    int _fd;
-
-    if( access((const char *) _fnmUserDir+_strLogFile+".cfg", F_OK) == 0 ) {
-      _fd = open((const char *) _fnmUserDir+_strLogFile+".cfg", O_RDONLY,S_IRUSR);
-      size_t x = read(_fd, _path, 2048);
-      _fnmUserDataPath = (CTString)_path + "/";
-      close(_fd);
-      CPrintF(TRANSV("Testing home path: %s\n"), (const char *) _fnmUserDataPath);
-    } else { 
-      _fnmUserDataPath = "";
-    }
-
-    // set testing files
-    if( strGameID == "serioussamse") {
-      _fnm_TestFile = "SE1_00_Levels.gro";
-    } else {
-      _fnm_TestFile = "1_00_music.gro";
-    }
-    CPrintF(TRANSV("Testing file: %s\n"), (const char *) _fnm_TestFile);
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-    _fnm_usr_TestFile = "/usr/local/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#elif defined(__NetBSD__)
-    _fnm_usr_TestFile = "/usr/pkg/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#else
-    _fnm_usr_TestFile = "/usr/share/" + strGameID + "/" + _fnm_TestFile; //  data in usr
-#endif
-    _fnm_local_TestFile = _fnmUserDir + _fnm_TestFile;                   //  data in home .local
-    _fnm_home_TestFile = (const char *)_fnmUserDataPath  + _fnm_TestFile;
-    // test
-    if( access((const char *) _fnm_home_TestFile, F_OK) != 0 ) {
-      CPrintF(TRANSV("Testing system path: %s\n"), (const char *) _fnm_usr_TestFile);
-      CPrintF(TRANSV("Testing local  path: %s\n"), (const char *) _fnm_local_TestFile);
-      if( access((const char *) _fnm_usr_TestFile, F_OK) == 0 ) {
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-        _fnmApplicationPath = "/usr/local/share/" + strGameID + "/";                       // all game data
-#elif defined(__NetBSD__)
-        _fnmApplicationPath = "/usr/pkg/share/" + strGameID + "/";                       // all game data
-#else
-        _fnmApplicationPath = "/usr/share/" + strGameID + "/";                       // all game data
-#endif
-        CPrintF(TRANSV("Found usr path: %s\n"), (const char *) _fnmUserDataPath);
-      } else if( access((const char *) _fnm_local_TestFile, F_OK) == 0 ) {
-        _fnmApplicationPath = _fnmUserDir;                                           // all game data
-        CPrintF(TRANSV("Found local path: %s\n"), (const char *) _fnmUserDataPath);
-      } else {
-        // search in home dir 
-        // BOOL YesNoMessage(const char *strFormat, ...)
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-        InfoMessage(TRANS("No game files were found in /usr/local/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#elif defined(__NetBSD__)
-        InfoMessage(TRANS("No game files were found in /usr/pkg/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#else
-        InfoMessage(TRANS("No game files were found in /usr/share/%s/\n or %s\nThe home directory will be searched."),(const char *) strGameID,(const char *) _fnmUserDir);
-#endif
-        struct passwd *pw = getpwuid(getuid());
-        const char *_homedir = pw->pw_dir;
-        _testfiledone = 0;
-        _list_dir(_homedir, 0, strGameID);
-        CTString _PATH;
-        _PATH = (CTString)_path;
-        _fnmApplicationPath = (CTFileName) _PATH + "/";
-        _fnm_home_TestFile  = (CTFileName) _PATH + "/" + _fnm_TestFile; 
-        if( access((const char *) _fnm_home_TestFile, F_OK) == 0 ) {
-          //_fnmApplicationPath = (CTFileName) _PATH + "/";
-          CPrintF(TRANSV("Found home path: %s\n"), (const char *) _fnm_home_TestFile);
-          _fd = open((const char *) _fnmUserDir+_strLogFile+".cfg", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
-          size_t x = write(_fd, _path, 2048);
-          close(_fd);
-        } else {
-          CPrintF(TRANSV("ERROR: Game data not ound!\n"));
-          _fnmUserDataPath = "";
-#if defined(__OpenBSD__) || defined(__FreeBSD__)
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/local/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#elif defined(__NetBSD__)
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/pkg/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#else
-          FatalError(TRANSV("Failed to search game data!\nPlease put the game data in the paths:\n/usr/share/%s/\n or %s\n or somewhere in your home directory\nSee the log for more details.\nGame log is here: ~/.local/share/Serious-Engine/%s/SeriousSam.log"),(const char *) strGameID,(const char *) _fnmUserDir,(const char *) strGameID);
-#endif
-        }
-      } 
-    } else {
-      CPrintF(TRANSV("Found path: %s\n"), (const char *) _fnmUserDataPath);
-      _fnmApplicationPath = _fnmUserDataPath;                                         // all game data
-    }
-  }
 
+  // using system path
+  sys_iSysPath = 1;
+  // library path for mods
+  _fnmModLibPath = _fnmApplicationPath + "lib/" + strGameID + "/";
   // print info on the started application
   CPrintF(TRANSV("Executable: %s\n"), (const char *) strExePath);
   CPrintF(TRANSV("Assumed engine data directory: %s\n"), (const char *) _fnmApplicationPath);
   CPrintF(TRANSV("Assumed mods library directory: %s\n"), (const char *) _fnmModLibPath);
+  CPrintF(TRANSV("Assumed additional data directory: %s\n"), (const char *) _fnmAdditionalDirPath);
 #endif
 
   CPrintF("\n");
@@ -969,7 +841,7 @@ ENGINE_API void SE_InitEngine(CTString strGameID)
   InitStreams();
   // keep mod name in sys cvar
   sys_strModName = _strModName;
-  sys_strModExt  = _strModExt;
+  sys_strModExt  = "MP";
 
 // checking of crc
 #if 0
diff --git a/SamTSE/Sources/Engine/Engine.h b/SamTSE/Sources/Engine/Engine.h
index 8307f70..6ba88a4 100644
--- a/SamTSE/Sources/Engine/Engine.h
+++ b/SamTSE/Sources/Engine/Engine.h
@@ -207,6 +207,7 @@ extern ENGINE_API BOOL _bWorldEditorApp; // is this world edtior app
 extern ENGINE_API CTString _strLogFile;
 extern ENGINE_API CTFileName _fnmModLibPath;
 extern ENGINE_API INDEX sys_iSysPath;
+extern ENGINE_API INDEX sys_iGameDataNotFound;
 #ifdef PLATFORM_WIN32
 //
 extern ENGINE_API FLOAT _fPlayerFOVAdjuster;