summary refs log tree commit diff
path: root/pkgs/games
diff options
context:
space:
mode:
authorMorgan Jones <me@numin.it>2018-07-12 08:42:52 +0000
committerMorgan Jones <me@numin.it>2018-09-09 06:59:41 +0000
commit4ada74e293212434114ac87a679c1432650f4b40 (patch)
tree19619cb5fe604ce10b885618cf17e8b3104e5128 /pkgs/games
parent9082a008d147c69538fedb045aacf34942ea1700 (diff)
downloadnixlib-4ada74e293212434114ac87a679c1432650f4b40.tar
nixlib-4ada74e293212434114ac87a679c1432650f4b40.tar.gz
nixlib-4ada74e293212434114ac87a679c1432650f4b40.tar.bz2
nixlib-4ada74e293212434114ac87a679c1432650f4b40.tar.lz
nixlib-4ada74e293212434114ac87a679c1432650f4b40.tar.xz
nixlib-4ada74e293212434114ac87a679c1432650f4b40.tar.zst
nixlib-4ada74e293212434114ac87a679c1432650f4b40.zip
dwarf-fortress: Support multiple unfuck/dfhack/TWBT versions
Diffstat (limited to 'pkgs/games')
-rw-r--r--pkgs/games/dwarf-fortress/default.nix52
-rw-r--r--pkgs/games/dwarf-fortress/dfhack/default.nix21
-rw-r--r--pkgs/games/dwarf-fortress/dfhack/dfhack.json38
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in26
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix19
-rw-r--r--pkgs/games/dwarf-fortress/game.nix3
-rw-r--r--pkgs/games/dwarf-fortress/lazy-pack.nix2
-rw-r--r--pkgs/games/dwarf-fortress/twbt/default.nix25
-rw-r--r--pkgs/games/dwarf-fortress/twbt/twbt.json32
-rw-r--r--pkgs/games/dwarf-fortress/unfuck.json26
-rw-r--r--pkgs/games/dwarf-fortress/unfuck.nix32
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix46
12 files changed, 244 insertions, 78 deletions
diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix
index aa4ff210812b..87bcc44b8156 100644
--- a/pkgs/games/dwarf-fortress/default.nix
+++ b/pkgs/games/dwarf-fortress/default.nix
@@ -5,7 +5,8 @@
 # This directory menaces with spikes of Nix code. It is terrifying.
 #
 # If this is your first time here, you should probably install the dwarf-fortress-full package,
-# for instance with `environment.systempackages = [ pkgs.dwarf-fortress.dwarf-fortress-full ];`.
+# for instance with:
+# `environment.systemPackages = [ pkgs.dwarf-fortress-packages.dwarf-fortress-full ];`
 #
 # You can adjust its settings by using override, or compile your own package by
 # using the other packages here. Take a look at lazy-pack.nix to get an idea of
@@ -24,11 +25,36 @@ let
   callPackage = pkgs.newScope self;
 
   df-games = lib.listToAttrs (map (dfVersion: {
-    name = "dwarf-fortress_${lib.replaceStrings ["."] ["_"] dfVersion}";
-    value = callPackage ./wrapper {
-      inherit (self) themes;
-      dwarf-fortress = callPackage ./game.nix { inherit dfVersion; };
-    };
+    name = "dwarf-fortress_${lib.replaceStrings ["."] ["_"] dfVersion}"; 
+    value =
+      let
+        # I can't believe this syntax works. Spikes of Nix code indeed...
+        dwarf-fortress = callPackage ./game.nix {
+          inherit dfVersion;
+          inherit dwarf-fortress-unfuck;
+        };
+
+        # unfuck is linux-only right now, we will only use it there.
+        dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { inherit dfVersion; }
+                                else null;
+
+        twbt = callPackage ./twbt { inherit dfVersion; };
+
+        dfhack = callPackage ./dfhack {
+          inherit (pkgs.perlPackages) XMLLibXML XMLLibXSLT;
+          inherit dfVersion;
+          inherit twbt;
+          stdenv = gccStdenv;
+        };
+      in
+      callPackage ./wrapper {
+        inherit (self) themes;
+
+        dwarf-fortress = dwarf-fortress;
+        dwarf-fortress-unfuck = dwarf-fortress-unfuck;
+        twbt = twbt;
+        dfhack = dfhack;
+      };
   }) (lib.attrNames self.df-hashes));
 
   self = rec {
@@ -37,17 +63,8 @@ let
 
     dwarf-fortress-full = callPackage ./lazy-pack.nix { };
 
-    dfhack = callPackage ./dfhack {
-      inherit (pkgs.perlPackages) XMLLibXML XMLLibXSLT;
-      stdenv = gccStdenv;
-    };
-
     soundSense = callPackage ./soundsense.nix { };
 
-    # unfuck is linux-only right now, we will only use it there.
-    dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { }
-                            else null;
-
     dwarf-therapist = callPackage ./dwarf-therapist/wrapper.nix {
       inherit (dwarf-fortress) dwarf-fortress;
       dwarf-therapist = pkgs.qt5.callPackage ./dwarf-therapist {
@@ -59,8 +76,9 @@ let
 
     legends-browser = callPackage ./legends-browser {};
 
-    twbt = callPackage ./twbt {};
-    themes = recurseIntoAttrs (callPackage ./themes { });
+    themes = recurseIntoAttrs (callPackage ./themes {
+      stdenv = stdenvNoCC;
+    });
 
     # aliases
     phoebus-theme = themes.phoebus;
diff --git a/pkgs/games/dwarf-fortress/dfhack/default.nix b/pkgs/games/dwarf-fortress/dfhack/default.nix
index 4a8c84cf92dc..1c88cab02193 100644
--- a/pkgs/games/dwarf-fortress/dfhack/default.nix
+++ b/pkgs/games/dwarf-fortress/dfhack/default.nix
@@ -3,14 +3,25 @@
 , enableStoneSense ? false,  allegro5, libGLU_combined
 , enableTWBT ? true, twbt
 , SDL
+, dfVersion
 }:
 
+with lib;
+
 let
-  dfVersion = "0.44.12";
-  version = "${dfVersion}-r1";
+  dfhack-releases = builtins.fromJSON (builtins.readFile ./dfhack.json);
+
+  release = if hasAttr dfVersion dfhack-releases
+            then getAttr dfVersion dfhack-releases
+            else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}";
+
+  version = release.dfHackRelease;
+
+  warning = if release.prerelease then builtins.trace "[DFHack] Version ${version} is a prerelease. Careful!"
+                                  else null;
 
   # revision of library/xml submodule
-  xmlRev = "23500e4e9bd1885365d0a2ef1746c321c1dd5094";
+  xmlRev = release.xmlRev;
 
   arch =
     if stdenv.hostPlatform.system == "x86_64-linux" then "64"
@@ -41,8 +52,8 @@ let
     src = fetchFromGitHub {
       owner = "DFHack";
       repo = "dfhack";
-      sha256 = "0j03lq6j6w378z6cvm7jspxc7hhrqm8jaszlq0mzfvap0k13fgyy";
-      rev = version;
+      rev = release.dfHackRelease;
+      sha256 = release.sha256;
       fetchSubmodules = true;
     };
 
diff --git a/pkgs/games/dwarf-fortress/dfhack/dfhack.json b/pkgs/games/dwarf-fortress/dfhack/dfhack.json
new file mode 100644
index 000000000000..d1907fb38afb
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/dfhack/dfhack.json
@@ -0,0 +1,38 @@
+{
+  "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",
+    "xmlRev": "321bd48b10c4c3f694cc801a7dee6be392c09b7b",
+    "prerelease": false
+  },
+  "0.44.11": {
+    "dfHackRelease": "0.44.11-beta2.1",
+    "sha256": "1jgwcqg9m1ybv3szgnklp6zfpiw5mswla464dlj2gfi5v82zqbv2",
+    "xmlRev": "f27ebae6aa8fb12c46217adec5a812cd49a905c8",
+    "prerelease": true
+  },
+  "0.44.12": {
+    "dfHackRelease": "0.44.12-r1",
+    "sha256": "0j03lq6j6w378z6cvm7jspxc7hhrqm8jaszlq0mzfvap0k13fgyy",
+    "xmlRev": "23500e4e9bd1885365d0a2ef1746c321c1dd5094",
+    "prerelease": false
+  }
+}
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
new file mode 100644
index 000000000000..77936c430e2b
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
@@ -0,0 +1,26 @@
+#!@stdenv_shell@ -e
+
+[ -z "$DT_DIR" ] && DT_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dwarftherapist"
+
+install_dir="@install@"
+therapist_dir="@therapist@"
+
+cat <<EOF >&2
+Using $DT_DIR as Dwarf Therapist overlay directory.
+EOF
+
+update_path() {
+  local path="$1"
+
+  mkdir -p "$DT_DIR/$(dirname "$path")"
+  if [ ! -e "$DT_DIR/$path" ] || [ -L "$DT_DIR/$path" ]; then
+    rm -f "$DT_DIR/$path"
+    ln -s "$install_dir/share/dwarftherapist/$path" "$DT_DIR/$path"
+  fi
+}
+
+cd "$install_dir/share/dwarftherapist"
+update_path memory_layouts
+
+QT_QPA_PLATFORM_PLUGIN_PATH="@qt_plugin_path@" \
+  exec "$therapist_dir/bin/dwarftherapist" "$@"
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
index 322a21ec3ad9..f86ef4bea7ab 100644
--- a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
@@ -1,4 +1,4 @@
-{ stdenv, symlinkJoin, dwarf-therapist, dwarf-fortress, makeWrapper }:
+{ pkgs, stdenv, symlinkJoin, lib, dwarf-therapist, dwarf-fortress, makeWrapper }:
 
 let
   platformSlug = if stdenv.targetPlatform.is32bit then
@@ -7,6 +7,8 @@ let
 
 in symlinkJoin {
   name = "dwarf-therapist-${dwarf-therapist.version}";
+  
+  wrapper = ./dwarf-therapist.in;
 
   paths = [ dwarf-therapist ];
 
@@ -14,13 +16,18 @@ in symlinkJoin {
 
   passthru = { inherit dwarf-fortress dwarf-therapist; };
 
-  postBuild = ''
-    # DwarfTherapist assumes it's run in $out/share/dwarftherapist and
-    # therefore uses many relative paths.
-    wrapProgram $out/bin/dwarftherapist \
-      --run "cd $out/share/dwarftherapist"
+  buildCommand = ''
+    mkdir -p $out/bin
     ln -s $out/bin/dwarftherapist $out/bin/DwarfTherapist
+    substitute $wrapper $out/bin/dwarftherapist \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var-by install $out \
+      --subst-var-by therapist ${dwarf-therapist} \
+      --subst-var-by qt_plugin_path "${pkgs.qt5.qtbase}/lib/qt-${pkgs.qt5.qtbase.qtCompatVersion}/plugins/platforms"
 
+    chmod 755 $out/bin/dwarftherapist
+
+    # Fix up memory layouts
     rm -rf $out/share/dwarftherapist/memory_layouts/linux
     mkdir -p $out/share/dwarftherapist/memory_layouts/linux
     origmd5=$(cat "${dwarf-fortress}/hash.md5.orig" | cut -c1-8)
diff --git a/pkgs/games/dwarf-fortress/game.nix b/pkgs/games/dwarf-fortress/game.nix
index 2547bb83f3f5..b5c80a0a56dc 100644
--- a/pkgs/games/dwarf-fortress/game.nix
+++ b/pkgs/games/dwarf-fortress/game.nix
@@ -42,9 +42,6 @@ let
 
 in
 
-assert dwarf-fortress-unfuck != null ->
-       dwarf-fortress-unfuck.dfVersion == dfVersion;
-
 stdenv.mkDerivation {
   name = "dwarf-fortress-${dfVersion}";
 
diff --git a/pkgs/games/dwarf-fortress/lazy-pack.nix b/pkgs/games/dwarf-fortress/lazy-pack.nix
index 3e0d3dcc6d73..ca7ae4024289 100644
--- a/pkgs/games/dwarf-fortress/lazy-pack.nix
+++ b/pkgs/games/dwarf-fortress/lazy-pack.nix
@@ -6,7 +6,7 @@
 , enableDFHack ? stdenvNoCC.isLinux
 , enableTWBT ? enableDFHack
 , enableSoundSense ? true
-, enableStoneSense ? false  # StoneSense is currently broken.
+, enableStoneSense ? true
 , enableDwarfTherapist ? true, dwarf-therapist
 , enableLegendsBrowser ? true, legends-browser
 , theme ? themes.phoebus
diff --git a/pkgs/games/dwarf-fortress/twbt/default.nix b/pkgs/games/dwarf-fortress/twbt/default.nix
index d90812f5d05e..1bdbddb56de4 100644
--- a/pkgs/games/dwarf-fortress/twbt/default.nix
+++ b/pkgs/games/dwarf-fortress/twbt/default.nix
@@ -1,14 +1,28 @@
-{ stdenvNoCC, fetchurl, unzip }:
+{ stdenvNoCC, lib, fetchurl, unzip
+, dfVersion
+}:
 
+with lib;
+
+let
+  twbt-releases = builtins.fromJSON (builtins.readFile ./twbt.json);
+
+  release = if hasAttr dfVersion twbt-releases
+            then getAttr dfVersion twbt-releases
+            else throw "[TWBT] Unsupported Dwarf Fortress version: ${dfVersion}";
+
+  warning = if release.prerelease then builtins.trace "[TWBT] Version ${version} is a prerelease. Careful!"
+                                  else null;
+
+in
 
 stdenvNoCC.mkDerivation rec {
   name = "twbt-${version}";
-  version = "6.54";
-  dfVersion = "0.44.12";
+  version = release.twbtRelease;
 
   src = fetchurl {
     url = "https://github.com/mifki/df-twbt/releases/download/v${version}/twbt-${version}-linux.zip";
-    sha256 = "10gfd6vv0vk4v1r5hjbz7vf1zqys06dsad695gysc7fbcik2dakh";
+    sha256 = release.sha256;
   };
 
   sourceRoot = ".";
@@ -24,10 +38,9 @@ stdenvNoCC.mkDerivation rec {
     cp -a *.png $art/data/art/
   '';
 
-  
   meta = with stdenvNoCC.lib; {
     description = "A plugin for Dwarf Fortress / DFHack that improves various aspects the game interface.";
-    maintainers = with maintainers; [ Baughn ];
+    maintainers = with maintainers; [ Baughn numinit ];
     license = licenses.mit;
     platforms = platforms.linux;
     homepage = https://github.com/mifki/df-twbt;
diff --git a/pkgs/games/dwarf-fortress/twbt/twbt.json b/pkgs/games/dwarf-fortress/twbt/twbt.json
new file mode 100644
index 000000000000..b455ff017fcd
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/twbt/twbt.json
@@ -0,0 +1,32 @@
+{
+  "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",
+    "prerelease": false
+  },
+  "0.44.11": {
+    "twbtRelease": "6.51",
+    "sha256": "1yclqmarjd97ch054h425a12r8a5ailmflsd7b39cg4qhdr1nii5",
+    "prerelease": true
+  },
+  "0.44.12": {
+    "twbtRelease": "6.53",
+    "sha256": "05qc9x4zm0pamwg7j12j0084dq2sj7825fhd3l0wxfinphzk3was",
+    "prerelease": false
+  }
+}
diff --git a/pkgs/games/dwarf-fortress/unfuck.json b/pkgs/games/dwarf-fortress/unfuck.json
new file mode 100644
index 000000000000..f7a4974c575c
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/unfuck.json
@@ -0,0 +1,26 @@
+{
+  "0.43.05": {
+    "unfuckRelease": "0.43.05",
+    "sha256": "173dyrbxlzqvjf1j3n7vpns4gfjkpyvk9z16430xnmd5m6nda8p2"
+  },
+  "0.44.05": {
+    "unfuckRelease": "0.44.05",
+    "sha256": "00yj4l4gazxg4i6fj9rwri6vm17i6bviy2mpkx0z5c0mvsr7s14b"
+  },
+  "0.44.09": {
+    "unfuckRelease": "0.44.09",
+    "sha256": "138p0v8z2x47f0fk9k6g75ikw5wb3vxldwv5ggbkf4hhvlw6lvzm"
+  },
+  "0.44.10": {
+    "unfuckRelease": "0.44.10",
+    "sha256": "0vb19qx2ibc79j4bgbk9lskb883qfb0815zw1dfz9k7rqwal8mzj"
+  },
+  "0.44.11": {
+    "unfuckRelease": "0.44.11.1",
+    "sha256": "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz"
+  },
+  "0.44.12": {
+    "unfuckRelease": "0.44.12",
+    "sha256": "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz"
+  }
+}
diff --git a/pkgs/games/dwarf-fortress/unfuck.nix b/pkgs/games/dwarf-fortress/unfuck.nix
index 0c5a81a52f0f..732003118713 100644
--- a/pkgs/games/dwarf-fortress/unfuck.nix
+++ b/pkgs/games/dwarf-fortress/unfuck.nix
@@ -1,18 +1,27 @@
-{ stdenv, fetchFromGitHub, cmake
+{ stdenv, lib, fetchFromGitHub, cmake
 , libGL, libSM, SDL, SDL_image, SDL_ttf, glew, openalSoft
 , ncurses, glib, gtk2, libsndfile, zlib
+, dfVersion
 }:
 
-let dfVersion = "0.44.12"; in
+with lib;
+
+let
+  unfuck-releases = builtins.fromJSON (builtins.readFile ./unfuck.json);
+
+  release = if hasAttr dfVersion unfuck-releases
+            then getAttr dfVersion unfuck-releases
+            else throw "[unfuck] Unknown Dwarf Fortress version: ${dfVersion}";
+in
 
 stdenv.mkDerivation {
-  name = "dwarf_fortress_unfuck-${dfVersion}";
+  name = "dwarf_fortress_unfuck-${release.unfuckRelease}";
 
   src = fetchFromGitHub {
     owner = "svenstaro";
     repo = "dwarf_fortress_unfuck";
-    rev = dfVersion;
-    sha256 = "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz";
+    rev = release.unfuckRelease;
+    sha256 = release.sha256;
   };
 
   cmakeFlags = [
@@ -20,23 +29,12 @@ stdenv.mkDerivation {
     "-DGTK2_GDKCONFIG_INCLUDE_DIR=${gtk2.out}/lib/gtk-2.0/include"
   ];
 
-  makeFlags = [
-    ''CFLAGS="-fkeep-inline-functions"''
-    ''CXXFLAGS="-fkeep-inline-functions"''
-  ];
-
   nativeBuildInputs = [ cmake ];
   buildInputs = [
     libSM SDL SDL_image SDL_ttf glew openalSoft
     ncurses gtk2 libsndfile zlib libGL
   ];
 
-  postPatch = ''
-    substituteInPlace CMakeLists.txt --replace \
-      'set(CMAKE_BUILD_TYPE Release)' \
-      'set(CMAKE_BUILD_TYPE Debug)'
-  '';
-
   # Don't strip unused symbols; dfhack hooks into some of them.
   dontStrip = true;
 
@@ -56,6 +54,6 @@ stdenv.mkDerivation {
     homepage = https://github.com/svenstaro/dwarf_fortress_unfuck;
     license = licenses.free;
     platforms = platforms.linux;
-    maintainers = with maintainers; [ abbradar ];
+    maintainers = with maintainers; [ abbradar numinit ];
   };
 }
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
index 6efe004fa9e8..105143916d10 100644
--- a/pkgs/games/dwarf-fortress/wrapper/default.nix
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -1,4 +1,5 @@
-{ stdenv, lib, buildEnv, dwarf-fortress, substituteAll
+{ stdenv, lib, buildEnv, substituteAll
+, dwarf-fortress, dwarf-fortress-unfuck
 , enableDFHack ? false, dfhack
 , enableSoundSense ? false, soundSense, jdk
 , enableStoneSense ? false
@@ -37,34 +38,12 @@ let
     paths = themePkg ++ pkgs;
     pathsToLink = [ "/" "/hack" "/hack/scripts" ];
     ignoreCollisions = true;
-
-    postBuild = ''
-      # De-symlink init.txt
-      cp $out/data/init/init.txt init.txt
-      rm $out/data/init/init.txt
-      mv init.txt $out/data/init/init.txt
-    '' + lib.optionalString enableDFHack ''
-      rm $out/hack/symbols.xml
-      substitute ${dfhack_}/hack/symbols.xml $out/hack/symbols.xml \
-        --replace $(cat ${dwarf-fortress}/hash.md5.orig) \
-                  $(cat ${dwarf-fortress}/hash.md5)
-    '' + lib.optionalString enableTWBT ''
-      substituteInPlace $out/data/init/init.txt \
-        --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]'
-    '' + ''
-      substituteInPlace $out/data/init/init.txt \
-        --replace '[INTRO:YES]' '[INTRO:${unBool enableIntro}]' \
-        --replace '[TRUETYPE:YES]' '[TRUETYPE:${unBool enableTruetype}]' \
-        --replace '[FPS:NO]' '[FPS:${unBool enableFPS}]'
-    '';
   };
 in
 
 stdenv.mkDerivation rec {
   name = "dwarf-fortress-${dwarf-fortress.dfVersion}";
 
-  compatible = lib.all (x: assert (x.dfVersion == dwarf-fortress.dfVersion); true) pkgs;
-
   dfInit = substituteAll {
     name = "dwarf-fortress-init";
     src = ./dwarf-fortress-init.in;
@@ -99,5 +78,26 @@ stdenv.mkDerivation rec {
     chmod 755 $out/bin/soundsense
   '';
 
+  postBuild = ''
+    # De-symlink init.txt
+    cp $out/data/init/init.txt init.txt
+    rm $out/data/init/init.txt
+    mv init.txt $out/data/init/init.txt
+  '' + lib.optionalString enableDFHack ''
+    rm $out/hack/symbols.xml
+    echo "[$out/hack/symbols.xml] $(cat ${dwarf-fortress}/hash.md5.orig) => $(cat ${dwarf-fortress}/hash.md5)"
+    substitute ${dfhack_}/hack/symbols.xml $out/hack/symbols.xml \
+      --replace $(cat ${dwarf-fortress}/hash.md5.orig) \
+                $(cat ${dwarf-fortress}/hash.md5)
+  '' + lib.optionalString enableTWBT ''
+    substituteInPlace $out/data/init/init.txt \
+      --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]'
+  '' + ''
+    substituteInPlace $out/data/init/init.txt \
+      --replace '[INTRO:YES]' '[INTRO:${unBool enableIntro}]' \
+      --replace '[TRUETYPE:YES]' '[TRUETYPE:${unBool enableTruetype}]' \
+      --replace '[FPS:NO]' '[FPS:${unBool enableFPS}]'
+  '';
+
   preferLocalBuild = true;
 }