summaryrefslogtreecommitdiffstats
path: root/pkgs/games/dwarf-fortress
diff options
context:
space:
mode:
authorNaïm Favier <n@monade.li>2022-12-01 11:34:11 +0100
committerGitHub <noreply@github.com>2022-12-01 11:34:11 +0100
commitb33a7fa3fa79e873a5907a46ad0367a420f92c76 (patch)
tree2485f48c6b093bdede043eb68fa3f7d4bd90eefe /pkgs/games/dwarf-fortress
parent84e81bb7903f89b9be3ba375007a7bf598e0281d (diff)
parent34e0667b74c5055f81986c759344e3a7de6414c1 (diff)
Merge pull request #201568 from ncfavier/df
Diffstat (limited to 'pkgs/games/dwarf-fortress')
-rw-r--r--pkgs/games/dwarf-fortress/default.nix2
-rw-r--r--pkgs/games/dwarf-fortress/dfhack/default.nix83
-rw-r--r--pkgs/games/dwarf-fortress/dfhack/fix-stonesense.patch23
-rw-r--r--pkgs/games/dwarf-fortress/game.nix2
-rw-r--r--pkgs/games/dwarf-fortress/lazy-pack.nix2
-rw-r--r--pkgs/games/dwarf-fortress/twbt/default.nix23
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix108
-rwxr-xr-x[-rw-r--r--]pkgs/games/dwarf-fortress/wrapper/dfhack.in4
8 files changed, 115 insertions, 132 deletions
diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix
index 382537282748..dd8e6b5503da 100644
--- a/pkgs/games/dwarf-fortress/default.nix
+++ b/pkgs/games/dwarf-fortress/default.nix
@@ -69,7 +69,7 @@ let
dfhack = callPackage ./dfhack {
inherit (perlPackages) XMLLibXML XMLLibXSLT;
- inherit dfVersion twbt;
+ inherit dfVersion;
stdenv = gccStdenv;
};
diff --git a/pkgs/games/dwarf-fortress/dfhack/default.nix b/pkgs/games/dwarf-fortress/dfhack/default.nix
index 49e8fabd45e4..914ccbb6ab33 100644
--- a/pkgs/games/dwarf-fortress/dfhack/default.nix
+++ b/pkgs/games/dwarf-fortress/dfhack/default.nix
@@ -2,6 +2,7 @@
, buildEnv
, lib
, fetchFromGitHub
+, fetchpatch
, cmake
, writeScriptBin
, perl
@@ -13,8 +14,6 @@
, allegro5
, libGLU
, libGL
-, enableTWBT ? true
-, twbt
, SDL
, dfVersion
}:
@@ -23,24 +22,6 @@ with lib;
let
dfhack-releases = {
- "0.43.05" = {
- dfHackRelease = "0.43.05-r3.1";
- sha256 = "1ds366i0qcfbn62w9qv98lsqcrm38npzgvcr35hf6ihqa6nc6xrl";
- xmlRev = "860a9041a75305609643d465123a4b598140dd7f";
- prerelease = false;
- };
- "0.44.05" = {
- dfHackRelease = "0.44.05-r2";
- sha256 = "1cwifdhi48a976xc472nf6q2k0ibwqffil5a4llcymcxdbgxdcc9";
- xmlRev = "2794f8a6d7405d4858bac486a0bb17b94740c142";
- prerelease = false;
- };
- "0.44.09" = {
- dfHackRelease = "0.44.09-r1";
- sha256 = "1nkfaa43pisbyik5inj5q2hja2vza5lwidg5z02jyh136jm64hwk";
- xmlRev = "3c0bf63674d5430deadaf7befaec42f0ec1e8bc5";
- prerelease = false;
- };
"0.44.10" = {
dfHackRelease = "0.44.10-r2";
sha256 = "19bxsghxzw3bilhr8sm4axz7p7z8lrvbdsd1vdjf5zbg04rs866i";
@@ -66,22 +47,24 @@ let
prerelease = true;
};
"0.47.04" = {
- dfHackRelease = "0.47.04-r2";
- sha256 = "18ppn1dqaxi6ahjzsvb9kw70rvca106a1hibhzc4rxmraypnqb89";
- xmlRev = "036b662a1bbc96b4911f3cbe74dfa1243b6459bc";
+ dfHackRelease = "0.47.04-r5";
+ sha256 = "sha256-0s+/LKbqsS/mrxKPDeniqykE5+Gy3ZzCa8yEDzMyssY=";
+ xmlRev = "be0444cc165a1abff053d5893dc1f780f06526b7";
prerelease = false;
};
"0.47.05" = {
- dfHackRelease = "0.47.05-r1";
- sha256 = "sha256-B0iv7fpIcnaO8sx9wPqI7/WuyLK15p8UYlYIcF5F5bw=";
- xmlRev = "11c379ffd31255f2a1415d98106114a46245e1c3";
+ dfHackRelease = "0.47.05-r7";
+ sha256 = "sha256-vBKUTSjfCnalkBzfjaIKcxUuqsGGOTtoJC1RHJIDlNc=";
+ xmlRev = "f5019a5c6f19ef05a28bd974c3e8668b78e6e2a4";
prerelease = false;
};
};
release =
- if hasAttr dfVersion dfhack-releases
+ if lib.isAttrs dfVersion
+ then dfVersion
+ else if hasAttr dfVersion dfhack-releases
then getAttr dfVersion dfhack-releases
else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}";
@@ -115,9 +98,9 @@ let
exit 1
fi
'';
-
- dfhack = stdenv.mkDerivation {
- pname = "dfhack-base";
+in
+ stdenv.mkDerivation {
+ pname = "dfhack";
inherit version;
# Beware of submodules
@@ -129,10 +112,20 @@ let
fetchSubmodules = true;
};
- patches = [ ./fix-stonesense.patch ];
+ patches = lib.optional (lib.versionOlder version "0.44.12-r3") (fetchpatch {
+ name = "fix-stonesense.patch";
+ url = "https://github.com/DFHack/stonesense/commit/f5be6fe5fb192f01ae4551ed9217e97fd7f6a0ae.patch";
+ extraPrefix = "plugins/stonesense/";
+ stripLen = 1;
+ hash = "sha256-wje6Mkct29eyMOcJnbdefwBOLJko/s4JcJe52ojuW+8=";
+ }) ++ lib.optional (lib.versionOlder version "0.47.04-r1") (fetchpatch {
+ name = "fix-protobuf.patch";
+ url = "https://github.com/DFHack/dfhack/commit/7bdf958518d2892ee89a7173224a069c4a2190d8.patch";
+ hash = "sha256-p+mKhmYbnhWKNiGPMjbYO505Gcg634n0nudqH0NX3KY=";
+ });
# gcc 11 fix
- NIX_CFLAGS_COMPILE = "-fpermissive";
+ CXXFLAGS = lib.optionalString (lib.versionOlder version "0.47.05-r3") "-fpermissive";
# As of
# https://github.com/DFHack/dfhack/commit/56e43a0dde023c5a4595a22b29d800153b31e3c4,
@@ -166,21 +159,13 @@ let
ln -s ${ruby}/lib/libruby-*.so $out/hack/libruby.so
'';
- };
-in
-
-buildEnv {
- name = "dfhack-${version}";
-
- passthru = { inherit version dfVersion; };
+ passthru = { inherit dfVersion; };
- paths = [ dfhack ] ++ lib.optionals enableTWBT [ twbt.lib ];
-
- meta = with lib; {
- description = "Memory hacking library for Dwarf Fortress and a set of tools that use it";
- homepage = "https://github.com/DFHack/dfhack/";
- license = licenses.zlib;
- platforms = [ "x86_64-linux" "i686-linux" ];
- maintainers = with maintainers; [ robbinch a1russell abbradar numinit ];
- };
-}
+ meta = with lib; {
+ description = "Memory hacking library for Dwarf Fortress and a set of tools that use it";
+ homepage = "https://github.com/DFHack/dfhack/";
+ license = licenses.zlib;
+ platforms = [ "x86_64-linux" "i686-linux" ];
+ maintainers = with maintainers; [ robbinch a1russell abbradar numinit ncfavier ];
+ };
+ }
diff --git a/pkgs/games/dwarf-fortress/dfhack/fix-stonesense.patch b/pkgs/games/dwarf-fortress/dfhack/fix-stonesense.patch
deleted file mode 100644
index da860cd55624..000000000000
--- a/pkgs/games/dwarf-fortress/dfhack/fix-stonesense.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From f5be6fe5fb192f01ae4551ed9217e97fd7f6a0ae Mon Sep 17 00:00:00 2001
-From: Herwig Hochleitner <hhochleitner@gmail.com>
-Date: Sun, 1 Oct 2017 18:01:43 +0200
-Subject: [PATCH] include <GL/glext.h>
-
-this fixes `GLhandleARB` not being defined
----
- plugins/stonesense/common.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/plugins/stonesense/common.h b/plugins/stonesense/common.h
-index eb36691..ef45389 100644
---- a/plugins/stonesense/common.h
-+++ b/plugins/stonesense/common.h
-@@ -31,6 +31,8 @@ using namespace df::enums;
- #include <allegro5/allegro_opengl.h>
- #include <allegro5/utf8.h>
-
-+#include <GL/glext.h>
-+
- // allegro leaks X headers, undef some of it here:
- #undef TileShape
- #undef None \ No newline at end of file
diff --git a/pkgs/games/dwarf-fortress/game.nix b/pkgs/games/dwarf-fortress/game.nix
index 42f2c6ed127b..7ce837b7b0b5 100644
--- a/pkgs/games/dwarf-fortress/game.nix
+++ b/pkgs/games/dwarf-fortress/game.nix
@@ -104,6 +104,6 @@ stdenv.mkDerivation {
homepage = "https://www.bay12games.com/dwarves/";
license = licenses.unfreeRedistributable;
platforms = attrNames platforms;
- maintainers = with maintainers; [ a1russell robbinch roconnor abbradar numinit shazow ];
+ maintainers = with maintainers; [ a1russell robbinch roconnor abbradar numinit shazow ncfavier ];
};
}
diff --git a/pkgs/games/dwarf-fortress/lazy-pack.nix b/pkgs/games/dwarf-fortress/lazy-pack.nix
index b34dbd3c74b8..17037dbdb278 100644
--- a/pkgs/games/dwarf-fortress/lazy-pack.nix
+++ b/pkgs/games/dwarf-fortress/lazy-pack.nix
@@ -19,7 +19,7 @@
, theme ? themes.phoebus
# General config options:
, enableIntro ? true
-, enableTruetype ? true
+, enableTruetype ? null # defaults to 24, see init.txt
, enableFPS ? false
, enableTextMode ? false
, enableSound ? true
diff --git a/pkgs/games/dwarf-fortress/twbt/default.nix b/pkgs/games/dwarf-fortress/twbt/default.nix
index 7d2816d97a4a..311a36da2bf1 100644
--- a/pkgs/games/dwarf-fortress/twbt/default.nix
+++ b/pkgs/games/dwarf-fortress/twbt/default.nix
@@ -9,21 +9,6 @@ with lib;
let
twbt-releases = {
- "0.43.05" = {
- twbtRelease = "6.22";
- sha256 = "0di5d38f6jj9smsz0wjcs1zav4zba6hrk8cbn59kwpb1wamsh5c7";
- prerelease = false;
- };
- "0.44.05" = {
- twbtRelease = "6.35";
- sha256 = "0qjkgl7dsqzsd7pdq8a5bihhi1wplfkv1id7sj6dp3swjpsfxp8g";
- prerelease = false;
- };
- "0.44.09" = {
- twbtRelease = "6.41";
- sha256 = "0nsq15z05pbhqjvw2xqs1a9b1n2ma0aalhc3vh3mi4cd4k7lxh44";
- prerelease = false;
- };
"0.44.10" = {
twbtRelease = "6.49";
sha256 = "1qjkc7k33qhxj2g18njzasccjqsis5y8zrw5vl90h4rs3i8ld9xz";
@@ -46,14 +31,14 @@ let
};
"0.47.04" = {
twbtRelease = "6.xx";
- dfhackRelease = "0.47.04-r2";
- sha256 = "092dgp8fh1j4nqr9wbzn89ib1nhscclr8m91lfxsvg0mgn7j8xlv";
+ dfhackRelease = "0.47.04-r5";
+ sha256 = "sha256-+C3g4KJShCb2VXGQ4mtkDOufXZQ1P+ebDTmUzL3tNyU=";
prerelease = true;
};
"0.47.05" = {
twbtRelease = "6.xx";
- dfhackRelease = "0.47.05-r1";
- sha256 = "1nqhaf7271bm9rq9dmilhhk9q7v3841d0rv4y3fid40vfi4gpi3p";
+ dfhackRelease = "0.47.05-r7";
+ sha256 = "sha256-4xMKuSP5J6pMK+hwjTAcTI0gsLJfw+Xt+vh9CopR4tk=";
prerelease = true;
};
};
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
index 0c1fbc6ca4de..89f980f8d5bc 100644
--- a/pkgs/games/dwarf-fortress/wrapper/default.nix
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -4,6 +4,7 @@
, substituteAll
, runCommand
, coreutils
+, gawk
, dwarf-fortress
, dwarf-therapist
, enableDFHack ? false
@@ -16,18 +17,22 @@
, twbt
, themes ? { }
, theme ? null
+, extraPackages ? [ ]
# General config options:
, enableIntro ? true
-, enableTruetype ? true
+, enableTruetype ? null # defaults to 24, see init.txt
, enableFPS ? false
, enableTextMode ? false
, enableSound ? true
+# An attribute set of settings to override in data/init/*.txt.
+# For example, `init.FOO = true;` is translated to `[FOO:YES]` in init.txt
+, settings ? { }
+# TODO world-gen.txt, interface.txt require special logic
}:
let
dfhack_ = dfhack.override {
inherit enableStoneSense;
- inherit enableTWBT;
};
ptheme =
@@ -35,27 +40,65 @@ let
then builtins.getAttr theme themes
else theme;
- unBool = b: if b then "YES" else "NO";
+ baseEnv = buildEnv {
+ name = "dwarf-fortress-base-env-${dwarf-fortress.dfVersion}";
- # These are in inverse order for first packages to override the next ones.
- themePkg = lib.optional (theme != null) ptheme;
- pkgs = lib.optional enableDFHack dfhack_
- ++ lib.optional enableSoundSense soundSense
- ++ lib.optional enableTWBT twbt.art
- ++ [ dwarf-fortress ];
+ # These are in inverse order for first packages to override the next ones.
+ paths = extraPackages
+ ++ lib.optional (theme != null) ptheme
+ ++ lib.optional enableDFHack dfhack_
+ ++ lib.optional enableSoundSense soundSense
+ ++ lib.optionals enableTWBT [ twbt.lib twbt.art ]
+ ++ [ dwarf-fortress ];
- fixup = lib.singleton (runCommand "fixup" { } (''
+ ignoreCollisions = true;
+ };
+
+ settings_ = lib.recursiveUpdate {
+ init = {
+ PRINT_MODE = if enableTextMode then "TEXT" else if enableTWBT then "TWBT" else null;
+ INTRO = enableIntro;
+ TRUETYPE = enableTruetype;
+ FPS = enableFPS;
+ SOUND = enableSound;
+ };
+ } settings;
+
+ forEach = attrs: f: lib.concatStrings (lib.mapAttrsToList f attrs);
+
+ toTxt = v:
+ if lib.isBool v then if v then "YES" else "NO"
+ else if lib.isInt v then toString v
+ else if lib.isString v then v
+ else throw "dwarf-fortress: unsupported configuration value ${toString v}";
+
+ config = runCommand "dwarf-fortress-config" {
+ nativeBuildInputs = [ gawk ];
+ } (''
mkdir -p $out/data/init
- '' + (if (theme != null) then ''
- cp ${lib.head themePkg}/data/init/init.txt $out/data/init/init.txt
- '' else ''
- cp ${dwarf-fortress}/data/init/init.txt $out/data/init/init.txt
- '') + lib.optionalString enableDFHack ''
+
+ edit_setting() {
+ v=''${v//'&'/'\&'}
+ if ! gawk -i inplace -v RS='\r?\n' '
+ { n += sub("\\[" ENVIRON["k"] ":[^]]*\\]", "[" ENVIRON["k"] ":" ENVIRON["v"] "]"); print }
+ END { exit(!n) }
+ ' "$out/$file"; then
+ echo "error: no setting named '$k' in $file" >&2
+ exit 1
+ fi
+ }
+ '' + forEach settings_ (file: kv: ''
+ file=data/init/${lib.escapeShellArg file}.txt
+ cp ${baseEnv}/"$file" "$out/$file"
+ '' + forEach kv (k: v: lib.optionalString (v != null) ''
+ export k=${lib.escapeShellArg k} v=${lib.escapeShellArg (toTxt v)}
+ edit_setting
+ '')) + lib.optionalString enableDFHack ''
mkdir -p $out/hack
# Patch the MD5
- orig_md5=$(cat "${dwarf-fortress}/hash.md5.orig")
- patched_md5=$(cat "${dwarf-fortress}/hash.md5")
+ orig_md5=$(< "${dwarf-fortress}/hash.md5.orig")
+ patched_md5=$(< "${dwarf-fortress}/hash.md5")
input_file="${dfhack_}/hack/symbols.xml"
output_file="$out/hack/symbols.xml"
@@ -66,31 +109,21 @@ let
echo " Replace: $patched_md5"
substitute "$input_file" "$output_file" --replace "$orig_md5" "$patched_md5"
- '' + lib.optionalString enableTWBT ''
- substituteInPlace $out/data/init/init.txt \
- --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]'
- '' +
- lib.optionalString enableTextMode ''
- substituteInPlace $out/data/init/init.txt \
- --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TEXT]'
- '' + ''
- substituteInPlace $out/data/init/init.txt \
- --replace '[INTRO:YES]' '[INTRO:${unBool enableIntro}]' \
- --replace '[TRUETYPE:YES]' '[TRUETYPE:${unBool enableTruetype}]' \
- --replace '[FPS:NO]' '[FPS:${unBool enableFPS}]' \
- --replace '[SOUND:YES]' '[SOUND:${unBool enableSound}]'
- ''));
+ '');
+ # This is a separate environment because the config files to modify may come
+ # from any of the paths in baseEnv.
env = buildEnv {
name = "dwarf-fortress-env-${dwarf-fortress.dfVersion}";
-
- paths = fixup ++ themePkg ++ pkgs;
- pathsToLink = [ "/" "/hack" "/hack/scripts" ];
-
+ paths = [ config baseEnv ];
ignoreCollisions = true;
};
in
+lib.throwIf (enableTWBT && !enableDFHack) "dwarf-fortress: TWBT requires DFHack to be enabled"
+lib.throwIf (enableStoneSense && !enableDFHack) "dwarf-fortress: StoneSense requires DFHack to be enabled"
+lib.throwIf (enableTextMode && enableTWBT) "dwarf-fortress: text mode and TWBT are mutually exclusive"
+
stdenv.mkDerivation {
pname = "dwarf-fortress";
version = dwarf-fortress.dfVersion;
@@ -114,7 +147,10 @@ stdenv.mkDerivation {
runDFHack = ./dfhack.in;
runSoundSense = ./soundSense.in;
- passthru = { inherit dwarf-fortress dwarf-therapist; };
+ passthru = {
+ inherit dwarf-fortress dwarf-therapist twbt env;
+ dfhack = dfhack_;
+ };
buildCommand = ''
mkdir -p $out/bin
diff --git a/pkgs/games/dwarf-fortress/wrapper/dfhack.in b/pkgs/games/dwarf-fortress/wrapper/dfhack.in
index 026b33ab87bf..0f74674baf29 100644..100755
--- a/pkgs/games/dwarf-fortress/wrapper/dfhack.in
+++ b/pkgs/games/dwarf-fortress/wrapper/dfhack.in
@@ -2,8 +2,8 @@
source @dfInit@
-for i in dfhack.init-example dfhack-config/default hack/* stonesense/*; do
- update_path "$i"
+for i in *.init *.init-example dfhack-config/default dfhack-config/init hack/* stonesense/*; do
+ if [ -e "$i" ]; then update_path "$i"; fi
done
cd "$DF_DIR"