From dff7737184f81aef0727d69c1ba7b1d9a35c97a1 Mon Sep 17 00:00:00 2001 From: mdarocha Date: Sun, 12 Mar 2023 19:04:37 +0100 Subject: openra: move old openra packages to the openra_2019 namespace --- pkgs/games/openra/common.nix | 86 -------- pkgs/games/openra/default.nix | 71 ------ pkgs/games/openra/engine.nix | 59 ----- pkgs/games/openra/engines.nix | 41 ---- pkgs/games/openra/mkdirp.sh | 4 - pkgs/games/openra/mod-launch-game.sh | 25 --- pkgs/games/openra/mod-update.sh | 160 -------------- pkgs/games/openra/mod.nix | 105 --------- pkgs/games/openra/mods.nix | 345 ------------------------------ pkgs/games/openra/openra-mod.desktop | 11 - pkgs/games/openra/packages.nix | 60 ------ pkgs/games/openra_2019/common.nix | 86 ++++++++ pkgs/games/openra_2019/default.nix | 71 ++++++ pkgs/games/openra_2019/engine.nix | 59 +++++ pkgs/games/openra_2019/engines.nix | 41 ++++ pkgs/games/openra_2019/mkdirp.sh | 4 + pkgs/games/openra_2019/mod-launch-game.sh | 25 +++ pkgs/games/openra_2019/mod-update.sh | 160 ++++++++++++++ pkgs/games/openra_2019/mod.nix | 105 +++++++++ pkgs/games/openra_2019/mods.nix | 345 ++++++++++++++++++++++++++++++ pkgs/games/openra_2019/openra-mod.desktop | 11 + pkgs/games/openra_2019/packages.nix | 60 ++++++ pkgs/top-level/all-packages.nix | 4 +- 23 files changed, 969 insertions(+), 969 deletions(-) delete mode 100644 pkgs/games/openra/common.nix delete mode 100644 pkgs/games/openra/default.nix delete mode 100644 pkgs/games/openra/engine.nix delete mode 100644 pkgs/games/openra/engines.nix delete mode 100644 pkgs/games/openra/mkdirp.sh delete mode 100644 pkgs/games/openra/mod-launch-game.sh delete mode 100755 pkgs/games/openra/mod-update.sh delete mode 100644 pkgs/games/openra/mod.nix delete mode 100644 pkgs/games/openra/mods.nix delete mode 100644 pkgs/games/openra/openra-mod.desktop delete mode 100644 pkgs/games/openra/packages.nix create mode 100644 pkgs/games/openra_2019/common.nix create mode 100644 pkgs/games/openra_2019/default.nix create mode 100644 pkgs/games/openra_2019/engine.nix create mode 100644 pkgs/games/openra_2019/engines.nix create mode 100644 pkgs/games/openra_2019/mkdirp.sh create mode 100644 pkgs/games/openra_2019/mod-launch-game.sh create mode 100755 pkgs/games/openra_2019/mod-update.sh create mode 100644 pkgs/games/openra_2019/mod.nix create mode 100644 pkgs/games/openra_2019/mods.nix create mode 100644 pkgs/games/openra_2019/openra-mod.desktop create mode 100644 pkgs/games/openra_2019/packages.nix diff --git a/pkgs/games/openra/common.nix b/pkgs/games/openra/common.nix deleted file mode 100644 index d9cc93e8234..00000000000 --- a/pkgs/games/openra/common.nix +++ /dev/null @@ -1,86 +0,0 @@ -/* The reusable code, and package attributes, between OpenRA engine packages (engine.nix) - and out-of-tree mod packages (mod.nix). -*/ -{ lib, makeSetupHook, curl, unzip, dos2unix, pkg-config, makeWrapper -, lua, mono, dotnetPackages, python3 -, libGL, freetype, openal, SDL2 -, zenity -}: - -with lib; - -let - path = makeBinPath ([ mono python3 ] ++ optional (zenity != null) zenity); - rpath = makeLibraryPath [ lua freetype openal SDL2 ]; - mkdirp = makeSetupHook { - name = "openra-mkdirp-hook"; - } ./mkdirp.sh; - -in { - patchEngine = dir: version: '' - sed -i \ - -e 's/^VERSION.*/VERSION = ${version}/g' \ - -e '/fetch-geoip-db/d' \ - -e '/GeoLite2-Country.mmdb.gz/d' \ - ${dir}/Makefile - - sed -i 's|locations=.*|locations=${lua}/lib|' ${dir}/thirdparty/configure-native-deps.sh - ''; - - wrapLaunchGame = openraSuffix: '' - # Setting TERM=xterm fixes an issue with terminfo in mono: System.Exception: Magic number is wrong: 542 - # https://github.com/mono/mono/issues/6752#issuecomment-365212655 - wrapProgram $out/lib/openra${openraSuffix}/launch-game.sh \ - --prefix PATH : "${path}" \ - --prefix LD_LIBRARY_PATH : "${rpath}" \ - --set TERM xterm - - makeWrapper $out/lib/openra${openraSuffix}/launch-game.sh $(mkdirp $out/bin)/openra${openraSuffix} \ - --chdir "$out/lib/openra${openraSuffix}" - ''; - - packageAttrs = { - buildInputs = with dotnetPackages; [ - FuzzyLogicLibrary - MaxMindDb - MaxMindGeoIP2 - MonoNat - NewtonsoftJson - NUnit3 - NUnitConsole - OpenNAT - RestSharp - SharpFont - SharpZipLib - SmartIrc4net - StyleCopMSBuild - StyleCopPlusMSBuild - ] ++ [ - libGL - ]; - - # TODO: Test if this is correct. - nativeBuildInputs = [ - curl - unzip - dos2unix - pkg-config - makeWrapper - mkdirp - mono - python3 - ]; - - makeFlags = [ "prefix=$(out)" ]; - - doCheck = true; - - dontStrip = true; - - meta = { - maintainers = with maintainers; [ fusion809 msteen rardiol ]; - license = licenses.gpl3; - platforms = platforms.linux; - }; - }; -} diff --git a/pkgs/games/openra/default.nix b/pkgs/games/openra/default.nix deleted file mode 100644 index 76454f69e4b..00000000000 --- a/pkgs/games/openra/default.nix +++ /dev/null @@ -1,71 +0,0 @@ -/* This file defines all OpenRA packages under `openraPackages`, - e.g. the OpenRA release engine can be found at `openraPackages.engines.release` (see `engines.nix`), - or the out-of-tree mod "Combined Arms" can be found at `openraPackages.mods.ca` (see `mods.nix`). - The `openra` package is just an alias to `openraPackages.engines.release`, - and just provides the mods included in the source code of the engine. - Additional engines or mods can be added with `openraPackages.buildOpenRAEngine` (function around `engine.nix`) - and `openraPackages.buildOpenRAMod` (function around `mod.nix`), respectively. -*/ -pkgs: - -with pkgs.lib; - -let - /* Building an engine or out-of-tree mod is very similar, - but different enough not to be able to build them with the same package definition, - so instaed we define what is common between them in a separate file. - - Although `callPackage` could be used, it would require undoing `makeOverridable`, - because `common.nix` does not define a package, but just an attribute set, - which is directly passed as part of the argument to the engines and mods `callPackage`, - so either the attributes added by `makeOverridable` have to be removed - or the engine and mod package definitions will need to add `...` to the argument list. - */ - common = let f = import ./common.nix; in f (builtins.intersectAttrs (functionArgs f) pkgs // { - lua = pkgs.lua5_1; - # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure, - # rather than having to look to the logs why it is not starting. - inherit (pkgs.gnome) zenity; - }); - - /* Building a set of engines or mods requires some dependencies as well, - so the sets will actually be defined as a function instead, - requiring the dependencies and returning the actual set. - - Not all dependencies for defining a engine or mod set are shared, - so additional arguments can be passed as well. - - The builders for engines and mods allow to delay specifying the name, - by returning a function that expects a name, which we use, in this case, - to base the name on the attribute name instead, preventing the need to specify the name twice - if the attribute name and engine/mod name are equal. - */ - callWithName = name: value: if isFunction value then value name else value; - buildOpenRASet = f: args: pkgs.recurseIntoAttrs (mapAttrs callWithName (f ({ - inherit (pkgs) fetchFromGitHub; - postFetch = '' - sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh - $out/thirdparty/fetch-thirdparty-deps.sh - ''; - } // args))); - -in pkgs.recurseIntoAttrs rec { - # The whole attribute set is destructered to ensure those (and only those) attributes are given - # and to provide defaults for those that are optional. - buildOpenRAEngine = { name ? null, version, description, homepage, mods, src }@engine: - # Allow specifying the name at a later point if no name has been given. - let builder = name: pkgs.callPackage ./engine.nix (common // { - engine = engine // { inherit name; }; - }); in if name == null then builder else builder name; - - # See `buildOpenRAEngine`. - buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine, assetsError ? "" }@mod: ({ version, mods ? [], src }@engine: - let builder = name: pkgs.callPackage ./mod.nix (common // { - mod = mod // { inherit name assetsError; }; - engine = engine // { inherit mods; }; - }); in if name == null then builder else builder name) engine; - - # See `buildOpenRASet`. - engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; }; - mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; }; -} diff --git a/pkgs/games/openra/engine.nix b/pkgs/games/openra/engine.nix deleted file mode 100644 index adc1bf76e00..00000000000 --- a/pkgs/games/openra/engine.nix +++ /dev/null @@ -1,59 +0,0 @@ -/* The package defintion for an OpenRA engine. - It shares code with `mod.nix` by what is defined in `common.nix`. - Similar to `mod.nix` it is a generic package definition, - in order to make it easy to define multiple variants of the OpenRA engine. - For each mod provided by the engine, a wrapper script is created, - matching the naming convention used by `mod.nix`. - This package could be seen as providing a set of in-tree mods, - while the `mod.nix` pacakges provide a single out-of-tree mod. -*/ -{ lib, stdenv -, packageAttrs -, patchEngine -, wrapLaunchGame -, engine -}: - -with lib; - -stdenv.mkDerivation (recursiveUpdate packageAttrs rec { - pname = "openra"; - version = "${engine.name}-${engine.version}"; - - src = engine.src; - - postPatch = patchEngine "." version; - - configurePhase = '' - runHook preConfigure - - make version VERSION=${escapeShellArg version} - - runHook postConfigure - ''; - - buildFlags = [ "DEBUG=false" "default" "man-page" ]; - - checkTarget = "nunit test"; - - installTargets = [ - "install" - "install-linux-icons" - "install-linux-desktop" - "install-linux-appdata" - "install-linux-mime" - "install-man-page" - ]; - - postInstall = '' - ${wrapLaunchGame ""} - - ${concatStrings (map (mod: '' - makeWrapper $out/bin/openra $out/bin/openra-${mod} --add-flags Game.Mod=${mod} - '') engine.mods)} - ''; - - meta = { - inherit (engine) description homepage; - }; -}) diff --git a/pkgs/games/openra/engines.nix b/pkgs/games/openra/engines.nix deleted file mode 100644 index bbb4947acd2..00000000000 --- a/pkgs/games/openra/engines.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ buildOpenRAEngine, fetchFromGitHub, postFetch }: - -let - buildUpstreamOpenRAEngine = { version, rev, sha256 }: name: (buildOpenRAEngine { - inherit version; - description = "Open-source re-implementation of Westwood Studios' 2D Command and Conquer games"; - homepage = "https://www.openra.net/"; - mods = [ "cnc" "d2k" "ra" "ts" ]; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - inherit rev sha256 postFetch; - }; - } name).overrideAttrs (origAttrs: { - postInstall = '' - ${origAttrs.postInstall} - cp -r mods/ts $out/lib/openra/mods/ - cp mods/ts/icon.png $(mkdirp $out/share/pixmaps)/openra-ts.png - ( cd $out/share/applications; sed -e 's/Dawn/Sun/g' -e 's/cnc/ts/g' openra-cnc.desktop > openra-ts.desktop ) - ''; - }); - -in { - release = name: (buildUpstreamOpenRAEngine rec { - version = "20190314"; - rev = "${name}-${version}"; - sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; - } name); - - playtest = name: (buildUpstreamOpenRAEngine rec { - version = "20190302"; - rev = "${name}-${version}"; - sha256 = "1vqvfk2p2lpk3m0d3rpvj34i8cmk3mfc7w4cn4llqd9zp4kk9pya"; - } name); - - bleed = buildUpstreamOpenRAEngine { - version = "8ee1102"; - rev = "8ee11028d72cde7556b31d45f556b40be65b4b70"; - sha256 = "0f1fpf37ms8d7fhlh3rjzsxsk9w23iyi3phs2i7g561292d5rk3l"; - }; -} diff --git a/pkgs/games/openra/mkdirp.sh b/pkgs/games/openra/mkdirp.sh deleted file mode 100644 index 7b2cf0b89c0..00000000000 --- a/pkgs/games/openra/mkdirp.sh +++ /dev/null @@ -1,4 +0,0 @@ -mkdirp() { - mkdir -p "$@" - echo "$@" -} diff --git a/pkgs/games/openra/mod-launch-game.sh b/pkgs/games/openra/mod-launch-game.sh deleted file mode 100644 index 88b53e71e1b..00000000000 --- a/pkgs/games/openra/mod-launch-game.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -show_error() { - if command -v zenity > /dev/null; then - zenity --no-wrap --no-markup --error --title "OpenRA - @title@" --text "$1" 2>/dev/null - else - printf "$1\n" >&2 - fi - exit 1 -} - -cd "@out@/lib/openra-@name@" - -# Check for missing assets -assetsError='@assetsError@' -if [[ -n "$assetsError" && ! -d "$HOME/.openra/Content/@name@" ]]; then - show_error "$assetsError" -fi - -# Run the game -mono --debug OpenRA.Game.exe Game.Mod=@name@ Engine.LaunchPath="@out@/bin/openra-@name@" Engine.ModSearchPaths="@out@/lib/openra-@name@/mods" "$@" - -# Show a crash dialog if something went wrong -if (( $? != 0 && $? != 1 )); then - show_error $'OpenRA - @title@ has encountered a fatal error.\nPlease refer to the crash logs for more information.\n\nLog files are located in ~/.openra/Logs' -fi diff --git a/pkgs/games/openra/mod-update.sh b/pkgs/games/openra/mod-update.sh deleted file mode 100755 index 8489d5a97a7..00000000000 --- a/pkgs/games/openra/mod-update.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash -# shellcheck disable=SC2034 - -# for mod in $(nix eval --raw '( -# with import { }; -# with lib; -# let mods = attrNames (removeAttrs openraPackages.mods [ "recurseForDerivations" ]); -# in concatStringsSep " " mods -# )'); do -# ./mod-update.sh "$mod" -# done - -# Uses: https://github.com/msteen/nix-upfetch - -mod=$1 -commit_count=$2 -token= -nixpkgs='' - -die() { - local ret=$? - echo "$*" >&2 - exit $ret -} - -curl() { - command curl --silent --show-error "$@" -} - -get_sha1() { - local owner=$1 repo=$2 ref=$3 - # https://developer.github.com/v3/#authentication - curl -H "Authorization: token $token" -H 'Accept: application/vnd.github.VERSION.sha' "https://api.github.com/repos/$owner/$repo/commits/$ref" -} - -[[ -n $mod ]] || die "The first argument of this script has to be a mod identifier." - -[[ -n $token ]] || die "Please edit this script to include a GitHub API access token, which is required for API v4: -https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/" - -# Get current mod_owner and mod_repo. -vars=$(nix-prefetch --file "$nixpkgs" "openraPackages.mods.$mod" --index 0 --quiet --output json --no-compute-hash > >( - jq --raw-output 'with_entries(select(.value | contains("\n") | not)) | to_entries | .[] | .key + "=" + .value')) || exit - -mod_owner=; mod_repo=; mod_rev= -while IFS='=' read -r key val; do - declare "mod_${key}=${val}" -done <<< "$vars" - -if [[ -n $commit_count ]]; then - query_on_commit='{ - history(first: 10) { - nodes { - abbreviatedOid - oid - } - totalCount - } -}' -else - query_on_commit='{ - history(first: 0) { - totalCount - } - abbreviatedOid - oid -}' -fi - -# shellcheck disable=SC2089 -query='{ - repository(owner: "'$mod_owner'", name: "'$mod_repo'") { - defaultBranchRef { - target { - ... on Commit '$query_on_commit' - } - } - licenseInfo { - key - } - } -}' - -# Newlines are not allowed in a query. -# https://developer.github.com/v4/guides/forming-calls/#communicating-with-graphql -# shellcheck disable=SC2086 disable=SC2090 disable=SC2116 -query=$(echo $query) -query=${query//\"/\\\"} - -# https://developer.github.com/v4/guides/using-the-explorer/#configuring-graphiql -json=$(curl -H "Authorization: bearer $token" -X POST -d '{ "query": "'"$query"'" }' https://api.github.com/graphql) || exit - -if [[ -n $commit_count ]]; then - json=$(jq "$commit_count"' as $commit_count - | .data.repository.defaultBranchRef.target - |= (.history |= (. | del(.nodes) | .totalCount = $commit_count)) - + (.history | .nodes[.totalCount - $commit_count])' <<< "$json") || exit -fi - -vars=$(jq --raw-output '.data.repository | { - license_key: .licenseInfo.key, -} + (.defaultBranchRef.target | { - version: ((.history.totalCount | tostring) + ".git." + .abbreviatedOid), - rev: .oid, -}) | to_entries | .[] | .key + "=" + (.value | tostring)' <<< "$json") || exit - -mod_license_key=; mod_version=; mod_rev= -while IFS='=' read -r key val; do - declare "mod_${key}=${val}" -done <<< "$vars" - -mod_config=$(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/mod.config") || exit - -mod_id=; engine_version=; automatic_engine_management=; automatic_engine_source= -while IFS='=' read -r key val; do - declare "${key,,}=$(jq --raw-output . <<< "$val")" -done < <(grep '^\(MOD_ID\|ENGINE_VERSION\|AUTOMATIC_ENGINE_MANAGEMENT\|AUTOMATIC_ENGINE_SOURCE\)=' <<< "$mod_config") - -for var in mod_id engine_version automatic_engine_management automatic_engine_source; do - echo "$var=${!var}" >&2 -done -echo >&2 - -[[ $mod_id == "$mod" ]] || - die "The mod '$mod' reports being mod '$mod_id' instead." -# shellcheck disable=SC2005 disable=SC2046 -[[ $mod_license_key == gpl-3.0 ]] || -[[ $(echo $(head -2 <(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/COPYING"))) == 'GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007' ]] || - die "The mod '$mod' is licensed under '$mod_license_key' while expecting 'gpl-3.0'." -[[ $automatic_engine_management == True ]] || - die "The mod '$mod' engine is not managed as a read-only dependency." -[[ $automatic_engine_source =~ https://github.com/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/archive/([a-zA-Z0-9_\-\$\{\}]+).zip ]] || - die "The mod '$mod' engine is not hosted on GitHub as an archive." - -engine_owner=${BASH_REMATCH[1]} -engine_repo=${BASH_REMATCH[2]} -# shellcheck disable=SC2016 -[[ ${BASH_REMATCH[3]} == '${ENGINE_VERSION}' ]] || engine_version=${BASH_REMATCH[3]} -engine_rev=$(get_sha1 "$engine_owner" "$engine_repo" "$engine_version") - -for type in mod engine; do - for name in version owner repo rev; do - var="${type}_${name}" - echo "$var=${!var}" >&2 - done - echo >&2 -done - -i=0 -for type in mod engine; do - fetcher_args=() - for name in owner repo rev; do - var="${type}_${name}" - fetcher_args+=( "--$name" "${!var}" ) - done - var="${type}_version" - version=${!var} - nix-upfetch --yes --version "$version" "$(nix-preupfetch --file "$nixpkgs" "openraPackages.mods.$mod" --index $i -- "${fetcher_args[@]}")" - (( i++ )) -done diff --git a/pkgs/games/openra/mod.nix b/pkgs/games/openra/mod.nix deleted file mode 100644 index 4d0a18e6334..00000000000 --- a/pkgs/games/openra/mod.nix +++ /dev/null @@ -1,105 +0,0 @@ -/* The package defintion for an OpenRA out-of-tree mod. - It shares code with `engine.nix` by what is defined in `common.nix`. - To build an out-of-tree mod it needs the source code of the engine available, - and they each need to be build with a specific version or fork of the engine, - so the engine needs to be supplied as an argument as well. - The engine is relatively small and quick to build, so this is not much of a problem. - Building a mod will result in a wrapper script that starts the mod inside the specified engine. -*/ -{ lib, stdenv -, packageAttrs -, patchEngine -, wrapLaunchGame -, mod -, engine -}: - -with lib; - -let - engineSourceName = engine.src.name or "engine"; - modSourceName = mod.src.name or "mod"; - -# Based on: https://build.opensuse.org/package/show/home:fusion809/openra-ura -in stdenv.mkDerivation (recursiveUpdate packageAttrs rec { - name = "${pname}-${version}"; - pname = "openra-${mod.name}"; - inherit (mod) version; - - srcs = [ - mod.src - engine.src - ]; - - sourceRoot = "."; - - postUnpack = '' - mv ${engineSourceName} ${modSourceName} - cd ${modSourceName} - ''; - - postPatch = '' - cat <<'EOF' > fetch-engine.sh - #!/bin/sh - exit 0 - EOF - - sed -i 's/^VERSION.*/VERSION = ${version}/g' Makefile - - dos2unix *.md - - ${patchEngine engineSourceName engine.version} - ''; - - configurePhase = '' - runHook preConfigure - - make version VERSION=${escapeShellArg version} - make -C ${engineSourceName} version VERSION=${escapeShellArg engine.version} - - runHook postConfigure - ''; - - checkTarget = "test"; - - installPhase = '' - runHook preInstall - - make -C ${engineSourceName} install-engine install-common-mod-files DATA_INSTALL_DIR=$out/lib/${pname} - - cp -r ${engineSourceName}/mods/{${concatStringsSep "," ([ "common" "modcontent" ] ++ engine.mods)}} mods/* \ - $out/lib/${pname}/mods/ - - substitute ${./mod-launch-game.sh} $out/lib/${pname}/launch-game.sh \ - --subst-var out \ - --subst-var-by name ${escapeShellArg mod.name} \ - --subst-var-by title ${escapeShellArg mod.title} \ - --subst-var-by assetsError ${escapeShellArg mod.assetsError} - chmod +x $out/lib/${pname}/launch-game.sh - - ${wrapLaunchGame "-${mod.name}"} - - substitute ${./openra-mod.desktop} $(mkdirp $out/share/applications)/${pname}.desktop \ - --subst-var-by name ${escapeShellArg mod.name} \ - --subst-var-by title ${escapeShellArg mod.title} \ - --subst-var-by description ${escapeShellArg mod.description} - - cp README.md $(mkdirp $out/share/doc/packages/${pname})/README.md - - [[ -e mods/${mod.name}/icon.png ]] && mod_icon=mods/${mod.name}/icon.png || { - [[ -e mods/${mod.name}/logo.png ]] && mod_icon=mods/${mod.name}/logo.png || mod_icon=packaging/linux/mod_256x256.png - } - cp "$mod_icon" $(mkdirp $out/share/pixmaps)/${pname}.png - - for size in 16 32 48 64 128 256; do - size=''${size}x''${size} - cp packaging/linux/mod_''${size}.png $(mkdirp $out/share/icons/hicolor/''${size}/apps)/${pname}.png - done - - runHook postInstall - ''; - - meta = { - inherit (mod) description homepage; - }; -}) diff --git a/pkgs/games/openra/mods.nix b/pkgs/games/openra/mods.nix deleted file mode 100644 index 47e86fd09a7..00000000000 --- a/pkgs/games/openra/mods.nix +++ /dev/null @@ -1,345 +0,0 @@ -{ buildOpenRAMod, fetchFromGitHub, postFetch }: - -let - unsafeBuildOpenRAMod = attrs: name: (buildOpenRAMod attrs name).overrideAttrs (_: { - doCheck = false; - }); - -in { - ca = buildOpenRAMod { - version = "96.git.fc3cf0b"; - title = "Combined Arms"; - description = "A game that combines units from the official OpenRA Red Alert and Tiberian Dawn mods"; - homepage = "https://github.com/Inq8/CAmod"; - src = fetchFromGitHub { - owner = "Inq8"; - repo = "CAmod"; - rev = "fc3cf0baf2b827650eaae9e1d2335a3eed24bac9"; - sha256 = "15w91xs253gyrlzsgid6ixxjazx0fbzick6vlkiay0znb58n883m"; - }; - engine = { - version = "b8a7dd5"; - src = fetchFromGitHub { - owner = "Inq8"; - repo = "CAengine" ; - rev = "b8a7dd52ff893ed8225726d4ed4e14ecad748404"; - sha256 = "0dyk861qagibx8ldshz7d2nrki9q550f6f0wy8pvayvf1gv1dbxj"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - d2 = unsafeBuildOpenRAMod rec { - version = "134.git.69a4aa7"; - title = "Dune II"; - description = "A modernization of the original ${title} game"; - homepage = "https://github.com/OpenRA/d2"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "d2"; - rev = "69a4aa708e2c26376469c0048fac13592aa452ca"; - sha256 = "1mfch4s6c05slyqvxllklbxpqq8dqcbx3515n3gyylyq43gq481r"; - }; - engine = rec { - version = "release-20181215"; - mods = [ "cnc" "d2k" "ra" ]; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - rev = version; - sha256 = "0p0izykjnz7pz02g2khp7msqa00jhjsrzk9y0g29dirmdv75qa4r"; - name = "engine"; - inherit postFetch; - }; - }; - assetsError = '' - The mod expects the original ${title} game assets in place: - https://github.com/OpenRA/d2/wiki - ''; - }; - - dr = buildOpenRAMod rec { - version = "324.git.ffcd6ba"; - title = "Dark Reign"; - description = "A re-imagination of the original Command & Conquer: ${title} game"; - homepage = "https://github.com/drogoganor/DarkReign"; - src = fetchFromGitHub { - owner = "drogoganor"; - repo = "DarkReign"; - rev = "ffcd6ba72979e5f77508136ed7b0efc13e4b100e"; - sha256 = "07g4qw909649s3i1yhw75613mpwfka05jana5mpp5smhnf0pkack"; - }; - engine = { - version = "DarkReign"; - src = fetchFromGitHub { - owner = "drogoganor"; - repo = "OpenRA" ; - rev = "f91d3f2603bbf51afaa89357e4defcdc36138102"; - sha256 = "05g900ri6q0zrkrk8rmjaz576vjggmi2y6jm0xz3cwli54prn11w"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - gen = buildOpenRAMod { - version = "1157.git.4f5e11d"; - title = "Generals Alpha"; - description = "Re-imagination of the original Command & Conquer: Generals game"; - homepage = "https://github.com/MustaphaTR/Generals-Alpha"; - src = fetchFromGitHub { - owner = "MustaphaTR"; - repo = "Generals-Alpha"; - rev = "4f5e11d916e4a03d8cf1c97eef484ce2d77d7df2"; - sha256 = "1wnl4qrlhynnlahgdlxwhgsdba5wgdg9yrv9f8hkgi69j60szypd"; - }; - engine = rec { - version = "gen-20190128_3"; - src = fetchFromGitHub { - owner = "MustaphaTR"; - repo = "OpenRA" ; - rev = version; - sha256 = "1x6byz37s8qcpqj902zvkvbv95rv2mv2kj35c12gbpyc92xkqkq0"; - name = "generals-alpha-engine"; - inherit postFetch; - }; - }; - }; - - kknd = let version = "145.git.5530bab"; in name: (buildOpenRAMod rec { - inherit version; - title = "Krush, Kill 'n' Destroy"; - description = "Re-imagination of the original ${title} game"; - homepage = "https://kknd-game.com/"; - src = fetchFromGitHub { - owner = "IceReaper"; - repo = "KKnD"; - rev = "5530babcb05170e0959e4cf2b079161e9fedde4f"; - sha256 = "07jczrarmgm6zdk0myzwgq200x19yvpjyxrnhdac08mjgyz75zk1"; - }; - engine = { - version = "4e8eab4ca00d1910203c8a103dfd2c002714daa8"; - src = fetchFromGitHub { - owner = "IceReaper"; - repo = "OpenRA" ; - # commit does not exist on any branch on the target repository - rev = "4e8eab4ca00d1910203c8a103dfd2c002714daa8"; - sha256 = "1yyqparf93x8yzy1f46gsymgkj5jls25v2yc7ighr3f7mi3igdvq"; - name = "engine"; - inherit postFetch; - }; - }; - } name).overrideAttrs (origAttrs: { - postPatch = '' - ${origAttrs.postPatch} - sed -i 's/{DEV_VERSION}/${version}/' mods/*/mod.yaml - ''; - }); - - mw = buildOpenRAMod rec { - version = "257.git.c9be8f2"; - title = "Medieval Warfare"; - description = "A re-imagination of the original Command & Conquer: ${title} game"; - homepage = "https://github.com/CombinE88/Medieval-Warfare"; - src = fetchFromGitHub { - owner = "CombinE88"; - repo = "Medieval-Warfare"; - rev = "c9be8f2a6f1dd710b1aedd9d5b00b4cf5020e2fe"; - sha256 = "09fp7k95jd6hjqdasbspbd43z5670wkyzbbgqkll9dfsrv0sky0v"; - }; - engine = { - version = "MedievalWarfareEngine"; - src = fetchFromGitHub { - owner = "CombinE88"; - repo = "OpenRA" ; - rev = "52109c0910f479753704c46fb19e8afaab353c83"; - sha256 = "0ga3855j6bc7h81q03cw6laiaiz12915zg8aqah1idvxbzicfy7l"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - ra2 = buildOpenRAMod rec { - version = "903.git.2f7c700"; - title = "Red Alert 2"; - description = "Re-imagination of the original Command & Conquer: ${title} game"; - homepage = "https://github.com/OpenRA/ra2"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "ra2"; - rev = "2f7c700d6d63c0625e7158ef3098221fa6741569"; - sha256 = "11vnzwczn47wjfrq6y7z9q234p27ihdrcl5p87i6h2xnrpwi8b6m"; - }; - engine = rec { - version = "release-20180923"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - rev = version; - sha256 = "1pgi3zaq9fwwdq6yh19bwxscslqgabjxkvl9bcn1a5agy4bfbqk5"; - name = "engine"; - inherit postFetch; - }; - }; - assetsError = '' - The mod expects the original ${title} game assets in place: - https://github.com/OpenRA/ra2/wiki - ''; - }; - - raclassic = buildOpenRAMod { - version = "183.git.c76c13e"; - title = "Red Alert Classic"; - description = "A modernization of the original Command & Conquer: Red Alert game"; - homepage = "https://github.com/OpenRA/raclassic"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "raclassic"; - rev = "c76c13e9f0912a66ddebae8d05573632b19736b2"; - sha256 = "1cnr3ccvrkjlv8kkdcglcfh133yy0fkva9agwgvc7wlj9n5ydl4g"; - }; - engine = rec { - version = "release-20190314"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - rev = version; - sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - rv = unsafeBuildOpenRAMod { - version = "1330.git.9230e6f"; - title = "Romanov's Vengeance"; - description = "Re-imagination of the original Command & Conquer: Red Alert 2 game"; - homepage = "https://github.com/MustaphaTR/Romanovs-Vengeance"; - src = fetchFromGitHub { - owner = "MustaphaTR"; - repo = "Romanovs-Vengeance"; - rev = "9230e6f1dd9758467832aee4eda115e18f0e635f"; - sha256 = "0bwbmmlhp1kh8rgk2nx1ca9vqssj849amndacf318d61gksc1w9n"; - }; - engine = { - version = "f3873ae"; - mods = [ "as" ]; - src = fetchFromGitHub { - owner = "AttacqueSuperior"; - repo = "Engine"; - rev = "f3873ae242803051285994d77eb26f4b951594b5"; - sha256 = "02rv29wja0p5d083pd087daz7x7pp5b9ym7sci2fhg3mrnaqgwkp"; - name = "engine"; - inherit postFetch; - }; - }; - assetsError = '' - The mod expects the Command & Conquer: The Ultimate Collection assets in place: - https://github.com/OpenRA/ra2/wiki - ''; - }; - - sp = unsafeBuildOpenRAMod { - version = "221.git.ac000cc"; - title = "Shattered Paradise"; - description = "Re-imagination of the original Command & Conquer: Tiberian Sun game"; - homepage = "https://github.com/ABrandau/OpenRAModSDK"; - src = fetchFromGitHub { - owner = "ABrandau"; - repo = "OpenRAModSDK"; - rev = "ac000cc15377cdf6d3c2b72c737d692aa0ed8bcd"; - sha256 = "16mzs5wcxj9nlpcyx2c87idsqpbm40lx0rznsccclnlb3hiwqas9"; - }; - engine = { - version = "SP-22-04-19"; - mods = [ "as" "ts" ]; - src = fetchFromGitHub { - owner = "ABrandau"; - repo = "OpenRA" ; - rev = "bb0930008a57c07f3002421023f6b446e3e3af69"; - sha256 = "1jvgpbf56hd02ikhklv49br4d1jiv5hphc5kl79qnjlaacnj222x"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - ss = buildOpenRAMod rec { - version = "77.git.23e1f3e"; - title = "Sole Survivor"; - description = "A re-imagination of the original Command & Conquer: ${title} game"; - homepage = "https://github.com/MustaphaTR/sole-survivor"; - src = fetchFromGitHub { - owner = "MustaphaTR"; - repo = "sole-survivor"; - rev = "23e1f3e5d8b98c936797b6680d95d56a69a9e2ab"; - sha256 = "104clmxphchs7r8y7hpmw103bychayz80bqj98bp89i64nv9d89x"; - }; - engine = { - version = "6de92de"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - rev = "6de92de8d982094a766eab97a92225c240d85493"; - sha256 = "0ps9x379plrrj1hnj4fpr26lc46mzgxknv5imxi0bmrh5y4781ql"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - ura = buildOpenRAMod { - version = "431.git.128dc53"; - title = "Red Alert Unplugged"; - description = "Re-imagination of the original Command & Conquer: Red Alert game"; - homepage = "http://redalertunplugged.com/"; - src = fetchFromGitHub { - owner = "RAunplugged"; - repo = "uRA"; - rev = "128dc53741fae923f4af556f2293ceaa0cf571f0"; - sha256 = "1mhr8kyh313z52gdrqv31d6z7jvdldiajalca5mcr8gzg6mph66p"; - }; - engine = rec { - version = "unplugged-cd82382"; - src = fetchFromGitHub { - owner = "RAunplugged"; - repo = "OpenRA" ; - rev = version; - sha256 = "1p5hgxxvxlz8480vj0qkmnxjh7zj3hahk312m0zljxfdb40652w1"; - name = "engine"; - inherit postFetch; - }; - }; - }; - - yr = unsafeBuildOpenRAMod rec { - version = "199.git.5b8b952"; - homepage = "https://github.com/cookgreen/yr"; - title = "Yuri's Revenge"; - description = "Re-imagination of the original Command & Conquer: ${title} game"; - src = fetchFromGitHub { - owner = "cookgreen"; - repo = "yr"; - rev = "5b8b952dbe21f194a6d00485f20e215ce8362712"; - sha256 = "0hxzrqnz5d7qj1jjr20imiyih62x1cnmndf75nnil4c4sj82f9a6"; - }; - engine = rec { - version = "release-20190314"; - src = fetchFromGitHub { - owner = "OpenRA"; - repo = "OpenRA" ; - rev = version; - sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; - name = "engine"; - inherit postFetch; - }; - }; - assetsError = '' - The mod expects the Command & Conquer: The Ultimate Collection assets in place: - https://github.com/OpenRA/ra2/wiki - ''; - }; -} diff --git a/pkgs/games/openra/openra-mod.desktop b/pkgs/games/openra/openra-mod.desktop deleted file mode 100644 index 090b6c1325d..00000000000 --- a/pkgs/games/openra/openra-mod.desktop +++ /dev/null @@ -1,11 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=OpenRA - @title@ -GenericName=Real Time Strategy Game -GenericName[de]=Echtzeit-Strategiespiel -Comment=@description@ -Icon=openra-@name@ -Exec=openra-@name@ -Terminal=false -Categories=Game;StrategyGame;X-RTS;X-RealTimeStrategy;X-RealTimeStrategyGame; diff --git a/pkgs/games/openra/packages.nix b/pkgs/games/openra/packages.nix deleted file mode 100644 index 5ee78fe2b8f..00000000000 --- a/pkgs/games/openra/packages.nix +++ /dev/null @@ -1,60 +0,0 @@ -pkgs: - -let - /* Building an engine or out-of-tree mod is very similar, - but different enough not to be able to build them with the same package definition, - so instaed we define what is common between them in a separate file. - - Although `callPackage` could be used, it would require undoing `makeOverridable`, - because `common.nix` does not define a package, but just an attribute set, - which is directly passed as part of the argument to the engines and mods `callPackage`, - so either the attributes added by `makeOverridable` have to be removed - or the engine and mod package definitions will need to add `...` to the argument list. - */ - common = let f = import ./common.nix; in f (builtins.intersectAttrs (builtins.functionArgs f) pkgs // { - lua = pkgs.lua5_1; - # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure, - # rather than having to look to the logs why it is not starting. - inherit (pkgs.gnome) zenity; - }); - - /* Building a set of engines or mods requires some dependencies as well, - so the sets will actually be defined as a function instead, - requiring the dependencies and returning the actual set. - - Not all dependencies for defining a engine or mod set are shared, - so additional arguments can be passed as well. - - The builders for engines and mods allow to delay specifying the name, - by returning a function that expects a name, which we use, in this case, - to base the name on the attribute name instead, preventing the need to specify the name twice - if the attribute name and engine/mod name are equal. - */ - buildOpenRASet = f: args: builtins.mapAttrs (name: value: if builtins.isFunction value then value name else value) (f ({ - inherit (pkgs) fetchFromGitHub; - postFetch = '' - sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh - $out/thirdparty/fetch-thirdparty-deps.sh - ''; - } // args)); - -in rec { - # The whole attribute set is destructered to ensure those (and only those) attributes are given - # and to provide defaults for those that are optional. - buildOpenRAEngine = { name ? null, version, description, homepage, mods, src, installExperimental ? "" }@engine: - # Allow specifying the name at a later point if no name has been given. - let builder = name: pkgs.callPackage ./engine.nix (common // { - engine = engine // { inherit name installExperimental; }; - }); in if name == null then builder else builder name; - - # See `buildOpenRAEngine`. - buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine }@mod: ({ version, mods ? [], src }@engine: - let builder = name: pkgs.callPackage ./mod.nix (common // { - mod = mod // { inherit name; }; - engine = engine // { inherit mods; }; - }); in if name == null then builder else builder name) engine; - - # See `buildOpenRASet`. - engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; }; - mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; }; -} diff --git a/pkgs/games/openra_2019/common.nix b/pkgs/games/openra_2019/common.nix new file mode 100644 index 00000000000..d9cc93e8234 --- /dev/null +++ b/pkgs/games/openra_2019/common.nix @@ -0,0 +1,86 @@ +/* The reusable code, and package attributes, between OpenRA engine packages (engine.nix) + and out-of-tree mod packages (mod.nix). +*/ +{ lib, makeSetupHook, curl, unzip, dos2unix, pkg-config, makeWrapper +, lua, mono, dotnetPackages, python3 +, libGL, freetype, openal, SDL2 +, zenity +}: + +with lib; + +let + path = makeBinPath ([ mono python3 ] ++ optional (zenity != null) zenity); + rpath = makeLibraryPath [ lua freetype openal SDL2 ]; + mkdirp = makeSetupHook { + name = "openra-mkdirp-hook"; + } ./mkdirp.sh; + +in { + patchEngine = dir: version: '' + sed -i \ + -e 's/^VERSION.*/VERSION = ${version}/g' \ + -e '/fetch-geoip-db/d' \ + -e '/GeoLite2-Country.mmdb.gz/d' \ + ${dir}/Makefile + + sed -i 's|locations=.*|locations=${lua}/lib|' ${dir}/thirdparty/configure-native-deps.sh + ''; + + wrapLaunchGame = openraSuffix: '' + # Setting TERM=xterm fixes an issue with terminfo in mono: System.Exception: Magic number is wrong: 542 + # https://github.com/mono/mono/issues/6752#issuecomment-365212655 + wrapProgram $out/lib/openra${openraSuffix}/launch-game.sh \ + --prefix PATH : "${path}" \ + --prefix LD_LIBRARY_PATH : "${rpath}" \ + --set TERM xterm + + makeWrapper $out/lib/openra${openraSuffix}/launch-game.sh $(mkdirp $out/bin)/openra${openraSuffix} \ + --chdir "$out/lib/openra${openraSuffix}" + ''; + + packageAttrs = { + buildInputs = with dotnetPackages; [ + FuzzyLogicLibrary + MaxMindDb + MaxMindGeoIP2 + MonoNat + NewtonsoftJson + NUnit3 + NUnitConsole + OpenNAT + RestSharp + SharpFont + SharpZipLib + SmartIrc4net + StyleCopMSBuild + StyleCopPlusMSBuild + ] ++ [ + libGL + ]; + + # TODO: Test if this is correct. + nativeBuildInputs = [ + curl + unzip + dos2unix + pkg-config + makeWrapper + mkdirp + mono + python3 + ]; + + makeFlags = [ "prefix=$(out)" ]; + + doCheck = true; + + dontStrip = true; + + meta = { + maintainers = with maintainers; [ fusion809 msteen rardiol ]; + license = licenses.gpl3; + platforms = platforms.linux; + }; + }; +} diff --git a/pkgs/games/openra_2019/default.nix b/pkgs/games/openra_2019/default.nix new file mode 100644 index 00000000000..76454f69e4b --- /dev/null +++ b/pkgs/games/openra_2019/default.nix @@ -0,0 +1,71 @@ +/* This file defines all OpenRA packages under `openraPackages`, + e.g. the OpenRA release engine can be found at `openraPackages.engines.release` (see `engines.nix`), + or the out-of-tree mod "Combined Arms" can be found at `openraPackages.mods.ca` (see `mods.nix`). + The `openra` package is just an alias to `openraPackages.engines.release`, + and just provides the mods included in the source code of the engine. + Additional engines or mods can be added with `openraPackages.buildOpenRAEngine` (function around `engine.nix`) + and `openraPackages.buildOpenRAMod` (function around `mod.nix`), respectively. +*/ +pkgs: + +with pkgs.lib; + +let + /* Building an engine or out-of-tree mod is very similar, + but different enough not to be able to build them with the same package definition, + so instaed we define what is common between them in a separate file. + + Although `callPackage` could be used, it would require undoing `makeOverridable`, + because `common.nix` does not define a package, but just an attribute set, + which is directly passed as part of the argument to the engines and mods `callPackage`, + so either the attributes added by `makeOverridable` have to be removed + or the engine and mod package definitions will need to add `...` to the argument list. + */ + common = let f = import ./common.nix; in f (builtins.intersectAttrs (functionArgs f) pkgs // { + lua = pkgs.lua5_1; + # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure, + # rather than having to look to the logs why it is not starting. + inherit (pkgs.gnome) zenity; + }); + + /* Building a set of engines or mods requires some dependencies as well, + so the sets will actually be defined as a function instead, + requiring the dependencies and returning the actual set. + + Not all dependencies for defining a engine or mod set are shared, + so additional arguments can be passed as well. + + The builders for engines and mods allow to delay specifying the name, + by returning a function that expects a name, which we use, in this case, + to base the name on the attribute name instead, preventing the need to specify the name twice + if the attribute name and engine/mod name are equal. + */ + callWithName = name: value: if isFunction value then value name else value; + buildOpenRASet = f: args: pkgs.recurseIntoAttrs (mapAttrs callWithName (f ({ + inherit (pkgs) fetchFromGitHub; + postFetch = '' + sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh + $out/thirdparty/fetch-thirdparty-deps.sh + ''; + } // args))); + +in pkgs.recurseIntoAttrs rec { + # The whole attribute set is destructered to ensure those (and only those) attributes are given + # and to provide defaults for those that are optional. + buildOpenRAEngine = { name ? null, version, description, homepage, mods, src }@engine: + # Allow specifying the name at a later point if no name has been given. + let builder = name: pkgs.callPackage ./engine.nix (common // { + engine = engine // { inherit name; }; + }); in if name == null then builder else builder name; + + # See `buildOpenRAEngine`. + buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine, assetsError ? "" }@mod: ({ version, mods ? [], src }@engine: + let builder = name: pkgs.callPackage ./mod.nix (common // { + mod = mod // { inherit name assetsError; }; + engine = engine // { inherit mods; }; + }); in if name == null then builder else builder name) engine; + + # See `buildOpenRASet`. + engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; }; + mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; }; +} diff --git a/pkgs/games/openra_2019/engine.nix b/pkgs/games/openra_2019/engine.nix new file mode 100644 index 00000000000..d6acf10cfc6 --- /dev/null +++ b/pkgs/games/openra_2019/engine.nix @@ -0,0 +1,59 @@ +/* The package defintion for an OpenRA engine. + It shares code with `mod.nix` by what is defined in `common.nix`. + Similar to `mod.nix` it is a generic package definition, + in order to make it easy to define multiple variants of the OpenRA engine. + For each mod provided by the engine, a wrapper script is created, + matching the naming convention used by `mod.nix`. + This package could be seen as providing a set of in-tree mods, + while the `mod.nix` pacakges provide a single out-of-tree mod. +*/ +{ lib, stdenv +, packageAttrs +, patchEngine +, wrapLaunchGame +, engine +}: + +with lib; + +stdenv.mkDerivation (recursiveUpdate packageAttrs rec { + pname = "openra_2019"; + version = "${engine.name}-${engine.version}"; + + src = engine.src; + + postPatch = patchEngine "." version; + + configurePhase = '' + runHook preConfigure + + make version VERSION=${escapeShellArg version} + + runHook postConfigure + ''; + + buildFlags = [ "DEBUG=false" "default" "man-page" ]; + + checkTarget = "nunit test"; + + installTargets = [ + "install" + "install-linux-icons" + "install-linux-desktop" + "install-linux-appdata" + "install-linux-mime" + "install-man-page" + ]; + + postInstall = '' + ${wrapLaunchGame ""} + + ${concatStrings (map (mod: '' + makeWrapper $out/bin/openra $out/bin/openra-${mod} --add-flags Game.Mod=${mod} + '') engine.mods)} + ''; + + meta = { + inherit (engine) description homepage; + }; +}) diff --git a/pkgs/games/openra_2019/engines.nix b/pkgs/games/openra_2019/engines.nix new file mode 100644 index 00000000000..bbb4947acd2 --- /dev/null +++ b/pkgs/games/openra_2019/engines.nix @@ -0,0 +1,41 @@ +{ buildOpenRAEngine, fetchFromGitHub, postFetch }: + +let + buildUpstreamOpenRAEngine = { version, rev, sha256 }: name: (buildOpenRAEngine { + inherit version; + description = "Open-source re-implementation of Westwood Studios' 2D Command and Conquer games"; + homepage = "https://www.openra.net/"; + mods = [ "cnc" "d2k" "ra" "ts" ]; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + inherit rev sha256 postFetch; + }; + } name).overrideAttrs (origAttrs: { + postInstall = '' + ${origAttrs.postInstall} + cp -r mods/ts $out/lib/openra/mods/ + cp mods/ts/icon.png $(mkdirp $out/share/pixmaps)/openra-ts.png + ( cd $out/share/applications; sed -e 's/Dawn/Sun/g' -e 's/cnc/ts/g' openra-cnc.desktop > openra-ts.desktop ) + ''; + }); + +in { + release = name: (buildUpstreamOpenRAEngine rec { + version = "20190314"; + rev = "${name}-${version}"; + sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; + } name); + + playtest = name: (buildUpstreamOpenRAEngine rec { + version = "20190302"; + rev = "${name}-${version}"; + sha256 = "1vqvfk2p2lpk3m0d3rpvj34i8cmk3mfc7w4cn4llqd9zp4kk9pya"; + } name); + + bleed = buildUpstreamOpenRAEngine { + version = "8ee1102"; + rev = "8ee11028d72cde7556b31d45f556b40be65b4b70"; + sha256 = "0f1fpf37ms8d7fhlh3rjzsxsk9w23iyi3phs2i7g561292d5rk3l"; + }; +} diff --git a/pkgs/games/openra_2019/mkdirp.sh b/pkgs/games/openra_2019/mkdirp.sh new file mode 100644 index 00000000000..7b2cf0b89c0 --- /dev/null +++ b/pkgs/games/openra_2019/mkdirp.sh @@ -0,0 +1,4 @@ +mkdirp() { + mkdir -p "$@" + echo "$@" +} diff --git a/pkgs/games/openra_2019/mod-launch-game.sh b/pkgs/games/openra_2019/mod-launch-game.sh new file mode 100644 index 00000000000..88b53e71e1b --- /dev/null +++ b/pkgs/games/openra_2019/mod-launch-game.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +show_error() { + if command -v zenity > /dev/null; then + zenity --no-wrap --no-markup --error --title "OpenRA - @title@" --text "$1" 2>/dev/null + else + printf "$1\n" >&2 + fi + exit 1 +} + +cd "@out@/lib/openra-@name@" + +# Check for missing assets +assetsError='@assetsError@' +if [[ -n "$assetsError" && ! -d "$HOME/.openra/Content/@name@" ]]; then + show_error "$assetsError" +fi + +# Run the game +mono --debug OpenRA.Game.exe Game.Mod=@name@ Engine.LaunchPath="@out@/bin/openra-@name@" Engine.ModSearchPaths="@out@/lib/openra-@name@/mods" "$@" + +# Show a crash dialog if something went wrong +if (( $? != 0 && $? != 1 )); then + show_error $'OpenRA - @title@ has encountered a fatal error.\nPlease refer to the crash logs for more information.\n\nLog files are located in ~/.openra/Logs' +fi diff --git a/pkgs/games/openra_2019/mod-update.sh b/pkgs/games/openra_2019/mod-update.sh new file mode 100755 index 00000000000..8489d5a97a7 --- /dev/null +++ b/pkgs/games/openra_2019/mod-update.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2034 + +# for mod in $(nix eval --raw '( +# with import { }; +# with lib; +# let mods = attrNames (removeAttrs openraPackages.mods [ "recurseForDerivations" ]); +# in concatStringsSep " " mods +# )'); do +# ./mod-update.sh "$mod" +# done + +# Uses: https://github.com/msteen/nix-upfetch + +mod=$1 +commit_count=$2 +token= +nixpkgs='' + +die() { + local ret=$? + echo "$*" >&2 + exit $ret +} + +curl() { + command curl --silent --show-error "$@" +} + +get_sha1() { + local owner=$1 repo=$2 ref=$3 + # https://developer.github.com/v3/#authentication + curl -H "Authorization: token $token" -H 'Accept: application/vnd.github.VERSION.sha' "https://api.github.com/repos/$owner/$repo/commits/$ref" +} + +[[ -n $mod ]] || die "The first argument of this script has to be a mod identifier." + +[[ -n $token ]] || die "Please edit this script to include a GitHub API access token, which is required for API v4: +https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/" + +# Get current mod_owner and mod_repo. +vars=$(nix-prefetch --file "$nixpkgs" "openraPackages.mods.$mod" --index 0 --quiet --output json --no-compute-hash > >( + jq --raw-output 'with_entries(select(.value | contains("\n") | not)) | to_entries | .[] | .key + "=" + .value')) || exit + +mod_owner=; mod_repo=; mod_rev= +while IFS='=' read -r key val; do + declare "mod_${key}=${val}" +done <<< "$vars" + +if [[ -n $commit_count ]]; then + query_on_commit='{ + history(first: 10) { + nodes { + abbreviatedOid + oid + } + totalCount + } +}' +else + query_on_commit='{ + history(first: 0) { + totalCount + } + abbreviatedOid + oid +}' +fi + +# shellcheck disable=SC2089 +query='{ + repository(owner: "'$mod_owner'", name: "'$mod_repo'") { + defaultBranchRef { + target { + ... on Commit '$query_on_commit' + } + } + licenseInfo { + key + } + } +}' + +# Newlines are not allowed in a query. +# https://developer.github.com/v4/guides/forming-calls/#communicating-with-graphql +# shellcheck disable=SC2086 disable=SC2090 disable=SC2116 +query=$(echo $query) +query=${query//\"/\\\"} + +# https://developer.github.com/v4/guides/using-the-explorer/#configuring-graphiql +json=$(curl -H "Authorization: bearer $token" -X POST -d '{ "query": "'"$query"'" }' https://api.github.com/graphql) || exit + +if [[ -n $commit_count ]]; then + json=$(jq "$commit_count"' as $commit_count + | .data.repository.defaultBranchRef.target + |= (.history |= (. | del(.nodes) | .totalCount = $commit_count)) + + (.history | .nodes[.totalCount - $commit_count])' <<< "$json") || exit +fi + +vars=$(jq --raw-output '.data.repository | { + license_key: .licenseInfo.key, +} + (.defaultBranchRef.target | { + version: ((.history.totalCount | tostring) + ".git." + .abbreviatedOid), + rev: .oid, +}) | to_entries | .[] | .key + "=" + (.value | tostring)' <<< "$json") || exit + +mod_license_key=; mod_version=; mod_rev= +while IFS='=' read -r key val; do + declare "mod_${key}=${val}" +done <<< "$vars" + +mod_config=$(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/mod.config") || exit + +mod_id=; engine_version=; automatic_engine_management=; automatic_engine_source= +while IFS='=' read -r key val; do + declare "${key,,}=$(jq --raw-output . <<< "$val")" +done < <(grep '^\(MOD_ID\|ENGINE_VERSION\|AUTOMATIC_ENGINE_MANAGEMENT\|AUTOMATIC_ENGINE_SOURCE\)=' <<< "$mod_config") + +for var in mod_id engine_version automatic_engine_management automatic_engine_source; do + echo "$var=${!var}" >&2 +done +echo >&2 + +[[ $mod_id == "$mod" ]] || + die "The mod '$mod' reports being mod '$mod_id' instead." +# shellcheck disable=SC2005 disable=SC2046 +[[ $mod_license_key == gpl-3.0 ]] || +[[ $(echo $(head -2 <(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/COPYING"))) == 'GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007' ]] || + die "The mod '$mod' is licensed under '$mod_license_key' while expecting 'gpl-3.0'." +[[ $automatic_engine_management == True ]] || + die "The mod '$mod' engine is not managed as a read-only dependency." +[[ $automatic_engine_source =~ https://github.com/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/archive/([a-zA-Z0-9_\-\$\{\}]+).zip ]] || + die "The mod '$mod' engine is not hosted on GitHub as an archive." + +engine_owner=${BASH_REMATCH[1]} +engine_repo=${BASH_REMATCH[2]} +# shellcheck disable=SC2016 +[[ ${BASH_REMATCH[3]} == '${ENGINE_VERSION}' ]] || engine_version=${BASH_REMATCH[3]} +engine_rev=$(get_sha1 "$engine_owner" "$engine_repo" "$engine_version") + +for type in mod engine; do + for name in version owner repo rev; do + var="${type}_${name}" + echo "$var=${!var}" >&2 + done + echo >&2 +done + +i=0 +for type in mod engine; do + fetcher_args=() + for name in owner repo rev; do + var="${type}_${name}" + fetcher_args+=( "--$name" "${!var}" ) + done + var="${type}_version" + version=${!var} + nix-upfetch --yes --version "$version" "$(nix-preupfetch --file "$nixpkgs" "openraPackages.mods.$mod" --index $i -- "${fetcher_args[@]}")" + (( i++ )) +done diff --git a/pkgs/games/openra_2019/mod.nix b/pkgs/games/openra_2019/mod.nix new file mode 100644 index 00000000000..9d69b79bdeb --- /dev/null +++ b/pkgs/games/openra_2019/mod.nix @@ -0,0 +1,105 @@ +/* The package defintion for an OpenRA out-of-tree mod. + It shares code with `engine.nix` by what is defined in `common.nix`. + To build an out-of-tree mod it needs the source code of the engine available, + and they each need to be build with a specific version or fork of the engine, + so the engine needs to be supplied as an argument as well. + The engine is relatively small and quick to build, so this is not much of a problem. + Building a mod will result in a wrapper script that starts the mod inside the specified engine. +*/ +{ lib, stdenv +, packageAttrs +, patchEngine +, wrapLaunchGame +, mod +, engine +}: + +with lib; + +let + engineSourceName = engine.src.name or "engine"; + modSourceName = mod.src.name or "mod"; + +# Based on: https://build.opensuse.org/package/show/home:fusion809/openra-ura +in stdenv.mkDerivation (recursiveUpdate packageAttrs rec { + name = "${pname}-${version}"; + pname = "openra_2019-${mod.name}"; + inherit (mod) version; + + srcs = [ + mod.src + engine.src + ]; + + sourceRoot = "."; + + postUnpack = '' + mv ${engineSourceName} ${modSourceName} + cd ${modSourceName} + ''; + + postPatch = '' + cat <<'EOF' > fetch-engine.sh + #!/bin/sh + exit 0 + EOF + + sed -i 's/^VERSION.*/VERSION = ${version}/g' Makefile + + dos2unix *.md + + ${patchEngine engineSourceName engine.version} + ''; + + configurePhase = '' + runHook preConfigure + + make version VERSION=${escapeShellArg version} + make -C ${engineSourceName} version VERSION=${escapeShellArg engine.version} + + runHook postConfigure + ''; + + checkTarget = "test"; + + installPhase = '' + runHook preInstall + + make -C ${engineSourceName} install-engine install-common-mod-files DATA_INSTALL_DIR=$out/lib/${pname} + + cp -r ${engineSourceName}/mods/{${concatStringsSep "," ([ "common" "modcontent" ] ++ engine.mods)}} mods/* \ + $out/lib/${pname}/mods/ + + substitute ${./mod-launch-game.sh} $out/lib/${pname}/launch-game.sh \ + --subst-var out \ + --subst-var-by name ${escapeShellArg mod.name} \ + --subst-var-by title ${escapeShellArg mod.title} \ + --subst-var-by assetsError ${escapeShellArg mod.assetsError} + chmod +x $out/lib/${pname}/launch-game.sh + + ${wrapLaunchGame "-${mod.name}"} + + substitute ${./openra-mod.desktop} $(mkdirp $out/share/applications)/${pname}.desktop \ + --subst-var-by name ${escapeShellArg mod.name} \ + --subst-var-by title ${escapeShellArg mod.title} \ + --subst-var-by description ${escapeShellArg mod.description} + + cp README.md $(mkdirp $out/share/doc/packages/${pname})/README.md + + [[ -e mods/${mod.name}/icon.png ]] && mod_icon=mods/${mod.name}/icon.png || { + [[ -e mods/${mod.name}/logo.png ]] && mod_icon=mods/${mod.name}/logo.png || mod_icon=packaging/linux/mod_256x256.png + } + cp "$mod_icon" $(mkdirp $out/share/pixmaps)/${pname}.png + + for size in 16 32 48 64 128 256; do + size=''${size}x''${size} + cp packaging/linux/mod_''${size}.png $(mkdirp $out/share/icons/hicolor/''${size}/apps)/${pname}.png + done + + runHook postInstall + ''; + + meta = { + inherit (mod) description homepage; + }; +}) diff --git a/pkgs/games/openra_2019/mods.nix b/pkgs/games/openra_2019/mods.nix new file mode 100644 index 00000000000..47e86fd09a7 --- /dev/null +++ b/pkgs/games/openra_2019/mods.nix @@ -0,0 +1,345 @@ +{ buildOpenRAMod, fetchFromGitHub, postFetch }: + +let + unsafeBuildOpenRAMod = attrs: name: (buildOpenRAMod attrs name).overrideAttrs (_: { + doCheck = false; + }); + +in { + ca = buildOpenRAMod { + version = "96.git.fc3cf0b"; + title = "Combined Arms"; + description = "A game that combines units from the official OpenRA Red Alert and Tiberian Dawn mods"; + homepage = "https://github.com/Inq8/CAmod"; + src = fetchFromGitHub { + owner = "Inq8"; + repo = "CAmod"; + rev = "fc3cf0baf2b827650eaae9e1d2335a3eed24bac9"; + sha256 = "15w91xs253gyrlzsgid6ixxjazx0fbzick6vlkiay0znb58n883m"; + }; + engine = { + version = "b8a7dd5"; + src = fetchFromGitHub { + owner = "Inq8"; + repo = "CAengine" ; + rev = "b8a7dd52ff893ed8225726d4ed4e14ecad748404"; + sha256 = "0dyk861qagibx8ldshz7d2nrki9q550f6f0wy8pvayvf1gv1dbxj"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + d2 = unsafeBuildOpenRAMod rec { + version = "134.git.69a4aa7"; + title = "Dune II"; + description = "A modernization of the original ${title} game"; + homepage = "https://github.com/OpenRA/d2"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "d2"; + rev = "69a4aa708e2c26376469c0048fac13592aa452ca"; + sha256 = "1mfch4s6c05slyqvxllklbxpqq8dqcbx3515n3gyylyq43gq481r"; + }; + engine = rec { + version = "release-20181215"; + mods = [ "cnc" "d2k" "ra" ]; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + rev = version; + sha256 = "0p0izykjnz7pz02g2khp7msqa00jhjsrzk9y0g29dirmdv75qa4r"; + name = "engine"; + inherit postFetch; + }; + }; + assetsError = '' + The mod expects the original ${title} game assets in place: + https://github.com/OpenRA/d2/wiki + ''; + }; + + dr = buildOpenRAMod rec { + version = "324.git.ffcd6ba"; + title = "Dark Reign"; + description = "A re-imagination of the original Command & Conquer: ${title} game"; + homepage = "https://github.com/drogoganor/DarkReign"; + src = fetchFromGitHub { + owner = "drogoganor"; + repo = "DarkReign"; + rev = "ffcd6ba72979e5f77508136ed7b0efc13e4b100e"; + sha256 = "07g4qw909649s3i1yhw75613mpwfka05jana5mpp5smhnf0pkack"; + }; + engine = { + version = "DarkReign"; + src = fetchFromGitHub { + owner = "drogoganor"; + repo = "OpenRA" ; + rev = "f91d3f2603bbf51afaa89357e4defcdc36138102"; + sha256 = "05g900ri6q0zrkrk8rmjaz576vjggmi2y6jm0xz3cwli54prn11w"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + gen = buildOpenRAMod { + version = "1157.git.4f5e11d"; + title = "Generals Alpha"; + description = "Re-imagination of the original Command & Conquer: Generals game"; + homepage = "https://github.com/MustaphaTR/Generals-Alpha"; + src = fetchFromGitHub { + owner = "MustaphaTR"; + repo = "Generals-Alpha"; + rev = "4f5e11d916e4a03d8cf1c97eef484ce2d77d7df2"; + sha256 = "1wnl4qrlhynnlahgdlxwhgsdba5wgdg9yrv9f8hkgi69j60szypd"; + }; + engine = rec { + version = "gen-20190128_3"; + src = fetchFromGitHub { + owner = "MustaphaTR"; + repo = "OpenRA" ; + rev = version; + sha256 = "1x6byz37s8qcpqj902zvkvbv95rv2mv2kj35c12gbpyc92xkqkq0"; + name = "generals-alpha-engine"; + inherit postFetch; + }; + }; + }; + + kknd = let version = "145.git.5530bab"; in name: (buildOpenRAMod rec { + inherit version; + title = "Krush, Kill 'n' Destroy"; + description = "Re-imagination of the original ${title} game"; + homepage = "https://kknd-game.com/"; + src = fetchFromGitHub { + owner = "IceReaper"; + repo = "KKnD"; + rev = "5530babcb05170e0959e4cf2b079161e9fedde4f"; + sha256 = "07jczrarmgm6zdk0myzwgq200x19yvpjyxrnhdac08mjgyz75zk1"; + }; + engine = { + version = "4e8eab4ca00d1910203c8a103dfd2c002714daa8"; + src = fetchFromGitHub { + owner = "IceReaper"; + repo = "OpenRA" ; + # commit does not exist on any branch on the target repository + rev = "4e8eab4ca00d1910203c8a103dfd2c002714daa8"; + sha256 = "1yyqparf93x8yzy1f46gsymgkj5jls25v2yc7ighr3f7mi3igdvq"; + name = "engine"; + inherit postFetch; + }; + }; + } name).overrideAttrs (origAttrs: { + postPatch = '' + ${origAttrs.postPatch} + sed -i 's/{DEV_VERSION}/${version}/' mods/*/mod.yaml + ''; + }); + + mw = buildOpenRAMod rec { + version = "257.git.c9be8f2"; + title = "Medieval Warfare"; + description = "A re-imagination of the original Command & Conquer: ${title} game"; + homepage = "https://github.com/CombinE88/Medieval-Warfare"; + src = fetchFromGitHub { + owner = "CombinE88"; + repo = "Medieval-Warfare"; + rev = "c9be8f2a6f1dd710b1aedd9d5b00b4cf5020e2fe"; + sha256 = "09fp7k95jd6hjqdasbspbd43z5670wkyzbbgqkll9dfsrv0sky0v"; + }; + engine = { + version = "MedievalWarfareEngine"; + src = fetchFromGitHub { + owner = "CombinE88"; + repo = "OpenRA" ; + rev = "52109c0910f479753704c46fb19e8afaab353c83"; + sha256 = "0ga3855j6bc7h81q03cw6laiaiz12915zg8aqah1idvxbzicfy7l"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + ra2 = buildOpenRAMod rec { + version = "903.git.2f7c700"; + title = "Red Alert 2"; + description = "Re-imagination of the original Command & Conquer: ${title} game"; + homepage = "https://github.com/OpenRA/ra2"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "ra2"; + rev = "2f7c700d6d63c0625e7158ef3098221fa6741569"; + sha256 = "11vnzwczn47wjfrq6y7z9q234p27ihdrcl5p87i6h2xnrpwi8b6m"; + }; + engine = rec { + version = "release-20180923"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + rev = version; + sha256 = "1pgi3zaq9fwwdq6yh19bwxscslqgabjxkvl9bcn1a5agy4bfbqk5"; + name = "engine"; + inherit postFetch; + }; + }; + assetsError = '' + The mod expects the original ${title} game assets in place: + https://github.com/OpenRA/ra2/wiki + ''; + }; + + raclassic = buildOpenRAMod { + version = "183.git.c76c13e"; + title = "Red Alert Classic"; + description = "A modernization of the original Command & Conquer: Red Alert game"; + homepage = "https://github.com/OpenRA/raclassic"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "raclassic"; + rev = "c76c13e9f0912a66ddebae8d05573632b19736b2"; + sha256 = "1cnr3ccvrkjlv8kkdcglcfh133yy0fkva9agwgvc7wlj9n5ydl4g"; + }; + engine = rec { + version = "release-20190314"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + rev = version; + sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + rv = unsafeBuildOpenRAMod { + version = "1330.git.9230e6f"; + title = "Romanov's Vengeance"; + description = "Re-imagination of the original Command & Conquer: Red Alert 2 game"; + homepage = "https://github.com/MustaphaTR/Romanovs-Vengeance"; + src = fetchFromGitHub { + owner = "MustaphaTR"; + repo = "Romanovs-Vengeance"; + rev = "9230e6f1dd9758467832aee4eda115e18f0e635f"; + sha256 = "0bwbmmlhp1kh8rgk2nx1ca9vqssj849amndacf318d61gksc1w9n"; + }; + engine = { + version = "f3873ae"; + mods = [ "as" ]; + src = fetchFromGitHub { + owner = "AttacqueSuperior"; + repo = "Engine"; + rev = "f3873ae242803051285994d77eb26f4b951594b5"; + sha256 = "02rv29wja0p5d083pd087daz7x7pp5b9ym7sci2fhg3mrnaqgwkp"; + name = "engine"; + inherit postFetch; + }; + }; + assetsError = '' + The mod expects the Command & Conquer: The Ultimate Collection assets in place: + https://github.com/OpenRA/ra2/wiki + ''; + }; + + sp = unsafeBuildOpenRAMod { + version = "221.git.ac000cc"; + title = "Shattered Paradise"; + description = "Re-imagination of the original Command & Conquer: Tiberian Sun game"; + homepage = "https://github.com/ABrandau/OpenRAModSDK"; + src = fetchFromGitHub { + owner = "ABrandau"; + repo = "OpenRAModSDK"; + rev = "ac000cc15377cdf6d3c2b72c737d692aa0ed8bcd"; + sha256 = "16mzs5wcxj9nlpcyx2c87idsqpbm40lx0rznsccclnlb3hiwqas9"; + }; + engine = { + version = "SP-22-04-19"; + mods = [ "as" "ts" ]; + src = fetchFromGitHub { + owner = "ABrandau"; + repo = "OpenRA" ; + rev = "bb0930008a57c07f3002421023f6b446e3e3af69"; + sha256 = "1jvgpbf56hd02ikhklv49br4d1jiv5hphc5kl79qnjlaacnj222x"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + ss = buildOpenRAMod rec { + version = "77.git.23e1f3e"; + title = "Sole Survivor"; + description = "A re-imagination of the original Command & Conquer: ${title} game"; + homepage = "https://github.com/MustaphaTR/sole-survivor"; + src = fetchFromGitHub { + owner = "MustaphaTR"; + repo = "sole-survivor"; + rev = "23e1f3e5d8b98c936797b6680d95d56a69a9e2ab"; + sha256 = "104clmxphchs7r8y7hpmw103bychayz80bqj98bp89i64nv9d89x"; + }; + engine = { + version = "6de92de"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + rev = "6de92de8d982094a766eab97a92225c240d85493"; + sha256 = "0ps9x379plrrj1hnj4fpr26lc46mzgxknv5imxi0bmrh5y4781ql"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + ura = buildOpenRAMod { + version = "431.git.128dc53"; + title = "Red Alert Unplugged"; + description = "Re-imagination of the original Command & Conquer: Red Alert game"; + homepage = "http://redalertunplugged.com/"; + src = fetchFromGitHub { + owner = "RAunplugged"; + repo = "uRA"; + rev = "128dc53741fae923f4af556f2293ceaa0cf571f0"; + sha256 = "1mhr8kyh313z52gdrqv31d6z7jvdldiajalca5mcr8gzg6mph66p"; + }; + engine = rec { + version = "unplugged-cd82382"; + src = fetchFromGitHub { + owner = "RAunplugged"; + repo = "OpenRA" ; + rev = version; + sha256 = "1p5hgxxvxlz8480vj0qkmnxjh7zj3hahk312m0zljxfdb40652w1"; + name = "engine"; + inherit postFetch; + }; + }; + }; + + yr = unsafeBuildOpenRAMod rec { + version = "199.git.5b8b952"; + homepage = "https://github.com/cookgreen/yr"; + title = "Yuri's Revenge"; + description = "Re-imagination of the original Command & Conquer: ${title} game"; + src = fetchFromGitHub { + owner = "cookgreen"; + repo = "yr"; + rev = "5b8b952dbe21f194a6d00485f20e215ce8362712"; + sha256 = "0hxzrqnz5d7qj1jjr20imiyih62x1cnmndf75nnil4c4sj82f9a6"; + }; + engine = rec { + version = "release-20190314"; + src = fetchFromGitHub { + owner = "OpenRA"; + repo = "OpenRA" ; + rev = version; + sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr"; + name = "engine"; + inherit postFetch; + }; + }; + assetsError = '' + The mod expects the Command & Conquer: The Ultimate Collection assets in place: + https://github.com/OpenRA/ra2/wiki + ''; + }; +} diff --git a/pkgs/games/openra_2019/openra-mod.desktop b/pkgs/games/openra_2019/openra-mod.desktop new file mode 100644 index 00000000000..090b6c1325d --- /dev/null +++ b/pkgs/games/openra_2019/openra-mod.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=OpenRA - @title@ +GenericName=Real Time Strategy Game +GenericName[de]=Echtzeit-Strategiespiel +Comment=@description@ +Icon=openra-@name@ +Exec=openra-@name@ +Terminal=false +Categories=Game;StrategyGame;X-RTS;X-RealTimeStrategy;X-RealTimeStrategyGame; diff --git a/pkgs/games/openra_2019/packages.nix b/pkgs/games/openra_2019/packages.nix new file mode 100644 index 00000000000..5ee78fe2b8f --- /dev/null +++ b/pkgs/games/openra_2019/packages.nix @@ -0,0 +1,60 @@ +pkgs: + +let + /* Building an engine or out-of-tree mod is very similar, + but different enough not to be able to build them with the same package definition, + so instaed we define what is common between them in a separate file. + + Although `callPackage` could be used, it would require undoing `makeOverridable`, + because `common.nix` does not define a package, but just an attribute set, + which is directly passed as part of the argument to the engines and mods `callPackage`, + so either the attributes added by `makeOverridable` have to be removed + or the engine and mod package definitions will need to add `...` to the argument list. + */ + common = let f = import ./common.nix; in f (builtins.intersectAttrs (builtins.functionArgs f) pkgs // { + lua = pkgs.lua5_1; + # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure, + # rather than having to look to the logs why it is not starting. + inherit (pkgs.gnome) zenity; + }); + + /* Building a set of engines or mods requires some dependencies as well, + so the sets will actually be defined as a function instead, + requiring the dependencies and returning the actual set. + + Not all dependencies for defining a engine or mod set are shared, + so additional arguments can be passed as well. + + The builders for engines and mods allow to delay specifying the name, + by returning a function that expects a name, which we use, in this case, + to base the name on the attribute name instead, preventing the need to specify the name twice + if the attribute name and engine/mod name are equal. + */ + buildOpenRASet = f: args: builtins.mapAttrs (name: value: if builtins.isFunction value then value name else value) (f ({ + inherit (pkgs) fetchFromGitHub; + postFetch = '' + sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh + $out/thirdparty/fetch-thirdparty-deps.sh + ''; + } // args)); + +in rec { + # The whole attribute set is destructered to ensure those (and only those) attributes are given + # and to provide defaults for those that are optional. + buildOpenRAEngine = { name ? null, version, description, homepage, mods, src, installExperimental ? "" }@engine: + # Allow specifying the name at a later point if no name has been given. + let builder = name: pkgs.callPackage ./engine.nix (common // { + engine = engine // { inherit name installExperimental; }; + }); in if name == null then builder else builder name; + + # See `buildOpenRAEngine`. + buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine }@mod: ({ version, mods ? [], src }@engine: + let builder = name: pkgs.callPackage ./mod.nix (common // { + mod = mod // { inherit name; }; + engine = engine // { inherit mods; }; + }); in if name == null then builder else builder name) engine; + + # See `buildOpenRASet`. + engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; }; + mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 4f3139461e5..32c48396b6d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -36944,9 +36944,9 @@ with pkgs; otto-matic = callPackage ../games/otto-matic { }; - openraPackages = import ../games/openra pkgs.__splicedPackages; + openraPackages_2019 = import ../games/openra_2019 pkgs.__splicedPackages; - openra = openraPackages.engines.release; + openra_2019 = openraPackages_2019.engines.release; openrw = callPackage ../games/openrw { inherit (darwin.apple_sdk.frameworks) Cocoa OpenAL; -- cgit 1.4.1