summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAda Stevenson <adanskana@gmail.com>2025-07-22 15:51:18 +0800
committerLiliana Marie Prikler <liliana.prikler@gmail.com>2025-08-01 20:16:25 +0200
commitb4f567645a645ba4abc78d874e4953aaabcde1cf (patch)
tree58d891cf6a74caa6091967100bfabdea39aae2fc
parent1a373745994323c4c3665ad08c9f51a1fa7e7fbc (diff)
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>
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/games.scm51
-rw-r--r--gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch582
3 files changed, 634 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index f51bc26cdb..34ba30fb98 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -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 \
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index e4704dd3fb..708c8fe4e9 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -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")
diff --git a/gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch b/gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch
new file mode 100644
index 0000000000..a4c8ea3854
--- /dev/null
+++ b/gnu/packages/patches/serious-sam-classic-engine-patch-paths.patch
@@ -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;