about summary refs log tree commit diff
path: root/pkgs/games
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/games')
-rw-r--r--pkgs/games/7kaa/default.nix79
-rw-r--r--pkgs/games/ace-of-penguins/default.nix78
-rw-r--r--pkgs/games/ace-of-penguins/fixup-miscompilations.patch80
-rw-r--r--pkgs/games/alephone/default.nix4
-rw-r--r--pkgs/games/amoeba/default.nix2
-rw-r--r--pkgs/games/among-sus/default.nix6
-rw-r--r--pkgs/games/andyetitmoves/default.nix67
-rw-r--r--pkgs/games/anki/default.nix5
-rw-r--r--pkgs/games/banner/default.nix2
-rw-r--r--pkgs/games/blackshades/default.nix20
-rw-r--r--pkgs/games/blightmud/default.nix79
-rw-r--r--pkgs/games/blobby/default.upstream8
-rw-r--r--pkgs/games/blockattack/default.nix59
-rw-r--r--pkgs/games/chessx/default.nix4
-rw-r--r--pkgs/games/cl-wordle/default.nix22
-rw-r--r--pkgs/games/colobot/data.nix4
-rw-r--r--pkgs/games/colobot/default.nix15
-rw-r--r--pkgs/games/crafty/default.nix73
-rw-r--r--pkgs/games/crawl/default.nix6
-rw-r--r--pkgs/games/crispy-doom/default.nix4
-rw-r--r--pkgs/games/ddnet/default.nix4
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix3
-rw-r--r--pkgs/games/dwarf-fortress/unfuck.nix3
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix3
-rw-r--r--pkgs/games/easyrpg-player/default.nix13
-rw-r--r--pkgs/games/egoboo/default.nix2
-rw-r--r--pkgs/games/factorio/versions.json48
-rw-r--r--pkgs/games/fheroes2/default.nix4
-rw-r--r--pkgs/games/flare/default.nix4
-rw-r--r--pkgs/games/flare/engine.nix6
-rw-r--r--pkgs/games/flare/game.nix6
-rw-r--r--pkgs/games/freedink/default.nix2
-rw-r--r--pkgs/games/gcompris/default.nix6
-rw-r--r--pkgs/games/gnubg/default.nix6
-rw-r--r--pkgs/games/grapejuice/default.nix13
-rw-r--r--pkgs/games/hawkthorne/default.nix39
-rw-r--r--pkgs/games/hawkthorne/makefile.patch33
-rw-r--r--pkgs/games/heroic/default.nix13
-rw-r--r--pkgs/games/hhexen/default.nix2
-rw-r--r--pkgs/games/instead/default.nix7
-rw-r--r--pkgs/games/itch-setup/default.nix24
-rw-r--r--pkgs/games/itch/default.nix64
-rw-r--r--pkgs/games/ivan/default.nix6
-rw-r--r--pkgs/games/legendary-gl/default.nix4
-rw-r--r--pkgs/games/liberation-circuit/default.nix2
-rw-r--r--pkgs/games/linthesia/default.nix38
-rw-r--r--pkgs/games/lzwolf/default.nix44
-rw-r--r--pkgs/games/megaglest/default.nix2
-rwxr-xr-xpkgs/games/minecraft-server/update.sh21
-rw-r--r--pkgs/games/minecraft-servers/default.nix24
-rw-r--r--pkgs/games/minecraft-servers/derivation.nix (renamed from pkgs/games/minecraft-server/default.nix)14
-rwxr-xr-xpkgs/games/minecraft-servers/update.py156
-rw-r--r--pkgs/games/minecraft-servers/versions.json104
-rw-r--r--pkgs/games/minetest/default.nix59
-rw-r--r--pkgs/games/minetest/disable_fixup.patch10
-rw-r--r--pkgs/games/minetest/fix_wordsize_confusion.patch10
-rw-r--r--pkgs/games/moon-buggy/default.nix5
-rw-r--r--pkgs/games/mudlet/default.nix61
-rw-r--r--pkgs/games/multimc/0001-pick-latest-java-first.patch48
-rw-r--r--pkgs/games/multimc/default.nix56
-rw-r--r--pkgs/games/n2048/default.nix31
-rw-r--r--pkgs/games/nethack/default.nix6
-rw-r--r--pkgs/games/nottetris2/default.nix49
-rw-r--r--pkgs/games/npush/default.nix47
-rw-r--r--pkgs/games/npush/run.nix31
-rw-r--r--pkgs/games/nxengine-evo/default.nix9
-rw-r--r--pkgs/games/openra/common.nix6
-rw-r--r--pkgs/games/opensupaplex/default.nix89
-rw-r--r--pkgs/games/openttd/nml.nix4
-rw-r--r--pkgs/games/osu-lazer/default.nix125
-rw-r--r--pkgs/games/osu-lazer/deps.nix156
-rwxr-xr-xpkgs/games/osu-lazer/update.sh3
-rw-r--r--pkgs/games/otto-matic/default.nix44
-rw-r--r--pkgs/games/papermc/default.nix6
-rw-r--r--pkgs/games/pentobi/default.nix6
-rw-r--r--pkgs/games/pioneer/default.nix55
-rw-r--r--pkgs/games/planetaryannihilation/default.nix25
-rw-r--r--pkgs/games/polymc/default.nix74
-rw-r--r--pkgs/games/purpur/default.nix41
-rw-r--r--pkgs/games/r2mod_cli/default.nix4
-rw-r--r--pkgs/games/rimshot/default.nix55
-rw-r--r--pkgs/games/rogue/default.nix3
-rw-r--r--pkgs/games/rpg-cli/default.nix6
-rw-r--r--pkgs/games/sgt-puzzles/default.upstream5
-rw-r--r--pkgs/games/shattered-pixel-dungeon/default.nix6
-rw-r--r--pkgs/games/snis/default.nix73
-rw-r--r--pkgs/games/steam/fhsenv.nix2
-rw-r--r--pkgs/games/supertux/default.nix8
-rw-r--r--pkgs/games/tennix/default.nix4
-rw-r--r--pkgs/games/tetrio-desktop/default.nix85
-rw-r--r--pkgs/games/the-legend-of-edgar/default.nix75
-rw-r--r--pkgs/games/toppler/default.nix57
-rw-r--r--pkgs/games/tworld2/default.nix45
-rw-r--r--pkgs/games/uchess/default.nix2
-rw-r--r--pkgs/games/ue4demos/default.nix2
-rw-r--r--pkgs/games/unciv/default.nix4
-rw-r--r--pkgs/games/vapor/default.nix61
-rw-r--r--pkgs/games/vassal/default.nix10
-rw-r--r--pkgs/games/vdrift/default.nix20
-rw-r--r--pkgs/games/vintagestory/default.nix4
-rw-r--r--pkgs/games/warzone2100/default.nix2
-rw-r--r--pkgs/games/widelands/default.nix10
-rw-r--r--pkgs/games/worldofgoo/default.nix2
-rw-r--r--pkgs/games/xconq/default.nix5
-rw-r--r--pkgs/games/xcowsay/default.nix4
-rw-r--r--pkgs/games/xmoto/default.nix2
106 files changed, 2011 insertions, 938 deletions
diff --git a/pkgs/games/7kaa/default.nix b/pkgs/games/7kaa/default.nix
new file mode 100644
index 0000000000000..2b74306cd2533
--- /dev/null
+++ b/pkgs/games/7kaa/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, gccStdenv
+, autoreconfHook
+, pkg-config
+, fetchurl
+, fetchFromGitHub
+, openal
+, libtool
+, enet
+, SDL2
+, curl
+, gettext
+, libiconv
+}:
+
+let
+
+  name = "7kaa";
+  versionMajor = "2.15";
+  versionMinor = "4p1";
+
+  music = stdenv.mkDerivation rec {
+    pname = "${name}-music";
+    version = "${versionMajor}";
+
+    src = fetchurl {
+      url = "https://www.7kfans.com/downloads/${name}-music-${versionMajor}.tar.bz2";
+      sha256 = "sha256-sNdntuJXGaFPXzSpN0SoAi17wkr2YnW+5U38eIaVwcM=";
+    };
+
+    installPhase = ''
+      mkdir -p $out
+      cp -r * $out/
+    '';
+
+    meta.license = lib.licenses.unfree;
+
+  };
+
+in
+
+gccStdenv.mkDerivation rec {
+  pname = "${name}";
+  version = "v${versionMajor}.${versionMinor}";
+
+  src = fetchFromGitHub {
+    owner = "the3dfxdude";
+    repo = pname;
+    rev = "9db2a43e1baee25a44b7aa7e9cedde9a107ed34b";
+    sha256 = "sha256-OAKaRuPP0/n8pO3wIUvGKs6n+U+EmZXUTywXYDAan1o=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ openal enet SDL2 curl gettext libiconv ];
+
+  preAutoreconf = ''
+    autoupdate
+  '';
+
+  hardeningDisable = lib.optionals (stdenv.isAarch64 && stdenv.isDarwin) [ "stackprotector" ];
+
+  postInstall = ''
+    mkdir $out/share/7kaa/MUSIC
+    cp -R ${music}/MUSIC $out/share/7kaa/
+    cp ${music}/COPYING-Music.txt $out/share/7kaa/MUSIC
+    cp ${music}/COPYING-Music.txt $out/share/doc/7kaa
+  '';
+
+  # Multiplayer is auto-disabled for non-x86 system
+
+  meta = with lib; {
+    homepage = "https://www.7kfans.com";
+    description = "GPL release of the Seven Kingdoms with multiplayer (available only on x86 platforms)";
+    license = licenses.gpl2Only;
+    platforms = platforms.x86_64 ++ platforms.aarch64;
+    maintainers = with maintainers; [ _1000101 ];
+  };
+}
diff --git a/pkgs/games/ace-of-penguins/default.nix b/pkgs/games/ace-of-penguins/default.nix
new file mode 100644
index 0000000000000..fb15aedc1df85
--- /dev/null
+++ b/pkgs/games/ace-of-penguins/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, fetchurl
+, copyDesktopItems
+, libX11
+, libXpm
+, libpng
+, makeDesktopItem
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ace-of-penguins";
+  version = "1.4";
+
+  src = fetchurl {
+    url = "http://www.delorie.com/store/ace/ace-${version}.tar.gz";
+    hash = "sha256-H+47BTOSGkKHPAYj8z2HOgZ7HuxY8scMAUSRRueaTM4=";
+  };
+
+  patches = [
+    # Fixes a bunch of miscompilations in modern environments
+    ./fixup-miscompilations.patch
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    libX11
+    libXpm
+    libpng
+    zlib
+  ];
+
+  desktopItems = let
+    generateItem = gameName: {
+      name = "${pname}-${gameName}";
+      exec = "${placeholder "out"}/bin/${gameName}";
+      comment = "Ace of Penguins ${gameName} Card Game";
+      desktopName = gameName;
+      genericName = gameName;
+    };
+  in
+    map (x: makeDesktopItem (generateItem x)) [
+      "canfield"
+      "freecell"
+      "golf"
+      "mastermind"
+      "merlin"
+      "minesweeper"
+      "pegged"
+      "penguins"
+      "solitaire"
+      "spider"
+      "taipedit"
+      "taipei"
+      "thornq"
+    ];
+
+  meta = with lib; {
+    homepage = "http://www.delorie.com/store/ace/";
+    description = "Solitaire games in X11";
+    longDescription = ''
+      The Ace of Penguins is a set of Unix/X solitaire games based on the ones
+      available for Windows(tm) but with a number of enhancements that my wife
+      says make my versions better :-)
+
+      The latest version includes clones of freecell, golf, mastermind, merlin,
+      minesweeper, pegged, solitaire, taipei (with editor!), and thornq (by
+      Martin Thornquist).
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/ace-of-penguins/fixup-miscompilations.patch b/pkgs/games/ace-of-penguins/fixup-miscompilations.patch
new file mode 100644
index 0000000000000..599b4a137d793
--- /dev/null
+++ b/pkgs/games/ace-of-penguins/fixup-miscompilations.patch
@@ -0,0 +1,80 @@
+--- ace-1.4/lib/xwin.c	
++++ ace-1.4/lib/xwin.c	
+@@ -89,10 +89,10 @@
+ /* Motif window hints */
+ typedef struct
+ {
+-  unsigned flags;
+-  unsigned functions;
+-  unsigned decorations;
+-  int inputMode;
++  unsigned long flags;
++  unsigned long functions;
++  unsigned long decorations;
++  long inputMode;
+ } PropMotifWmHints;
+ 
+ typedef PropMotifWmHints        PropMwmHints;
+@@ -841,13 +841,13 @@
+   png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
+   info_ptr = png_create_info_struct (png_ptr);
+ 
+-  if (setjmp (png_ptr->jmpbuf)) {
++  if (setjmp (png_jmpbuf (png_ptr))) {
+     fprintf(stderr, "Invalid PNG image!\n");
+     return;
+   }
+ 
+   file_bytes = src->file_data;
+-  png_set_read_fn (png_ptr, (voidp)&file_bytes, (png_rw_ptr)png_reader);
++  png_set_read_fn (png_ptr, (void *)&file_bytes, (png_rw_ptr)png_reader);
+ 
+   png_read_info (png_ptr, info_ptr);
+ 
+--- ace-1.4/lib/make-imglib.c	
++++ ace-1.4/lib/make-imglib.c	
+@@ -86,7 +86,7 @@
+     png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
+     info_ptr = png_create_info_struct (png_ptr);
+ 
+-    if (setjmp (png_ptr->jmpbuf)) {
++    if (setjmp (png_jmpbuf (png_ptr))) {
+       fclose (f);
+       continue;
+     }
+
+--- ace-1.4/lib/Makefile.am	
++++ ace-1.4/lib/Makefile.am
+@@ -6,7 +6,7 @@
+ CLEANFILES = images.c images.d
+ 
+ INCLUDES = $(X_CFLAGS) @PDA@
+-AM_LDFLAGS = $(X_LIBS)
++AM_LDFLAGS = $(X_LIBS) -lpng -lz -lm
+ 
+ BUILD_CC = @BUILD_CC@
+ AR = @AR@
+
+--- ace-1.4/lib/xwin.c  2020-10-07 02:07:59.000000000 +0300
++++ ace-1.4/lib/xwin.c    2020-10-07 02:15:05.941784967 +0300
+@@ -55,7 +55,6 @@
+   { "-visual", OPTION_INTEGER, &visual_id },
+   { 0, 0, 0 }
+ };
+-OptionDesc *xwin_options = xwin_options_list;
+
+ Display *display=0;
+ int screen=0;
+--- ace-1.4/config.guess	2012-03-24 19:00:49.000000000 +0100
++++ ace-1.4/config.guess	2021-07-05 11:02:16.685843793 +0200
+@@ -882,6 +882,9 @@
+ 	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ 	fi
+ 	exit ;;
++    aarch64*:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	exit ;;
+     avr32*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-gnu
+ 	exit ;;
+
diff --git a/pkgs/games/alephone/default.nix b/pkgs/games/alephone/default.nix
index 347ccd8df63b1..6477e3fb37d50 100644
--- a/pkgs/games/alephone/default.nix
+++ b/pkgs/games/alephone/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchurl, boost, curl, ffmpeg, icoutils, libGLU, libmad, libogg
+{ lib, stdenv, fetchurl, boost, curl, ffmpeg_4, icoutils, libGLU, libmad, libogg
 , libpng, libsndfile, libvorbis, lua, pkg-config, SDL2, SDL2_image, SDL2_net
 , SDL2_ttf, smpeg, speex, zziplib, zlib, makeWrapper, makeDesktopItem, unzip
 , alephone }:
@@ -20,7 +20,7 @@ let
     buildInputs = [
       boost
       curl
-      ffmpeg
+      ffmpeg_4
       libGLU
       libmad
       libsndfile
diff --git a/pkgs/games/amoeba/default.nix b/pkgs/games/amoeba/default.nix
index 61f5a5bf824df..0e21a9a1b9ea3 100644
--- a/pkgs/games/amoeba/default.nix
+++ b/pkgs/games/amoeba/default.nix
@@ -1,7 +1,7 @@
 { lib, stdenv, fetchurl, amoeba-data, alsa-lib, expat, freetype, gtk2, libvorbis, libGLU, xorg, pkg-config }:
 
 stdenv.mkDerivation rec {
-  name = "amoeba-${version}-${debver}";
+  pname = "amoeba";
   version = "1.1";
   debver = "29.1";
 
diff --git a/pkgs/games/among-sus/default.nix b/pkgs/games/among-sus/default.nix
index 454c7d181f951..be9ecc7adf57e 100644
--- a/pkgs/games/among-sus/default.nix
+++ b/pkgs/games/among-sus/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation {
   pname = "among-sus-unstable";
-  version = "2020-10-29";
+  version = "2021-05-19";
 
   src = fetchFromSourcehut {
     owner = "~martijnbraam";
     repo = "among-sus";
-    rev = "1f4c8d800d025d36ac66826937161be3252fbc57";
-    sha256 = "19jq7ygh9l11dl1h6702bg57m04y35nqd6yqx1rgp1kxwhp45xyh";
+    rev = "554e60bf52e3fa931661b9414189a92bb8f69d78";
+    sha256 = "0j1158nczhvy5i1ykvzvhlv4ndhibgng0dq1lw2bmi8q6k1q1s0w";
   };
 
   patchPhase = ''
diff --git a/pkgs/games/andyetitmoves/default.nix b/pkgs/games/andyetitmoves/default.nix
index 9eb1c7594a101..ecd1dfc9b3cd6 100644
--- a/pkgs/games/andyetitmoves/default.nix
+++ b/pkgs/games/andyetitmoves/default.nix
@@ -2,38 +2,43 @@
 
 stdenv.mkDerivation rec {
   pname = "andyetitmoves";
-  version   = "1.2.2";
+  version = "1.2.2";
 
-  src = if stdenv.hostPlatform.system == "i686-linux" || stdenv.hostPlatform.system == "x86_64-linux"
+  src =
+    if stdenv.hostPlatform.system == "i686-linux" || stdenv.hostPlatform.system == "x86_64-linux"
     then
-      let postfix        = if stdenv.hostPlatform.system == "i686-linux" then "i386" else "x86_64";
-          commercialName = "${pname}-${version}_${postfix}.tar.gz";
-          demoUrl        = "http://www.andyetitmoves.net/demo/${pname}Demo-${version}_${postfix}.tar.gz";
+      let
+        postfix = if stdenv.hostPlatform.system == "i686-linux" then "i386" else "x86_64";
+        commercialName = "${pname}-${version}_${postfix}.tar.gz";
+        demoUrl = "http://www.andyetitmoves.net/demo/${pname}Demo-${version}_${postfix}.tar.gz";
       in
       if commercialVersion
-        then requireFile {
-               message = ''
-                 We cannot download the commercial version automatically, as you require a license.
-                 Once you bought a license, you need to add your downloaded version to the nix store.
-                 You can do this by using "nix-prefetch-url file:///\$PWD/${commercialName}" in the
-                 directory where yousaved it.
-               '';
-               name = commercialName;
-               sha256 = if stdenv.hostPlatform.system == "i686-linux"
-                          then "15wvzmmidvykwjrbnq70h5jrvnjx1hcrm0357qj85q4aqbzavh01"
-                          else "1v8z16qa9ka8sf7qq45knsxj87s6sipvv3a7xq11pb5xk08fb2ql";
-             }
-        else fetchurl {
-               url = demoUrl;
-               sha256 = if stdenv.hostPlatform.system == "i686-linux"
-                          then "0f14vrrbq05hsbdajrb5y9za65fpng1lc8f0adb4aaz27x7sh525"
-                          else "0mg41ya0b27blq3b5498kwl4rj46dj21rcd7qd0rw1kyvr7sx4v4";
-             }
+      then
+        requireFile
+          {
+            message = ''
+              We cannot download the commercial version automatically, as you require a license.
+              Once you bought a license, you need to add your downloaded version to the nix store.
+              You can do this by using "nix-prefetch-url file:///\$PWD/${commercialName}" in the
+              directory where yousaved it.
+            '';
+            name = commercialName;
+            sha256 =
+              if stdenv.hostPlatform.system == "i686-linux"
+              then "15wvzmmidvykwjrbnq70h5jrvnjx1hcrm0357qj85q4aqbzavh01"
+              else "1v8z16qa9ka8sf7qq45knsxj87s6sipvv3a7xq11pb5xk08fb2ql";
+          }
+      else
+        fetchurl {
+          url = demoUrl;
+          sha256 =
+            if stdenv.hostPlatform.system == "i686-linux"
+            then "0f14vrrbq05hsbdajrb5y9za65fpng1lc8f0adb4aaz27x7sh525"
+            else "0mg41ya0b27blq3b5498kwl4rj46dj21rcd7qd0rw1kyvr7sx4v4";
+        }
     else
       throw "And Yet It Moves nix package only supports linux and intel cpu's.";
 
-  phases = "unpackPhase installPhase";
-
   installPhase = ''
     mkdir -p $out/{opt/andyetitmoves,bin}
     cp -r * $out/opt/andyetitmoves/
@@ -54,19 +59,15 @@ stdenv.mkDerivation rec {
     chmod +x $out/bin/$binName
   '';
 
-  buildInputs = [libvorbis libogg libtheora SDL libXft SDL_image zlib libX11 libpng openal];
+  buildInputs = [ libvorbis libogg libtheora SDL libXft SDL_image zlib libX11 libpng openal ];
 
-  meta = {
+  meta = with lib; {
     description = "Physics/Gravity Platform game";
-
     longDescription = ''
       And Yet It Moves is an award-winning physics-based platform game in which players rotate the game world at will to solve challenging puzzles. Tilting the world turns walls into floors, slides into platforms, and stacks of rocks into dangerous hazards.
     '';
-
     homepage = "http://www.andyetitmoves.net/";
-
-    license = lib.licenses.unfree;
-
-    maintainers = with lib.maintainers; [bluescreen303];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ bluescreen303 ];
   };
 }
diff --git a/pkgs/games/anki/default.nix b/pkgs/games/anki/default.nix
index d1def37400979..a25111bddfe91 100644
--- a/pkgs/games/anki/default.nix
+++ b/pkgs/games/anki/default.nix
@@ -116,6 +116,11 @@ buildPythonApplication rec {
       url = "https://sources.debian.org/data/main/a/anki/2.1.15+dfsg-3/debian/patches/fix-mpv-args.patch";
       sha256 = "1dimnnawk64m5bbdbjrxw5k08q95l728n94cgkrrwxwavmmywaj2";
     })
+    (fetchpatch {
+      name = "anki-2.1.15-unescape.patch";
+      url = "https://795309.bugs.gentoo.org/attachment.cgi?id=715200";
+      sha256 = "14rz864kdaba4fd1marwkyz9n1jiqnbjy4al8bvwlhpvp0rm1qk6";
+    })
   ];
 
   # Anki does not use setup.py
diff --git a/pkgs/games/banner/default.nix b/pkgs/games/banner/default.nix
index 613947c677a5f..befb29f6ffc91 100644
--- a/pkgs/games/banner/default.nix
+++ b/pkgs/games/banner/default.nix
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    homepage = "https://software.cedar-solutions.com/utilities.html";
+    homepage = "https://github.com/pronovic/banner";
     description = "Print large banners to ASCII terminals";
     license = licenses.gpl2Only;
 
diff --git a/pkgs/games/blackshades/default.nix b/pkgs/games/blackshades/default.nix
index bd29c7b616c42..76f22e98d9e96 100644
--- a/pkgs/games/blackshades/default.nix
+++ b/pkgs/games/blackshades/default.nix
@@ -1,29 +1,27 @@
 { lib, stdenv, fetchFromSourcehut
-, SDL, stb, libGLU, libGL, openal, libvorbis, freealut }:
+, zig, glfw, libGLU, libGL, openal, libsndfile }:
 
 stdenv.mkDerivation rec {
   pname = "blackshades";
-  version = "1.3.1";
+  version = "2.4.7";
 
   src = fetchFromSourcehut {
     owner = "~cnx";
     repo = pname;
     rev = version;
-    sha256 = "0yzp74ynkcp6hh5m4zmvrgx5gwm186hq7p3m7qkww54qdyijb3rv";
+    fetchSubmodules = true;
+    sha256 = "sha256-hvJwWUUmGeb7MQgKe79cPS2ckPZ9z0Yc5S9IiwuXPD8=";
   };
 
-  buildInputs = [ SDL stb libGLU libGL openal libvorbis freealut ];
+  nativeBuildInputs = [ zig ];
+  buildInputs = [ glfw libGLU libGL openal libsndfile ];
 
-  postPatch = ''
-    sed -i -e s,Data/,$out/share/$pname/,g \
-      -e s,Data:,$out/share/$pname/,g \
-      src/*.cpp
+  preBuild = ''
+    export HOME=$TMPDIR
   '';
 
   installPhase = ''
-    mkdir -p $out/bin $out/share
-    cp build/blackshades $out/bin
-    cp -R Data $out/share/$pname
+    zig build -Drelease-fast -Dcpu=baseline --prefix $out install
   '';
 
   meta = {
diff --git a/pkgs/games/blightmud/default.nix b/pkgs/games/blightmud/default.nix
new file mode 100644
index 0000000000000..2e177f169fabc
--- /dev/null
+++ b/pkgs/games/blightmud/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, lib, fetchFromGitHub, rustPlatform, pkg-config, alsa-lib, openssl
+, withTTS ? false, llvmPackages, speechd }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "blightmud";
+  version = "3.5.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-DaICzwBew90YstV42wiY0IbvR1W4Hm8dzo3xY2qlMGQ=";
+  };
+
+  cargoSha256 = "sha256-BamMTPh+GN9GG4puxyTauPhjCC8heCu1wsgFaw98s9U=";
+
+  buildFeatures = lib.optional withTTS "tts";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ alsa-lib openssl ] ++ lib.optional withTTS [ speechd ];
+
+  # Building the speech-dispatcher-sys crate for TTS support requires setting
+  # LIBCLANG_PATH.
+  LIBCLANG_PATH = lib.optionalString withTTS "${llvmPackages.libclang.lib}/lib";
+
+  preBuild = lib.optionalString withTTS ''
+    # When building w/ TTS the speech-dispatcher-sys crate's build.rs uses
+    # rust-bindgen with libspeechd. This bypasses the normal nixpkgs CC wrapper
+    # so we have to adapt the BINDGEN_EXTRA_CLANG_ARGS env var to compensate. See
+    # this blog post[0] for more information.
+    #
+    # [0]: https://hoverbear.org/blog/rust-bindgen-in-nix/
+
+    export BINDGEN_EXTRA_CLANG_ARGS="$(< ${stdenv.cc}/nix-support/libc-cflags) \
+      $(< ${stdenv.cc}/nix-support/cc-cflags) \
+      -isystem ${llvmPackages.libclang.lib}/lib/clang/${
+        lib.getVersion llvmPackages.clang
+      }/include \
+      -idirafter ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${
+        lib.getVersion stdenv.cc.cc
+      }/include \
+      -idirafter ${speechd}/include"
+  '';
+
+  checkFlags = let
+    # Most of Blightmud's unit tests pass without trouble in the isolated
+    # Nixpkgs build env. The following tests need to be skipped.
+    skipList = [
+      "test_connect"
+      "test_gmcp_negotiation"
+      "test_ttype_negotiation"
+      "test_reconnect"
+      "test_mud"
+      "test_server"
+      "test_lua_script"
+      "timer_test"
+      "validate_assertion_fail"
+    ];
+    skipFlag = test: "--skip " + test;
+  in builtins.concatStringsSep " " (builtins.map skipFlag skipList);
+
+  meta = with lib; {
+    description = "A terminal MUD client written in Rust";
+    longDescription = ''
+      Blightmud is a terminal client for connecting to Multi User Dungeon (MUD)
+      games. It is written in Rust and supports TLS, GMCP, MSDP, MCCP2, tab
+      completion, text searching and a split view for scrolling. Blightmud can
+      be customized with Lua scripting for aliases, triggers, timers, customized
+      status bars, and more. Blightmud supports several accessibility features
+      including an optional built-in text-to-speech engine and a screen reader
+      friendly mode.
+    '';
+    homepage = "https://github.com/Blightmud/Blightmud";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ cpu ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/blobby/default.upstream b/pkgs/games/blobby/default.upstream
deleted file mode 100644
index 8f2804e079469..0000000000000
--- a/pkgs/games/blobby/default.upstream
+++ /dev/null
@@ -1,8 +0,0 @@
-url https://sourceforge.net/projects/blobby/files/Blobby%20Volley%202%20%28Linux%29/
-SF_version_dir
-version_link '[.]tar[.][^.]+/download$'
-SF_redirect
-do_overwrite(){
-  do_overwrite_just_version
-  set_var_value url $CURRENT_URL
-}
diff --git a/pkgs/games/blockattack/default.nix b/pkgs/games/blockattack/default.nix
new file mode 100644
index 0000000000000..7616d2e51a34e
--- /dev/null
+++ b/pkgs/games/blockattack/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, boost
+, cmake
+, gettext
+, physfs
+, pkg-config
+, zip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "blockattack";
+  version = "2.7.0";
+
+  src = fetchFromGitHub {
+    name = "${pname}-${version}-src";
+    owner = "blockattack";
+    repo = "blockattack-game";
+    rev = "v${version}";
+    hash = "sha256-ySLm3AdoJRiMRdla45OJh8ZIFYNh+HzjG2VnFqoWuZA=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    gettext
+    zip
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    SDL2_ttf
+    boost
+    physfs
+  ];
+
+  preConfigure = ''
+    patchShebangs packdata.sh source/misc/translation/*.sh
+    chmod +x ./packdata.sh
+    ./packdata.sh
+  '';
+
+  meta = with lib; {
+    homepage = "https://blockattack.net/";
+    description = "An open source clone of Panel de Pon (aka Tetris Attack)";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/chessx/default.nix b/pkgs/games/chessx/default.nix
index 1d2b366cf38e2..fd8189386e73d 100644
--- a/pkgs/games/chessx/default.nix
+++ b/pkgs/games/chessx/default.nix
@@ -12,11 +12,11 @@
 
 mkDerivation rec {
   pname = "chessx";
-  version = "1.5.6";
+  version = "1.5.7";
 
   src = fetchurl {
     url = "mirror://sourceforge/chessx/chessx-${version}.tgz";
-    sha256 = "sha256-0JpLU0qQnF8aOYxkBlBJov3zBJe8gcy98NlAQSNk0gU=";
+    sha256 = "sha256-wadIO3iNvj8LgIzExHTmeXxXnWOI+ViLrdhAlzZ79Jw=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/games/cl-wordle/default.nix b/pkgs/games/cl-wordle/default.nix
new file mode 100644
index 0000000000000..1ad3487c3feda
--- /dev/null
+++ b/pkgs/games/cl-wordle/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchCrate }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "cl-wordle";
+  version = "0.4.0";
+
+  src = fetchCrate {
+    inherit pname version;
+    sha256 = "sha256-z2XpXgOviBRcberwpxQ4ml1T04k5kMhG7wA0PAYWENg=";
+  };
+
+  cargoSha256 = "sha256-C7UMkhgez2CtddftARlwN1TjZ1N26NnZfpRiX1KkMEA=";
+
+  meta = with lib; {
+    description = "Wordle TUI in Rust";
+    homepage = "https://github.com/conradludgate/wordle";
+    # repo has no license, but crates.io says it's MIT
+    license = licenses.mit;
+    maintainers = with maintainers; [ lom ];
+    mainProgram = "wordle";
+  };
+}
diff --git a/pkgs/games/colobot/data.nix b/pkgs/games/colobot/data.nix
index 7ae9dbb2b5ed9..761c68c15e816 100644
--- a/pkgs/games/colobot/data.nix
+++ b/pkgs/games/colobot/data.nix
@@ -4,13 +4,13 @@
 
 stdenv.mkDerivation rec {
   pname = "colobot-data";
-  version = "0.1.12-alpha";
+  version = "0.2.0-alpha";
 
   src = fetchFromGitHub {
     owner = "colobot";
     repo = "colobot-data";
     rev = "colobot-gold-${version}";
-    sha256 = "1vm33s52ymwd03x24i9bqiglw5v3wgd7rlzyx9r5ww0nnqzwbwi6";
+    sha256 = "sha256-yzIbAzrGsDe6hO0GHF9gjnj7IE8B7+5LDbvjZi4Wtms=";
   };
 
   nativeBuildInputs = [ cmake vorbis-tools xmlstarlet doxygen python3 ];
diff --git a/pkgs/games/colobot/default.nix b/pkgs/games/colobot/default.nix
index b26244ccc5fde..e1070843811c5 100644
--- a/pkgs/games/colobot/default.nix
+++ b/pkgs/games/colobot/default.nix
@@ -9,24 +9,15 @@ stdenv.mkDerivation rec {
   pname = "colobot";
   # Maybe require an update to package colobot-data as well
   # in file data.nix next to this one
-  version = "0.1.12-alpha";
+  version = "0.2.0-alpha";
 
   src = fetchFromGitHub {
     owner = "colobot";
-    repo = "colobot";
+    repo = pname;
     rev = "colobot-gold-${version}";
-    sha256 = "0viq5s4zqs33an7rdmc3anf74ml7mwwcwf60alhvp9hj5jr547s2";
+    sha256 = "sha256-Nu7NyicNIk5yza9sXfd4KbGdB65guVuGREd6rwRU3lU=";
   };
 
-  patches = [
-    # Fix issue with newer compilers, like used in nixpkgs
-    # https://github.com/colobot/colobot/pull/1291
-    (fetchpatch {
-      url = "https://github.com/colobot/colobot/commit/fc2bd68876ac6302dbc8e91e8ffa33592db14b21.patch";
-      sha256 = "sha256-PKe8jeyHpTT86tprSafQhNqTYBrSonz+r2fL1lVJdfo=";
-    })
-  ];
-
   nativeBuildInputs = [ cmake xmlstarlet doxygen python3 ];
   buildInputs = [ boost SDL2 SDL2_image SDL2_ttf libpng glew gettext libsndfile libvorbis libogg physfs openal ];
 
diff --git a/pkgs/games/crafty/default.nix b/pkgs/games/crafty/default.nix
deleted file mode 100644
index b5b53aa3c4131..0000000000000
--- a/pkgs/games/crafty/default.nix
+++ /dev/null
@@ -1,73 +0,0 @@
-{ lib, stdenv, fetchurl, unzip }:
-
-stdenv.mkDerivation rec {
-  pname = "crafty";
-  version = "25.0.1";
-
-  src = fetchurl {
-    url = "http://www.craftychess.com/downloads/source/crafty-${version}.zip";
-    sha256 = "0aqgj2q7kdlgbha01qs869cwyja13bc7q2lh4nfhlba2pklknsm8";
-  };
-
-  bookBin = fetchurl {
-    url = "http://www.craftychess.com/downloads/book/book.bin";
-    sha256 = "10rrgkr3hxm7pxdbc2jq8b5g74gfhzk4smahks3k8am1cmyq4p7r";
-  };
-
-  startPgn = fetchurl {
-    url = "http://craftychess.com/downloads/book/start.pgn.gz";
-    sha256 = "12g70mgfifwssfvndzq94pin34dizlixhsga75vgj7dakysi2p7f";
-  };
-
-  nativeBuildInputs = [ unzip ];
-
-  unpackPhase = ''
-    mkdir "craftysrc"
-    unzip $src -d craftysrc
-    gunzip -c $startPgn > "craftysrc/start.pgn"
-  '';
-
-  buildPhase = ''
-    cd craftysrc
-    make unix-gcc
-  '';
-
-  installPhase = ''
-    BUILDDIR="$PWD"
-    mkdir -p $out/bin
-    cp -p ./crafty $out/bin
-
-    mkdir -p $out/share/crafty
-    cd $out/share/crafty
-
-    $out/bin/crafty "books create $BUILDDIR/start.pgn 60"
-    rm -f *.001
-
-    cp -p ${bookBin} $out/share/crafty/book.bin
-
-    mv $out/bin/crafty $out/bin/.crafty-wrapped
-
-    cat - > $out/bin/crafty <<EOF
-    #! ${stdenv.shell}
-    #
-    # The books are copied from share/crafty to ~/.crafty/books the first time
-    # this script is run. You can restore them at any time just copying them
-    # again.
-    if [[ ! -d "\$HOME/.crafty/books" ]]; then
-      mkdir "\$HOME/.crafty/books" -p
-      cp "$out/share/crafty/"book*.bin "\$HOME/.crafty/books"
-      chmod ug+w "\$HOME/.crafty/books/"*
-    fi
-    exec $out/bin/.crafty-wrapped bookpath=\$HOME/.crafty/books "\$@"
-    EOF
-    chmod +x $out/bin/crafty
-  '';
-
-  meta = {
-    homepage = "http://www.craftychess.com/";
-    description = "Chess program developed by Dr. Robert M. Hyatt";
-    license = lib.licenses.unfree;
-    platforms = lib.platforms.unix;
-    maintainers = [ lib.maintainers.jwiegley ];
-  };
-}
diff --git a/pkgs/games/crawl/default.nix b/pkgs/games/crawl/default.nix
index 02e34e5f749df..064e1d623a5f4 100644
--- a/pkgs/games/crawl/default.nix
+++ b/pkgs/games/crawl/default.nix
@@ -7,14 +7,14 @@
 }:
 
 stdenv.mkDerivation rec {
-  name = "crawl-${version}${lib.optionalString tileMode "-tiles"}";
-  version = "0.27.1";
+  pname = "crawl${lib.optionalString tileMode "-tiles"}";
+  version = "0.28.0";
 
   src = fetchFromGitHub {
     owner = "crawl";
     repo = "crawl";
     rev = version;
-    sha256 = "sha256-fyI7OIzhYXNTjIgJLqApyPMmiG3iof1b5XuGudNanos=";
+    sha256 = "sha256-pVEE3g+NDwpsrakyj4YIk53aE+LCiIaRhOqos4huh9A=";
   };
 
   # Patch hard-coded paths and remove force library builds
diff --git a/pkgs/games/crispy-doom/default.nix b/pkgs/games/crispy-doom/default.nix
index c507332399ab8..7454242c72b5e 100644
--- a/pkgs/games/crispy-doom/default.nix
+++ b/pkgs/games/crispy-doom/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   pname = "crispy-doom";
-  version = "5.10.3";
+  version = "5.11.1";
 
   src = fetchFromGitHub {
     owner = "fabiangreffrath";
     repo = pname;
     rev = "${pname}-${version}";
-    sha256 = "sha256-F1cK8qusxOHM0DkLEYV5i2ixP3II8ZttwKxd8htd0+A=";
+    sha256 = "sha256-2Sjl9XO01ko0BwbFQSFv9mNoetyMa8Dxx17y0JmlLS0=";
   };
 
   postPatch = ''
diff --git a/pkgs/games/ddnet/default.nix b/pkgs/games/ddnet/default.nix
index eca0d10d7f988..1663e17b14d29 100644
--- a/pkgs/games/ddnet/default.nix
+++ b/pkgs/games/ddnet/default.nix
@@ -20,13 +20,13 @@
 
 stdenv.mkDerivation rec {
   pname = "ddnet";
-  version = "15.8";
+  version = "15.9.1";
 
   src = fetchFromGitHub {
     owner = "ddnet";
     repo = pname;
     rev = version;
-    sha256 = "sha256-segJVGH5ngSEhk0EpLHPORTNck4tIDCxJh9Ri6sa2dE=";
+    sha256 = "sha256-QGtXI4Dbua5LBXSvB17tnSTGEvCCoopvg1XKBuDIEoQ=";
   };
 
   nativeBuildInputs = [ cmake ninja pkg-config ];
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
index 93f51df1819d5..316d1308eb794 100644
--- a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
@@ -9,7 +9,8 @@ let
 in
 
 stdenv.mkDerivation {
-  name = "dwarf-therapist-${dwarf-therapist.version}";
+  pname = "dwarf-therapist";
+  version = dwarf-therapist.version;
 
   wrapper = substituteAll {
     src = ./dwarf-therapist.in;
diff --git a/pkgs/games/dwarf-fortress/unfuck.nix b/pkgs/games/dwarf-fortress/unfuck.nix
index 5b25cf4ff4090..27b54667f0b9a 100644
--- a/pkgs/games/dwarf-fortress/unfuck.nix
+++ b/pkgs/games/dwarf-fortress/unfuck.nix
@@ -72,7 +72,8 @@ let
 in
 
 stdenv.mkDerivation {
-  name = "dwarf_fortress_unfuck-${release.unfuckRelease}";
+  pname = "dwarf_fortress_unfuck";
+  version = release.unfuckRelease;
 
   src = fetchFromGitHub {
     owner = "svenstaro";
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
index ce989b98ffbd7..3d1c3ead06042 100644
--- a/pkgs/games/dwarf-fortress/wrapper/default.nix
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -92,7 +92,8 @@ let
 in
 
 stdenv.mkDerivation {
-  name = "dwarf-fortress-${dwarf-fortress.dfVersion}";
+  pname = "dwarf-fortress";
+  version = dwarf-fortress.dfVersion;
 
   dfInit = substituteAll {
     name = "dwarf-fortress-init";
diff --git a/pkgs/games/easyrpg-player/default.nix b/pkgs/games/easyrpg-player/default.nix
index 83e40a4c3407e..4476c0a7a5324 100644
--- a/pkgs/games/easyrpg-player/default.nix
+++ b/pkgs/games/easyrpg-player/default.nix
@@ -1,22 +1,25 @@
-{ lib, stdenv, fetchFromGitHub, cmake, doxygen ? null, pkg-config, freetype ? null, glib, harfbuzz ? null
+{ lib, stdenv, fetchFromGitHub, cmake, doxygen ? null, pkg-config
+, freetype ? null, fmt, glib, harfbuzz ? null
 , liblcf, libpng, libsndfile ? null, libvorbis ? null, libxmp ? null
 , libXcursor, libXext, libXi, libXinerama, libXrandr, libXScrnSaver, libXxf86vm
-, mpg123 ? null, opusfile ? null, pcre, pixman, SDL2_mixer, speexdsp ? null, wildmidi ? null, zlib }:
+, mpg123 ? null, opusfile ? null, pcre, pixman, SDL2, speexdsp ? null, wildmidi ? null, zlib
+}:
 
 stdenv.mkDerivation rec {
   pname = "easyrpg-player";
-  version = "0.6.2.3";
+  version = "0.7.0";
 
   src = fetchFromGitHub {
     owner = "EasyRPG";
     repo = "Player";
     rev = version;
-    sha256 = "103ywad12dcfjpf97kyx22smilqrw1f20xcfvjjr4mm3walc2mdp";
+    sha256 = "049bj3jg3ldi3n11nx8xvh6pll68g7dcxz51q6z1gyyfxxws1qpj";
   };
 
   nativeBuildInputs = [ cmake doxygen pkg-config ];
 
   buildInputs = [
+    fmt
     freetype
     glib
     harfbuzz
@@ -34,9 +37,9 @@ stdenv.mkDerivation rec {
     libXxf86vm
     mpg123
     opusfile
-    SDL2_mixer
     pcre
     pixman
+    SDL2
     speexdsp
     wildmidi
     zlib
diff --git a/pkgs/games/egoboo/default.nix b/pkgs/games/egoboo/default.nix
index 158e81d912885..506868efe312f 100644
--- a/pkgs/games/egoboo/default.nix
+++ b/pkgs/games/egoboo/default.nix
@@ -50,7 +50,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "3D dungeon crawling adventure";
 
-    homepage = "http://www.freedink.org/";
+    homepage = "http://egoboo.sourceforge.net/";
     license = lib.licenses.gpl2Plus;
 
     # I take it out of hydra as it does not work as well as I'd like
diff --git a/pkgs/games/factorio/versions.json b/pkgs/games/factorio/versions.json
index 37dc97d5597b5..663dffe249829 100644
--- a/pkgs/games/factorio/versions.json
+++ b/pkgs/games/factorio/versions.json
@@ -2,48 +2,56 @@
   "x86_64-linux": {
     "alpha": {
       "experimental": {
-        "name": "factorio_alpha_x64-1.1.50.tar.xz",
+        "name": "factorio_alpha_x64-1.1.53.tar.xz",
         "needsAuth": true,
-        "sha256": "1sb3kvpj3kikr1bvm4si4f3dmj7873dhbz6zj57kin6d5mbmhq4p",
+        "sha256": "1l5sk9rhf4pq9l87w5sv4a1ikqx8rpby5hf4xn7sdsm9mshd3wyw",
         "tarDirectory": "x64",
-        "url": "https://factorio.com/get-download/1.1.50/alpha/linux64",
-        "version": "1.1.50"
+        "url": "https://factorio.com/get-download/1.1.53/alpha/linux64",
+        "version": "1.1.53"
       },
       "stable": {
-        "name": "factorio_alpha_x64-1.1.50.tar.xz",
+        "name": "factorio_alpha_x64-1.1.53.tar.xz",
         "needsAuth": true,
-        "sha256": "1sb3kvpj3kikr1bvm4si4f3dmj7873dhbz6zj57kin6d5mbmhq4p",
+        "sha256": "1l5sk9rhf4pq9l87w5sv4a1ikqx8rpby5hf4xn7sdsm9mshd3wyw",
         "tarDirectory": "x64",
-        "url": "https://factorio.com/get-download/1.1.50/alpha/linux64",
-        "version": "1.1.50"
+        "url": "https://factorio.com/get-download/1.1.53/alpha/linux64",
+        "version": "1.1.53"
       }
     },
     "demo": {
+      "experimental": {
+        "name": "factorio_demo_x64-1.1.53.tar.xz",
+        "needsAuth": false,
+        "sha256": "0m3mk296w4azma2v5z6pay1caqql2jfnlcyyd120laxl4rdg2k76",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.53/demo/linux64",
+        "version": "1.1.53"
+      },
       "stable": {
-        "name": "factorio_demo_x64-1.1.50.tar.xz",
+        "name": "factorio_demo_x64-1.1.53.tar.xz",
         "needsAuth": false,
-        "sha256": "0i3r21i7s4yzjfqrwf82x87pfjg7d3bhkz3zqi0x398j9bykpw43",
+        "sha256": "0m3mk296w4azma2v5z6pay1caqql2jfnlcyyd120laxl4rdg2k76",
         "tarDirectory": "x64",
-        "url": "https://factorio.com/get-download/1.1.50/demo/linux64",
-        "version": "1.1.50"
+        "url": "https://factorio.com/get-download/1.1.53/demo/linux64",
+        "version": "1.1.53"
       }
     },
     "headless": {
       "experimental": {
-        "name": "factorio_headless_x64-1.1.50.tar.xz",
+        "name": "factorio_headless_x64-1.1.53.tar.xz",
         "needsAuth": false,
-        "sha256": "0j75wbnszhlmyk655b2h8jd1lvmnplq44blixl959hh3lxvqn50m",
+        "sha256": "18ra52h32nhdqxz6vagp9nw3an5pgamariy0ny050xr2xpidw3v1",
         "tarDirectory": "x64",
-        "url": "https://factorio.com/get-download/1.1.50/headless/linux64",
-        "version": "1.1.50"
+        "url": "https://factorio.com/get-download/1.1.53/headless/linux64",
+        "version": "1.1.53"
       },
       "stable": {
-        "name": "factorio_headless_x64-1.1.50.tar.xz",
+        "name": "factorio_headless_x64-1.1.53.tar.xz",
         "needsAuth": false,
-        "sha256": "0j75wbnszhlmyk655b2h8jd1lvmnplq44blixl959hh3lxvqn50m",
+        "sha256": "18ra52h32nhdqxz6vagp9nw3an5pgamariy0ny050xr2xpidw3v1",
         "tarDirectory": "x64",
-        "url": "https://factorio.com/get-download/1.1.50/headless/linux64",
-        "version": "1.1.50"
+        "url": "https://factorio.com/get-download/1.1.53/headless/linux64",
+        "version": "1.1.53"
       }
     }
   }
diff --git a/pkgs/games/fheroes2/default.nix b/pkgs/games/fheroes2/default.nix
index 287093354fc7a..567ab267cfeac 100644
--- a/pkgs/games/fheroes2/default.nix
+++ b/pkgs/games/fheroes2/default.nix
@@ -7,13 +7,13 @@
 
 stdenv.mkDerivation rec {
   pname = "fheroes2";
-  version = "0.9.11";
+  version = "0.9.12";
 
   src = fetchFromGitHub {
     owner = "ihhub";
     repo = "fheroes2";
     rev = version;
-    sha256 = "sha256-p2FG4oWLTGflOoxsp8A+FpoVHfKiEw3DEnK8n3UiBtU=";
+    sha256 = "sha256-6voM6aQ22zW6NHm9x2TDsM4Kea6TLYZTdSLyc/6fz8A=";
   };
 
   buildInputs = [ gettext libpng SDL2 SDL2_image SDL2_mixer SDL2_ttf zlib ];
diff --git a/pkgs/games/flare/default.nix b/pkgs/games/flare/default.nix
index 9b4b6848aea02..3567a5886055d 100644
--- a/pkgs/games/flare/default.nix
+++ b/pkgs/games/flare/default.nix
@@ -1,7 +1,7 @@
 { lib, buildEnv, callPackage, makeWrapper, Cocoa }:
 
 buildEnv {
-  name = "flare-1.12";
+  name = "flare-1.13.04";
 
   paths = [
     (callPackage ./engine.nix { inherit Cocoa; })
@@ -17,7 +17,7 @@ buildEnv {
   meta = with lib; {
     description = "Fantasy action RPG using the FLARE engine";
     homepage = "https://flarerpg.org/";
-    maintainers = [ maintainers.aanderse ];
+    maintainers = with maintainers; [ aanderse McSinyx ];
     license = [ licenses.gpl3 licenses.cc-by-sa-30 ];
     platforms = platforms.unix;
   };
diff --git a/pkgs/games/flare/engine.nix b/pkgs/games/flare/engine.nix
index fc7415ba3ec38..9e9215ada1f29 100644
--- a/pkgs/games/flare/engine.nix
+++ b/pkgs/games/flare/engine.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   pname = "flare-engine";
-  version = "1.12";
+  version = "1.13.04";
 
   src = fetchFromGitHub {
     owner = "flareteam";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0swav6fzz970wj4iic3b7y06haa05720s2wivc8w7wcw9nzcac7j";
+    sha256 = "sha256-GPHPYcW0kBDGpZti2kFggNB4RVK/3eQ53M9mJvJuKXM=";
   };
 
   patches = [ ./desktop.patch ];
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
   meta = with lib; {
     description = "Free/Libre Action Roleplaying Engine";
     homepage = "https://github.com/flareteam/flare-engine";
-    maintainers = [ maintainers.aanderse ];
+    maintainers = with maintainers; [ aanderse McSinyx ];
     license = [ licenses.gpl3 ];
     platforms = platforms.unix;
   };
diff --git a/pkgs/games/flare/game.nix b/pkgs/games/flare/game.nix
index 9903f0b58204e..791af2645353a 100644
--- a/pkgs/games/flare/game.nix
+++ b/pkgs/games/flare/game.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   pname = "flare-game";
-  version = "1.12";
+  version = "1.13.04";
 
   src = fetchFromGitHub {
     owner = "flareteam";
     repo = pname;
     rev = "v${version}";
-    sha256 = "15k9r7w587pvkzrln0670hhq5fzif8k7xmrhb0nl3z3fi6dw3mmc";
+    sha256 = "sha256-7dEIagioM6OZXG+eNaYls8skHXSqGFXZuNhT0zhTFdY=";
   };
 
   nativeBuildInputs = [ cmake ];
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
   meta = with lib; {
     description = "Fantasy action RPG using the FLARE engine";
     homepage = "https://github.com/flareteam/flare-game";
-    maintainers = [ maintainers.aanderse ];
+    maintainers = with maintainers; [ aanderse McSinyx ];
     license = [ licenses.cc-by-sa-30 ];
     platforms = platforms.unix;
   };
diff --git a/pkgs/games/freedink/default.nix b/pkgs/games/freedink/default.nix
index c80dc2b07034c..75c50669421d8 100644
--- a/pkgs/games/freedink/default.nix
+++ b/pkgs/games/freedink/default.nix
@@ -51,7 +51,7 @@ in stdenv.mkDerivation rec {
       with close compatibility, under multiple platforms.
     '';
 
-    homepage = "http://www.freedink.org/";
+    homepage = "https://www.gnu.org/software/freedink/"; # Formerly http://www.freedink.org
     license = lib.licenses.gpl3Plus;
 
     maintainers = [ lib.maintainers.bjg ];
diff --git a/pkgs/games/gcompris/default.nix b/pkgs/games/gcompris/default.nix
index 2b3ff2b5c2e58..c4c737d228cc7 100644
--- a/pkgs/games/gcompris/default.nix
+++ b/pkgs/games/gcompris/default.nix
@@ -18,15 +18,15 @@
 
 mkDerivation rec {
   pname = "gcompris";
-  version = "2.0";
+  version = "2.1";
 
   src = fetchurl {
     url = "http://gcompris.net/download/qt/src/gcompris-qt-${version}.tar.xz";
-    sha256 = "sha256-mrVGYI9IPyXqlXZN2MEDGTjIPUmlLwfaAo+zW4HjqMc=";
+    sha256 = "sha256-ljOY/uybXzfwOFmhBXB4sC4Vn/C8BP1BeUUPpdHuQwo=";
   };
 
   cmakeFlags = [
-    "-DQML_BOX2D_LIBRARY=${qmlbox2d}/${qtbase.qtQmlPrefix}/Box2D.2.0"
+    "-DQML_BOX2D_LIBRARY=${qmlbox2d}/${qtbase.qtQmlPrefix}/Box2D.2.1"
   ];
 
   nativeBuildInputs = [ cmake gettext ninja qttools ];
diff --git a/pkgs/games/gnubg/default.nix b/pkgs/games/gnubg/default.nix
index 7402049a9d820..6f50869e6c694 100644
--- a/pkgs/games/gnubg/default.nix
+++ b/pkgs/games/gnubg/default.nix
@@ -1,8 +1,8 @@
 { lib, stdenv, fetchurl, pkg-config, glib, python3, gtk2, readline }:
 
-let version = "1.06.002"; in
-stdenv.mkDerivation {
-  name = "gnubg-"+version;
+stdenv.mkDerivation rec {
+  pname = "gnubg";
+  version = "1.06.002";
 
   src = fetchurl {
     url = "http://gnubg.org/media/sources/gnubg-release-${version}-sources.tar.gz";
diff --git a/pkgs/games/grapejuice/default.nix b/pkgs/games/grapejuice/default.nix
index 931de10c18f4e..4ddb58c81482d 100644
--- a/pkgs/games/grapejuice/default.nix
+++ b/pkgs/games/grapejuice/default.nix
@@ -11,17 +11,19 @@
 , xdg-user-dirs
 , wine
 , winetricks
+, pciutils
+, glxinfo
 }:
 
 python3Packages.buildPythonApplication rec  {
   pname = "grapejuice";
-  version = "3.64.16";
+  version = "4.10.2";
 
   src = fetchFromGitLab {
     owner = "BrinkerVII";
     repo = "grapejuice";
-    rev = "a5bc65e094bbfb86e6142ac1da59017ddccff69e";
-    sha256 = "sha256-3+5LWn+UBgLAX683MPHRHQMpW+gC5hGIwTtRVJHRWeE=";
+    rev = "9a7cf806d35b4d53b3d3762339eba7d861b5043d";
+    sha256 = "sha256-cKZv9qPCnl7i4kb6PG8RYx3HNLcwgI4d2zkw899MA6E=";
   };
 
   nativeBuildInputs = [
@@ -43,13 +45,14 @@ python3Packages.buildPythonApplication rec  {
     packaging
     psutil
     setuptools
+    unidecode
   ];
 
   dontWrapGApps = true;
 
   makeWrapperArgs = [
     "\${gappsWrapperArgs[@]}"
-    "--prefix PATH : ${lib.makeBinPath [ xdg-user-dirs xdg-utils wine winetricks ]}"
+    "--prefix PATH : ${lib.makeBinPath [ xdg-user-dirs xdg-utils wine winetricks pciutils glxinfo ]}"
   ];
 
   postPatch = ''
@@ -84,7 +87,7 @@ python3Packages.buildPythonApplication rec  {
 
   meta = with lib; {
     homepage = "https://gitlab.com/brinkervii/grapejuice";
-    description = "Simple Wine+Roblox management tool";
+    description = "A wine+Roblox management application";
     license = licenses.gpl3Plus;
     platforms = platforms.linux;
     maintainers = with maintainers; [ artturin ];
diff --git a/pkgs/games/hawkthorne/default.nix b/pkgs/games/hawkthorne/default.nix
deleted file mode 100644
index 3da78349dbb19..0000000000000
--- a/pkgs/games/hawkthorne/default.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-{ fetchgit, lib, stdenv, love, curl, zip }:
-
-stdenv.mkDerivation {
-  version = "0.12.1";
-  pname = "hawkthorne";
-
-  src = fetchgit {
-    url = "https://github.com/hawkthorne/hawkthorne-journey.git";
-    rev = "610b9b3907b2a1b21da2ae926e4c7c4c9e19959b";
-    sha256 = "013smhdf9sh91153fpk2bwhhnpg6pn7kfrpw77jmf0v48i3q44h2";
-  };
-
-  buildInputs = [
-    love curl zip
-  ];
-
-  patches = [
-    ./makefile.patch
-  ];
-
-  enableParallelBuilding = true;
-
-  meta = {
-    description = "Journey to the Center of Hawkthorne - A fan-made retro-style game based on the show Community";
-    longDescription = ''
-      Journey to the Center of Hawkthorne is an open source game written in Love2D.
-      It's based on the show Community, starring Jim Rash and Joel McHale as
-      the primary will-they-or-won't-they relationship.
-
-      This game has been entirely developed by fans of the show, who were inspired
-      to bring to life the video game used to determine the winner of Pierce
-      Hawthorne's inheritance.
-    '';
-    homepage = "https://www.reddit.com/r/hawkthorne";
-    license = lib.licenses.mit;
-    maintainers = with lib.maintainers; [ campadrenalin ];
-    broken = true;
-  };
-}
diff --git a/pkgs/games/hawkthorne/makefile.patch b/pkgs/games/hawkthorne/makefile.patch
deleted file mode 100644
index 16a79683149d0..0000000000000
--- a/pkgs/games/hawkthorne/makefile.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 55eb817..f3406aa 100644
---- a/Makefile
-+++ b/Makefile
-@@ -18,10 +18,14 @@ endif
-
- tilemaps := $(patsubst %.tmx,%.lua,$(wildcard src/maps/*.tmx))
-
--maps: $(tilemaps)
--
- love: build/hawkthorne.love
-
-+shebang: build/hawkthorne.love
-+	cat <(echo '#!/usr/bin/env love') build/hawkthorne.love > build/hawkthorne
-+	chmod +x build/hawkthorne
-+
-+maps: $(tilemaps)
-+
- build/hawkthorne.love: $(tilemaps) src/*
- 	mkdir -p build
- 	cd src && zip --symlinks -q -r ../build/hawkthorne.love . -x ".*" \
-@@ -30,6 +34,12 @@ build/hawkthorne.love: $(tilemaps) src/*
- run: $(tilemaps) $(LOVE)
- 	$(LOVE) src
-
-+check: test
-+
-+install: shebang
-+	mkdir -p $(out)/bin
-+	cp build/hawkthorne $(out)/bin
-+
- src/maps/%.lua: src/maps/%.tmx bin/tmx2lua
- 	bin/tmx2lua $<
diff --git a/pkgs/games/heroic/default.nix b/pkgs/games/heroic/default.nix
index e6413a87f2cab..bcbe2a6c65352 100644
--- a/pkgs/games/heroic/default.nix
+++ b/pkgs/games/heroic/default.nix
@@ -1,16 +1,17 @@
-{ lib, fetchurl, appimageTools, python }:
+{ lib, fetchurl, appimageTools, gsettings-desktop-schemas, gtk3 }:
 
 let
   pname = "heroic";
-  version = "1.10.3";
+  version = "2.0.2";
   name = "${pname}-${version}";
   src = fetchurl {
     url = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/releases/download/v${version}/Heroic-${version}.AppImage";
-    sha256 = "sha256-0VQ5rSGGsEAsOLB4H/Hn2w7wCOrCSoVFzCBqNV5NyVE=";
+    sha256 = "sha256-4gq0ZCcPIx/CkFNZTM5Atkd/GP6v1t3MO2tibrKkcZQ=";
   };
   appimageContents = appimageTools.extractType2 { inherit name src; };
 
-in appimageTools.wrapType2 {
+in
+appimageTools.wrapType2 {
   inherit name src;
 
   extraInstallCommands = ''
@@ -28,6 +29,10 @@ in appimageTools.wrapType2 {
       --replace 'Exec=AppRun' 'Exec=heroic'
   '';
 
+  profile = ''
+    export XDG_DATA_DIRS=${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:${gtk3}/share/gsettings-schemas/${gtk3.name}:$XDG_DATA_DIRS
+  '';
+
   meta = with lib; {
     description = "A Native GUI Epic Games Launcher for Linux, Windows and Mac";
     homepage = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher";
diff --git a/pkgs/games/hhexen/default.nix b/pkgs/games/hhexen/default.nix
index 0306c54ef4ee8..19a0b783efdd0 100644
--- a/pkgs/games/hhexen/default.nix
+++ b/pkgs/games/hhexen/default.nix
@@ -1,7 +1,7 @@
 { lib, fetchurl, SDL, stdenv }:
 
 stdenv.mkDerivation rec {
-  name = "hhexen";
+  pname = "hhexen";
   version = "1.6.3";
   src = fetchurl {
     url = "mirror://sourceforge/hhexen/hhexen-${version}-src.tgz";
diff --git a/pkgs/games/instead/default.nix b/pkgs/games/instead/default.nix
index 5c35219c19bf4..cafdd2b84f0d7 100644
--- a/pkgs/games/instead/default.nix
+++ b/pkgs/games/instead/default.nix
@@ -1,8 +1,6 @@
 { lib, stdenv, fetchurl, SDL2, SDL2_ttf, SDL2_image, SDL2_mixer, pkg-config, lua, zlib, unzip }:
 
 let
-  version = "3.3.2";
-
   # I took several games at random from https://instead.syscall.ru/games/
   games = [
     (fetchurl {
@@ -28,8 +26,9 @@ let
   ];
 in
 
-stdenv.mkDerivation {
-  name = "instead-" + version;
+stdenv.mkDerivation rec {
+  pname = "instead";
+  version = "3.3.2";
 
   src = fetchurl {
     url = "mirror://sourceforge/project/instead/instead/${version}/instead_${version}.tar.gz";
diff --git a/pkgs/games/itch-setup/default.nix b/pkgs/games/itch-setup/default.nix
new file mode 100644
index 0000000000000..55d488bcaac06
--- /dev/null
+++ b/pkgs/games/itch-setup/default.nix
@@ -0,0 +1,24 @@
+{ lib, writeShellScriptBin, steam-run, fetchurl }:
+let
+
+  pname = "itch-setup";
+  version = "1.26.0";
+
+  src = fetchurl {
+    url = "https://broth.itch.ovh/itch-setup/linux-amd64/${version}/unpacked/default";
+    hash = "sha256-bcJKqhgZK42Irx12BIvbTDMb/DHEOEXljetlDokF7x8=";
+    executable = true;
+  };
+
+in
+(writeShellScriptBin pname ''exec ${steam-run}/bin/steam-run ${src} "$@"'') // {
+
+  passthru = { inherit pname version src; };
+  meta = with lib; {
+    description = "An installer for the itch.io desktop app";
+    homepage = "https://github.com/itchio/itch-setup";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ pasqui23 ];
+  };
+}
diff --git a/pkgs/games/itch/default.nix b/pkgs/games/itch/default.nix
new file mode 100644
index 0000000000000..a8cfe8f24d76b
--- /dev/null
+++ b/pkgs/games/itch/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenvNoCC
+, fetchurl
+, libnotify
+, nss
+, gtk3
+, fetchFromGitHub
+, makeDesktopItem
+, itch-setup
+, runtimeShell
+}:
+stdenvNoCC.mkDerivation rec{
+  pname = "itch";
+  version = "25.5.1";
+
+  src = fetchFromGitHub {
+    owner = "itchio";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Pi3l3uK4kr+N3p7fGQuqckYIzycRqJHDVX00reoSbp4=";
+  };
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      exec = pname;
+      icon = pname;
+      desktopName = pname;
+      mimeType = "x-scheme-handler/itchio;x-scheme-handler/itch";
+      comment = "Install and play itch.io games easily";
+      extraDesktopEntries = {
+        TryExec = "itch %U";
+        Categories = "Game;";
+      };
+    })
+  ];
+
+  itchBin = ''
+    #!${runtimeShell}
+    exec ${itch-setup}/bin/itch-setup --prefer-launch -- "$@"
+  '';
+
+  passAsFile = [ "itchBin" ];
+
+  # as taken from https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=itch
+  installPhase = ''
+    install -Dm0777 $itchBinPath $out/bin/itch
+    for icon in release/images/itch-icons/icon*.png
+    do
+      iconsize="''${icon#release/images/itch-icons/icon}"
+      iconsize="''${iconsize%.png}"
+      icondir="$out/share/icons/hicolor/''${iconsize}x''${iconsize}/apps/"
+      install -Dm644 "$icon" "$icondir/itch.png"
+    done
+  '';
+
+  meta = with lib; {
+    description = "The best way to play itch.io games";
+    homepage = "https://github.com/itchio/itch";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ pasqui23 ];
+  };
+}
diff --git a/pkgs/games/ivan/default.nix b/pkgs/games/ivan/default.nix
index f16aa75263275..ce0eeea738afa 100644
--- a/pkgs/games/ivan/default.nix
+++ b/pkgs/games/ivan/default.nix
@@ -4,13 +4,13 @@
 stdenv.mkDerivation rec {
 
   pname = "ivan";
-  version = "058";
+  version = "059";
 
   src = fetchFromGitHub {
     owner = "Attnam";
     repo = "ivan";
     rev = "v${version}";
-    sha256 = "04jzs8wad2b3g9hvnijr4r89iiw6b1i44zdzkg0dy447lrw6l6xc";
+    sha256 = "sha256-5Ijy28LLx1TGnZE6ZNQXPYfvW2KprF+91fKx2MzLEms=";
   };
 
   nativeBuildInputs = [ cmake pkg-config ];
@@ -64,6 +64,6 @@ stdenv.mkDerivation rec {
     homepage = "https://attnam.com/";
     license = licenses.gpl2Plus;
     platforms = platforms.linux;
-    maintainers = with maintainers; [freepotion];
+    maintainers = with maintainers; [];
   };
 }
diff --git a/pkgs/games/legendary-gl/default.nix b/pkgs/games/legendary-gl/default.nix
index cbdfbc22891be..082b9220c0e87 100644
--- a/pkgs/games/legendary-gl/default.nix
+++ b/pkgs/games/legendary-gl/default.nix
@@ -7,13 +7,13 @@
 
 buildPythonApplication rec {
   pname = "legendary-gl"; # Name in pypi
-  version = "0.20.18";
+  version = "0.20.25";
 
   src = fetchFromGitHub {
     owner = "derrod";
     repo = "legendary";
     rev = version;
-    sha256 = "0d31c8grvcw7y3sh2x90cxhj612k6f491w2r12j1q33d2v9sqm4j";
+    sha256 = "07z5ffi7lnvs64pksy30fbfv2i11dkkycyh31vyc4y7fsn1vd0vf";
   };
 
   propagatedBuildInputs = [ requests ];
diff --git a/pkgs/games/liberation-circuit/default.nix b/pkgs/games/liberation-circuit/default.nix
index 478fd606376a4..c1f03e036c9fe 100644
--- a/pkgs/games/liberation-circuit/default.nix
+++ b/pkgs/games/liberation-circuit/default.nix
@@ -64,7 +64,7 @@ stdenv.mkDerivation rec {
       Escape from a hostile computer system! Harvest data to create an armada of battle-processes to aid your escape! Take command directly and play the game as an RTS, or use the game's built-in editor and compiler to write your own unit AI in a simplified version of C.
     '';
     homepage = "https://linleyh.itch.io/liberation-circuit";
-    maintainers = with maintainers; [ angustrau ];
+    maintainers = with maintainers; [ emilytrau ];
     license = licenses.gpl3Only;
     platforms = platforms.linux;
   };
diff --git a/pkgs/games/linthesia/default.nix b/pkgs/games/linthesia/default.nix
new file mode 100644
index 0000000000000..0914722a9acbd
--- /dev/null
+++ b/pkgs/games/linthesia/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, python3, libGL, libGLU
+, alsa-lib, glibmm, sqlite, SDL2, SDL2_ttf_2_0_15, SDL2_image, gtk3, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "linthesia";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "linthesia";
+    repo = "linthesia";
+    rev = version;
+    sha256 = "sha256-bdW0RlV14ttnK8NizfNfXmZ7zlJOqZCpVvt8vT2Pjys=";
+  };
+
+  postPatch = ''
+    patchShebangs meson_post_install.py
+  '';
+
+  nativeBuildInputs = [ meson ninja pkg-config python3 wrapGAppsHook ];
+  buildInputs = [
+    libGL
+    libGLU
+    alsa-lib
+    glibmm
+    sqlite
+    SDL2
+    SDL2_ttf_2_0_15
+    SDL2_image
+    gtk3.out # icon cache
+  ];
+
+  meta = with lib; {
+    description = "A game of playing music using a MIDI keyboard following a MIDI file";
+    inherit (src.meta) homepage;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/lzwolf/default.nix b/pkgs/games/lzwolf/default.nix
new file mode 100644
index 0000000000000..4faa7419b7ab9
--- /dev/null
+++ b/pkgs/games/lzwolf/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, lib, fetchFromBitbucket, p7zip, cmake
+, SDL2, bzip2, zlib, libjpeg
+, libsndfile, mpg123
+, SDL2_net, SDL2_mixer }:
+
+stdenv.mkDerivation rec {
+  pname = "lzwolf";
+  version = "unstable-2022-01-04";
+
+  src = fetchFromBitbucket {
+    owner = "linuxwolf6";
+    repo = "lzwolf";
+    rev = "6e470316382b87378966f441e233760ce0ff478c";
+    sha256 = "sha256-IbZleY2FPyW3ORIGO2YFXQyAf1l9nDthpJjEKTTsilM=";
+  };
+  nativeBuildInputs = [ p7zip cmake ];
+  buildInputs = [
+    SDL2 bzip2 zlib libjpeg SDL2_mixer SDL2_net libsndfile mpg123
+  ];
+
+  cmakeFlags = [
+    "-DCMAKE_BUILD_TYPE=Release"
+    "-DGPL=ON"
+  ];
+
+  doCheck = true;
+
+  installPhase = ''
+    install -Dm755 lzwolf "$out/lib/lzwolf/lzwolf"
+    for i in *.pk3; do
+      install -Dm644 "$i" "$out/lib/lzwolf/$i"
+    done
+    mkdir -p $out/bin
+    ln -s $out/lib/lzwolf/lzwolf $out/bin/lzwolf
+  '';
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/linuxwolf6/lzwolf";
+    description = "Enhanced fork of ECWolf, a Wolfenstein 3D source port";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ tgunnoe ];
+  };
+}
diff --git a/pkgs/games/megaglest/default.nix b/pkgs/games/megaglest/default.nix
index 5f79b86956cc2..30383e5f4067e 100644
--- a/pkgs/games/megaglest/default.nix
+++ b/pkgs/games/megaglest/default.nix
@@ -51,7 +51,7 @@ stdenv.mkDerivation {
   meta = with lib; {
     description = "An entertaining free (freeware and free software) and open source cross-platform 3D real-time strategy (RTS) game";
     license = licenses.gpl3;
-    homepage = "http://megaglest.org/";
+    homepage = "https://megaglest.org/";
     maintainers = [ maintainers.matejc ];
     platforms = platforms.linux;
   };
diff --git a/pkgs/games/minecraft-server/update.sh b/pkgs/games/minecraft-server/update.sh
deleted file mode 100755
index 433a12a9caf62..0000000000000
--- a/pkgs/games/minecraft-server/update.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env nix-shell
-#!nix-shell -i bash -p curl jq common-updater-scripts
-
-BASEDIR="$(dirname "$0")"
-
-# get current release version
-versions=$(curl -s 'https://launchermeta.mojang.com/mc/game/version_manifest.json')
-version=$(echo $versions | jq .latest.release)
-url=$(echo $versions | jq -r ".versions[] | select(.id == $version) | .url")
-
-# get current server.jar
-versions=$(curl -s $url | jq .downloads.server)
-sha1=$(echo $versions | jq .sha1)
-url=$(echo $versions | jq .url)
-
-echo $version: $url:$sha1
-
-# change default.nix
-sed -i "s/version = \"[0-9.]*\";/version = ${version};/g" "$BASEDIR/default.nix"
-sed -i "s+url = \"[a-zA-Z0-9/:.]*/server.jar\";+url = $url;+g" "$BASEDIR/default.nix"
-sed -i "s/sha1 = \"[a-zA-Z0-9]*\";/sha1 = ${sha1};/g" "$BASEDIR/default.nix"
diff --git a/pkgs/games/minecraft-servers/default.nix b/pkgs/games/minecraft-servers/default.nix
new file mode 100644
index 0000000000000..f3d4aad16698e
--- /dev/null
+++ b/pkgs/games/minecraft-servers/default.nix
@@ -0,0 +1,24 @@
+{ callPackage, lib, javaPackages }:
+let
+  versions = lib.importJSON ./versions.json;
+
+  latestVersion = lib.last (builtins.sort lib.versionOlder (builtins.attrNames versions));
+  escapeVersion = builtins.replaceStrings [ "." ] [ "-" ];
+
+  getJavaVersion = v: (builtins.getAttr "openjdk${toString v}" javaPackages.compiler).headless;
+
+  packages = lib.mapAttrs'
+    (version: value: {
+      name = "vanilla-${escapeVersion version}";
+      value = callPackage ./derivation.nix {
+        inherit (value) version url sha1;
+        jre_headless = getJavaVersion (if value.javaVersion == null then 8 else value.javaVersion); # versions <= 1.6 will default to 8
+      };
+    })
+    versions;
+in
+lib.recurseIntoAttrs (
+  packages // {
+    vanilla = builtins.getAttr "vanilla-${escapeVersion latestVersion}" packages;
+  }
+)
diff --git a/pkgs/games/minecraft-server/default.nix b/pkgs/games/minecraft-servers/derivation.nix
index 02054f1ad8b52..eda7da943ca54 100644
--- a/pkgs/games/minecraft-server/default.nix
+++ b/pkgs/games/minecraft-servers/derivation.nix
@@ -1,13 +1,9 @@
-{ lib, stdenv, fetchurl, nixosTests, jre_headless }:
+{ lib, stdenv, fetchurl, nixosTests, jre_headless, version, url, sha1 }:
 stdenv.mkDerivation {
   pname = "minecraft-server";
-  version = "1.18.1";
+  inherit version;
 
-  src = fetchurl {
-    url = "https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar";
-    # sha1 because that comes from mojang via api
-    sha1 = "125e5adf40c659fd3bce3e66e67a16bb49ecc1b9";
-  };
+  src = fetchurl { inherit url sha1; };
 
   preferLocalBuild = true;
 
@@ -27,7 +23,7 @@ stdenv.mkDerivation {
 
   passthru = {
     tests = { inherit (nixosTests) minecraft-server; };
-    updateScript = ./update.sh;
+    updateScript = ./update.py;
   };
 
   meta = with lib; {
@@ -35,6 +31,6 @@ stdenv.mkDerivation {
     homepage = "https://minecraft.net";
     license = licenses.unfreeRedistributable;
     platforms = platforms.unix;
-    maintainers = with maintainers; [ thoughtpolice tomberek costrouc ];
+    maintainers = with maintainers; [ thoughtpolice tomberek costrouc jyooru ];
   };
 }
diff --git a/pkgs/games/minecraft-servers/update.py b/pkgs/games/minecraft-servers/update.py
new file mode 100755
index 0000000000000..0e7f10a8c9323
--- /dev/null
+++ b/pkgs/games/minecraft-servers/update.py
@@ -0,0 +1,156 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p python3Packages.requests python3Packages.dataclasses-json
+
+import json
+from dataclasses import dataclass, field
+from datetime import datetime
+from pathlib import Path
+from typing import Any, Dict, List, Optional
+
+import requests
+from dataclasses_json import DataClassJsonMixin, LetterCase, config
+from marshmallow import fields
+
+
+@dataclass
+class Download(DataClassJsonMixin):
+    sha1: str
+    size: int
+    url: str
+
+
+@dataclass
+class Version(DataClassJsonMixin):
+    id: str
+    type: str
+    url: str
+    time: datetime = field(
+        metadata=config(
+            encoder=datetime.isoformat,
+            decoder=datetime.fromisoformat,
+            mm_field=fields.DateTime(format="iso"),
+        )
+    )
+    release_time: datetime = field(
+        metadata=config(
+            encoder=datetime.isoformat,
+            decoder=datetime.fromisoformat,
+            mm_field=fields.DateTime(format="iso"),
+            letter_case=LetterCase.CAMEL,
+        )
+    )
+
+    def get_manifest(self) -> Any:
+        """Return the version's manifest."""
+        response = requests.get(self.url)
+        response.raise_for_status()
+        return response.json()
+
+    def get_downloads(self) -> Dict[str, Download]:
+        """
+        Return all downloadable files from the version's manifest, in Download
+        objects.
+        """
+        return {
+            download_name: Download.from_dict(download_info)
+            for download_name, download_info in self.get_manifest()["downloads"].items()
+        }
+
+    def get_java_version(self) -> Any:
+        """
+        Return the java version specified in a version's manifest, if it is
+        present. Versions <= 1.6 do not specify this.
+        """
+        return self.get_manifest().get("javaVersion", {}).get("majorVersion", None)
+
+    def get_server(self) -> Optional[Download]:
+        """
+        If the version has a server download available, return the Download
+        object for the server download. If the version does not have a server
+        download avilable, return None.
+        """
+        downloads = self.get_downloads()
+        if "server" in downloads:
+            return downloads["server"]
+        return None
+
+
+def get_versions() -> List[Version]:
+    """Return a list of Version objects for all available versions."""
+    response = requests.get(
+        "https://launchermeta.mojang.com/mc/game/version_manifest.json"
+    )
+    response.raise_for_status()
+    data = response.json()
+    return [Version.from_dict(version) for version in data["versions"]]
+
+
+def get_major_release(version_id: str) -> str:
+    """
+    Return the major release for a version. The major release for 1.17 and
+    1.17.1 is 1.17.
+    """
+    if not len(version_id.split(".")) >= 2:
+        raise ValueError(f"version not in expected format: '{version_id}'")
+    return ".".join(version_id.split(".")[:2])
+
+
+def group_major_releases(releases: List[Version]) -> Dict[str, List[Version]]:
+    """
+    Return a dictionary containing each version grouped by each major release.
+    The key "1.17" contains a list with two Version objects, one for "1.17"
+    and another for "1.17.1".
+    """
+    groups: Dict[str, List[Version]] = {}
+    for release in releases:
+        major_release = get_major_release(release.id)
+        if major_release not in groups:
+            groups[major_release] = []
+        groups[major_release].append(release)
+    return groups
+
+
+def get_latest_major_releases(releases: List[Version]) -> Dict[str, Version]:
+    """
+    Return a dictionary containing the latest version for each major release.
+    The latest major release for 1.16 is 1.16.5, so the key "1.16" contains a
+    Version object for 1.16.5.
+    """
+    return {
+        major_release: sorted(releases, key=lambda x: x.id, reverse=True)[0]
+        for major_release, releases in group_major_releases(releases).items()
+    }
+
+
+def generate() -> Dict[str, Dict[str, str]]:
+    """
+    Return a dictionary containing the latest url, sha1 and version for each major
+    release.
+    """
+    versions = get_versions()
+    releases = list(
+        filter(lambda version: version.type == "release", versions)
+    )  # remove snapshots and betas
+    latest_major_releases = get_latest_major_releases(releases)
+
+    servers = {
+        version: Download.schema().dump(download_info)  # Download -> dict
+        for version, download_info in {
+            version: value.get_server()
+            for version, value in latest_major_releases.items()
+        }.items()
+        if download_info is not None  # versions < 1.2 do not have a server
+    }
+    for server in servers.values():
+        del server["size"]  # don't need it
+
+    for version, server in servers.items():
+        server["version"] = latest_major_releases[version].id
+        server["javaVersion"] = latest_major_releases[version].get_java_version()
+    return servers
+
+
+if __name__ == "__main__":
+    with open(Path(__file__).parent / "versions.json", "w") as file:
+        json.dump(generate(), file, indent=2)
+        file.write("\n")
diff --git a/pkgs/games/minecraft-servers/versions.json b/pkgs/games/minecraft-servers/versions.json
new file mode 100644
index 0000000000000..ba0b652a6bdc4
--- /dev/null
+++ b/pkgs/games/minecraft-servers/versions.json
@@ -0,0 +1,104 @@
+{
+  "1.18": {
+    "url": "https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar",
+    "sha1": "125e5adf40c659fd3bce3e66e67a16bb49ecc1b9",
+    "version": "1.18.1",
+    "javaVersion": 17
+  },
+  "1.17": {
+    "url": "https://launcher.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar",
+    "sha1": "a16d67e5807f57fc4e550299cf20226194497dc2",
+    "version": "1.17.1",
+    "javaVersion": 16
+  },
+  "1.16": {
+    "url": "https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar",
+    "sha1": "1b557e7b033b583cd9f66746b7a9ab1ec1673ced",
+    "version": "1.16.5",
+    "javaVersion": 8
+  },
+  "1.15": {
+    "url": "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar",
+    "sha1": "bb2b6b1aefcd70dfd1892149ac3a215f6c636b07",
+    "version": "1.15.2",
+    "javaVersion": 8
+  },
+  "1.14": {
+    "url": "https://launcher.mojang.com/v1/objects/3dc3d84a581f14691199cf6831b71ed1296a9fdf/server.jar",
+    "sha1": "3dc3d84a581f14691199cf6831b71ed1296a9fdf",
+    "version": "1.14.4",
+    "javaVersion": 8
+  },
+  "1.13": {
+    "url": "https://launcher.mojang.com/v1/objects/3737db93722a9e39eeada7c27e7aca28b144ffa7/server.jar",
+    "sha1": "3737db93722a9e39eeada7c27e7aca28b144ffa7",
+    "version": "1.13.2",
+    "javaVersion": 8
+  },
+  "1.12": {
+    "url": "https://launcher.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar",
+    "sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f",
+    "version": "1.12.2",
+    "javaVersion": 8
+  },
+  "1.11": {
+    "url": "https://launcher.mojang.com/v1/objects/f00c294a1576e03fddcac777c3cf4c7d404c4ba4/server.jar",
+    "sha1": "f00c294a1576e03fddcac777c3cf4c7d404c4ba4",
+    "version": "1.11.2",
+    "javaVersion": 8
+  },
+  "1.10": {
+    "url": "https://launcher.mojang.com/v1/objects/3d501b23df53c548254f5e3f66492d178a48db63/server.jar",
+    "sha1": "3d501b23df53c548254f5e3f66492d178a48db63",
+    "version": "1.10.2",
+    "javaVersion": 8
+  },
+  "1.9": {
+    "url": "https://launcher.mojang.com/v1/objects/edbb7b1758af33d365bf835eb9d13de005b1e274/server.jar",
+    "sha1": "edbb7b1758af33d365bf835eb9d13de005b1e274",
+    "version": "1.9.4",
+    "javaVersion": 8
+  },
+  "1.8": {
+    "url": "https://launcher.mojang.com/v1/objects/b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd/server.jar",
+    "sha1": "b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd",
+    "version": "1.8.9",
+    "javaVersion": 8
+  },
+  "1.7": {
+    "url": "https://launcher.mojang.com/v1/objects/4cec86a928ec171fdc0c6b40de2de102f21601b5/server.jar",
+    "sha1": "4cec86a928ec171fdc0c6b40de2de102f21601b5",
+    "version": "1.7.9",
+    "javaVersion": 8
+  },
+  "1.6": {
+    "url": "https://launcher.mojang.com/v1/objects/050f93c1f3fe9e2052398f7bd6aca10c63d64a87/server.jar",
+    "sha1": "050f93c1f3fe9e2052398f7bd6aca10c63d64a87",
+    "version": "1.6.4",
+    "javaVersion": null
+  },
+  "1.5": {
+    "url": "https://launcher.mojang.com/v1/objects/f9ae3f651319151ce99a0bfad6b34fa16eb6775f/server.jar",
+    "sha1": "f9ae3f651319151ce99a0bfad6b34fa16eb6775f",
+    "version": "1.5.2",
+    "javaVersion": null
+  },
+  "1.4": {
+    "url": "https://launcher.mojang.com/v1/objects/2f0ec8efddd2f2c674c77be9ddb370b727dec676/server.jar",
+    "sha1": "2f0ec8efddd2f2c674c77be9ddb370b727dec676",
+    "version": "1.4.7",
+    "javaVersion": null
+  },
+  "1.3": {
+    "url": "https://launcher.mojang.com/v1/objects/3de2ae6c488135596e073a9589842800c9f53bfe/server.jar",
+    "sha1": "3de2ae6c488135596e073a9589842800c9f53bfe",
+    "version": "1.3.2",
+    "javaVersion": null
+  },
+  "1.2": {
+    "url": "https://launcher.mojang.com/v1/objects/d8321edc9470e56b8ad5c67bbd16beba25843336/server.jar",
+    "sha1": "d8321edc9470e56b8ad5c67bbd16beba25843336",
+    "version": "1.2.5",
+    "javaVersion": null
+  }
+}
diff --git a/pkgs/games/minetest/default.nix b/pkgs/games/minetest/default.nix
index 7ffa361da559c..9e94bb6a4a7dc 100644
--- a/pkgs/games/minetest/default.nix
+++ b/pkgs/games/minetest/default.nix
@@ -1,7 +1,8 @@
 { lib, stdenv, fetchFromGitHub, cmake, irrlicht, libpng, bzip2, curl, libogg, jsoncpp
 , libjpeg, libXxf86vm, libGLU, libGL, openal, libvorbis, sqlite, luajit
 , freetype, gettext, doxygen, ncurses, graphviz, xorg, gmp, libspatialindex
-, leveldb, postgresql, hiredis, libiconv, OpenGL, OpenAL ? openal, Carbon, Cocoa
+, leveldb, postgresql, hiredis, libiconv, zlib, libXrandr, libX11, ninja, prometheus-cpp
+, OpenGL, OpenAL ? openal, Carbon, Cocoa
 }:
 
 with lib;
@@ -9,6 +10,21 @@ with lib;
 let
   boolToCMake = b: if b then "ON" else "OFF";
 
+  irrlichtMt = stdenv.mkDerivation rec {
+    pname = "irrlichtMt";
+    version = "1.9.0mt4";
+    src = fetchFromGitHub {
+      owner = "minetest";
+      repo = "irrlicht";
+      rev = version;
+      sha256 = "sha256-YlXn9LrfGkjdb8+zQGDgrInolUYj9nVSF2AXWFpEEkw=";
+    };
+    nativeBuildInputs = [ cmake ];
+    buildInputs = [ zlib libjpeg libpng libGLU libGL libXrandr libX11 libXxf86vm ];
+    outputs = [ "out" "dev" ];
+    meta = irrlicht.meta;
+  };
+
   generic = { version, rev ? version, sha256, dataRev ? version, dataSha256, buildClient ? true, buildServer ? false }: let
     sources = {
       src = fetchFromGitHub {
@@ -30,29 +46,41 @@ let
     src = sources.src;
 
     cmakeFlags = [
+      "-G Ninja"
       "-DBUILD_CLIENT=${boolToCMake buildClient}"
       "-DBUILD_SERVER=${boolToCMake buildServer}"
-      "-DENABLE_FREETYPE=1"
       "-DENABLE_GETTEXT=1"
+      "-DENABLE_SPATIAL=1"
       "-DENABLE_SYSTEM_JSONCPP=1"
-      "-DIRRLICHT_INCLUDE_DIR=${irrlicht}/include/irrlicht"
+      "-DIRRLICHT_INCLUDE_DIR=${irrlichtMt.dev}/include/irrlicht"
+
+      # Remove when https://github.com/NixOS/nixpkgs/issues/144170 is fixed
+      "-DCMAKE_INSTALL_BINDIR=bin"
+      "-DCMAKE_INSTALL_DATADIR=share"
+      "-DCMAKE_INSTALL_DOCDIR=share/doc"
+      "-DCMAKE_INSTALL_DOCDIR=share/doc"
+      "-DCMAKE_INSTALL_MANDIR=share/man"
+      "-DCMAKE_INSTALL_LOCALEDIR=share/locale"
+
     ] ++ optionals buildClient [
       "-DOpenGL_GL_PREFERENCE=GLVND"
+    ] ++ optionals buildServer [
+      "-DENABLE_PROMETHEUS=1"
     ];
 
     NIX_CFLAGS_COMPILE = "-DluaL_reg=luaL_Reg"; # needed since luajit-2.1.0-beta3
 
-    nativeBuildInputs = [ cmake doxygen graphviz ];
+    nativeBuildInputs = [ cmake doxygen graphviz ninja ];
 
     buildInputs = [
-      irrlicht luajit jsoncpp gettext freetype sqlite curl bzip2 ncurses
+      irrlichtMt luajit jsoncpp gettext freetype sqlite curl bzip2 ncurses
       gmp libspatialindex
     ] ++ optionals stdenv.isDarwin [
       libiconv OpenGL OpenAL Carbon Cocoa
     ] ++ optionals buildClient [
       libpng libjpeg libGLU libGL openal libogg libvorbis xorg.libX11 libXxf86vm
     ] ++ optionals buildServer [
-      leveldb postgresql hiredis
+      leveldb postgresql hiredis prometheus-cpp
     ];
 
     postInstall = ''
@@ -66,25 +94,20 @@ let
       license = licenses.lgpl21Plus;
       platforms = platforms.linux ++ platforms.darwin;
       maintainers = with maintainers; [ pyrolagus fpletz ];
+      # never built on Hydra
+      # https://hydra.nixos.org/job/nixpkgs/trunk/minetestclient_4.x86_64-darwin
+      # https://hydra.nixos.org/job/nixpkgs/trunk/minetestserver_4.x86_64-darwin
+      broken = (lib.versionOlder version "5.0.0") && stdenv.isDarwin;
     };
   };
 
-  v4 = {
-    version = "0.4.17.1";
-    sha256 = "19sfblgh9mchkgw32n7gdvm7a8a9jxsl9cdlgmxn9bk9m939a2sg";
-    dataSha256 = "1g8iw2pya32ifljbdx6z6rpcinmzm81i9minhi2bi1d500ailn7s";
-  };
-
   v5 = {
-    version = "5.4.1";
-    sha256 = "062ilb7s377q3hwfhl8q06vvcw2raydz5ljzlzwy2dmyzmdcndb8";
-    dataSha256 = "0i45lbnikvgj9kxdp0yphpjjwjcgp4ibn49xkj78j5ic1s9n8jd4";
+    version = "5.5.0";
+    sha256 = "sha256-V+ggqvZibSQrJbrtNCEkmRYHhgSKTQsdBh3c8+t6WeA=";
+    dataSha256 = "sha256-6ZS3EET3nm09eL0czCGadwzon35/EBfAg2KjPX3ZP/0=";
   };
 
 in {
-  minetestclient_4 = generic (v4 // { buildClient = true; buildServer = false; });
-  minetestserver_4 = generic (v4 // { buildClient = false; buildServer = true; });
-
   minetestclient_5 = generic (v5 // { buildClient = true; buildServer = false; });
   minetestserver_5 = generic (v5 // { buildClient = false; buildServer = true; });
 }
diff --git a/pkgs/games/minetest/disable_fixup.patch b/pkgs/games/minetest/disable_fixup.patch
deleted file mode 100644
index 1c378d7f83fcb..0000000000000
--- a/pkgs/games/minetest/disable_fixup.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -802,7 +802,6 @@
- 		install(CODE "
- 			set(BU_CHMOD_BUNDLE_ITEMS ON)
- 			include(BundleUtilities)
--			fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
- 		" COMPONENT Runtime)
- 	endif()
- 
diff --git a/pkgs/games/minetest/fix_wordsize_confusion.patch b/pkgs/games/minetest/fix_wordsize_confusion.patch
deleted file mode 100644
index 9540a434dafe3..0000000000000
--- a/pkgs/games/minetest/fix_wordsize_confusion.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/src/main.cpp
-+++ b/src/main.cpp
-@@ -17,6 +17,7 @@
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- 
-+#include <cstdint>
- #include "irrlicht.h" // createDevice
- #include "irrlichttypes_extrabloated.h"
- #include "chat_interface.h"
diff --git a/pkgs/games/moon-buggy/default.nix b/pkgs/games/moon-buggy/default.nix
index b623d7bd53969..12eb6b24a806c 100644
--- a/pkgs/games/moon-buggy/default.nix
+++ b/pkgs/games/moon-buggy/default.nix
@@ -1,16 +1,15 @@
 {lib, stdenv, fetchurl, ncurses}:
 
 stdenv.mkDerivation rec {
-  baseName = "moon-buggy";
+  pname = "moon-buggy";
   version = "1.0.51";
-  name = "${baseName}-${version}";
 
   buildInputs = [
     ncurses
   ];
 
   src = fetchurl {
-    url = "http://m.seehuhn.de/programs/${name}.tar.gz";
+    url = "http://m.seehuhn.de/programs/moon-buggy-${version}.tar.gz";
     sha256 = "0gyjwlpx0sd728dwwi7pwks4zfdy9rm1w1xbhwg6zip4r9nc2b9m";
   };
 
diff --git a/pkgs/games/mudlet/default.nix b/pkgs/games/mudlet/default.nix
index aacc15d19b975..46ae45b2202b3 100644
--- a/pkgs/games/mudlet/default.nix
+++ b/pkgs/games/mudlet/default.nix
@@ -1,5 +1,25 @@
-{ fetchFromGitHub, lib, stdenv, wrapQtAppsHook, git, pcre, pugixml, qtbase, libsForQt5, libsecret, qtmultimedia, qttools, yajl, libzip, hunspell
-, boost, libGLU, lua, cmake,  which, pkg-config, }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, git
+, pkg-config
+, qttools
+, which
+, wrapQtAppsHook
+, boost
+, hunspell
+, libGLU
+, libsForQt5
+, libsecret
+, libzip
+, lua
+, pcre
+, pugixml
+, qtbase
+, qtmultimedia
+, yajl
+}:
 
 let
   luaEnv = lua.withPackages(ps: with ps; [
@@ -8,25 +28,46 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "mudlet";
-  version = "4.12.0";
+  version = "4.15.1";
 
   src = fetchFromGitHub {
     owner = "Mudlet";
     repo = "Mudlet";
     rev = "Mudlet-${version}";
     fetchSubmodules = true;
-    sha256 = "023plm5mwm15xikmdh1mq3gx1n7y4a0r0kw9fvk3rvm9brm78hzp";
+    hash = "sha256-GnTQc0Jh4YaQnfy7fYsTCACczlzWCQ+auKYoU9ET83M=";
   };
 
-  nativeBuildInputs = [ pkg-config cmake wrapQtAppsHook git qttools which ];
+  nativeBuildInputs = [
+    cmake
+    git
+    pkg-config
+    qttools
+    which
+    wrapQtAppsHook
+  ];
+
   buildInputs = [
-    pcre pugixml qtbase libsForQt5.qtkeychain qtmultimedia luaEnv libsecret libzip libGLU yajl boost hunspell
+    boost
+    hunspell
+    libGLU
+    libsForQt5.qtkeychain
+    libsecret
+    libzip
+    luaEnv
+    pcre
+    pugixml
+    qtbase
+    qtmultimedia
+    yajl
   ];
 
   WITH_FONTS = "NO";
   WITH_UPDATER = "NO";
 
   installPhase =  ''
+    runHook preInstall
+
     mkdir -pv $out/lib
     cp 3rdparty/edbee-lib/edbee-lib/qslog/lib/libQsLog.so $out/lib
     mkdir -pv $out/bin
@@ -41,15 +82,19 @@ stdenv.mkDerivation rec {
     cp -r ../mudlet.png $out/share/pixmaps/
 
     makeQtWrapper $out/mudlet $out/bin/mudlet \
+      --set LUA_CPATH "${luaEnv}/lib/lua/${lua.luaversion}/?.so" \
+      --prefix LUA_PATH : "$NIX_LUA_PATH" \
       --prefix LD_LIBRARY_PATH : "${libsForQt5.qtkeychain}/lib/" \
       --run "cd $out";
+
+    runHook postInstall
   '';
 
   meta = with lib; {
     description = "Crossplatform mud client";
-    homepage = "https://mudlet.org";
+    homepage = "https://www.mudlet.org/";
     maintainers = [ maintainers.wyvie maintainers.pstn ];
     platforms = platforms.linux;
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
   };
 }
diff --git a/pkgs/games/multimc/0001-pick-latest-java-first.patch b/pkgs/games/multimc/0001-pick-latest-java-first.patch
deleted file mode 100644
index a65dcbfd037d6..0000000000000
--- a/pkgs/games/multimc/0001-pick-latest-java-first.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 44e1b2a19a869b907b40e56c85c8a47aa6c22097 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Mustafa=20=C3=87al=C4=B1=C5=9Fkan?= <musfay@protonmail.com>
-Date: Tue, 22 Jun 2021 21:50:11 +0300
-Subject: [PATCH] pick latest java first
-
----
- launcher/java/JavaInstallList.cpp | 4 ++--
- launcher/java/JavaUtils.cpp       | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp
-index 0bded03c..40898e20 100644
---- a/launcher/java/JavaInstallList.cpp
-+++ b/launcher/java/JavaInstallList.cpp
-@@ -120,8 +120,8 @@ void JavaInstallList::updateListData(QList<BaseVersionPtr> versions)
- 
- bool sortJavas(BaseVersionPtr left, BaseVersionPtr right)
- {
--    auto rleft = std::dynamic_pointer_cast<JavaInstall>(left);
--    auto rright = std::dynamic_pointer_cast<JavaInstall>(right);
-+    auto rleft = std::dynamic_pointer_cast<JavaInstall>(right);
-+    auto rright = std::dynamic_pointer_cast<JavaInstall>(left);
-     return (*rleft) > (*rright);
- }
- 
-diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp
-index 5f004a10..6d633631 100644
---- a/launcher/java/JavaUtils.cpp
-+++ b/launcher/java/JavaUtils.cpp
-@@ -350,7 +350,6 @@ QList<QString> JavaUtils::FindJavaPaths()
-     qDebug() << "Linux Java detection incomplete - defaulting to \"java\"";
- 
-     QList<QString> javas;
--    javas.append(this->GetDefaultJava()->path);
-     auto scanJavaDir = [&](const QString & dirPath)
-     {
-         QDir dir(dirPath);
-@@ -379,6 +378,7 @@ QList<QString> JavaUtils::FindJavaPaths()
-     // general locations used by distro packaging
-     scanJavaDir("/usr/lib/jvm");
-     scanJavaDir("/usr/lib32/jvm");
-+    javas.append(this->GetDefaultJava()->path);
-     // javas stored in MultiMC's folder
-     scanJavaDir("java");
-     return javas;
--- 
-2.31.1
-
diff --git a/pkgs/games/multimc/default.nix b/pkgs/games/multimc/default.nix
deleted file mode 100644
index 732a66ef8b419..0000000000000
--- a/pkgs/games/multimc/default.nix
+++ /dev/null
@@ -1,56 +0,0 @@
-{ lib, mkDerivation, fetchFromGitHub, cmake, jdk8, jdk, zlib, file, makeWrapper, xorg, libpulseaudio, qtbase, libGL, msaClientID ? "" }:
-
-let
-  libpath = with xorg; lib.makeLibraryPath [ libX11 libXext libXcursor libXrandr libXxf86vm libpulseaudio libGL ];
-in mkDerivation rec {
-  pname = "multimc";
-  version = "unstable-2021-09-08";
-  src = fetchFromGitHub {
-    owner = "MultiMC";
-    repo = "MultiMC5";
-    rev = "e2355eb276bf355ca4acf526a0f3cc390aa88f8b";
-    sha256 = "3G9QPoAbC+uVfUYR0Kq6hnxl9c2mvCzIEYGjwfarQJ8=";
-    fetchSubmodules = true;
-  };
-  nativeBuildInputs = [ cmake file makeWrapper ];
-  buildInputs = [ qtbase jdk8 zlib ];
-
-  patches = [ ./0001-pick-latest-java-first.patch ];
-
-  postPatch = ''
-    # hardcode jdk paths
-    substituteInPlace launcher/java/JavaUtils.cpp \
-      --replace 'scanJavaDir("/usr/lib/jvm")' 'javas.append("${jdk}/lib/openjdk/bin/java")' \
-      --replace 'scanJavaDir("/usr/lib32/jvm")' 'javas.append("${jdk8}/lib/openjdk/bin/java")'
-
-    # add client ID
-    substituteInPlace notsecrets/Secrets.cpp \
-      --replace 'QString MSAClientID = "";' 'QString MSAClientID = "${msaClientID}";'
-  '';
-
-  cmakeFlags = [ "-DMultiMC_LAYOUT=lin-system" ];
-
-  postInstall = ''
-    install -Dm644 ../launcher/resources/multimc/scalable/multimc.svg $out/share/pixmaps/multimc.svg
-    install -Dm755 ../launcher/package/linux/multimc.desktop $out/share/applications/multimc.desktop
-
-    # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128
-    wrapProgram $out/bin/multimc \
-      --set GAME_LIBRARY_PATH /run/opengl-driver/lib:${libpath} \
-      --prefix PATH : ${lib.makeBinPath [ xorg.xrandr ]}
-  '';
-
-  meta = with lib; {
-    homepage = "https://multimc.org/";
-    description = "A free, open source launcher for Minecraft";
-    longDescription = ''
-      Allows you to have multiple, separate instances of Minecraft (each with their own mods, texture packs, saves, etc) and helps you manage them and their associated options with a simple interface.
-    '';
-    platforms = platforms.linux;
-    license = licenses.asl20;
-    # upstream don't want us to re-distribute this application:
-    # https://github.com/NixOS/nixpkgs/issues/131983
-    hydraPlatforms = [];
-    maintainers = with maintainers; [ cleverca22 starcraft66 ];
-  };
-}
diff --git a/pkgs/games/n2048/default.nix b/pkgs/games/n2048/default.nix
index b3d06a51fd3c8..ec3a4e2bbeecf 100644
--- a/pkgs/games/n2048/default.nix
+++ b/pkgs/games/n2048/default.nix
@@ -1,35 +1,26 @@
-{lib, stdenv, fetchurl, ncurses}:
-let
-  s =
-  rec {
-    baseName = "n2048";
-    version = "0.1";
-    name = "${baseName}-${version}";
-    url = "http://www.dettus.net/n2048/${baseName}_v${version}.tar.gz";
+{ lib, stdenv, fetchurl, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "n2048";
+  version = "0.1";
+  src = fetchurl {
+    url = "http://www.dettus.net/n2048/n2048_v${version}.tar.gz";
     sha256 = "184z2rr0rnj4p740qb4mzqr6kgd76ynb5gw9bj8hrfshcxdcg1kk";
   };
   buildInputs = [
     ncurses
   ];
-in
-stdenv.mkDerivation {
-  inherit (s) name version;
-  inherit buildInputs;
-  src = fetchurl {
-    inherit (s) url sha256;
-  };
   makeFlags = [
     "DESTDIR=$(out)"
   ];
   preInstall = ''
     mkdir -p "$out"/{share/man,bin}
   '';
-  meta = {
-    inherit (s) version;
+  meta = with lib; {
     description = "Console implementation of 2048 game";
-    license = lib.licenses.bsd2;
-    maintainers = [lib.maintainers.raskin];
-    platforms = lib.platforms.linux;
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
     homepage = "http://www.dettus.net/n2048/";
   };
 }
diff --git a/pkgs/games/nethack/default.nix b/pkgs/games/nethack/default.nix
index f9939f063c809..2b29bddad93ca 100644
--- a/pkgs/games/nethack/default.nix
+++ b/pkgs/games/nethack/default.nix
@@ -20,9 +20,9 @@ let
 
 in stdenv.mkDerivation rec {
   version = "3.6.6";
-  name = if x11Mode then "nethack-x11-${version}"
-         else if qtMode then "nethack-qt-${version}"
-         else "nethack-${version}";
+  pname = if x11Mode then "nethack-x11"
+         else if qtMode then "nethack-qt"
+         else "nethack";
 
   src = fetchurl {
     url = "https://nethack.org/download/${version}/nethack-${lib.replaceStrings ["."] [""] version}-src.tgz";
diff --git a/pkgs/games/nottetris2/default.nix b/pkgs/games/nottetris2/default.nix
deleted file mode 100644
index 179673c05b633..0000000000000
--- a/pkgs/games/nottetris2/default.nix
+++ /dev/null
@@ -1,49 +0,0 @@
-{ lib, stdenv, fetchFromGitHub, zip, love_0_7, makeWrapper, makeDesktopItem }:
-
-let
-  pname = "nottetris2";
-  version = "2.0";
-
-  desktopItem = makeDesktopItem {
-    name = "nottetris2";
-    exec = pname;
-    comment = "It's like tetris, but it's not";
-    desktopName = "nottetris2";
-    genericName = "nottetris2";
-    categories = "Game";
-  };
-
-in
-
-stdenv.mkDerivation {
-  inherit pname version;
-
-  src = fetchFromGitHub {
-    owner = "Stabyourself";
-    repo = pname;
-    rev = "v${version}";
-    sha256 = "17iabh6rr8jim70n96rbhif4xq02g2kppscm8l339yqx6mhb64hs";
-  };
-
-  nativeBuildInputs = [ zip makeWrapper ];
-  buildInputs = [ love_0_7 ];
-
-  installPhase =
-  ''
-    mkdir -p $out/bin $out/share/games/lovegames $out/share/applications
-    zip -9 -r ${pname}.love ./*
-    mv ${pname}.love $out/share/games/lovegames/${pname}.love
-    makeWrapper ${love_0_7}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
-    ln -s ${desktopItem}/share/applications/* $out/share/applications/
-    chmod +x $out/bin/${pname}
-  '';
-
-  meta = with lib; {
-    description = "It's like Tetris, but it's not";
-    platforms = platforms.linux;
-    license = licenses.wtfpl;
-    maintainers = with maintainers; [ yorickvp ];
-    downloadPage = "https://stabyourself.net/nottetris2/";
-  };
-
-}
diff --git a/pkgs/games/npush/default.nix b/pkgs/games/npush/default.nix
new file mode 100644
index 0000000000000..d4124557f6e6d
--- /dev/null
+++ b/pkgs/games/npush/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+}:
+
+stdenv.mkDerivation rec {
+  pname = "npush";
+  version = "0.7";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/npush/${pname}/${version}/${pname}-${version}.tgz";
+    hash = "sha256-8hbSsyeehzd4T3fUhDyebyI/oTHOHr3a8ArYAquivNk=";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  buildInputs = [
+    ncurses
+  ];
+
+  dontConfigure = true;
+
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}c++"
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/npush/levels $doc/share/doc/npush
+    cp npush $out/bin/
+    cp levels/* $out/share/npush/levels
+    cp CHANGES COPYING CREDITS index.html \
+       readme.txt screenshot1.png screenshot2.png $doc/share/doc/npush/
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "http://npush.sourceforge.net/";
+    description = "A Sokoban-like game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/pkgs/games/npush/run.nix b/pkgs/games/npush/run.nix
new file mode 100644
index 0000000000000..bc4a3b5fda3f2
--- /dev/null
+++ b/pkgs/games/npush/run.nix
@@ -0,0 +1,31 @@
+{ runtimeShell
+, symlinkJoin
+, writeShellScriptBin
+, npush
+}:
+
+let
+  runScript = writeShellScriptBin "run-npush" ''
+    set -euo pipefail
+    CWD=$(pwd)
+
+    if [ -d "./levels" ]; then
+      echo "Directory ./levels found; skipping levelset copy"
+    else
+      echo "Directory ./levels not found; copying the official levelset to the current directory"
+      mkdir -p ./levels
+      cp ${npush}/share/npush/levels/* levels/
+      chmod 644 levels/*
+    fi
+    echo "Now calling npush"
+    exec "${npush}/bin/npush"
+  '';
+in
+symlinkJoin {
+  name = "run-npush-${npush.version}";
+
+  paths = [
+    npush
+    runScript
+  ];
+}
diff --git a/pkgs/games/nxengine-evo/default.nix b/pkgs/games/nxengine-evo/default.nix
index e3df235b75732..4660423a35094 100644
--- a/pkgs/games/nxengine-evo/default.nix
+++ b/pkgs/games/nxengine-evo/default.nix
@@ -1,6 +1,7 @@
 { lib, stdenv
 , fetchpatch
 , fetchurl
+, fetchFromGitHub
 , cmake
 , libpng
 , SDL2
@@ -10,9 +11,11 @@
 stdenv.mkDerivation rec {
   pname = "nxengine-evo";
   version = "2.6.4";
-  src = fetchurl {
-    url = "https://github.com/nxengine/nxengine-evo/archive/v${version}.tar.gz";
-    sha256 = "1xir74l0vrzrpyl7sfqfxp083dakbix26hd0arwf2y57w1mbjas8";
+  src = fetchFromGitHub {
+    owner = "nxengine";
+    repo = "nxengine-evo";
+    rev = "v${version}";
+    sha256 = "sha256-krK2b1E5JUMxRoEWmb3HZMNSIHfUUGXSpyb4/Zdp+5A=";
   };
   assets = fetchurl {
     url = "https://github.com/nxengine/nxengine-evo/releases/download/v${version}/NXEngine-v${version}-Linux.tar.xz";
diff --git a/pkgs/games/openra/common.nix b/pkgs/games/openra/common.nix
index 41c903e101167..01bd44ee244ab 100644
--- a/pkgs/games/openra/common.nix
+++ b/pkgs/games/openra/common.nix
@@ -2,7 +2,7 @@
     and out-of-tree mod packages (mod.nix).
 */
 { lib, makeSetupHook, curl, unzip, dos2unix, pkg-config, makeWrapper
-, lua, mono, dotnetPackages, python
+, lua, mono, dotnetPackages, python2
 , libGL, freetype, openal, SDL2
 , zenity
 }:
@@ -10,7 +10,7 @@
 with lib;
 
 let
-  path = makeBinPath ([ mono python ] ++ optional (zenity != null) zenity);
+  path = makeBinPath ([ mono python2 ] ++ optional (zenity != null) zenity);
   rpath = makeLibraryPath [ lua freetype openal SDL2 ];
   mkdirp = makeSetupHook { } ./mkdirp.sh;
 
@@ -66,7 +66,7 @@ in {
       makeWrapper
       mkdirp
       mono
-      python
+      python2
     ];
 
     makeFlags = [ "prefix=$(out)" ];
diff --git a/pkgs/games/opensupaplex/default.nix b/pkgs/games/opensupaplex/default.nix
new file mode 100644
index 0000000000000..44fc219bef917
--- /dev/null
+++ b/pkgs/games/opensupaplex/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchurl
+, makeDesktopItem
+, copyDesktopItems
+, testVersion
+, opensupaplex
+, SDL2
+, SDL2_mixer
+}:
+
+let
+  # Doesn't seem to be included in tagged releases, but does exist on master.
+  icon = fetchurl {
+    url = "https://raw.githubusercontent.com/sergiou87/open-supaplex/b102548699cf16910b59559f689ecfad88d2a7d2/open-supaplex.svg";
+    sha256 = "sha256-nKeSBUGjSulbEP7xxc6smsfCRjyc/xsLykH0o3Rq5wo=";
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "opensupaplex";
+  version = "7.1.2";
+
+  src = fetchFromGitHub {
+    owner = "sergiou87";
+    repo = "open-supaplex";
+    rev = "v${version}";
+    sha256 = "sha256-hP8dJlLXE5J/oxPhRkrrBl1Y5e9MYbJKi8OApFM3+GU=";
+  };
+
+  nativeBuildInputs = [
+    SDL2 # For "sdl2-config"
+    copyDesktopItems
+  ];
+  buildInputs = [ SDL2_mixer ];
+
+  enableParallelBuilding = true;
+
+  NIX_CFLAGS_COMPILE = [
+    "-DFILE_DATA_PATH=${placeholder "out"}/lib/opensupaplex"
+    "-DFILE_FHS_XDG_DIRS"
+  ];
+
+  preBuild = ''
+    # Makefile is located in this directory
+    pushd linux
+  '';
+
+  postBuild = ''
+    popd
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{bin,lib,share/icons/hicolor/scalable/apps}
+
+    install -D ./linux/opensupaplex $out/bin/opensupaplex
+    cp -R ./resources $out/lib/opensupaplex
+    cp ${icon} $out/share/icons/hicolor/scalable/apps/open-supaplex.svg
+
+    runHook postInstall
+  '';
+
+  passthru.tests.version = testVersion {
+    package = opensupaplex;
+    command = "opensupaplex --help";
+    version = "v${version}";
+  };
+
+  desktopItems = [(makeDesktopItem {
+    name = "opensupaplex";
+    exec = meta.mainProgram;
+    icon = "open-supaplex";
+    desktopName = "OpenSupaplex";
+    comment = meta.description;
+    categories = "Application;Game;";
+  })];
+
+  meta = with lib; {
+    description = "A decompilation of Supaplex in C and SDL";
+    homepage = "https://github.com/sergiou87/open-supaplex";
+    changelog = "https://github.com/sergiou87/open-supaplex/blob/master/changelog/v${version}.txt";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.ivar ];
+    platforms = platforms.linux; # Many more are supported upstream, but only linux is tested.
+    mainProgram = "opensupaplex";
+  };
+}
diff --git a/pkgs/games/openttd/nml.nix b/pkgs/games/openttd/nml.nix
index 094330faffbb9..bb44d9eee0b6d 100644
--- a/pkgs/games/openttd/nml.nix
+++ b/pkgs/games/openttd/nml.nix
@@ -2,13 +2,13 @@
 
 python3Packages.buildPythonApplication rec {
   pname = "openttd-nml";
-  version = "0.5.3";
+  version = "0.6.1";
 
   src = fetchFromGitHub {
     owner = "OpenTTD";
     repo = "nml";
     rev = version;
-    sha256 = "0kfnkshff3wrxsj1wpfbbw2mmgww2q80v63p5d2pp1f38x8j33w9";
+    sha256 = "0z0n4lqvnqigfjjhmmz7mvis7iivd4a8d287ya2yscfg5hznnqh2";
   };
 
   propagatedBuildInputs = with python3Packages; [ply pillow];
diff --git a/pkgs/games/osu-lazer/default.nix b/pkgs/games/osu-lazer/default.nix
index ab826c4f0b31b..5ddbabe042ea3 100644
--- a/pkgs/games/osu-lazer/default.nix
+++ b/pkgs/games/osu-lazer/default.nix
@@ -1,111 +1,70 @@
-{ lib, stdenv, fetchFromGitHub, fetchurl, makeWrapper, makeDesktopItem, linkFarmFromDrvs
-, dotnetCorePackages, dotnetPackages, cacert
-, ffmpeg_4, alsa-lib, SDL2, lttng-ust, numactl, alsa-plugins
+{ lib
+, stdenvNoCC
+, buildDotnetModule
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, ffmpeg
+, alsa-lib
+, SDL2
+, lttng-ust
+, numactl
 }:
 
-let
-  runtimeDeps = [
-    ffmpeg_4 alsa-lib SDL2 lttng-ust numactl
-  ];
-
-  dotnet-sdk = dotnetCorePackages.sdk_5_0;
-  dotnet-runtime = dotnetCorePackages.runtime_5_0;
-
-  # https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#using-rids
-  runtimeId = "linux-x64";
-
-in stdenv.mkDerivation rec {
+buildDotnetModule rec {
   pname = "osu-lazer";
-  version = "2021.1113.0";
+  version = "2022.205.0";
 
   src = fetchFromGitHub {
     owner = "ppy";
     repo = "osu";
     rev = version;
-    sha256 = "EDW3DGnDkdH6k4XKDc5xWFYeIMcoRN4S9nMBF+TeAl8=";
+    sha256 = "sha256-CzXgj3990qWOwIjhbU8vO29nDO/7HrGDtsc67VIenPI=";
   };
 
-  nativeBuildInputs = [
-    dotnet-sdk dotnetPackages.Nuget makeWrapper
-    # FIXME: Without `cacert`, we will suffer from https://github.com/NuGet/Announcements/issues/49
-    cacert
-  ];
-
-  nugetDeps = linkFarmFromDrvs "${pname}-nuget-deps" (import ./deps.nix {
-    fetchNuGet = { pname, version, sha256 }: fetchurl {
-      name = "${pname}-${version}.nupkg";
-      url = "https://www.nuget.org/api/v2/package/${pname}/${version}";
-      inherit sha256;
-    };
-  });
-
-  configurePhase = ''
-    runHook preConfigure
-
-    export HOME=$(mktemp -d)
-    export DOTNET_CLI_TELEMETRY_OPTOUT=1
-    export DOTNET_NOLOGO=1
-
-    nuget sources Add -Name nixos -Source "$PWD/nixos"
-    nuget init "$nugetDeps" "$PWD/nixos"
+  projectFile = "osu.Desktop/osu.Desktop.csproj";
+  nugetDeps = ./deps.nix;
 
-    # FIXME: https://github.com/NuGet/Home/issues/4413
-    mkdir -p $HOME/.nuget/NuGet
-    cp $HOME/.config/NuGet/NuGet.Config $HOME/.nuget/NuGet
+  nativeBuildInputs = [ copyDesktopItems ];
 
-    dotnet restore --source "$PWD/nixos" osu.Desktop --runtime ${runtimeId}
-
-    runHook postConfigure
+  preConfigure = ''
+    dotnetFlags+=(
+      --runtime linux-x64
+    )
   '';
 
-  buildPhase = ''
-    runHook preBuild
-    dotnet build osu.Desktop \
-      --no-restore \
-      --configuration Release \
-      --runtime ${runtimeId} \
-      -p:Version=${version}
-    runHook postBuild
-  '';
+  runtimeDeps = [
+    ffmpeg
+    alsa-lib
+    SDL2
+    lttng-ust
+    numactl
+  ];
 
-  installPhase = ''
-    runHook preInstall
+  executables = [ "osu!" ];
 
-    dotnet publish osu.Desktop \
-      --no-build \
-      --configuration Release \
-      --runtime ${runtimeId} \
-      --no-self-contained \
-      --output $out/lib/osu
+  fixupPhase = ''
+    runHook preFixup
 
-    makeWrapper $out/lib/osu/osu\! $out/bin/osu\! \
-      --set DOTNET_ROOT "${dotnet-runtime}" \
-      --suffix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeDeps}"
     for i in 16 32 48 64 96 128 256 512 1024; do
       install -D ./assets/lazer.png $out/share/icons/hicolor/''${i}x$i/apps/osu\!.png
     done
-    cp -r ${makeDesktopItem {
-      desktopName = "osu!";
-      name = "osu";
-      exec = "osu!";
-      icon = "osu!";
-      comment = meta.description;
-      type = "Application";
-      categories = "Game;";
-    }}/share/applications $out/share
 
-    runHook postInstall
-  '';
+    ln -sft $out/lib/${pname} ${SDL2}/lib/libSDL2${stdenvNoCC.hostPlatform.extensions.sharedLibrary}
+    cp -f ${./osu.runtimeconfig.json} "$out/lib/${pname}/osu!.runtimeconfig.json"
 
-  fixupPhase = ''
-    runHook preFixup
-    cp -f ${./osu.runtimeconfig.json} "$out/lib/osu/osu!.runtimeconfig.json"
-    ln -sft $out/lib/osu ${SDL2}/lib/libSDL2${stdenv.hostPlatform.extensions.sharedLibrary}
     runHook postFixup
   '';
 
-  # Strip breaks the executable.
-  dontStrip = true;
+  desktopItems = [(makeDesktopItem {
+    desktopName = "osu!";
+    name = "osu";
+    exec = "osu!";
+    icon = "osu!";
+    comment = meta.description;
+    type = "Application";
+    categories = "Game;";
+  })];
 
   meta = with lib; {
     description = "Rhythm is just a *click* away";
diff --git a/pkgs/games/osu-lazer/deps.nix b/pkgs/games/osu-lazer/deps.nix
index 96b257204f4fe..6ff9f6dfaf802 100644
--- a/pkgs/games/osu-lazer/deps.nix
+++ b/pkgs/games/osu-lazer/deps.nix
@@ -1,68 +1,69 @@
 { fetchNuGet }: [
-  (fetchNuGet { pname = "AutoMapper"; version = "10.1.1"; sha256 = "1l1p9g7f7finr8laklbm7h2c45k0swl47iq0ik68js5s6pzvd6f8"; })
+  (fetchNuGet { pname = "AutoMapper"; version = "11.0.0"; sha256 = "1ni9mmrqfbspwf7xz6by5415ci5zhg15z3f7596qqpmbn8bqg7wq"; })
   (fetchNuGet { pname = "DeltaCompressionDotNet"; version = "2.0.0.0"; sha256 = "0zhj7m3zaf9wcg51385in9qg1xgkvp8yyzgq3r5k4sagm7y68aqy"; })
   (fetchNuGet { pname = "DiffPlex"; version = "1.7.0"; sha256 = "09a8hkbx99iwikfl8war629945yv7i8llj9480dbc4kyp6qqlr00"; })
   (fetchNuGet { pname = "DiscordRichPresence"; version = "1.0.175"; sha256 = "180sax976327d70qbinv07f65g3w2zbw80n49hckg8wd4rw209vd"; })
   (fetchNuGet { pname = "FFmpeg.AutoGen"; version = "4.3.0.1"; sha256 = "0n6x57mnnvcjnrs8zyvy07h5zm4bcfy9gh4n4bvd9fx5ys4pxkvv"; })
-  (fetchNuGet { pname = "Fody"; version = "6.5.3"; sha256 = "14yj3xj4jh2ayl8jsyypxv9af0xbw30946kn14m0bfmlyl027wkp"; })
+  (fetchNuGet { pname = "Fody"; version = "6.6.0"; sha256 = "0cx708ah61cxmvpaq040mhqwrv937rvlmskwihg1w118729k9yv0"; })
   (fetchNuGet { pname = "HidSharpCore"; version = "1.2.1.1"; sha256 = "1zkndglmz0s8rblfhnqcvv90rkq2i7lf4bc380g7z8h1avf2ikll"; })
-  (fetchNuGet { pname = "HtmlAgilityPack"; version = "1.11.37"; sha256 = "1q0kkw2rhvxi67hqv18ziv2dvmhi7f68745gcs1253mwv5da4vy6"; })
-  (fetchNuGet { pname = "Humanizer"; version = "2.11.10"; sha256 = "057pqzvdxsbpnnc5f1xkqg7j3ywp68ggia3w74fgqp0158dm6rdk"; })
-  (fetchNuGet { pname = "Humanizer.Core"; version = "2.11.10"; sha256 = "0z7kmd5rh1sb6izq0vssk6c2p63n00xglk45s7ga9z18z9aaskxv"; })
+  (fetchNuGet { pname = "HtmlAgilityPack"; version = "1.11.40"; sha256 = "0k1cpkfgz4v5qigvmmvlk8lv2a731kqkmx6acf3rzr8rlj3cfnc4"; })
+  (fetchNuGet { pname = "Humanizer"; version = "2.13.14"; sha256 = "155g2700x6sbym2jd4dshm4rf3jjr8flx6w9xnw28zrrv7r2rdy8"; })
+  (fetchNuGet { pname = "Humanizer.Core"; version = "2.13.14"; sha256 = "1ni4mcyhcs46ih9b8c8l3xq3iai56rdlcw0afwhji3hxwbxqbk7i"; })
   (fetchNuGet { pname = "Humanizer.Core"; version = "2.2.0"; sha256 = "08mzg65y9d3zvq16rsmpapcdan71ggq2mpks6k777h3wlm2sh3p5"; })
-  (fetchNuGet { pname = "Humanizer.Core.af"; version = "2.11.10"; sha256 = "18fiixfvjwn8m1i8z2cz4aqykzylvfdqmmpwc2zcd8sr1a2xm86z"; })
-  (fetchNuGet { pname = "Humanizer.Core.ar"; version = "2.11.10"; sha256 = "009fpm4jd325izm82ipipsvlwd31824gvskda68bdwi4yqmycz4p"; })
-  (fetchNuGet { pname = "Humanizer.Core.az"; version = "2.11.10"; sha256 = "144b9diwprabxwgi5a98k5iy95ajq4p7356phdqi2lhzwbz7b6a9"; })
-  (fetchNuGet { pname = "Humanizer.Core.bg"; version = "2.11.10"; sha256 = "1b9y40gvq2kwnj5wa40f8cbywv79jkajcwknagrgr27sykpfadl2"; })
-  (fetchNuGet { pname = "Humanizer.Core.bn-BD"; version = "2.11.10"; sha256 = "18pn4jcp36ygcx283l3fi9bs5d7q1a384b72a10g5kl0qckn88ay"; })
-  (fetchNuGet { pname = "Humanizer.Core.cs"; version = "2.11.10"; sha256 = "03crw1lnzp32v2kcdmllkrsqh07r4ggw9gyc96qw7cv0nk5ch1h8"; })
-  (fetchNuGet { pname = "Humanizer.Core.da"; version = "2.11.10"; sha256 = "0glby12zra3y3yiq4cwq1m6wjcjl8f21v8ghi6s20r48glm8vzy9"; })
-  (fetchNuGet { pname = "Humanizer.Core.de"; version = "2.11.10"; sha256 = "0a35xrm1f9p74x0fkr52bw9sd54vdy9d5rnvf565yh8ww43xfk7b"; })
-  (fetchNuGet { pname = "Humanizer.Core.el"; version = "2.11.10"; sha256 = "0bhwwdx5vc48zikdsbrkghdhwahxxc2lkff0yaa5nxhbhasl84h8"; })
-  (fetchNuGet { pname = "Humanizer.Core.es"; version = "2.11.10"; sha256 = "07bw07qy8nyzlgxl7l2lxv9f78qmkfppgzx7iyq5ikrcnpvc7i9q"; })
-  (fetchNuGet { pname = "Humanizer.Core.fa"; version = "2.11.10"; sha256 = "00d4hc1pfmhfkc5wmx9p7i00lgi4r0k6wfcns9kl1syjxv3bs5f2"; })
-  (fetchNuGet { pname = "Humanizer.Core.fi-FI"; version = "2.11.10"; sha256 = "0z4is7pl5jpi4pfdvd2zvx5mp00bj26d9l9ksqyc0liax8nfzyik"; })
-  (fetchNuGet { pname = "Humanizer.Core.fr"; version = "2.11.10"; sha256 = "0sybpg6kbbhrnk7gxcdk7ppan89lsfqsdssrg4i1dm8w48wgicap"; })
-  (fetchNuGet { pname = "Humanizer.Core.fr-BE"; version = "2.11.10"; sha256 = "1s25c86nl9wpsn6fydzwv4rfmdx5sm0vgyd7xhw5344k20gazvhv"; })
-  (fetchNuGet { pname = "Humanizer.Core.he"; version = "2.11.10"; sha256 = "1nx61qkjd6p9r36dmnm4942khyv35fpdqmb2w69gz6463g4d7z29"; })
-  (fetchNuGet { pname = "Humanizer.Core.hr"; version = "2.11.10"; sha256 = "02jhcyj72prkqsjxyilv04drm0bknqjh2r893jlbsfi9vjg2zay3"; })
-  (fetchNuGet { pname = "Humanizer.Core.hu"; version = "2.11.10"; sha256 = "0yb6ly4s1wdyaf96h2dvifqyb575aid6irwl3qx8gcvrs0xpcxdp"; })
-  (fetchNuGet { pname = "Humanizer.Core.hy"; version = "2.11.10"; sha256 = "0b7vaqldn7ca3xi4gkvkhjk900kw2zwb0m0d20bg45a83zdlx79c"; })
-  (fetchNuGet { pname = "Humanizer.Core.id"; version = "2.11.10"; sha256 = "1yqxirknwga4j18k7ixwgqxlv20479afanhariy3c5mkwvglsr9b"; })
-  (fetchNuGet { pname = "Humanizer.Core.it"; version = "2.11.10"; sha256 = "1skwgj5a6kkx3pm9w4f29psch69h1knmwbkdydlmx13h452p1w4l"; })
-  (fetchNuGet { pname = "Humanizer.Core.ja"; version = "2.11.10"; sha256 = "1wpc3yz9v611dqbw8j5yimk8dpz0rvpnls4rmlnp1m47gavpj8x4"; })
-  (fetchNuGet { pname = "Humanizer.Core.ko-KR"; version = "2.11.10"; sha256 = "1df0kd7vwdc3inxfkb3wsl1aw3d6vbab99dzh08p4m04g7i2c1a9"; })
-  (fetchNuGet { pname = "Humanizer.Core.ku"; version = "2.11.10"; sha256 = "17b66xfgwjr0sffx0hw4c6l90h43z7ffylrs26hgav0n110q2nwg"; })
-  (fetchNuGet { pname = "Humanizer.Core.lv"; version = "2.11.10"; sha256 = "0czxx4b9g0w7agykdl82wds09zasa9y58dmgjm925amlfz4wkyzs"; })
-  (fetchNuGet { pname = "Humanizer.Core.ms-MY"; version = "2.11.10"; sha256 = "0kix95nbw94fx0dziyz80y59i7ii7d21b63f7f94niarljjq36i3"; })
-  (fetchNuGet { pname = "Humanizer.Core.mt"; version = "2.11.10"; sha256 = "1rwy6m22pq65gxn86xlr9lv818fp5kb0wz98zxxfljc2iviw1f4p"; })
-  (fetchNuGet { pname = "Humanizer.Core.nb"; version = "2.11.10"; sha256 = "0ra2cl0avvv4sylha7z76jxnb4pdiqfbpr5m477snr04dsjxd9q9"; })
-  (fetchNuGet { pname = "Humanizer.Core.nb-NO"; version = "2.11.10"; sha256 = "1qszib03pvmjkrg8za7jjd2vzrs9p4fn2rmy82abnzldkhvifipq"; })
-  (fetchNuGet { pname = "Humanizer.Core.nl"; version = "2.11.10"; sha256 = "1i9bvy0i2yyasl9mgxiiwrkmfpm2c53d3wwdp9270r6120sxyy63"; })
-  (fetchNuGet { pname = "Humanizer.Core.pl"; version = "2.11.10"; sha256 = "0kggh4wgcic7wzgxy548n6w61schss2ccf9kz8alqshfi42xifby"; })
-  (fetchNuGet { pname = "Humanizer.Core.pt"; version = "2.11.10"; sha256 = "09j90s8x1lpvhfiy3syfnj8slkgcacf3xjy3pnkgxa6g4mi4f4bd"; })
-  (fetchNuGet { pname = "Humanizer.Core.ro"; version = "2.11.10"; sha256 = "1jgidmqfly91v1k22gn687mfql5bz7gjzp1aapi93vq5x635qssy"; })
-  (fetchNuGet { pname = "Humanizer.Core.ru"; version = "2.11.10"; sha256 = "13mmlh0ibxfyc85xrz3vx4mcg56mkzqql184iwdryq94p0g5ahil"; })
-  (fetchNuGet { pname = "Humanizer.Core.sk"; version = "2.11.10"; sha256 = "04ja06y5jaz1jwkwn117wx9cib04gpbi0vysn58a8sd5jrxmxai5"; })
-  (fetchNuGet { pname = "Humanizer.Core.sl"; version = "2.11.10"; sha256 = "05hxk9v3a7fn7s4g9jp5zxk2z6a33b9fkavyb1hjqnl2i37q2wja"; })
-  (fetchNuGet { pname = "Humanizer.Core.sr"; version = "2.11.10"; sha256 = "0x6l2msimrx72iywa1g0rqklgy209sdwg0r77i2lz0s1rvk5klm5"; })
-  (fetchNuGet { pname = "Humanizer.Core.sr-Latn"; version = "2.11.10"; sha256 = "01hdyn7mmbyy7f3aglawgnsj3nblcdpqjgzdcvniy73l536mira0"; })
-  (fetchNuGet { pname = "Humanizer.Core.sv"; version = "2.11.10"; sha256 = "0cbgchivw3d5ndib1zmgzmnymhyvfh9g9f0hijc860g5vaa9fkvh"; })
-  (fetchNuGet { pname = "Humanizer.Core.th-TH"; version = "2.11.10"; sha256 = "1v7f9x3b04iwhz9lb3ir8az8128nvcw1gi4park5zh3fg0f3mni0"; })
-  (fetchNuGet { pname = "Humanizer.Core.tr"; version = "2.11.10"; sha256 = "02c4ky0dskxkdrkc7vy8yzmvwjr1wqll1kzx0k21afhlx8xynjd4"; })
-  (fetchNuGet { pname = "Humanizer.Core.uk"; version = "2.11.10"; sha256 = "0900ilhwj8yvhyzpg1pjr7f5vrl62wp8dsnhk4c2igs20qvnv079"; })
-  (fetchNuGet { pname = "Humanizer.Core.uz-Cyrl-UZ"; version = "2.11.10"; sha256 = "09b7p2m8y49j49ckrmx2difgyj6y7fm2mwca093j8psxclsykcyr"; })
-  (fetchNuGet { pname = "Humanizer.Core.uz-Latn-UZ"; version = "2.11.10"; sha256 = "029kvkawqhlln52vpjpvr52dhr18ylk01cgsj2z8lxnqaka0q9hk"; })
-  (fetchNuGet { pname = "Humanizer.Core.vi"; version = "2.11.10"; sha256 = "0q4d47plsj956ivn82qwyidfxppjr9dp13m8c66aamrvhy4q8ny5"; })
-  (fetchNuGet { pname = "Humanizer.Core.zh-CN"; version = "2.11.10"; sha256 = "01dy5kf6ai8id77px92ji4kcxjc8haj39ivv55xy1afcg3qiy7mh"; })
-  (fetchNuGet { pname = "Humanizer.Core.zh-Hans"; version = "2.11.10"; sha256 = "16gcxgw2g6gck3nc2hxzlkbsg7wkfaqsjl87kasibxxh47zdqqv2"; })
-  (fetchNuGet { pname = "Humanizer.Core.zh-Hant"; version = "2.11.10"; sha256 = "1rjg2xvkwjjw3c7z9mdjjvbnl9lcvvhh4fr7l61rla2ynzdk46cj"; })
+  (fetchNuGet { pname = "Humanizer.Core.af"; version = "2.13.14"; sha256 = "0w7n9qfxlqayw2dwgajqjks5b2qxcy2853v5h0rbaq5r5yb84874"; })
+  (fetchNuGet { pname = "Humanizer.Core.ar"; version = "2.13.14"; sha256 = "1nxdh3hg9hkvi7q0ffaflb738kkdl0kmpry9jxdkkvg4mhrmfs2i"; })
+  (fetchNuGet { pname = "Humanizer.Core.az"; version = "2.13.14"; sha256 = "1rjhpbzy49rrf0mypkf7ksjlmx6iywdbra1caj1mr970gfm1j4zb"; })
+  (fetchNuGet { pname = "Humanizer.Core.bg"; version = "2.13.14"; sha256 = "101zwkys4w7dwwa7dzsc10gdrk6bnfmm3hqc09a4jvxj2p8i6hds"; })
+  (fetchNuGet { pname = "Humanizer.Core.bn-BD"; version = "2.13.14"; sha256 = "1d0flbhk4f0kc1dqzgqnimlp3gcj490qchrbl4yb4ilmsyaws0gm"; })
+  (fetchNuGet { pname = "Humanizer.Core.cs"; version = "2.13.14"; sha256 = "11hfxdpncbrbj9d779b24hw43sfpbjynmkxlv636sg532j5vd58g"; })
+  (fetchNuGet { pname = "Humanizer.Core.da"; version = "2.13.14"; sha256 = "0bfl1zx6x58i75l57k8xfky264hh2ziv068yx9w0zshil0d74iw5"; })
+  (fetchNuGet { pname = "Humanizer.Core.de"; version = "2.13.14"; sha256 = "1bhhmp9rza2p4j5zs11sk2xvrbbvckr1v8d97aramqzqmv4x20pd"; })
+  (fetchNuGet { pname = "Humanizer.Core.el"; version = "2.13.14"; sha256 = "1kym97876jspj72y9fhpc2y1jn3j12y5l95222r53mbrrpwz1m6p"; })
+  (fetchNuGet { pname = "Humanizer.Core.es"; version = "2.13.14"; sha256 = "0v5fmy7cjdk3bs13pi09v3g7sbmdnvijn0w8gnif0krmg2rdm2z7"; })
+  (fetchNuGet { pname = "Humanizer.Core.fa"; version = "2.13.14"; sha256 = "12m3d0cr9qa0f7sx58rqw835awi01j0frvbp1q796s6amlvhrcyc"; })
+  (fetchNuGet { pname = "Humanizer.Core.fi-FI"; version = "2.13.14"; sha256 = "0j8gl6kajazjw64xpf4ws5v6hv5dz43gnm0vcnfm5l2kizd87wxh"; })
+  (fetchNuGet { pname = "Humanizer.Core.fr"; version = "2.13.14"; sha256 = "053jcc9rdxxnwiccqmcxnvq40a4fm6h6lr0mlqdxjdfdj07s29i9"; })
+  (fetchNuGet { pname = "Humanizer.Core.fr-BE"; version = "2.13.14"; sha256 = "00xff7shwclns2v8mknwnh2y6ycfa9zj7ssgrkdyqa9k8ppq26dh"; })
+  (fetchNuGet { pname = "Humanizer.Core.he"; version = "2.13.14"; sha256 = "10qhxb6fin6w595f7h7nnfvvh5xi0vmca9ynsggq74rpjzgmvyzr"; })
+  (fetchNuGet { pname = "Humanizer.Core.hr"; version = "2.13.14"; sha256 = "1xgd3had8gsfy4l5835vn9ngr5i5ys38mggzmm4s6j1id49920g4"; })
+  (fetchNuGet { pname = "Humanizer.Core.hu"; version = "2.13.14"; sha256 = "0gfrkjp9c38c671d8rc468hphkixarjzss754rqsk4j5x1p13wml"; })
+  (fetchNuGet { pname = "Humanizer.Core.hy"; version = "2.13.14"; sha256 = "01691rwvrh6spks5jc1vcg961p1awy34ynkaxqlhr5d49dw5qgdd"; })
+  (fetchNuGet { pname = "Humanizer.Core.id"; version = "2.13.14"; sha256 = "177vbbn8q0xl2cdak4xyk38w4w8c1y2vlq9i2fm7va4x6awdyxjk"; })
+  (fetchNuGet { pname = "Humanizer.Core.is"; version = "2.13.14"; sha256 = "08d8zknnxlvbshlvlnj1m954ddf7khw1n24pphsa9i0brww9wxfv"; })
+  (fetchNuGet { pname = "Humanizer.Core.it"; version = "2.13.14"; sha256 = "0873ijf8cxm7skwp622ddnh8pdl30nlrwmil89icf67z3flis60d"; })
+  (fetchNuGet { pname = "Humanizer.Core.ja"; version = "2.13.14"; sha256 = "1bshhkiv57010zij7pcmm1709n0y4pk3kp9xx7ar3gnra3jmm6za"; })
+  (fetchNuGet { pname = "Humanizer.Core.ko-KR"; version = "2.13.14"; sha256 = "0rhq6471pjaypnh4k08y124i7sa6cj3i71v2frv66qpynl6hi0y0"; })
+  (fetchNuGet { pname = "Humanizer.Core.ku"; version = "2.13.14"; sha256 = "1ircd4lw3ryl3zzdv85wpk8by44rzhn4ln85ycml2b6a21arq1rw"; })
+  (fetchNuGet { pname = "Humanizer.Core.lv"; version = "2.13.14"; sha256 = "0y7m6zvns8wr0sy5ksjb51wrypgplfdwprz96xw1ajmdj4fjh9sr"; })
+  (fetchNuGet { pname = "Humanizer.Core.ms-MY"; version = "2.13.14"; sha256 = "1cpnjjgybh9dp9snq3r6wm3l4zy1ssjyb64bayjnd8770lpvyfjs"; })
+  (fetchNuGet { pname = "Humanizer.Core.mt"; version = "2.13.14"; sha256 = "0n5zjsq71nvxnhghsk321cqrwz7kf1jzfcq4vhsksyv7q9na74ak"; })
+  (fetchNuGet { pname = "Humanizer.Core.nb"; version = "2.13.14"; sha256 = "07b1fj3ac2wcj7ql1gc7vaa4q4dmyd0prj7bxr52z04ar3nxjlsc"; })
+  (fetchNuGet { pname = "Humanizer.Core.nb-NO"; version = "2.13.14"; sha256 = "0v1vljlzjlslj5y3c5xd2pbp1g29ghjd02s0z2bri5zk9zcgysvq"; })
+  (fetchNuGet { pname = "Humanizer.Core.nl"; version = "2.13.14"; sha256 = "15imi9m1lvfrx0fvfmlx74p8y59na2rkgdrbfyy3dvgvd74b9k5v"; })
+  (fetchNuGet { pname = "Humanizer.Core.pl"; version = "2.13.14"; sha256 = "06ix2xilgi7w7306hs4v41ai6jwank384cyz0885b53dic5kgq7r"; })
+  (fetchNuGet { pname = "Humanizer.Core.pt"; version = "2.13.14"; sha256 = "1qd1w1xrxap7nwmfl9yjx6z71r03p53kw8y4dnjn7xdn85xc7z4b"; })
+  (fetchNuGet { pname = "Humanizer.Core.ro"; version = "2.13.14"; sha256 = "1qifvw6y6g7014q0s8xaprsk79bqlgg0rmvbyn21qalc0ayab97v"; })
+  (fetchNuGet { pname = "Humanizer.Core.ru"; version = "2.13.14"; sha256 = "0wg4p84m9r6slbz9gxrjnidc1j7xfmwncpp14x3f86a37791rz61"; })
+  (fetchNuGet { pname = "Humanizer.Core.sk"; version = "2.13.14"; sha256 = "1qm0nsbw3z9n011fnnhyhzgpxyz41f01dxl13bs8mjzy0f1v3gvj"; })
+  (fetchNuGet { pname = "Humanizer.Core.sl"; version = "2.13.14"; sha256 = "1fhkjyxjk9icj705qysk8yc11hpdml2cjcxm7mfdv5z2f93sa4hz"; })
+  (fetchNuGet { pname = "Humanizer.Core.sr"; version = "2.13.14"; sha256 = "02f15q3i9npvvxwjyp14rxd8rlhd9qricrah3cmc8lw9fca26bb4"; })
+  (fetchNuGet { pname = "Humanizer.Core.sr-Latn"; version = "2.13.14"; sha256 = "0mnycpjl51cd4nz9kwijr66zrgxqjbcsp5jqgr660l4bq16yxjad"; })
+  (fetchNuGet { pname = "Humanizer.Core.sv"; version = "2.13.14"; sha256 = "13vdyrg1jp2al96w08vfkw5yjdqdnp7pksxz907i89w6cp9wbfvm"; })
+  (fetchNuGet { pname = "Humanizer.Core.th-TH"; version = "2.13.14"; sha256 = "0ganp6zjjj07lcpy9h88q2441f1lfv3a7mgncrqw36bliv37pr8m"; })
+  (fetchNuGet { pname = "Humanizer.Core.tr"; version = "2.13.14"; sha256 = "1sgfzh9dabdhhk5i97c0d13rz5yghcp2qpjidqsizpi2k8h8rl0r"; })
+  (fetchNuGet { pname = "Humanizer.Core.uk"; version = "2.13.14"; sha256 = "1ns33byx9p6fv6gffdxly3fm3wvjl6ndscribwr37134pa6nvqc9"; })
+  (fetchNuGet { pname = "Humanizer.Core.uz-Cyrl-UZ"; version = "2.13.14"; sha256 = "1qm27qz989nwnkpg26phi60qqahivssx906znwkldml2h2rz8k0g"; })
+  (fetchNuGet { pname = "Humanizer.Core.uz-Latn-UZ"; version = "2.13.14"; sha256 = "1hd2d7js8cng50ir56l8lhc9qc1rwzjvqrv98ly9ggnv8n63iiws"; })
+  (fetchNuGet { pname = "Humanizer.Core.vi"; version = "2.13.14"; sha256 = "0xh33ml7aspslj4gnbd7anjvp3463djhcc51bh2ji67rbw1an6rw"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-CN"; version = "2.13.14"; sha256 = "062wgs0qnhvikvfz37jmqw6sx7xwzs24ncl89paq3640id32aivd"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-Hans"; version = "2.13.14"; sha256 = "0s01h733ihxjg64bznjvnij76lflqfcmwznjwmd8p2axmn8688s0"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-Hant"; version = "2.13.14"; sha256 = "07xsdx8j1rhp712kwy8jx9ang6f9zljqrvaggf0ssj5zqbliz93p"; })
   (fetchNuGet { pname = "JetBrains.Annotations"; version = "2021.3.0"; sha256 = "01ssylllbwpana2w3iybi533zlvcsbhzjc8kr0g4kg307kjbfn8v"; })
-  (fetchNuGet { pname = "ManagedBass"; version = "3.0.0"; sha256 = "1yh1s36w465z8gcj4xs6q048g63z7m3nyfy1vvw1lgh7k6hqqgma"; })
-  (fetchNuGet { pname = "ManagedBass.Fx"; version = "3.0.0"; sha256 = "0sck1wmjlcy8q941bamk1i0k4yrklyilsgg6c832xdh96sdc049s"; })
-  (fetchNuGet { pname = "ManagedBass.Mix"; version = "3.0.0"; sha256 = "0brnm0ry96b81hgffbaj52s53bsn9c8cx4q24j0whsvmcqqxhs4v"; })
+  (fetchNuGet { pname = "ManagedBass"; version = "3.1.0"; sha256 = "0p4kzpq86h00z7rwzmwxyk1yg627mm5376ssjv1wgqgls0dl7gkh"; })
+  (fetchNuGet { pname = "ManagedBass.Fx"; version = "3.1.0"; sha256 = "130rrf6sb64dcq58mr1gigma3pzr7hg5mxn5fbryg375x3vphbs8"; })
+  (fetchNuGet { pname = "ManagedBass.Mix"; version = "3.1.0"; sha256 = "1ppxczh1i67k5xicr0q4n0k7zdzghs99wwkcpjmh726hkdsshnib"; })
   (fetchNuGet { pname = "managed-midi"; version = "1.9.14"; sha256 = "025jh146zy98699y4civ7nxlkx312lwkl4sr8pha626q7q1kg89h"; })
-  (fetchNuGet { pname = "Markdig"; version = "0.26.0"; sha256 = "1pg0yica8h1c2kx10pqzc5iclmlfll5wbw1bxa8l251w1qnfglv2"; })
+  (fetchNuGet { pname = "Markdig"; version = "0.23.0"; sha256 = "1bwn885w7balwncmr764vidyyp9bixqlq6r3lhsapj8ykrpxxa70"; })
   (fetchNuGet { pname = "MessagePack"; version = "2.3.85"; sha256 = "0n7kv4i6knhv1dd35cv45sfpidsiy9albfdmbrdschykd1mzxmiy"; })
   (fetchNuGet { pname = "MessagePack.Annotations"; version = "2.3.85"; sha256 = "0axjgy9r533bw00lflnc6acjyza76mf2x1nn6fw7qacvak9rqxm3"; })
   (fetchNuGet { pname = "Microsoft.AspNetCore.App.Runtime.linux-x64"; version = "5.0.12"; sha256 = "1asph5v7kgmscfgsyv9gg7cwvg52gnm6m0ldm2m4pfkpsxqyp2mi"; })
@@ -77,7 +78,6 @@
   (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Protocols.MessagePack"; version = "5.0.11"; sha256 = "0w60z54wxv1nndv7mz9rqswdh8k4rxmgihnxkirp4gr0idr7ln7j"; })
   (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson"; version = "5.0.11"; sha256 = "1qrmrkdrzm4bn5zq6a1dk88rpb6pajcs6jh23h43yny68y80jcnr"; })
   (fetchNuGet { pname = "Microsoft.Bcl.AsyncInterfaces"; version = "1.0.0"; sha256 = "00dx5armvkqjxvkldz3invdlck9nj7w21dlsr2aqp1rqbyrbsbbh"; })
-  (fetchNuGet { pname = "Microsoft.Bcl.AsyncInterfaces"; version = "1.1.0"; sha256 = "1dq5yw7cy6s42193yl4iqscfw5vzkjkgv0zyy32scr4jza6ni1a1"; })
   (fetchNuGet { pname = "Microsoft.Bcl.AsyncInterfaces"; version = "5.0.0"; sha256 = "0cp5jbax2mf6xr3dqiljzlwi05fv6n9a35z337s92jcljiq674kf"; })
   (fetchNuGet { pname = "Microsoft.Build.Framework"; version = "16.5.0"; sha256 = "1xgr02r7s9i6s70n237hss4yi9zicssia3zd2ny6s8vyxb7jpdyb"; })
   (fetchNuGet { pname = "Microsoft.Build.Locator"; version = "1.4.1"; sha256 = "0j119rri7a401rca67cxdyrn3rprzdl1b2wrblqc23xsff1xvlrx"; })
@@ -93,8 +93,8 @@
   (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.5.0"; sha256 = "01i28nvzccxbqmiz217fxs6hnjwmd5fafs37rd49a6qp53y6623l"; })
   (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.7.0"; sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j"; })
   (fetchNuGet { pname = "Microsoft.Data.Sqlite.Core"; version = "2.2.6"; sha256 = "0fx8698k71vzr8pdc6q8bsbzg6r8a42s4hkzmiyv13ibmyb5q68k"; })
-  (fetchNuGet { pname = "Microsoft.Diagnostics.NETCore.Client"; version = "0.2.221401"; sha256 = "1k55l60bg8lj5ayl3kixbzvx2684xd7a9nzha5fiqjgp85cimb3r"; })
-  (fetchNuGet { pname = "Microsoft.Diagnostics.Runtime"; version = "2.0.226801"; sha256 = "1w8ahqkv8nbq2ch17aa9axhqqnybmc9bsxpdhpiy52ix70mr72w1"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.NETCore.Client"; version = "0.2.61701"; sha256 = "1ic1607jj4ln8dbibf1fz5v9svk9x2kqlgvhndc6ijaqnbc4wcr1"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.Runtime"; version = "2.0.161401"; sha256 = "02qcm8nv1ch07g8b0i60ynrjn33b8y5ivyk4rxal3vd9zfi6pvwi"; })
   (fetchNuGet { pname = "Microsoft.DotNet.PlatformAbstractions"; version = "2.1.0"; sha256 = "1qydvyyinj3b5mraazjal3n2k7jqhn05b6n1a2f3qjkqkxi63dmy"; })
   (fetchNuGet { pname = "Microsoft.EntityFrameworkCore"; version = "2.2.6"; sha256 = "18j2cr50wsikwv7gy3vrjvmpdxckvv537qma8afdpr3yn2klayh5"; })
   (fetchNuGet { pname = "Microsoft.EntityFrameworkCore.Abstractions"; version = "2.2.6"; sha256 = "1dyxb5ibx24frlgbqy7zch0falq9p1189zvlbxgl94m0hvpml5j3"; })
@@ -111,8 +111,10 @@
   (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Binder"; version = "2.2.0"; sha256 = "10qyjdkymdmag3r807kvbnwag4j3nz65i4cwikbd77jjvz92ya3j"; })
   (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "2.2.0"; sha256 = "0lvv45rvq1xbf47lz818rjydc776zk8mf7svpzh1dml4qwlx9zck"; })
   (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "5.0.2"; sha256 = "0db6d1b076nfqfn5mhy63l3gkfn5kr29hwcrx81ldr7y062r1b9y"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "6.0.0-rc.1.21451.13"; sha256 = "0r6945jq7c2f1wjifq514zvngicndjqfnsjya6hqw0yzah0jr56c"; })
   (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "2.2.0"; sha256 = "1jyzfdr9651h3x6pxwhpfbb9mysfh8f8z1jvy4g117h9790r9zx5"; })
   (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "5.0.0"; sha256 = "17cz6s80va0ch0a6nqa1wbbbp3p8sqxb96lj4qcw67ivkp2yxiyj"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "6.0.0-rc.1.21451.13"; sha256 = "11dg16x6g0gssb143qpghxz1s41himvhr7yhjwxs9hacx4ij2dm1"; })
   (fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "2.1.0"; sha256 = "0dl4qhjgifm6v3jsfzvzkvddyic77ggp9fq49ah661v45gk6ilgd"; })
   (fetchNuGet { pname = "Microsoft.Extensions.Logging"; version = "2.2.0"; sha256 = "0bx3ljyvvcbikradq2h583rl72h8bxdz33aghk026cxzpv2mm3wm"; })
   (fetchNuGet { pname = "Microsoft.Extensions.Logging"; version = "5.0.0"; sha256 = "1qa1l18q2jh9azya8gv1p8anzcdirjzd9dxxisb4911i9m1648i3"; })
@@ -127,7 +129,6 @@
   (fetchNuGet { pname = "Microsoft.NETCore.App.Runtime.linux-x64"; version = "5.0.12"; sha256 = "1fdbrjrmjd31y1amp0inlmki9w3fwzv8nz41pqmc943g3cpmyg9f"; })
   (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.0.1"; sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; })
   (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
-  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.0.0"; sha256 = "1fk2fk2639i7nzy58m9dvpdnzql4vb8yl8vr19r2fp8lmj9w2jr0"; })
   (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.1.2"; sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141"; })
   (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "5.0.0"; sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc"; })
   (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "3.1.0"; sha256 = "04cc2wl90p7g9zscnxgyj55vzl7srrrjwadl2dxgicfb2x2499ca"; })
@@ -154,18 +155,19 @@
   (fetchNuGet { pname = "NuGet.Protocol"; version = "5.11.0"; sha256 = "041pva6ykc5h6az7bb87mkg32c95cvxlixgspnd34zbdldr4ypdb"; })
   (fetchNuGet { pname = "NuGet.Versioning"; version = "5.11.0"; sha256 = "041351n1rbyqpfxqyxbvjgfrcbbawymbq96givz5pvdbabvyf5vq"; })
   (fetchNuGet { pname = "NUnit"; version = "3.13.2"; sha256 = "00bkjgarkwbj497da9d7lajala1ns67h1kx53w4bapwkf32jlcvn"; })
-  (fetchNuGet { pname = "OpenTabletDriver"; version = "0.5.3.1"; sha256 = "16xw8w943x9gvnnpbryahff5azzy8n26j2igyqgv88m352jd9rb8"; })
-  (fetchNuGet { pname = "OpenTabletDriver.Plugin"; version = "0.5.3.1"; sha256 = "17dxsvcz9g8kzydk5xlfz9kfxl62x9wi20609rh76wjd881bg1br"; })
-  (fetchNuGet { pname = "ppy.LocalisationAnalyser"; version = "2021.725.0"; sha256 = "00nvk8kw94v0iq5k7y810sa235lqdjlggq7f00c64c3d1zam4203"; })
-  (fetchNuGet { pname = "ppy.ManagedBass"; version = "3.1.3-alpha"; sha256 = "0qdrklalp42pbyb30vpr7c0kwjablsja0s6xplxxkpfd14y8mzk4"; })
-  (fetchNuGet { pname = "ppy.osu.Framework"; version = "2021.1108.0"; sha256 = "0zcmxnb521j8v9q863l5bf74svgsn8lc00d03kmldyfhcjq6zqb9"; })
-  (fetchNuGet { pname = "ppy.osu.Framework.NativeLibs"; version = "2021.805.0"; sha256 = "004c053s6p7339bfw68lvlyk9jkbw6djkf2d72dz8wam546k8dcl"; })
-  (fetchNuGet { pname = "ppy.osu.Game.Resources"; version = "2021.1112.0"; sha256 = "0q0z0f9f9g2a6523zyp5a7k3z0h2rallnz6pzyahkn2vz9s4ykxj"; })
-  (fetchNuGet { pname = "ppy.osuTK.NS20"; version = "1.0.178"; sha256 = "1bv77rrf3g6zr4bzfrrqqzl0vjj4c8izc0sakckda8dlm6h3gxln"; })
-  (fetchNuGet { pname = "ppy.SDL2-CS"; version = "1.0.468-alpha"; sha256 = "1qa2xg5p6ywmvzz868vck2jy4sn8vfqssa4an4afqsmc4amxfmc8"; })
+  (fetchNuGet { pname = "OpenTabletDriver"; version = "0.6.0.2"; sha256 = "0blwfs1cacxq0vs6fy7zjnsny8qdsr5jlxix3icmphyqgz0g4g39"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Configurations"; version = "0.6.0.2"; sha256 = "18q6gjayqrwk6n1kf359z94z8zyb3yz4hr1dpgglk51sq6wi2z84"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Native"; version = "0.6.0.2"; sha256 = "12hf4v8j8asc9wlywpykajb8yrzx10w6h11qbykckmrfxvz8pc0a"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Plugin"; version = "0.6.0.2"; sha256 = "0z2n5jysw06zp2cxmfqddbg3g88jdm1irr2hv04q8valq0plaq5c"; })
+  (fetchNuGet { pname = "ppy.LocalisationAnalyser"; version = "2021.1210.0"; sha256 = "0dn6fc31yllr5nizylvkfl2b603b5m9694nsn5mmkh8w43h0rkbq"; })
+  (fetchNuGet { pname = "ppy.osu.Framework"; version = "2022.204.0"; sha256 = "1dwg45k1qhxj4mhxw49djmab800yi7z7qnvl8ipicli4lg9k5lvf"; })
+  (fetchNuGet { pname = "ppy.osu.Framework.NativeLibs"; version = "2021.1221.0"; sha256 = "1ffxp4nsgbqw1f6nypirmc0a3h203qikbmxm2x8w3kgcfga5dx3k"; })
+  (fetchNuGet { pname = "ppy.osu.Game.Resources"; version = "2022.204.0"; sha256 = "1v4kfphjbkcxswx11c7xh93jwpsyvnskc0zia91d5bp5d11y3z32"; })
+  (fetchNuGet { pname = "ppy.osuTK.NS20"; version = "1.0.187"; sha256 = "0ididsxn3005dvs0hvx7bz2xzjsfpa8kmnyfqq4c2ybjxlx15gkw"; })
+  (fetchNuGet { pname = "ppy.SDL2-CS"; version = "1.0.501-alpha"; sha256 = "03ixv0nhszsyyf0bvyd25nkyn3c3cndzbxnva19lagvf0l9gnvjg"; })
   (fetchNuGet { pname = "ppy.squirrel.windows"; version = "1.9.0.5"; sha256 = "0nmhrg3q6izapfpwdslq80fqkvjj12ad9r94pd0nr2xx1zw0x1zl"; })
-  (fetchNuGet { pname = "Realm"; version = "10.6.0"; sha256 = "0vsd99zr22a2cvyx71gdqqvr2ld239v5s4dhhfdkjgvadz5dyc2a"; })
-  (fetchNuGet { pname = "Realm.Fody"; version = "10.6.0"; sha256 = "031igfdwrkgn5nh19qxh6s6l8l1ni6lgk65dhqrzqc202xqidsdm"; })
+  (fetchNuGet { pname = "Realm"; version = "10.8.0"; sha256 = "1ixpms8x9z5ia9yiqvhmgdlcrjvqrhbqnr8b9z6mlxwcms1z2f45"; })
+  (fetchNuGet { pname = "Realm.Fody"; version = "10.8.0"; sha256 = "0hj3cqan96y01k5qgs0knkqzg3rlr2794az68xqffd2vqphvqvqq"; })
   (fetchNuGet { pname = "Remotion.Linq"; version = "2.2.0"; sha256 = "1y46ni0xswmmiryp8sydjgryafwn458dr91f9xn653w73kdyk4xf"; })
   (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; })
   (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; })
@@ -187,9 +189,9 @@
   (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; })
   (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; })
   (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; })
-  (fetchNuGet { pname = "Sentry"; version = "3.10.0"; sha256 = "1dnvj1adr6kz5pfdhi2cvq8m303vdaj00zgg2sbx0pc8y3nhc6x7"; })
+  (fetchNuGet { pname = "Sentry"; version = "3.13.0"; sha256 = "0wnivy7rhzghr94pdczv7kw72y1hv5kp6hw0fkmw1nfgnsh4qjfm"; })
   (fetchNuGet { pname = "SharpCompress"; version = "0.17.1"; sha256 = "1ffiacghbcnr3fkgvdcad7b1nky54nhmmn2sm43sks9zm8grvva4"; })
-  (fetchNuGet { pname = "SharpCompress"; version = "0.30.0"; sha256 = "0q9icpwzf76a85wlqqn2d5zsb0pfzvqxihsg71g76gk74xg9gdcd"; })
+  (fetchNuGet { pname = "SharpCompress"; version = "0.30.1"; sha256 = "1hib2hxjrlikwsczym1qn2slaapgjw8qzd8gmid8bryaz8hv044h"; })
   (fetchNuGet { pname = "SharpFNT"; version = "2.0.0"; sha256 = "1bgacgh9hbck0qvji6frbb50sdiqfdng2fvvfgfw8b9qaql91mx0"; })
   (fetchNuGet { pname = "SixLabors.ImageSharp"; version = "1.0.4"; sha256 = "0fmgn414my76gjgp89qlc210a0lqvnvkvk2fcwnpwxdhqpfvyilr"; })
   (fetchNuGet { pname = "Splat"; version = "1.6.2"; sha256 = "154w9q0z8697rcpqs4x233crx5ap1z4pl4xc21hsd3csbhw13ykf"; })
@@ -206,12 +208,12 @@
   (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
   (fetchNuGet { pname = "System.Buffers"; version = "4.4.0"; sha256 = "183f8063w8zqn99pv0ni0nnwh7fgx46qzxamwnans55hhs2l0g19"; })
   (fetchNuGet { pname = "System.Buffers"; version = "4.5.1"; sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3"; })
-  (fetchNuGet { pname = "System.CodeDom"; version = "4.5.0"; sha256 = "1js3h3ig0zwyynl1q88siynp8ra0gz0pfq1wmvls6ji83jrxsami"; })
   (fetchNuGet { pname = "System.Collections"; version = "4.0.11"; sha256 = "1ga40f5lrwldiyw6vy67d0sg7jd7ww6kgwbksm19wrvq9hr0bsm6"; })
   (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
   (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.0.12"; sha256 = "07y08kvrzpak873pmyxs129g1ch8l27zmg51pcyj2jvq03n0r0fc"; })
   (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
   (fetchNuGet { pname = "System.Collections.Immutable"; version = "1.5.0"; sha256 = "1d5gjn5afnrf461jlxzawcvihz195gayqpcfbv6dd7pxa9ialn06"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "1.7.1"; sha256 = "1nh4nlxfc7lbnbl86wwk1a3jwl6myz5j6hvgh5sp4krim9901hsq"; })
   (fetchNuGet { pname = "System.Collections.Immutable"; version = "5.0.0"; sha256 = "1kvcllagxz2q92g81zkz81djkn2lid25ayjfgjalncyc68i15p0r"; })
   (fetchNuGet { pname = "System.ComponentModel.Annotations"; version = "4.5.0"; sha256 = "1jj6f6g87k0iwsgmg3xmnn67a14mq88np0l1ys5zkxhkvbc8976p"; })
   (fetchNuGet { pname = "System.ComponentModel.Annotations"; version = "5.0.0"; sha256 = "021h7x98lblq9avm1bgpa4i31c2kgsa7zn4sqhxf39g087ar756j"; })
@@ -260,7 +262,6 @@
   (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.1.0"; sha256 = "1gpdxl6ip06cnab7n3zlcg6mqp7kknf73s8wjinzi4p0apw82fpg"; })
   (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
   (fetchNuGet { pname = "System.Linq.Queryable"; version = "4.0.1"; sha256 = "11jn9k34g245yyf260gr3ldzvaqa9477w2c5nhb1p8vjx4xm3qaw"; })
-  (fetchNuGet { pname = "System.Management"; version = "4.5.0"; sha256 = "19z5x23n21xi94bgl531l9hrm64nyw9d5fpd7klfvr5xfsbh9jwr"; })
   (fetchNuGet { pname = "System.Memory"; version = "4.5.1"; sha256 = "0f07d7hny38lq9w69wx4lxkn4wszrqf9m9js6fh9is645csm167c"; })
   (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
   (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
@@ -279,7 +280,6 @@
   (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.0.1"; sha256 = "0ydqcsvh6smi41gyaakglnv252625hf29f7kywy2c70nhii2ylqp"; })
   (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
   (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.6.0"; sha256 = "18h375q5bn9h7swxnk4krrxym1dxmi9bm26p89xps9ygrj4q6zqw"; })
-  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.7.0"; sha256 = "121l1z2ypwg02yz84dy6gr82phpys0njk7yask3sihgy214w43qp"; })
   (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.0.1"; sha256 = "1pcd2ig6bg144y10w7yxgc9d22r7c7ww7qn1frdfwgxr24j9wvv0"; })
   (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
   (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.0.1"; sha256 = "1s4b043zdbx9k39lfhvsk68msv1nxbidhkq6nbm27q7sf8xcsnxr"; })
@@ -287,6 +287,7 @@
   (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.6.0"; sha256 = "0hry2k6b7kicg4zxnq0hhn0ys52711pxy7l9v5sp7gvp9cicwpgp"; })
   (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.0.1"; sha256 = "0m7wqwq0zqq9gbpiqvgk3sr92cbrw7cp3xn53xvw7zj6rz6fdirn"; })
   (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "1.8.1"; sha256 = "17xxl3m99wa4hcpqy42vl8qb1jk2jfq32rj3sfjc1a46hi2si5jj"; })
   (fetchNuGet { pname = "System.Reflection.Metadata"; version = "5.0.0"; sha256 = "17qsl5nanlqk9iz0l5wijdn6ka632fs1m1fvx18dfgswm258r3ss"; })
   (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.0.1"; sha256 = "1bangaabhsl4k9fg8khn83wm6yial8ik1sza7401621jc6jrym28"; })
   (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
@@ -299,7 +300,9 @@
   (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.1"; sha256 = "1xcrjx5fwg284qdnxyi2d0lzdm5q4frlpkp0nf6vvkx1kdz2prrf"; })
   (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.2"; sha256 = "1vz4275fjij8inf31np78hw50al8nqkngk04p3xv5n4fcmf1grgi"; })
   (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.3"; sha256 = "1afi6s2r1mh1kygbjmfba6l4f87pi5sg13p4a48idqafli94qxln"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.7.1"; sha256 = "119br3pd85lq8zcgh4f60jzmv1g976q1kdgi3hvqdlhfbw6siz2j"; })
   (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "5.0.0"; sha256 = "02k25ivn50dmqx5jn8hawwmz24yf0454fjd823qk6lygj9513q4x"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0-rc.1.21451.13"; sha256 = "0v5bc80p35jj5b5xdgsn5r1v4w68gqz0sahi214rprrrlr3sl206"; })
   (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.1.0"; sha256 = "0rw4rm4vsm3h3szxp9iijc3ksyviwsv6f63dng3vhqyg4vjdkc2z"; })
   (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
   (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.0.1"; sha256 = "1g0zrdi5508v49pfm3iii2hn6nm00bgvfpjq1zxknfjrxxa20r4g"; })
@@ -348,7 +351,6 @@
   (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
   (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.0.0"; sha256 = "1cb51z062mvc2i8blpzmpn9d9mm4y307xrwi65di8ri18cz5r1zr"; })
   (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.3.0"; sha256 = "1xxcx2xh8jin360yjwm4x4cf5y3a2bwpn2ygkfkwkicz7zk50s2z"; })
-  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.2"; sha256 = "1sh63dz0dymqcwmprp0nadm77b83vmm7lyllpv578c397bslb8hj"; })
   (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.3"; sha256 = "0g7r6hm572ax8v28axrdxz1gnsblg6kszq17g51pj14a5rn2af7i"; })
   (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.4"; sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153"; })
   (fetchNuGet { pname = "System.Threading.Thread"; version = "4.0.0"; sha256 = "1gxxm5fl36pjjpnx1k688dcw8m9l7nmf802nxis6swdaw8k54jzc"; })
diff --git a/pkgs/games/osu-lazer/update.sh b/pkgs/games/osu-lazer/update.sh
index 2fe30ebec1430..21f9eb80f4520 100755
--- a/pkgs/games/osu-lazer/update.sh
+++ b/pkgs/games/osu-lazer/update.sh
@@ -22,6 +22,9 @@ chmod -R +w "$src"
 
 pushd "$src"
 
+export DOTNET_NOLOGO=1
+export DOTNET_CLI_TELEMETRY_OPTOUT=1
+
 mkdir ./nuget_tmp.packages
 dotnet restore osu.Desktop --packages ./nuget_tmp.packages --runtime linux-x64
 
diff --git a/pkgs/games/otto-matic/default.nix b/pkgs/games/otto-matic/default.nix
new file mode 100644
index 0000000000000..e213deabe8593
--- /dev/null
+++ b/pkgs/games/otto-matic/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, cmake, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "OttoMatic";
+  version = "4.0.0";
+
+  src = fetchFromGitHub {
+    owner = "jorio";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256:1yd4clks7kr2hn69c4q1ykc92sw6axbspambm03viapr834bjz3q";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [
+    SDL2
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/OttoMatic
+    mv Data $out/share/OttoMatic
+    install -Dm755 {.,$out/bin}/OttoMatic
+    wrapProgram $out/bin/OttoMatic --run "cd $out/share/OttoMatic"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A port of Otto Matic, a 2001 Macintosh game by Pangea Software, for modern operating systems";
+    homepage = "https://github.com/jorio/OttoMatic";
+    license = with licenses; [
+      cc-by-sa-40
+    ];
+    maintainers = with maintainers; [ lux ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/papermc/default.nix b/pkgs/games/papermc/default.nix
index e1554bdcb4106..09dbfb6c3c83a 100644
--- a/pkgs/games/papermc/default.nix
+++ b/pkgs/games/papermc/default.nix
@@ -1,10 +1,10 @@
 { lib, stdenv, fetchurl, bash, jre }:
 let
-  mcVersion = "1.17.1";
-  buildNum = "399";
+  mcVersion = "1.18.1";
+  buildNum = "132";
   jar = fetchurl {
     url = "https://papermc.io/api/v2/projects/paper/versions/${mcVersion}/builds/${buildNum}/downloads/paper-${mcVersion}-${buildNum}.jar";
-    sha256 = "01374201dkzrx28phy87wji7kzjwx8bpjzv85bjl6672ziskbmpd";
+    sha256 = "af26babef1e9134804bdf61e14eed7677d603516638f5a2ffe97e176ebd9839b";
   };
 in stdenv.mkDerivation {
   pname = "papermc";
diff --git a/pkgs/games/pentobi/default.nix b/pkgs/games/pentobi/default.nix
index 5cfe06ff8dd0b..e0bd6909fb946 100644
--- a/pkgs/games/pentobi/default.nix
+++ b/pkgs/games/pentobi/default.nix
@@ -3,14 +3,14 @@
 }:
 
 mkDerivation rec {
-  version = "19.0";
+  version = "20.0";
   pname = "pentobi";
 
   src = fetchFromGitHub {
     owner = "enz";
     repo = "pentobi";
     rev = "v${version}";
-    sha256 = "sha256-2UeGMAYtVsmKUR7Yw5rogGOd/BTY6twAHuVBU5APp20=";
+    sha256 = "sha256-DQM3IJ0pRkX4OsrjZGROg50LfKb621UnpvtqSjxchz8=";
   };
 
   nativeBuildInputs = [ cmake docbook_xsl qttools ];
@@ -31,7 +31,7 @@ mkDerivation rec {
   meta = with lib; {
     description = "A computer opponent for the board game Blokus";
     homepage = "https://pentobi.sourceforge.io";
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     maintainers = [ ];
     platforms = platforms.linux;
   };
diff --git a/pkgs/games/pioneer/default.nix b/pkgs/games/pioneer/default.nix
index 82879d0a9d2d6..b70ef8c3dab69 100644
--- a/pkgs/games/pioneer/default.nix
+++ b/pkgs/games/pioneer/default.nix
@@ -1,37 +1,68 @@
-{ fetchFromGitHub, lib, stdenv, cmake, pkg-config, curl, libsigcxx, SDL2
-, SDL2_image, freetype, libvorbis, libpng, assimp, libGLU, libGL
-, glew
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, assimp
+, curl
+, freetype
+#, glew
+, libGL
+, libGLU
+, libpng
+, libsigcxx
+, libvorbis
+, lua5_2
+, mesa
+, SDL2
+, SDL2_image
 }:
 
 stdenv.mkDerivation rec {
   pname = "pioneer";
-  version = "20210723";
+  version = "20220203";
 
   src = fetchFromGitHub{
     owner = "pioneerspacesim";
     repo = "pioneer";
     rev = version;
-    sha256 = "sha256-w+ECVv96MoS69815+X0PqguDiGDhHoTnAnnYtLpMScI=";
+    hash = "sha256-HNVg8Lq6k6gQDmgOdpnBwJ57WSEnn5XwtqzmkDU1WGI=";
   };
 
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace 'string(TIMESTAMP PROJECT_VERSION "%Y%m%d")' 'set(PROJECT_VERSION ${version})'
+  '';
+
   nativeBuildInputs = [ cmake pkg-config ];
 
   buildInputs = [
-    curl libsigcxx SDL2 SDL2_image freetype libvorbis libpng
-    assimp libGLU libGL glew
+    assimp
+    curl
+    freetype
+    libGL
+    libGLU
+    libpng
+    libsigcxx
+    libvorbis
+    lua5_2
+    mesa
+    SDL2
+    SDL2_image
   ];
 
-  preConfigure = ''
-    export PIONEER_DATA_DIR="$out/share/pioneer/data";
-  '';
+  cmakeFlags = [
+    "-DPIONEER_DATA_DIR:PATH=${placeholder "out"}/share/pioneer/data"
+    "-DUSE_SYSTEM_LIBLUA:BOOL=YES"
+  ];
 
-  makeFlags = [ "build-data" ];
+  makeFlags = [ "all" "build-data" ];
 
   meta = with lib; {
     description = "A space adventure game set in the Milky Way galaxy at the turn of the 31st century";
     homepage = "https://pioneerspacesim.net";
     license = with licenses; [
-        gpl3 cc-by-sa-30
+        gpl3Only cc-by-sa-30
     ];
     platforms = [ "x86_64-linux" "i686-linux" ];
   };
diff --git a/pkgs/games/planetaryannihilation/default.nix b/pkgs/games/planetaryannihilation/default.nix
index c29af6d810f5f..2debd15f814eb 100644
--- a/pkgs/games/planetaryannihilation/default.nix
+++ b/pkgs/games/planetaryannihilation/default.nix
@@ -1,26 +1,15 @@
 { lib, stdenv, config, fetchurl, patchelf, makeWrapper, gtk2, glib, udev, alsa-lib, atk
-, nspr, fontconfig, cairo, pango, nss, freetype, gnome2, gdk-pixbuf, curl, systemd, xorg }:
+, nspr, fontconfig, cairo, pango, nss, freetype, gnome2, gdk-pixbuf, curl, systemd, xorg, requireFile }:
 
-# TODO: use dynamic attributes once Nix 1.7 is out
-assert ((config.planetary_annihilation or null).url or null) != null;
-assert ((config.planetary_annihilation or null).sha256 or null) != null;
+stdenv.mkDerivation rec {
+  pname = "planetary-annihalation";
+  version = "62857";
 
-/* to setup:
- $ cat ~/.config/nixpkgs/config.nix
- {
-  planetary_annihilation = {
-    url = "file:///home/user/PA_Linux_62857.tar.bz2";
+  src = requireFile {
+    message = "This file has to be downloaded manually via nix-prefetch-url.";
+    name = "PA_Linux_${version}.tar.bz2";
     sha256 = "0imi3k5144dsn3ka9khx3dj76klkw46ga7m6rddqjk4yslwabh3k";
   };
-}
-*/
-
-stdenv.mkDerivation {
-  name = "planetary-annihalation";
-
-  src = fetchurl {
-    inherit (config.planetary_annihilation) url sha256;
-  };
 
   nativeBuildInputs = [ patchelf makeWrapper ];
 
diff --git a/pkgs/games/polymc/default.nix b/pkgs/games/polymc/default.nix
new file mode 100644
index 0000000000000..0d63a8ad5f91d
--- /dev/null
+++ b/pkgs/games/polymc/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, mkDerivation
+, fetchFromGitHub
+, cmake
+, jdk8
+, jdk
+, zlib
+, file
+, makeWrapper
+, xorg
+, libpulseaudio
+, qtbase
+, libGL
+, msaClientID ? ""
+}:
+
+mkDerivation rec {
+  pname = "polymc";
+  version = "1.0.6";
+
+  src = fetchFromGitHub {
+    owner = "PolyMC";
+    repo = "PolyMC";
+    rev = version;
+    sha256 = "sha256-KgLWbZxtxTpuFdMOJNyADYw9rMWoLgczrbSrH4qv6NI=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [ cmake file makeWrapper ];
+  buildInputs = [ qtbase jdk8 zlib ];
+
+  postPatch = ''
+    # hardcode jdk paths
+    substituteInPlace launcher/java/JavaUtils.cpp \
+      --replace 'scanJavaDir("/usr/lib/jvm")' 'javas.append("${jdk}/lib/openjdk/bin/java")' \
+      --replace 'scanJavaDir("/usr/lib32/jvm")' 'javas.append("${jdk8}/lib/openjdk/bin/java")'
+  '';
+
+  cmakeFlags = [ "-DLauncher_LAYOUT=lin-system" ] ++
+               lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ];
+
+  dontWrapQtApps = true;
+
+  postInstall = let
+    libpath = with xorg; lib.makeLibraryPath [
+      libX11
+      libXext
+      libXcursor
+      libXrandr
+      libXxf86vm
+      libpulseaudio
+      libGL
+    ];
+  in ''
+    # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128
+    wrapProgram $out/bin/polymc \
+      "''${qtWrapperArgs[@]}" \
+      --set GAME_LIBRARY_PATH /run/opengl-driver/lib:${libpath} \
+      --prefix PATH : ${lib.makeBinPath [ xorg.xrandr ]}
+  '';
+
+  meta = with lib; {
+    homepage = "https://polymc.org/";
+    description = "A free, open source launcher for Minecraft";
+    longDescription = ''
+      Allows you to have multiple, separate instances of Minecraft (each with
+      their own mods, texture packs, saves, etc) and helps you manage them and
+      their associated options with a simple interface.
+    '';
+    platforms = platforms.linux;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ cleverca22 starcraft66 ];
+  };
+}
diff --git a/pkgs/games/purpur/default.nix b/pkgs/games/purpur/default.nix
new file mode 100644
index 0000000000000..b12c54449a488
--- /dev/null
+++ b/pkgs/games/purpur/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchurl, nixosTests, jre_headless, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "purpur";
+  version = "1.18.1r1522";
+
+  src = fetchurl {
+    url = "https://api.purpurmc.org/v2/purpur/${builtins.replaceStrings [ "r" ] [ "/" ] version}/download";
+    sha256 = "1060fsfcw6m30d47wla1vsnmc4czyla6m8wf91ws095hbvc22qsm";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  preferLocalBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/lib/minecraft
+    cp -v $src $out/lib/minecraft/server.jar
+
+    makeWrapper ${jre_headless}/bin/java $out/bin/minecraft-server \
+      --add-flags "-jar $out/lib/minecraft/server.jar nogui"
+  '';
+
+  dontUnpack = true;
+
+  passthru = {
+    tests = { inherit (nixosTests) minecraft-server; };
+  };
+
+  meta = with lib; {
+    description = "A drop-in replacement for Minecraft Paper servers";
+    longDescription = ''
+      Purpur is a drop-in replacement for Minecraft Paper servers designed for configurability, new fun and exciting
+      gameplay features, and performance built on top of Airplane.
+    '';
+    homepage = "https://purpurmc.org/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ jyooru ];
+  };
+}
diff --git a/pkgs/games/r2mod_cli/default.nix b/pkgs/games/r2mod_cli/default.nix
index 169385576ac5e..607a53579c7eb 100644
--- a/pkgs/games/r2mod_cli/default.nix
+++ b/pkgs/games/r2mod_cli/default.nix
@@ -8,13 +8,13 @@
 
 stdenv.mkDerivation rec {
   pname = "r2mod_cli";
-  version = "1.2.0";
+  version = "1.2.1";
 
   src = fetchFromGitHub {
     owner = "Foldex";
     repo = "r2mod_cli";
     rev = "v${version}";
-    sha256 = "sha256-VNqdVDBR6+eNOeUthPXLfz+0VoaNfSj4f04HLvjg6/0=";
+    sha256 = "sha256-FS9P/uTZU4d6zpM3TlEW6i6PLGHxqqO2fc8D7VsPCig=";
   };
 
   buildInputs = [ bashInteractive ];
diff --git a/pkgs/games/rimshot/default.nix b/pkgs/games/rimshot/default.nix
deleted file mode 100644
index 997da768c6d4a..0000000000000
--- a/pkgs/games/rimshot/default.nix
+++ /dev/null
@@ -1,55 +0,0 @@
-{ lib, stdenv, fetchurl, unzip, love, lua, makeWrapper, makeDesktopItem }:
-
-stdenv.mkDerivation rec {
-  pname = "rimshot";
-  version = "1.0";
-
-  src = fetchurl {
-    url = "https://stabyourself.net/dl.php?file=${pname}/${pname}-source.zip";
-    sha256 = "08pdkyvki92549605m9bqnr24ipkbwkp5nkr5aagdqnr8ai4rgmi";
-  };
-
-  icon = fetchurl {
-    url = "http://stabyourself.net/images/screenshots/rimshot-2.png";
-    sha256 = "08fyiqym3gcpq2vgb5dvafkban42fsbzfcr3iiyw03hz99q53psd";
-  };
-
-  desktopItem = makeDesktopItem {
-    name = "rimshot";
-    exec = pname;
-    icon = icon;
-    comment = "Create your own music";
-    desktopName = "Rimshot";
-    genericName = "rimshot";
-    categories = "Audio;AudioVideo;Music";
-  };
-
-  nativeBuildInputs = [ makeWrapper unzip ];
-  buildInputs = [ lua love ];
-
-  unpackPhase = ''
-    unzip -j $src
-  '';
-
-  installPhase =
-  ''
-    mkdir -p $out/bin
-    mkdir -p $out/share/games/lovegames
-
-    cp -v ./*.love $out/share/games/lovegames/${pname}.love
-    makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
-
-    chmod +x $out/bin/${pname}
-    mkdir -p $out/share/applications
-    ln -s ${desktopItem}/share/applications/* $out/share/applications/
-  '';
-
-  meta = with lib; {
-    description = "Create your own music";
-    maintainers = with maintainers; [ leenaars ];
-    platforms = platforms.linux;
-    license = licenses.free;
-    downloadPage = "http://stabyourself.net/rimshot/";
-  };
-
-}
diff --git a/pkgs/games/rogue/default.nix b/pkgs/games/rogue/default.nix
index 127d65ff362f6..4865b85bbe385 100644
--- a/pkgs/games/rogue/default.nix
+++ b/pkgs/games/rogue/default.nix
@@ -15,9 +15,6 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ ncurses ];
 
-  # Fix build for recent ncurses versions
-  NIX_CFLAGS_COMPILE = "-DNCURSES_INTERNALS=1";
-
   meta = with lib; {
     homepage = "http://rogue.rogueforge.net/rogue-5-4/";
     description = "The final version of the original Rogue game developed for the UNIX operating system";
diff --git a/pkgs/games/rpg-cli/default.nix b/pkgs/games/rpg-cli/default.nix
index 8128a67ebeeec..cad3b539d9ad2 100644
--- a/pkgs/games/rpg-cli/default.nix
+++ b/pkgs/games/rpg-cli/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "rpg-cli";
-  version = "1.0.0";
+  version = "1.0.1";
 
   src = fetchFromGitHub {
     owner = "facundoolano";
     repo = pname;
     rev = version;
-    sha256 = "sha256-Ih+1qO/VHkRp766WDe09xXL/pkby+sURopy7m5wRn4Y=";
+    sha256 = "sha256-rhG/EK68PWvQYoZdjhk0w7oNmh/QiTaAt4/WgEkgxEA=";
   };
 
-  cargoSha256 = "sha256-Au7Nlpl4XOSG8rW0DaHFDqBr1kUY5Emyw6ff0htPc+I=";
+  cargoSha256 = "sha256-YXQohmDmkClziaLkL2N4cGURZ0tewyt7BuNY4hS+a4w=";
 
   # tests assume the authors macbook, and thus fail
   doCheck = false;
diff --git a/pkgs/games/sgt-puzzles/default.upstream b/pkgs/games/sgt-puzzles/default.upstream
deleted file mode 100644
index b6d048b68ae9c..0000000000000
--- a/pkgs/games/sgt-puzzles/default.upstream
+++ /dev/null
@@ -1,5 +0,0 @@
-minimize_overwrite
-url http://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles.tar.gz
-redirect
-NEED_TO_CHOOSE_URL=
-version '.*[-_.]([0-9]{8}[.][^.]+)[.]tar[.].*' '\1'
diff --git a/pkgs/games/shattered-pixel-dungeon/default.nix b/pkgs/games/shattered-pixel-dungeon/default.nix
index 8dc205d51bc39..d8bf9d5f32351 100644
--- a/pkgs/games/shattered-pixel-dungeon/default.nix
+++ b/pkgs/games/shattered-pixel-dungeon/default.nix
@@ -10,15 +10,15 @@
 
 let
   pname = "shattered-pixel-dungeon";
-  version = "1.1.0";
+  version = "1.1.2";
 
   src = fetchFromGitHub {
     owner = "00-Evan";
     repo = "shattered-pixel-dungeon";
     # NOTE: always use the commit sha, not the tag. Tags _will_ disappear!
     # https://github.com/00-Evan/shattered-pixel-dungeon/issues/596
-    rev = "7f29a03078647ea503d3c866476568511aa5af84";
-    sha256 = "sha256-+d8X7WFGX8YGb2rGu8jVO82QdlF9ec+6+Ti5wGEIwRg=";
+    rev = "5d1a2dce6b554b40f6737ead45d411fd98f4c67d";
+    sha256 = "sha256-Vu7K0NnqFY298BIQV9AwNEahV0eJl14tAeq+rw6KrtM=";
   };
 
   postPatch = ''
diff --git a/pkgs/games/snis/default.nix b/pkgs/games/snis/default.nix
new file mode 100644
index 0000000000000..ed09ed46eff54
--- /dev/null
+++ b/pkgs/games/snis/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, coreutils
+, portaudio
+, libbsd
+, libpng
+, libvorbis
+, SDL2
+, makeWrapper
+, lua5_2
+, glew
+, openssl
+, picotts
+, alsa-utils
+, espeak-classic
+, sox
+, libopus
+, openscad
+}:
+
+stdenv.mkDerivation {
+  pname = "snis_launcher";
+  version = "unstable-2021-10-17";
+
+  src = fetchFromGitHub {
+    owner = "smcameron";
+    repo = "space-nerds-in-space";
+    rev = "e70d3c63e33c940feb53c8d818ce2d8ea2aadf00";
+    sha256 = "sha256-HVCb1iFn7GWNpedtFCgLyd0It8s4PEmUwDfb8ap1TDc=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "OPUSARCHIVE=libopus.a" "OPUSARCHIVE=" \
+      --replace "-I./opus-1.3.1/include" "-I${libopus.dev}/include/opus"
+    substituteInPlace snis_launcher \
+      --replace "PREFIX=." "PREFIX=$out"
+    substituteInPlace snis_text_to_speech.sh \
+      --replace "pico2wave" "${sox}/bin/pico2wave" \
+      --replace "espeak" "${espeak-classic}/bin/espeak" \
+      --replace "play" "${sox}/bin/play" \
+      --replace "aplay" "${alsa-utils}/bin/aplay" \
+      --replace "/bin/rm" "${coreutils}/bin/rm"
+  '';
+
+  nativeBuildInputs = [ pkg-config openscad makeWrapper ];
+  buildInputs = [ coreutils portaudio libbsd libpng libvorbis SDL2 lua5_2 glew openssl picotts sox alsa-utils libopus ];
+
+  postBuild = ''
+    make models -j$NIX_BUILD_CORES
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out
+    cp -R share $out/share
+    cp -R bin $out/bin
+    cp snis_launcher $out/bin/
+    # without this, snis_client crashes on Wayland
+    wrapProgram $out/bin/snis_client --set SDL_VIDEODRIVER x11
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Space Nerds In Space, a multi-player spaceship bridge simulator";
+    homepage = "https://smcameron.github.io/space-nerds-in-space/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ alyaeanyx ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/steam/fhsenv.nix b/pkgs/games/steam/fhsenv.nix
index 8c379959ad8b0..35e8b9838f5a3 100644
--- a/pkgs/games/steam/fhsenv.nix
+++ b/pkgs/games/steam/fhsenv.nix
@@ -327,7 +327,7 @@ in buildFHSUserEnv rec {
     name = "steam-run";
 
     targetPkgs = commonTargetPkgs;
-    inherit multiPkgs extraBuildCommands;
+    inherit multiPkgs extraBuildCommands profile;
 
     inherit unshareIpc unsharePid;
 
diff --git a/pkgs/games/supertux/default.nix b/pkgs/games/supertux/default.nix
index 31b36efc4900e..067ce78fae9cd 100644
--- a/pkgs/games/supertux/default.nix
+++ b/pkgs/games/supertux/default.nix
@@ -1,21 +1,21 @@
 { lib, stdenv, fetchurl, cmake, pkg-config, SDL2, SDL2_image , curl
 , libogg, libvorbis, libGLU, libGL, openal, boost, glew
-, libpng, freetype
+, libpng, freetype, glm
 }:
 
 stdenv.mkDerivation rec {
   pname = "supertux";
-  version = "0.6.2";
+  version = "0.6.3";
 
   src = fetchurl {
     url = "https://github.com/SuperTux/supertux/releases/download/v${version}/SuperTux-v${version}-Source.tar.gz";
-    sha256 = "167m3z4m8n76dvbv42m1fnvabpbpsxvr28zk9641916jl9pfba96";
+    sha256 = "1xkr3ka2sxp5s0spp84iv294i29s1vxqzazb6kmjc0n415h0x57p";
   };
 
   nativeBuildInputs = [ pkg-config cmake ];
 
   buildInputs = [ SDL2 SDL2_image curl libogg libvorbis libGLU libGL openal boost glew
-    libpng freetype
+    libpng freetype glm
   ];
 
   cmakeFlags = [ "-DENABLE_BOOST_STATIC_LIBS=OFF" ];
diff --git a/pkgs/games/tennix/default.nix b/pkgs/games/tennix/default.nix
index f81ddb7edf953..809ed7a146d08 100644
--- a/pkgs/games/tennix/default.nix
+++ b/pkgs/games/tennix/default.nix
@@ -1,4 +1,4 @@
-{lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_net, python } :
+{lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_net, python2 } :
 
 stdenv.mkDerivation rec {
   pname = "tennix";
@@ -8,7 +8,7 @@ stdenv.mkDerivation rec {
     sha256 = "0np5kw1y7i0z0dsqx4r2nvmq86qj8hv3mmgavm3hxraqnds5z8cm";
   };
 
-  buildInputs = [ python SDL SDL_mixer SDL_image SDL_ttf SDL_net ];
+  buildInputs = [ python2 SDL SDL_mixer SDL_image SDL_ttf SDL_net ];
 
   patches = [ ./fix_FTBFS.patch ];
 
diff --git a/pkgs/games/tetrio-desktop/default.nix b/pkgs/games/tetrio-desktop/default.nix
new file mode 100644
index 0000000000000..c700aba72fc9c
--- /dev/null
+++ b/pkgs/games/tetrio-desktop/default.nix
@@ -0,0 +1,85 @@
+{ stdenv
+, lib
+, fetchurl
+, autoPatchelfHook
+, alsa-lib
+, cups
+, libX11
+, libXScrnSaver
+, libXtst
+, mesa
+, nss
+, systemd
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tetrio-desktop";
+  version = "8.0.0";
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20211130172544/https://tetr.io/about/desktop/builds/TETR.IO%20Setup.deb";
+    name = "tetrio-desktop.deb";
+    sha256 = "1nlblfhrph4cw8rpic9icrs78mzrxyskl7ggyy2i8bk9i07i21xf";
+  };
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    alsa-lib
+    cups
+    libX11
+    libXScrnSaver
+    libXtst
+    mesa
+    nss
+  ];
+
+  dontWrapGApps = true;
+
+  libPath = lib.makeLibraryPath [
+    alsa-lib
+    cups
+    libX11
+    libXScrnSaver
+    libXtst
+    mesa
+    nss
+    systemd
+  ];
+
+  unpackPhase = ''
+    mkdir -p $TMP/tetrio-desktop $out/bin
+    cp $src $TMP/tetrio-desktop.deb
+    ar vx $TMP/tetrio-desktop.deb
+    tar --no-overwrite-dir -xvf data.tar.xz -C $TMP/tetrio-desktop/
+  '';
+
+  installPhase = ''
+    cp -R $TMP/tetrio-desktop/{usr/share,opt} $out/
+
+    wrapProgram $out/opt/TETR.IO/tetrio-desktop \
+      --prefix LD_LIBRARY_PATH : ${libPath}:$out/opt/TETR.IO
+
+    ln -s $out/opt/TETR.IO/tetrio-desktop $out/bin/
+
+    substituteInPlace $out/share/applications/tetrio-desktop.desktop \
+      --replace "Exec=\"/opt/TETR.IO/tetrio-desktop\"" "Exec=\"$out/opt/TETR.IO/tetrio-desktop\""
+  '';
+
+  meta = with lib; {
+    homepage = "https://tetr.io";
+    downloadPage = "https://tetr.io/about/desktop/";
+    description = "TETR.IO desktop client";
+    longDescription = ''
+      TETR.IO is a modern yet familiar online stacker.
+      Play against friends and foes all over the world, or claim a spot on the leaderboards - the stacker future is yours!
+    '';
+    platforms = [ "x86_64-linux" ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ wackbyte ];
+  };
+}
diff --git a/pkgs/games/the-legend-of-edgar/default.nix b/pkgs/games/the-legend-of-edgar/default.nix
new file mode 100644
index 0000000000000..d099bbf2a4205
--- /dev/null
+++ b/pkgs/games/the-legend-of-edgar/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, gettext
+, libpng
+, pkg-config
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "the-legend-of-edgar";
+  version = "1.35";
+
+  src = fetchFromGitHub {
+    name = "${pname}-${version}-src";
+    owner = "riksweeney";
+    repo = "edgar";
+    rev = version;
+    hash = "sha256-ojy4nEW9KiSte/AoFUMPrKCxvIeQpMVIL4ileHiBydo=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    libpng
+    zlib
+  ];
+
+  dontConfigure = true;
+
+  makefile = "makefile";
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+    "BIN_DIR=${placeholder "out"}/bin/"
+  ];
+
+  # TODO: remove the setting below when the next version arrives
+  # https://github.com/riksweeney/edgar/pull/57
+  preBuild = ''
+    export CFLAGS=$(sdl2-config --cflags)
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.parallelrealities.co.uk/games/edgar";
+    description = "A 2D platform game with a persistent world";
+    longDescription = ''
+      When Edgar's father fails to return home after venturing out one dark and
+      stormy night, Edgar fears the worst: he has been captured by the evil
+      sorcerer who lives in a fortress beyond the forbidden swamp.
+
+      Donning his armour, Edgar sets off to rescue him, but his quest will not
+      be easy...
+
+      The Legend of Edgar is a platform game, not unlike those found on the
+      Amiga and SNES. Edgar must battle his way across the world, solving
+      puzzles and defeating powerful enemies to achieve his quest.
+    '';
+    license = licenses.gpl1Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/toppler/default.nix b/pkgs/games/toppler/default.nix
index ffe807410bb40..890e13498747e 100644
--- a/pkgs/games/toppler/default.nix
+++ b/pkgs/games/toppler/default.nix
@@ -1,34 +1,61 @@
-{ lib, stdenv
-, fetchurl
-, SDL
-, SDL_mixer
+{ lib
+, stdenv
+, fetchFromGitLab
+
+, pkg-config
+, gettext
+, povray
+, imagemagick
+, gimp
+
+, SDL2
+, SDL2_mixer
+, SDL2_image
+, libpng
 , zlib
 }:
 
 stdenv.mkDerivation rec {
   pname = "toppler";
-  version = "1.1.6";
+  version = "1.3";
 
-  src = fetchurl {
-    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
-    sha256 = "0ifccissd8sh78kpwh7dafx4ah7hkhqz6nf4z2hdnalw702jkg3x";
+  src = fetchFromGitLab {
+    owner = "roever";
+    repo = "toppler";
+    rev = "v${version}";
+    sha256 = "sha256-ecEaELu52Nmov/BD9VzcUw6wyWeHJcsKQkEzTnaW330=";
   };
 
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    povray
+    imagemagick
+    gimp
+  ];
+
   buildInputs = [
-    SDL
-    SDL_mixer
+    SDL2
+    SDL2_mixer
+    SDL2_image
+    libpng
     zlib
   ];
 
-  # The conftest hangs on Hydra runners, because they are not logged in.
-  configureFlags = lib.optional stdenv.isDarwin "--disable-sdltest";
+  # GIMP needs a writable home
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  hardeningDisable = [ "format" ];
 
   meta = with lib; {
     description = "Jump and run game, reimplementation of Tower Toppler/Nebulus";
-    homepage = "http://toppler.sourceforge.net/";
-    license = licenses.gpl2;
+    homepage = "https://gitlab.com/roever/toppler";
+    license = licenses.gpl2Plus;
     maintainers = with maintainers; [ fgaz ];
     platforms = platforms.all;
   };
 }
-
diff --git a/pkgs/games/tworld2/default.nix b/pkgs/games/tworld2/default.nix
new file mode 100644
index 0000000000000..1db1dcf5f0652
--- /dev/null
+++ b/pkgs/games/tworld2/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, fetchurl
+, qt4
+, SDL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tworld2";
+  version = "2.2.0";
+
+  src = fetchurl {
+    url = "https://tw2.bitbusters.club/downloads/tworld-${version}-src.tar.gz";
+    sha256 = "sha256:1y55v2shk2xxcds7bdwdjaq9lka31sgdp2469zqnvldchwbvcb2i";
+  };
+
+  buildInputs = [ qt4 SDL ];
+  enableParallelBuilding = true;
+
+  postConfigure = ''
+    echo "#define COMPILE_TIME \"$(date -ud "@$SOURCE_DATE_EPOCH" '+%Y %b %e %T %Z')\"" >comptime.h
+  '';
+
+  makeFlags = [
+    "bindir=${placeholder "out"}/bin"
+    "sharedir=${placeholder "out"}/share"
+    "mandir=${placeholder "out"}/share/man/en"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/doc/${pname}
+    cp COPYING README docs/tworld2.html $out/share/doc/${pname}
+
+    mkdir $out/share/icons
+    cp tworld.ico tworld2.ico $out/share/icons
+  '';
+
+  meta = with lib; {
+    description = "Tile World 2: Tile World is a reimplementation of the game Chip's Challenge";
+    homepage = "https://tw2.bitbusters.club/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ drperceptron ];
+  };
+}
diff --git a/pkgs/games/uchess/default.nix b/pkgs/games/uchess/default.nix
index cafd7cf57696b..58b45609cc4a0 100644
--- a/pkgs/games/uchess/default.nix
+++ b/pkgs/games/uchess/default.nix
@@ -13,7 +13,7 @@ buildGoModule rec {
     sha256 = "1njl3f41gshdpj431zkvpv2b7zmh4m2m5q6xsijb0c0058dk46mz";
   };
 
-  vendorSha256 = "0dkq240ch1z3gihn8yc5d723nnvfxirk2nhw12r1c2hj1ga088g3";
+  vendorSha256 = "sha256-4yEE1AsSChayCBxaMXPsbls7xGmFeWRhfOMHyAAReDY=";
 
   # package does not contain any tests as of v0.2.1
   doCheck = false;
diff --git a/pkgs/games/ue4demos/default.nix b/pkgs/games/ue4demos/default.nix
index a2d114f511392..51148e42e8e16 100644
--- a/pkgs/games/ue4demos/default.nix
+++ b/pkgs/games/ue4demos/default.nix
@@ -5,7 +5,7 @@ let
     [
       # Untrusted mirrors - do not update hashes
       "https://ludios.org/mirror/ue4demos/${file}"
-      "http://web.archive.org/web/20140824192039/http://ue4linux.raxxy.com/${file}"
+      "https://web.archive.org/web/20140824192039/http://ue4linux.raxxy.com/${file}"
     ];
 
   buildDemo = { name, src }:
diff --git a/pkgs/games/unciv/default.nix b/pkgs/games/unciv/default.nix
index 307138c03aaa0..dd9e1c827c46f 100644
--- a/pkgs/games/unciv/default.nix
+++ b/pkgs/games/unciv/default.nix
@@ -25,11 +25,11 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "unciv";
-  version = "3.15.9";
+  version = "3.19.7";
 
   src = fetchurl {
     url = "https://github.com/yairm210/Unciv/releases/download/${version}/Unciv.jar";
-    sha256 = "sha256-ONp7M6nMlVjxNnsIveDpqV7/WahydphP16DFDrcjY4E=";
+    sha256 = "sha256-I6qU/qojUjwCQf7DLoeUwoYROo4N5SEtWCs1DazaZXw=";
   };
 
   dontUnpack = true;
diff --git a/pkgs/games/vapor/default.nix b/pkgs/games/vapor/default.nix
deleted file mode 100644
index 2fa7ca1892701..0000000000000
--- a/pkgs/games/vapor/default.nix
+++ /dev/null
@@ -1,61 +0,0 @@
-{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
-
-let
-  pname = "vapor";
-  version = "0.2.3";
-  commitid = "dbf509f";
-
-  icon = fetchurl {
-    url = "http://vapor.love2d.org/sites/default/files/vapT240x90.png";
-    sha256 = "1xlra74lpm1y54z6zm6is0gldkswp3wdw09m6a306ch0xjf3f87f";
-  };
-
-  desktopItem = makeDesktopItem {
-    name = "Vapor";
-    exec = pname;
-    icon = icon;
-    comment = "LÖVE Distribution Client";
-    desktopName = "Vapor";
-    genericName = "vapor";
-    categories = "Game;";
-  };
-
-in
-
-stdenv.mkDerivation {
-  name = "${pname}-${version}";
-
-  src = fetchurl {
-    url =
-    "https://github.com/josefnpat/${pname}/releases/download/${version}/${pname}_${commitid}.love";
-    sha256 = "0w2qkrrkzfy4h4jld18apypmbi8a8r89y2l11axlv808i2rg68fk";
-  };
-
-  nativeBuildInputs = [ makeWrapper ];
-  buildInputs = [ lua love ];
-
-  dontUnpack = true;
-
-  installPhase =
-  ''
-    mkdir -p $out/bin
-    mkdir -p $out/share
-
-    cp -v $src $out/share/${pname}.love
-
-    makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/${pname}.love
-
-    chmod +x $out/bin/${pname}
-    mkdir -p $out/share/applications
-    ln -s ${desktopItem}/share/applications/* $out/share/applications/
-  '';
-
-  meta = with lib; {
-    description = "LÖVE Distribution Client allowing access to many games";
-    platforms = platforms.linux;
-    license = licenses.zlib;
-    maintainers = with maintainers; [ leenaars ];
-    downloadPage = "http://vapor.love2d.org/";
-  };
-
-}
diff --git a/pkgs/games/vassal/default.nix b/pkgs/games/vassal/default.nix
index 1a08fbb4dd0b4..905d51438b687 100644
--- a/pkgs/games/vassal/default.nix
+++ b/pkgs/games/vassal/default.nix
@@ -2,16 +2,18 @@
 
 stdenv.mkDerivation rec {
   pname = "VASSAL";
-  version = "3.5.8";
+  version = "3.6.5";
 
   src = fetchzip {
     url = "https://github.com/vassalengine/vassal/releases/download/${version}/${pname}-${version}-linux.tar.bz2";
-    sha256 = "sha256-IJ3p7+0fs/2dCbE1BOb2580upR9W/1R2/e3xmkAsJ+M=";
+    sha256 = "sha256-wnaT0+r599/RboeUfpCZTNd/M2kaCsckI9F+7r7leEE=";
   };
 
   nativeBuildInputs = [ makeWrapper ];
 
   installPhase = ''
+    runHook preInstall
+
     mkdir -p $out/bin $out/share/vassal $out/doc
 
     cp CHANGES LICENSE README.md $out
@@ -21,6 +23,8 @@ stdenv.mkDerivation rec {
     makeWrapper ${jre}/bin/java $out/bin/vassal \
       --add-flags "-Duser.dir=$out -cp $out/share/vassal/Vengine.jar \
       VASSAL.launch.ModuleManager"
+
+    runHook postInstall
   '';
 
   # Don't move doc to share/, VASSAL expects it to be in the root
@@ -28,7 +32,7 @@ stdenv.mkDerivation rec {
 
   meta = with lib; {
       description = "A free, open-source boardgame engine";
-      homepage = "http://www.vassalengine.org/";
+      homepage = "https://vassalengine.org/";
       license = licenses.lgpl21Only;
       maintainers = with maintainers; [ tvestelind ];
       platforms = platforms.unix;
diff --git a/pkgs/games/vdrift/default.nix b/pkgs/games/vdrift/default.nix
index 04f65cf793795..19397794649b9 100644
--- a/pkgs/games/vdrift/default.nix
+++ b/pkgs/games/vdrift/default.nix
@@ -12,7 +12,7 @@
 , bullet
 , curl
 , gettext
-, writeTextFile
+, writeShellScriptBin
 
 , data ? fetchsvn {
     url = "svn://svn.code.sf.net/p/vdrift/code/vdrift-data";
@@ -54,21 +54,15 @@ let
     };
   };
   wrappedName = "vdrift-${version}-with-data-${toString data.rev}";
-in writeTextFile {
+in
+(writeShellScriptBin "vdrift"  ''
+  export VDRIFT_DATA_DIRECTORY="${data}"
+  exec ${bin}/bin/vdrift "$@"
+'').overrideAttrs (_: {
   name = wrappedName;
-  text = ''
-    export VDRIFT_DATA_DIRECTORY="${data}"
-    exec ${bin}/bin/vdrift "$@"
-  '';
-  destination = "/bin/vdrift";
-  executable = true;
-  checkPhase = ''
-    ${stdenv.shell} -n $out/bin/vdrift
-  '';
-} // {
   meta = bin.meta // {
     hydraPlatforms = [ ];
   };
   unwrapped = bin;
   inherit bin data;
-}
+})
diff --git a/pkgs/games/vintagestory/default.nix b/pkgs/games/vintagestory/default.nix
index d19611a08ffeb..8c2e8573177ec 100644
--- a/pkgs/games/vintagestory/default.nix
+++ b/pkgs/games/vintagestory/default.nix
@@ -17,11 +17,11 @@
 
 stdenv.mkDerivation rec {
   pname = "vintagestory";
-  version = "1.15.10";
+  version = "1.16.3";
 
   src = fetchurl {
     url = "https://cdn.vintagestory.at/gamefiles/stable/vs_archive_${version}.tar.gz";
-    sha256 = "sha256-aT6vndo/SSAqd4omyW4qWvGetkqEpgvapqaqDBrbTmo=";
+    sha256 = "sha256-PpvTHG/EBKBhtlgIrAz/B+U1aHbZURN2cWTlZ/DkZQs=";
   };
 
   nativeBuildInputs = [ makeWrapper copyDesktopItems ];
diff --git a/pkgs/games/warzone2100/default.nix b/pkgs/games/warzone2100/default.nix
index e5656e50de3c6..788fbdbf6c8ea 100644
--- a/pkgs/games/warzone2100/default.nix
+++ b/pkgs/games/warzone2100/default.nix
@@ -124,7 +124,7 @@ stdenv.mkDerivation rec {
       technologies, combined with the unit design system, allows for a wide
       variety of possible units and tactics.
     '';
-    homepage = "http://wz2100.net";
+    homepage = "https://wz2100.net";
     license = licenses.gpl2Plus;
     maintainers = with maintainers; [ astsmtl fgaz ];
     platforms = platforms.all;
diff --git a/pkgs/games/widelands/default.nix b/pkgs/games/widelands/default.nix
index f094c7cd59616..f53b3deaef493 100644
--- a/pkgs/games/widelands/default.nix
+++ b/pkgs/games/widelands/default.nix
@@ -1,6 +1,7 @@
 { lib
 , stdenv
 , fetchFromGitHub
+, fetchpatch
 , SDL2
 , SDL2_image
 , SDL2_mixer
@@ -32,7 +33,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-gNumYoeKePaxiAzrqEPKibMxFwv9vyBrCSoua+MKhcM=";
   };
 
-  patches = [ ./bincmake.patch ];
+  patches = [
+    ./bincmake.patch
+    # fix for building with Boost 1.77, https://github.com/widelands/widelands/pull/5025
+    (fetchpatch {
+      url = "https://github.com/widelands/widelands/commit/33981fda8c319c9feafc958f5f0b1670c48666ef.patch";
+      sha256 = "sha256-FjxxCTPpg/Zp01XpNfgRXMMLJBfxAptkLpsLmnFXm2Q=";
+    })
+  ];
 
   postPatch = ''
     substituteInPlace xdg/org.widelands.Widelands.desktop \
diff --git a/pkgs/games/worldofgoo/default.nix b/pkgs/games/worldofgoo/default.nix
index a9938cfcbc042..fee4699aec92a 100644
--- a/pkgs/games/worldofgoo/default.nix
+++ b/pkgs/games/worldofgoo/default.nix
@@ -68,7 +68,7 @@ stdenv.mkDerivation rec {
       Balls who live in the beautiful World of Goo don't know that they are in a
       game, or that they are extremely delicious.
     '';
-    homepage = "http://worldofgoo.com";
+    homepage = "https://worldofgoo.com";
     license = licenses.unfree;
     platforms = [ "i686-linux" "x86_64-linux" ];
     maintainers = with maintainers; [ jcumming maxeaubrey ];
diff --git a/pkgs/games/xconq/default.nix b/pkgs/games/xconq/default.nix
index 8f4366fbcb87d..10a959a676b49 100644
--- a/pkgs/games/xconq/default.nix
+++ b/pkgs/games/xconq/default.nix
@@ -2,12 +2,11 @@
 , libXext, fontconfig, makeWrapper }:
 
 stdenv.mkDerivation rec {
-  name = "${baseName}-${version}";
-  baseName = "xconq";
+  pname = "xconq";
   version = "7.5.0-0pre.0.20050612";
 
   src = fetchurl {
-    url = "mirror://sourceforge/project/${baseName}/${baseName}/${name}/${name}.tar.gz";
+    url = "mirror://sourceforge/project/xconq/xconq/xconq-${version}/xconq-${version}.tar.gz";
     sha256 = "1za78yx57mgwcmmi33wx3533yz1x093dnqis8q2qmqivxav51lca";
   };
 
diff --git a/pkgs/games/xcowsay/default.nix b/pkgs/games/xcowsay/default.nix
index 89ca50b3a3321..52569e044f06e 100644
--- a/pkgs/games/xcowsay/default.nix
+++ b/pkgs/games/xcowsay/default.nix
@@ -5,11 +5,11 @@
 
 stdenv.mkDerivation rec {
   pname = "xcowsay";
-  version = "1.5.1";
+  version = "1.6";
 
   src = fetchurl {
     url = "http://www.nickg.me.uk/files/xcowsay-${version}.tar.gz";
-    sha256 = "sha256-wypsfAp634wbaAI+fxzmr3J5AmvQzChVi/wp/BPxiA0=";
+    sha256 = "sha256-RqzoZP8o0tIfS3BY8CleGNAEGhIMEHipUfpDxOD1yMU=";
   };
 
   buildInputs = [
diff --git a/pkgs/games/xmoto/default.nix b/pkgs/games/xmoto/default.nix
index 246e1afc7444a..5909c3f20ee46 100644
--- a/pkgs/games/xmoto/default.nix
+++ b/pkgs/games/xmoto/default.nix
@@ -57,7 +57,7 @@ stdenv.mkDerivation rec {
       X-Moto is a challenging 2D motocross platform game, where physics plays an all important role in the gameplay.
       You need to control your bike to its limits, if you want to have a chance to finish the most difficult challenges.
     '';
-    homepage = "http://xmoto.tuxfamily.org";
+    homepage = "https://xmoto.tuxfamily.org";
     maintainers = with maintainers; [ raskin pSub ];
     platforms = platforms.all;
     license = licenses.gpl2Plus;