From e325317476f449ca2a5b6733b51d63a46a1edf74 Mon Sep 17 00:00:00 2001 From: Peppersawce <157759066+Peppersawce@users.noreply.github.com> Date: Sun, 29 Mar 2026 07:55:32 +0200 Subject: [PATCH] Warzone 2100 port (#13170) --- .../additional-files/warzone2100.rdef.in | 69 +++++++ .../patches/warzone2100-4.6.3.patchset | 183 ++++++++++++++++++ .../warzone2100/warzone2100-4.6.3.recipe | 126 ++++++++++++ 3 files changed, 378 insertions(+) create mode 100644 games-strategy/warzone2100/additional-files/warzone2100.rdef.in create mode 100644 games-strategy/warzone2100/patches/warzone2100-4.6.3.patchset create mode 100644 games-strategy/warzone2100/warzone2100-4.6.3.recipe diff --git a/games-strategy/warzone2100/additional-files/warzone2100.rdef.in b/games-strategy/warzone2100/additional-files/warzone2100.rdef.in new file mode 100644 index 000000000..53a29b9d1 --- /dev/null +++ b/games-strategy/warzone2100/additional-files/warzone2100.rdef.in @@ -0,0 +1,69 @@ +resource app_flags B_SINGLE_LAUNCH; + +resource app_version { + major = @MAJOR@, + middle = @MIDDLE@, + minor = @MINOR@, + + variety = B_APPV_FINAL, + internal = 0, + + short_info = "Warzone 2100", + long_info = "@LONG_INFO@" +}; + +resource app_signature "application/x-vnd.warzone2100"; + +resource large_icon array { + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFF67661B1B1B1B1B1B1B1C1C1C1C1C1C1B1B1B616767676767FFFFFFFF" + $"FFFF671B191213131313131313131313121212121211111110100F876767FFFF" + $"FFFF6013051419150F10181B1B1112121967120F1961676767878E058E1BFFFF" + $"FFFF660904171C1713141B1D1E1412121D1E13121A1B1B1B1B1B14030A1CFFFF" + $"FFFF6609AE671C1714141C1E1E1513141E1E1514131313131D6010D50A60FFFF" + $"FFFF1D090A671C1714141C1E1E1514141E1E1715161515186067D5070A66FFFF" + $"FFFF1C0705671B141111191B1C1312121B1C131211101161678ED5D50867FFFF" + $"FFFF6007D56766120CAE676666B50A0A87670A0709D5AE8D8DB50AD50966FFFF" + $"FFFF1C09AE676012AED56766660AD5D567660A0707D5671B19B50AAE0B1DFFFF" + $"FFFF1D09B567661107D5671C1C0AD5091B1D10AEB50E1D1C140CD5D50866FFFF" + $"FF191B07D5191C12D5D51A1C1D0EAEAE1C1B8E8E0A146767080706070866FFFF" + $"FF676707D5676012AEAE196066AEAEB56767B5D5D56767160405070708668EFF" + $"FF8767D5AE8D878EAE8E6767670C070E601B08D5111B6610D5B50AD509678EFF" + $"FF67670AAE136767081160606087D5136787B5B5876767B5B5AE0CB509678EFF" + $"FF676707060D66668E67670A8D678E6767138E136767676767678705086116FF" + $"FF191905D5D5876767678EAE8E671B6067AEAEB56666666666676706076787FF" + $"FF676708B5AEAEAEAEAEAE8EAEAE0AD5D5D5D5D5070707080808070A09678DFF" + $"FF8E6787AEAEAEAE8E8D8D8767676767676767878767678EAEAEAEB58D8DB5FF" + $"FFFF126116B5081566878E8E8E12128E8EAE8E1313131367870CD58D670EFFFF" + $"FFFFFF131B17181B11D511121210188E13128E8E131306AE6787671B10FFFFFF" + $"FFFFFFFF156160128E8E148E610867AE180C671213160DD50F666711FFFFFFFF" + $"FFFFFFFFFF04186709AEAE151605670A1807181312160F09676704FFFFFFFFFF" + $"FFFFFFFFFFFFFF6014D514190A04670A18AF671214160E12660FFFFFFFFFFFFF" + $"FFFFFFFFFFFFFF171B0D141715D5140811110FAE13130B6715FFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFF61181212121212118E1111111111676708FFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFF131B1B1B1B606060606666666667678EFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFF0505050505050505050505050505FFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +resource mini_icon array { + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFF671B1B1B1B1D1C1C1B676767FFFF" + $"FF6713161217161316121616871067FF" + $"FF871261141C1A131E1317181C0E15FF" + $"FF161219131B19131D14131667D58EFF" + $"FF1513670C6787D5670808878EB515FF" + $"FF151317D51B16B51C10AE1BAFD58EFF" + $"FF8E8E87AE67870C6609876708D513FF" + $"FF8E0E678E67678E67AE678713AE13FF" + $"FF12B58E8D8E8E87AE0A1313130E13FF" + $"FF6710AE878E8787878787878EAE8DFF" + $"FFFF18180F121315131314B58767FFFF" + $"FFFFFF180E150D121315140F67FFFFFF" + $"FFFFFFFF6714121111101316FFFFFFFF" + $"FFFFFFFF151616878787878EFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; diff --git a/games-strategy/warzone2100/patches/warzone2100-4.6.3.patchset b/games-strategy/warzone2100/patches/warzone2100-4.6.3.patchset new file mode 100644 index 000000000..60027e882 --- /dev/null +++ b/games-strategy/warzone2100/patches/warzone2100-4.6.3.patchset @@ -0,0 +1,183 @@ +From 81fc679557028d79c94e872dfb3eeb0f69ebfeff Mon Sep 17 00:00:00 2001 +From: Peppersawce +Date: Mon, 27 Oct 2025 20:05:20 +0100 +Subject: Haiku fixes + + +diff --git a/3rdparty/readerwriterqueue/atomicops.h b/3rdparty/readerwriterqueue/atomicops.h +index f58bcf8..24b145d 100644 +--- a/3rdparty/readerwriterqueue/atomicops.h ++++ b/3rdparty/readerwriterqueue/atomicops.h +@@ -372,7 +372,7 @@ extern "C" { + } + #elif defined(__MACH__) + #include +-#elif defined(__unix__) ++#elif defined(__unix__) || defined(__HAIKU__) + #include + #elif defined(FREERTOS) + #include +@@ -510,7 +510,7 @@ namespace moodycamel + } + } + }; +-#elif defined(__unix__) ++#elif defined(__unix__) || defined(__HAIKU__) + //--------------------------------------------------------- + // Semaphore (POSIX, Linux) + //--------------------------------------------------------- +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 372438b..6a94833 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -212,7 +212,11 @@ endif() + INCLUDE(AddTargetLinkFlagsIfSupported) + + # Use "-fPIC" / "-fPIE" for all targets by default, including static libs +-set(CMAKE_POSITION_INDEPENDENT_CODE ON) ++if (HAIKU) ++ set(CMAKE_POSITION_INDEPENDENT_CODE OFF) ++else() ++ set(CMAKE_POSITION_INDEPENDENT_CODE ON) ++endif() + + set(WZ_WIN_HAS_PDB FALSE) + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") +diff --git a/lib/framework/wzglobal.h b/lib/framework/wzglobal.h +index ad32013..46fa2de 100644 +--- a/lib/framework/wzglobal.h ++++ b/lib/framework/wzglobal.h +@@ -108,7 +108,7 @@ + # define WZ_OS_RELIANT + #elif defined(__linux__) || defined(__linux) + # define WZ_OS_LINUX +-#elif defined(__FreeBSD__) || defined(__DragonFly__) ++#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__HAIKU__) + # define WZ_OS_FREEBSD + # define WZ_OS_BSD4 + #elif defined(__FreeBSD_kernel__) && !defined(__FreeBSD__) +diff --git a/lib/sound/oggvorbis.cpp b/lib/sound/oggvorbis.cpp +index c02f6d1..2fd4aba 100644 +--- a/lib/sound/oggvorbis.cpp ++++ b/lib/sound/oggvorbis.cpp +@@ -57,7 +57,7 @@ static size_t wz_ogg_read(void *ptr, size_t size, size_t nmemb, void *datasource + return WZ_PHYSFS_readBytes(fileHandle, ptr, static_cast(readLen)); + } + +-static int wz_ogg_seek(void *datasource, int64_t offset, int whence) ++static int wz_ogg_seek(void *datasource, ogg_int64_t offset, int whence) + { + PHYSFS_file *fileHandle; + int64_t newPos; +diff --git a/lib/wzmaplib/src/map_io.cpp b/lib/wzmaplib/src/map_io.cpp +index 992b649..60c97d8 100644 +--- a/lib/wzmaplib/src/map_io.cpp ++++ b/lib/wzmaplib/src/map_io.cpp +@@ -744,7 +744,9 @@ bool enumerateDirInternal(const std::string& rootBasePath, const std::string& ba + continue; + } + fullFilePath = basePath + "/" + dir->d_name; +- if (dir->d_type == DT_DIR) ++ struct stat stbuf; ++ stat(dir->d_name, &stbuf); ++ if (S_ISDIR(stbuf.st_mode)) + { + // recurse + if (((enumDirFlags & ENUM_FOLDERS) == ENUM_FOLDERS)) +diff --git a/src/version.cpp b/src/version.cpp +index 7db79e8..e0be3cc 100644 +--- a/src/version.cpp ++++ b/src/version.cpp +@@ -225,14 +225,14 @@ std::string version_getBuildIdentifierReleaseEnvironment() + if (strlen(vcs_tag)) + { + optional tagVersion = version_extractVersionNumberFromTag(vcs_tag); +- if (tagVersion.has_value() && strlen(tagVersion.value().qualifier) != 0) ++ /*if (tagVersion.has_value() && strlen(tagVersion.value().qualifier) != 0) + { + buildReleaseEnvironmentStr = "preview"; + } + else +- { ++ {*/ + buildReleaseEnvironmentStr = "release"; +- } ++ //} + } + else + { +-- +2.51.0 + + +From 1b4035c7f8778d9525d000ca582cae4018229078 Mon Sep 17 00:00:00 2001 +From: Peppersawce +Date: Fri, 31 Oct 2025 17:05:13 +0100 +Subject: GameNetworkingSockets: fake being FreeBSD + + +diff --git a/3rdparty/GameNetworkingSockets/CMakeLists.txt b/3rdparty/GameNetworkingSockets/CMakeLists.txt +index 25bc6a6..314b759 100644 +--- a/3rdparty/GameNetworkingSockets/CMakeLists.txt ++++ b/3rdparty/GameNetworkingSockets/CMakeLists.txt +@@ -155,7 +155,7 @@ function(set_target_common_gns_properties TGT) + target_compile_definitions(${TGT} PUBLIC LINUX) + elseif(CMAKE_SYSTEM_NAME MATCHES Darwin) + target_compile_definitions(${TGT} PUBLIC OSX) +- elseif(CMAKE_SYSTEM_NAME MATCHES FreeBSD) ++ elseif(CMAKE_SYSTEM_NAME MATCHES FreeBSD OR CMAKE_SYSTEM_NAME MATCHES Haiku) + target_compile_definitions(${TGT} PUBLIC FREEBSD) + elseif(CMAKE_SYSTEM_NAME MATCHES Windows) + target_compile_definitions(${TGT} PUBLIC _WINDOWS) +diff --git a/3rdparty/GameNetworkingSockets/src/CMakeLists.txt b/3rdparty/GameNetworkingSockets/src/CMakeLists.txt +index 998bd7f..c669832 100644 +--- a/3rdparty/GameNetworkingSockets/src/CMakeLists.txt ++++ b/3rdparty/GameNetworkingSockets/src/CMakeLists.txt +@@ -294,7 +294,7 @@ macro(set_clientlib_target_properties GNS_TARGET) + #if(USE_STEAMWEBRTC AND NOT STEAMWEBRTC_USE_STATIC_LIBS) + # target_link_libraries(${GNS_TARGET} PRIVATE dl) + #endif() +- elseif(CMAKE_SYSTEM_NAME MATCHES FreeBSD) ++ elseif(CMAKE_SYSTEM_NAME MATCHES FreeBSD OR CMAKE_SYSTEM_NAME MATCHES Haiku) + + elseif(CMAKE_SYSTEM_NAME MATCHES Windows) + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") +diff --git a/3rdparty/GameNetworkingSockets/src/public/minbase/minbase_identify.h b/3rdparty/GameNetworkingSockets/src/public/minbase/minbase_identify.h +index 2ab5730..df3e3c7 100644 +--- a/3rdparty/GameNetworkingSockets/src/public/minbase/minbase_identify.h ++++ b/3rdparty/GameNetworkingSockets/src/public/minbase/minbase_identify.h +@@ -166,7 +166,7 @@ + #elif defined( LINUX ) || defined( __LINUX__ ) || defined(linux) || defined(__linux) || defined(__linux__) + #define IsLinux() true + #define IsPosix() true +-#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + #define IsBSD() true + #define IsPosix() true + #elif defined( _POSIX_VERSION ) || defined( POSIX ) || defined( VALVE_POSIX ) +-- +2.51.0 + + +From 0f55b8733407b8e378623b82c965e7e5a445f140 Mon Sep 17 00:00:00 2001 +From: Peppersawce +Date: Fri, 31 Oct 2025 17:57:34 +0100 +Subject: Just work already + + +diff --git a/3rdparty/GameNetworkingSockets/src/tier0/dbg.cpp b/3rdparty/GameNetworkingSockets/src/tier0/dbg.cpp +index 455ab45..1baef41 100644 +--- a/3rdparty/GameNetworkingSockets/src/tier0/dbg.cpp ++++ b/3rdparty/GameNetworkingSockets/src/tier0/dbg.cpp +@@ -139,7 +139,7 @@ void AssertMsgImplementationV( bool _bFatal, bool bFmt, const char* pstrFile, un + #elif defined( __clang__ ) + abort(); + #else +- std::quick_exit( EXIT_FAILURE ); ++ abort(); + #endif + } + +-- +2.51.0 + diff --git a/games-strategy/warzone2100/warzone2100-4.6.3.recipe b/games-strategy/warzone2100/warzone2100-4.6.3.recipe new file mode 100644 index 000000000..ca6a87c94 --- /dev/null +++ b/games-strategy/warzone2100/warzone2100-4.6.3.recipe @@ -0,0 +1,126 @@ +SUMMARY="A free and open-source 3D real-time strategy game" +DESCRIPTION="Warzone 2100 was originally developed by Pumpkin Studios and published by Eidos Interactive. +In 1999, it was released commercially for Microsoft Windows and Sony PlayStation. +Pumpkin Studios ended their support for Warzone 2100 on January 5, 2000. + +In 2004, after fan petition, Warzone's source code was released publicly under an open-source license. +It has been developed, maintained, and improved by the community ever since, under the banner of the 'Warzone 2100 Project'." +HOMEPAGE="https://wz2100.net/" +COPYRIGHT=" + 2004-2026 Warzone 2100 Project + 1999-2000 Pumpkin Studios + " +LICENSE="GNU GPL v2" +REVISION="1" +SOURCE_URI="https://github.com/Warzone2100/warzone2100/releases/download/$portVersion/warzone2100_src.tar.xz" +CHECKSUM_SHA256="431fe2436cff96878e2ed4edc6d0739453ad6293d6430b5832de9b522ff0b13a" +SOURCE_DIR="warzone2100" +SOURCE_URI_2="https://github.com/Warzone2100/data-terrain-high/releases/download/v3/high.wz#noarchive" +CHECKSUM_SHA256_2="a16a06c2a6b68e86a03934240880ec0b0fd72666606af3bf12ed5ffda7734f0e" +PATCHES="warzone2100-$portVersion.patchset" +ADDITIONAL_FILES="warzone2100.rdef.in" + +ARCHITECTURES="all !x86_gcc2" +SECONDARY_ARCHITECTURES="x86" + +PROVIDES=" + warzone2100$secondaryArchSuffix = $portVersion + cmd:warzone2100 + " +REQUIRES=" + haiku$secondaryArchSuffix + lib:libcurl$secondaryArchSuffix + lib:libfreetype$secondaryArchSuffix + lib:libfribidi$secondaryArchSuffix + lib:libharfbuzz$secondaryArchSuffix + lib:libintl$secondaryArchSuffix + lib:libminiupnpc$secondaryArchSuffix + lib:libogg$secondaryArchSuffix + lib:libopenal$secondaryArchSuffix + lib:libopus$secondaryArchSuffix + lib:libpng16$secondaryArchSuffix + lib:libphysfs$secondaryArchSuffix + lib:libprotobuf$secondaryArchSuffix + lib:libSDL3$secondaryArchSuffix + lib:libsodium$secondaryArchSuffix + lib:libsqlite3$secondaryArchSuffix + lib:libtheoradec$secondaryArchSuffix + lib:libvorbis$secondaryArchSuffix + lib:libvorbisfile$secondaryArchSuffix + lib:libz$secondaryArchSuffix + lib:libzip$secondaryArchSuffix + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + gcc${secondaryArchSuffix}_syslibs_devel + devel:libcurl$secondaryArchSuffix + devel:libfreetype$secondaryArchSuffix + devel:libfribidi$secondaryArchSuffix + devel:libharfbuzz$secondaryArchSuffix + devel:libminiupnpc$secondaryArchSuffix + devel:libogg$secondaryArchSuffix + devel:libopenal$secondaryArchSuffix + devel:libopus$secondaryArchSuffix + #devel:libopusfile$secondaryArchSuffix # Uses in-source one even when included + devel:libpng16$secondaryArchSuffix + devel:libprotobuf$secondaryArchSuffix + devel:libphysfs$secondaryArchSuffix + devel:libSDL3$secondaryArchSuffix + devel:libsodium$secondaryArchSuffix + devel:libsqlite3$secondaryArchSuffix + devel:libtheora$secondaryArchSuffix + devel:libvorbis$secondaryArchSuffix + devel:libvulkan$secondaryArchSuffix + devel:libzip$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + cmd:asciidoc # Optional, for documentation + cmd:basisu + cmd:cmake + cmd:gcc$secondaryArchSuffix + #cmd:git # Optional, inclusion messes up config/settings dir + cmd:gettext + #cmd:glslc # Optional, for vulkan renderer (that won't compile) + cmd:make + cmd:pkg_config$secondaryArchSuffix + cmd:zip + " + +BUILD() +{ + cmake -Bbuild -S. $cmakeDirArgs \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_EXE_LINKER_FLAGS="-lbsd -lnetwork" \ + -DWZ_DOWNLOAD_PREBUILT_PACKAGES_ASSET_DIR=$sourceDir2 + + make -C build $jobArgs +} + +INSTALL() +{ + make -C build install + + # Remove unneeded files + rm -rf $dataDir/{applications,icons,metainfo} + + # Generate the rdef + local MAJOR="`echo "$portVersion" | cut -d. -f1`" + local MIDDLE="`echo "$portVersion" | cut -d. -f2`" + local MINOR="`echo "$portVersion" | cut -d. -f3`" + local LONG_INFO="$SUMMARY" + sed \ + -e "s|@MAJOR@|$MAJOR|" \ + -e "s|@MIDDLE@|$MIDDLE|" \ + -e "s|@MINOR@|$MINOR|" \ + -e "s|@LONG_INFO@|$LONG_INFO|" \ + $portDir/additional-files/warzone2100.rdef.in > warzone2100.rdef + + addResourcesToBinaries warzone2100.rdef $prefix/bin/warzone2100 + + # Make the app name uppercase then link it back in lowercase for cmd + mkdir -p $appsDir && mv $prefix/bin/warzone2100 $appsDir/"Warzone 2100" + ln -s $appsDir/"Warzone 2100" $prefix/bin/warzone2100 + addAppDeskbarSymlink $appsDir/"Warzone 2100" +}