summary refs log tree commit diff
path: root/pkgs/games
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2021-08-04 10:43:07 +0000
committerAlyssa Ross <hi@alyssa.is>2021-08-04 10:43:07 +0000
commit62614cbef7da005c1eda8c9400160f6bcd6546b8 (patch)
treec2630f69080637987b68acb1ee8676d2681fe304 /pkgs/games
parentd9c82ed3044c72cecf01c6ea042489d30914577c (diff)
parente24069138dfec3ef94f211f1da005bb5395adc11 (diff)
downloadnixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar.gz
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar.bz2
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar.lz
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar.xz
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.tar.zst
nixpkgs-62614cbef7da005c1eda8c9400160f6bcd6546b8.zip
Merge branch 'nixpkgs-update' into master
Diffstat (limited to 'pkgs/games')
-rw-r--r--pkgs/games/0ad/data.nix7
-rw-r--r--pkgs/games/0ad/default.nix10
-rw-r--r--pkgs/games/0ad/game.nix59
-rw-r--r--pkgs/games/0ad/rootdir_env.patch13
-rw-r--r--pkgs/games/0ad/spidermonkey-cargo-toml.patch15
-rw-r--r--pkgs/games/0ad/wrapper.nix2
-rw-r--r--pkgs/games/0verkill/default.nix39
-rw-r--r--pkgs/games/1oom/default.nix32
-rw-r--r--pkgs/games/2048-in-terminal/default.nix4
-rw-r--r--pkgs/games/20kly/default.nix36
-rw-r--r--pkgs/games/90secondportraits/default.nix4
-rw-r--r--pkgs/games/abbaye-des-morts/default.nix6
-rw-r--r--pkgs/games/abuse/abuse.sh18
-rw-r--r--pkgs/games/abuse/default.nix54
-rw-r--r--pkgs/games/adom/default.nix8
-rw-r--r--pkgs/games/airstrike/default.nix7
-rw-r--r--pkgs/games/alephone/default.nix32
-rw-r--r--pkgs/games/alephone/infinity/default.nix4
-rw-r--r--pkgs/games/alephone/marathon/default.nix4
-rw-r--r--pkgs/games/alienarena/default.nix18
-rw-r--r--pkgs/games/amoeba/data.nix4
-rw-r--r--pkgs/games/amoeba/default.nix8
-rw-r--r--pkgs/games/among-sus/default.nix30
-rw-r--r--pkgs/games/andyetitmoves/default.nix19
-rw-r--r--pkgs/games/angband/default.nix8
-rw-r--r--pkgs/games/anki/bin.nix72
-rw-r--r--pkgs/games/anki/default.nix18
-rw-r--r--pkgs/games/antsimulator/default.nix29
-rw-r--r--pkgs/games/arena/default.nix23
-rw-r--r--pkgs/games/armagetronad/default.nix40
-rw-r--r--pkgs/games/arx-libertatis/default.nix15
-rw-r--r--pkgs/games/asc/default.nix15
-rw-r--r--pkgs/games/assaultcube/default.nix14
-rw-r--r--pkgs/games/astromenace/default.nix9
-rw-r--r--pkgs/games/atanks/default.nix4
-rw-r--r--pkgs/games/augustus/default.nix11
-rw-r--r--pkgs/games/azimuth/default.nix8
-rw-r--r--pkgs/games/ball-and-paddle/default.nix13
-rw-r--r--pkgs/games/banner/default.nix17
-rw-r--r--pkgs/games/bastet/default.nix4
-rw-r--r--pkgs/games/beret/default.nix11
-rw-r--r--pkgs/games/bitsnbots/default.nix15
-rw-r--r--pkgs/games/black-hole-solver/default.nix30
-rw-r--r--pkgs/games/blackshades/default.nix46
-rw-r--r--pkgs/games/blobby/default.nix24
-rw-r--r--pkgs/games/blobwars/default.nix34
-rw-r--r--pkgs/games/boohu/default.nix6
-rw-r--r--pkgs/games/braincurses/default.nix4
-rw-r--r--pkgs/games/brogue/default.nix4
-rw-r--r--pkgs/games/bsdgames/default.nix15
-rw-r--r--pkgs/games/btanks/default.nix6
-rw-r--r--pkgs/games/bzflag/default.nix8
-rw-r--r--pkgs/games/cataclysm-dda/common.nix31
-rw-r--r--pkgs/games/cataclysm-dda/default.nix3
-rw-r--r--pkgs/games/cataclysm-dda/git.nix15
-rw-r--r--pkgs/games/cataclysm-dda/lib.nix31
-rw-r--r--pkgs/games/cataclysm-dda/pkgs/default.nix10
-rw-r--r--pkgs/games/cataclysm-dda/stable.nix13
-rw-r--r--pkgs/games/cbonsai/default.nix29
-rw-r--r--pkgs/games/cdogs-sdl/default.nix52
-rw-r--r--pkgs/games/cgoban/default.nix38
-rw-r--r--pkgs/games/chessdb/default.nix16
-rw-r--r--pkgs/games/chessx/default.nix14
-rw-r--r--pkgs/games/chiaki/default.nix59
-rw-r--r--pkgs/games/chocolate-doom/default.nix12
-rw-r--r--pkgs/games/chromium-bsu/default.nix68
-rw-r--r--pkgs/games/ckan/default.nix47
-rw-r--r--pkgs/games/clonehero/default.nix73
-rw-r--r--pkgs/games/clonehero/fhs-wrapper.nix39
-rw-r--r--pkgs/games/clonehero/xdg-wrapper.nix21
-rw-r--r--pkgs/games/cockatrice/default.nix18
-rw-r--r--pkgs/games/colobot/data.nix41
-rw-r--r--pkgs/games/colobot/default.nix50
-rw-r--r--pkgs/games/commandergenius/default.nix6
-rw-r--r--pkgs/games/construo/default.nix10
-rw-r--r--pkgs/games/crack-attack/default.nix17
-rw-r--r--pkgs/games/crafty/default.nix10
-rw-r--r--pkgs/games/crawl/crawl_purify.patch20
-rw-r--r--pkgs/games/crawl/default.nix15
-rw-r--r--pkgs/games/crispy-doom/default.nix29
-rw-r--r--pkgs/games/crrcsim/default.nix6
-rw-r--r--pkgs/games/curseofwar/default.nix4
-rw-r--r--pkgs/games/cutemaze/default.nix10
-rw-r--r--pkgs/games/cuyo/default.nix12
-rw-r--r--pkgs/games/devilutionx/default.nix21
-rw-r--r--pkgs/games/dhewm3/default.nix8
-rw-r--r--pkgs/games/domination/default.nix93
-rw-r--r--pkgs/games/duckmarines/default.nix11
-rw-r--r--pkgs/games/dwarf-fortress/default.nix94
-rw-r--r--pkgs/games/dwarf-fortress/dfhack/default.nix42
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/default.nix28
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in11
-rw-r--r--pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix35
-rw-r--r--pkgs/games/dwarf-fortress/game.json14
-rw-r--r--pkgs/games/dwarf-fortress/game.nix44
-rw-r--r--pkgs/games/dwarf-fortress/lazy-pack.nix32
-rw-r--r--pkgs/games/dwarf-fortress/legends-browser/default.nix6
-rw-r--r--pkgs/games/dwarf-fortress/soundsense.nix7
-rw-r--r--pkgs/games/dwarf-fortress/themes/default.nix32
-rw-r--r--pkgs/games/dwarf-fortress/themes/themes.json54
-rw-r--r--pkgs/games/dwarf-fortress/twbt/default.nix22
-rw-r--r--pkgs/games/dwarf-fortress/unfuck.nix58
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix44
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in17
-rw-r--r--pkgs/games/dxx-rebirth/assets.nix4
-rw-r--r--pkgs/games/dxx-rebirth/default.nix8
-rw-r--r--pkgs/games/dxx-rebirth/full.nix4
-rw-r--r--pkgs/games/easyrpg-player/default.nix10
-rw-r--r--pkgs/games/eboard/default.nix13
-rw-r--r--pkgs/games/eduke32/default.nix25
-rw-r--r--pkgs/games/egoboo/default.nix8
-rw-r--r--pkgs/games/eidolon/default.nix15
-rw-r--r--pkgs/games/empty-epsilon/0001-bundle-system-glm-in-seriousproton.patch34
-rw-r--r--pkgs/games/empty-epsilon/default.nix67
-rw-r--r--pkgs/games/endgame-singularity/default.nix10
-rw-r--r--pkgs/games/endless-sky/default.nix25
-rw-r--r--pkgs/games/enigma/default.nix32
-rw-r--r--pkgs/games/enyo-doom/default.nix14
-rw-r--r--pkgs/games/eternity-engine/default.nix10
-rw-r--r--pkgs/games/extremetuxracer/default.nix16
-rw-r--r--pkgs/games/exult/arch.patch123
-rw-r--r--pkgs/games/exult/default.nix28
-rw-r--r--pkgs/games/ezquake/default.nix14
-rw-r--r--pkgs/games/factorio/default.nix128
-rw-r--r--pkgs/games/factorio/mods.nix4
-rwxr-xr-xpkgs/games/factorio/update.py180
-rw-r--r--pkgs/games/factorio/utils.nix4
-rw-r--r--pkgs/games/factorio/versions.json58
-rw-r--r--pkgs/games/fairymax/default.nix13
-rw-r--r--pkgs/games/fheroes2/default.nix45
-rw-r--r--pkgs/games/fish-fillets-ng/default.nix38
-rw-r--r--pkgs/games/fish-fillets-ng/icon.xpm39
-rw-r--r--pkgs/games/flare/default.nix4
-rw-r--r--pkgs/games/flare/desktop.patch15
-rw-r--r--pkgs/games/flare/engine.nix12
-rw-r--r--pkgs/games/flare/game.nix8
-rw-r--r--pkgs/games/flightgear/default.nix16
-rw-r--r--pkgs/games/fltrator/default.nix6
-rw-r--r--pkgs/games/freecell-solver/default.nix6
-rw-r--r--pkgs/games/freeciv/default.nix19
-rw-r--r--pkgs/games/freedink/default.nix14
-rw-r--r--pkgs/games/freedroid/default.nix53
-rw-r--r--pkgs/games/freedroidrpg/default.nix10
-rw-r--r--pkgs/games/freenukum/default.nix72
-rw-r--r--pkgs/games/freeorion/default.nix77
-rw-r--r--pkgs/games/freeorion/fix-paths.sh2
-rw-r--r--pkgs/games/freesweep/default.nix4
-rw-r--r--pkgs/games/frogatto/data.nix16
-rw-r--r--pkgs/games/frogatto/default.nix6
-rw-r--r--pkgs/games/frogatto/engine.nix20
-rw-r--r--pkgs/games/frotz/default.nix13
-rw-r--r--pkgs/games/frozen-bubble/default.nix22
-rw-r--r--pkgs/games/fsg/default.nix17
-rw-r--r--pkgs/games/galaxis/default.nix4
-rw-r--r--pkgs/games/gambatte/default.nix12
-rw-r--r--pkgs/games/garden-of-coloured-lights/default.nix4
-rw-r--r--pkgs/games/gargoyle/default.nix8
-rw-r--r--pkgs/games/gav/default.nix13
-rw-r--r--pkgs/games/gcompris/default.nix4
-rw-r--r--pkgs/games/gcs/default.nix7
-rw-r--r--pkgs/games/gemrb/default.nix79
-rw-r--r--pkgs/games/gimx/default.nix76
-rw-r--r--pkgs/games/gimx/env.patch30
-rw-r--r--pkgs/games/gimx/variant.nix14
-rw-r--r--pkgs/games/gl-117/default.nix4
-rw-r--r--pkgs/games/globulation/default.nix10
-rw-r--r--pkgs/games/gltron/default.nix13
-rw-r--r--pkgs/games/gmad/default.nix11
-rw-r--r--pkgs/games/gnome-hexgl/default.nix4
-rw-r--r--pkgs/games/gnonograms/default.nix64
-rw-r--r--pkgs/games/gnubg/default.nix10
-rw-r--r--pkgs/games/gnuchess/default.nix12
-rw-r--r--pkgs/games/gnugo/default.nix6
-rw-r--r--pkgs/games/gnujump/default.nix19
-rw-r--r--pkgs/games/gnujump/gnujump.xpm64
-rw-r--r--pkgs/games/gnushogi/default.nix4
-rw-r--r--pkgs/games/gogui/default.nix10
-rw-r--r--pkgs/games/grapejuice/default.nix95
-rw-r--r--pkgs/games/gscrabble/default.nix10
-rw-r--r--pkgs/games/gshogi/default.nix4
-rw-r--r--pkgs/games/gtetrinet/default.nix15
-rw-r--r--pkgs/games/gtypist/default.nix9
-rw-r--r--pkgs/games/gweled/default.nix20
-rw-r--r--pkgs/games/gzdoom/default.nix22
-rw-r--r--pkgs/games/harmonist/default.nix10
-rw-r--r--pkgs/games/harmonist/deps.nix88
-rw-r--r--pkgs/games/hawkthorne/default.nix6
-rw-r--r--pkgs/games/hedgewars/default.nix19
-rw-r--r--pkgs/games/hhexen/default.nix22
-rw-r--r--pkgs/games/holdingnuts/default.nix7
-rw-r--r--pkgs/games/hyperrogue/default.nix4
-rw-r--r--pkgs/games/icbm3d/default.nix13
-rw-r--r--pkgs/games/instead-launcher/default.nix4
-rw-r--r--pkgs/games/instead/default.nix23
-rw-r--r--pkgs/games/iortcw/default.nix27
-rw-r--r--pkgs/games/iortcw/sp.nix52
-rw-r--r--pkgs/games/ivan/default.nix8
-rw-r--r--pkgs/games/ja2-stracciatella/Cargo.lock291
-rw-r--r--pkgs/games/ja2-stracciatella/default.nix55
-rw-r--r--pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch78
-rw-r--r--pkgs/games/julius/default.nix9
-rw-r--r--pkgs/games/jumpnbump/default.nix55
-rw-r--r--pkgs/games/katago/default.nix94
-rw-r--r--pkgs/games/keen4/builder.sh2
-rw-r--r--pkgs/games/keen4/default.nix2
-rw-r--r--pkgs/games/keeperrl/default.nix10
-rw-r--r--pkgs/games/klavaro/default.nix13
-rw-r--r--pkgs/games/kobodeluxe/default.nix13
-rw-r--r--pkgs/games/koboredux/default.nix87
-rw-r--r--pkgs/games/lbreakout2/default.nix6
-rw-r--r--pkgs/games/leela-zero/default.nix6
-rw-r--r--pkgs/games/left4gore/default.nix48
-rw-r--r--pkgs/games/legendary-gl/default.nix12
-rw-r--r--pkgs/games/lgogdownloader/default.nix39
-rw-r--r--pkgs/games/liberal-crime-squad/default.nix4
-rw-r--r--pkgs/games/lincity/default.nix4
-rw-r--r--pkgs/games/lincity/ng.nix6
-rw-r--r--pkgs/games/liquidwar/5.nix15
-rw-r--r--pkgs/games/liquidwar/default.nix9
-rw-r--r--pkgs/games/ltris/default.nix4
-rw-r--r--pkgs/games/lugaru/default.nix12
-rw-r--r--pkgs/games/lunar-client/default.nix44
-rw-r--r--pkgs/games/macopix/default.nix13
-rw-r--r--pkgs/games/maelstrom/default.nix39
-rw-r--r--pkgs/games/maelstrom/fix-compilation.patch42
-rw-r--r--pkgs/games/manaplus/default.nix32
-rw-r--r--pkgs/games/mar1d/default.nix68
-rw-r--r--pkgs/games/mari0/default.nix6
-rw-r--r--pkgs/games/mars/default.nix18
-rw-r--r--pkgs/games/megaglest/default.nix34
-rw-r--r--pkgs/games/meritous/default.nix4
-rw-r--r--pkgs/games/methane/default.nix70
-rw-r--r--pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch33
-rw-r--r--pkgs/games/mindustry/default.nix175
-rw-r--r--pkgs/games/minecraft-server/default.nix17
-rw-r--r--pkgs/games/minecraft/default.nix43
-rwxr-xr-xpkgs/games/minecraft/update.sh6
-rw-r--r--pkgs/games/minetest/default.nix12
-rw-r--r--pkgs/games/moon-buggy/default.nix10
-rw-r--r--pkgs/games/mrrescue/default.nix11
-rw-r--r--pkgs/games/mudlet/default.nix16
-rw-r--r--pkgs/games/multimc/0001-pick-latest-java-first.patch48
-rw-r--r--pkgs/games/multimc/default.nix29
-rw-r--r--pkgs/games/n2048/default.nix14
-rw-r--r--pkgs/games/naev/default.nix10
-rw-r--r--pkgs/games/nethack/default.nix10
-rw-r--r--pkgs/games/netris/default.nix4
-rw-r--r--pkgs/games/neverball/default.nix11
-rw-r--r--pkgs/games/newtonwars/default.nix7
-rw-r--r--pkgs/games/nexuiz/default.nix15
-rw-r--r--pkgs/games/ninvaders/default.nix7
-rw-r--r--pkgs/games/njam/default.nix13
-rw-r--r--pkgs/games/nottetris2/default.nix8
-rw-r--r--pkgs/games/nudoku/default.nix13
-rw-r--r--pkgs/games/nxengine-evo/default.nix8
-rw-r--r--pkgs/games/odamex/default.nix12
-rw-r--r--pkgs/games/oh-my-git/default.nix115
-rw-r--r--pkgs/games/oilrush/default.nix10
-rw-r--r--pkgs/games/onscripter-en/default.nix4
-rw-r--r--pkgs/games/openarena/default.nix8
-rw-r--r--pkgs/games/openclonk/default.nix10
-rw-r--r--pkgs/games/opendune/default.nix14
-rw-r--r--pkgs/games/opendungeons/default.nix12
-rw-r--r--pkgs/games/openjk/default.nix7
-rw-r--r--pkgs/games/openlierox/default.nix16
-rw-r--r--pkgs/games/openmw/default.nix47
-rw-r--r--pkgs/games/openmw/tes3mp.nix190
-rw-r--r--pkgs/games/openra/common.nix6
-rw-r--r--pkgs/games/openra/default.nix2
-rw-r--r--pkgs/games/openra/engine.nix5
-rw-r--r--pkgs/games/openra/mod.nix4
-rw-r--r--pkgs/games/openra/mods.nix1
-rw-r--r--pkgs/games/openra/packages.nix2
-rw-r--r--pkgs/games/openrct2/default.nix34
-rw-r--r--pkgs/games/openrw/default.nix6
-rw-r--r--pkgs/games/openspades/default.nix8
-rw-r--r--pkgs/games/openttd/default.nix44
-rw-r--r--pkgs/games/openttd/grfcodec.nix28
-rw-r--r--pkgs/games/openttd/jgrpp.nix4
-rw-r--r--pkgs/games/openttd/nml.nix22
-rw-r--r--pkgs/games/opentyrian/default.nix4
-rw-r--r--pkgs/games/openxcom/default.nix8
-rw-r--r--pkgs/games/openxray/default.nix34
-rw-r--r--pkgs/games/orthorobot/default.nix32
-rw-r--r--pkgs/games/osu-lazer/default.nix36
-rw-r--r--pkgs/games/osu-lazer/deps.nix738
-rw-r--r--pkgs/games/osu-lazer/osu.runtimeconfig.json9
-rwxr-xr-xpkgs/games/osu-lazer/update.sh19
-rw-r--r--pkgs/games/pacvim/default.nix6
-rw-r--r--pkgs/games/papermc/default.nix33
-rw-r--r--pkgs/games/pentobi/default.nix26
-rw-r--r--pkgs/games/performous/default.nix10
-rw-r--r--pkgs/games/pinball/default.nix40
-rw-r--r--pkgs/games/pingus/default.nix14
-rw-r--r--pkgs/games/pioneer/default.nix10
-rw-r--r--pkgs/games/pioneers/default.nix32
-rw-r--r--pkgs/games/planetaryannihilation/default.nix12
-rw-r--r--pkgs/games/pokerth/default.nix8
-rw-r--r--pkgs/games/pong3d/default.nix13
-rw-r--r--pkgs/games/portmod/default.nix98
-rw-r--r--pkgs/games/powermanga/default.nix58
-rw-r--r--pkgs/games/prboom/default.nix17
-rw-r--r--pkgs/games/privateer/0001-fix-VSFile-constructor.patch25
-rw-r--r--pkgs/games/privateer/default.nix43
-rw-r--r--pkgs/games/pro-office-calculator/default.nix6
-rw-r--r--pkgs/games/pysolfc/default.nix6
-rw-r--r--pkgs/games/qqwing/default.nix4
-rw-r--r--pkgs/games/qtads/default.nix4
-rw-r--r--pkgs/games/quake2/yquake2/default.nix4
-rw-r--r--pkgs/games/quake2/yquake2/games.nix6
-rw-r--r--pkgs/games/quake2/yquake2/wrapper.nix2
-rw-r--r--pkgs/games/quake3/content/demo.nix4
-rw-r--r--pkgs/games/quake3/content/hires.nix26
-rw-r--r--pkgs/games/quake3/content/pointrelease.nix4
-rw-r--r--pkgs/games/quake3/ioquake/default.nix14
-rw-r--r--pkgs/games/quake3/quake3e/default.nix8
-rw-r--r--pkgs/games/quake3/wrapper/default.nix2
-rw-r--r--pkgs/games/quakespasm/default.nix13
-rw-r--r--pkgs/games/quakespasm/vulkan.nix24
-rw-r--r--pkgs/games/quantumminigolf/default.nix10
-rw-r--r--pkgs/games/r2mod_cli/default.nix37
-rw-r--r--pkgs/games/racer/default.nix19
-rw-r--r--pkgs/games/redeclipse/default.nix10
-rw-r--r--pkgs/games/residualvm/default.nix14
-rw-r--r--pkgs/games/rftg/default.nix8
-rw-r--r--pkgs/games/rigsofrods/default.nix20
-rw-r--r--pkgs/games/riko4/default.nix9
-rw-r--r--pkgs/games/rili/default.nix15
-rw-r--r--pkgs/games/rimshot/default.nix23
-rw-r--r--pkgs/games/robotfindskitten/default.nix6
-rw-r--r--pkgs/games/rocksndiamonds/default.nix9
-rw-r--r--pkgs/games/rogue/default.nix15
-rw-r--r--pkgs/games/rpg-cli/default.nix25
-rw-r--r--pkgs/games/rrootage/default.nix4
-rw-r--r--pkgs/games/runelite/default.nix41
-rw-r--r--pkgs/games/sauerbraten/default.nix56
-rw-r--r--pkgs/games/scid-vs-pc/default.nix15
-rw-r--r--pkgs/games/scid/default.nix12
-rw-r--r--pkgs/games/scorched3d/default.nix6
-rw-r--r--pkgs/games/scrolls/default.nix9
-rw-r--r--pkgs/games/scummvm/default.nix23
-rw-r--r--pkgs/games/scummvm/games.nix2
-rw-r--r--pkgs/games/sdlpop/default.nix68
-rw-r--r--pkgs/games/sdlpop/prince.sh16
-rw-r--r--pkgs/games/sfrotz/default.nix4
-rw-r--r--pkgs/games/sgt-puzzles/default.nix16
-rw-r--r--pkgs/games/shattered-pixel-dungeon/default.nix27
-rw-r--r--pkgs/games/shticker-book-unwritten/cargo-lock.patch1248
-rw-r--r--pkgs/games/shticker-book-unwritten/default.nix25
-rw-r--r--pkgs/games/shticker-book-unwritten/unwrapped.nix20
-rwxr-xr-xpkgs/games/shticker-book-unwritten/update-cargo-lock.sh18
-rw-r--r--pkgs/games/sienna/default.nix22
-rw-r--r--pkgs/games/sil/default.nix21
-rw-r--r--pkgs/games/simutrans/default.nix32
-rw-r--r--pkgs/games/sm64ex/default.nix12
-rw-r--r--pkgs/games/snake4/default.nix11
-rw-r--r--pkgs/games/snipes/default.nix10
-rw-r--r--pkgs/games/soi/default.nix4
-rw-r--r--pkgs/games/solarus/default.nix24
-rw-r--r--pkgs/games/soldat-unstable/default.nix115
-rw-r--r--pkgs/games/space-orbit/default.nix4
-rw-r--r--pkgs/games/speed-dreams/default.nix12
-rw-r--r--pkgs/games/spring/default.nix27
-rw-r--r--pkgs/games/spring/springlobby.nix21
-rw-r--r--pkgs/games/stardust/default.nix4
-rw-r--r--pkgs/games/steam-tui/default.nix45
-rw-r--r--pkgs/games/steam/fhsenv.nix94
-rw-r--r--pkgs/games/steam/fonts.nix5
-rw-r--r--pkgs/games/steam/runtime-wrapped.nix2
-rw-r--r--pkgs/games/steam/runtime.nix21
-rw-r--r--pkgs/games/steam/steam.nix26
-rw-r--r--pkgs/games/steam/steamcmd.nix4
-rw-r--r--pkgs/games/stepmania/default.nix6
-rw-r--r--pkgs/games/stockfish/default.nix54
-rw-r--r--pkgs/games/stuntrally/default.nix10
-rw-r--r--pkgs/games/super-tux-kart/default.nix121
-rw-r--r--pkgs/games/supertux/default.nix6
-rw-r--r--pkgs/games/system-syzygy/default.nix2
-rw-r--r--pkgs/games/t4kcommon/default.nix8
-rw-r--r--pkgs/games/taisei/default.nix8
-rw-r--r--pkgs/games/tcl2048/default.nix29
-rw-r--r--pkgs/games/tdm/default.nix102
-rw-r--r--pkgs/games/tecnoballz/default.nix68
-rw-r--r--pkgs/games/teetertorture/default.nix13
-rw-r--r--pkgs/games/teeworlds/default.nix10
-rw-r--r--pkgs/games/tennix/default.nix9
-rw-r--r--pkgs/games/terraria-server/default.nix10
-rw-r--r--pkgs/games/tes3cmd/default.nix28
-rw-r--r--pkgs/games/the-butterfly-effect/default.nix10
-rw-r--r--pkgs/games/the-powder-toy/default.nix25
-rw-r--r--pkgs/games/tibia/default.nix16
-rw-r--r--pkgs/games/tintin/default.nix9
-rw-r--r--pkgs/games/tinyfugue/default.nix4
-rw-r--r--pkgs/games/tome2/default.nix5
-rw-r--r--pkgs/games/tome4/default.nix21
-rw-r--r--pkgs/games/toppler/default.nix7
-rw-r--r--pkgs/games/torcs/default.nix13
-rw-r--r--pkgs/games/torus-trooper/default.nix104
-rw-r--r--pkgs/games/tr-patcher/default.nix36
-rw-r--r--pkgs/games/trackballs/default.nix20
-rw-r--r--pkgs/games/tremulous/default.nix7
-rw-r--r--pkgs/games/trigger/default.nix34
-rw-r--r--pkgs/games/tumiki-fighters/default.nix97
-rw-r--r--pkgs/games/tuxpaint/default.nix18
-rw-r--r--pkgs/games/tuxtype/default.nix6
-rw-r--r--pkgs/games/typespeed/default.nix11
-rw-r--r--pkgs/games/uchess/default.nix32
-rw-r--r--pkgs/games/ue4/default.nix11
-rw-r--r--pkgs/games/ue4demos/default.nix8
-rw-r--r--pkgs/games/ufoai/default.nix17
-rw-r--r--pkgs/games/uhexen2/default.nix66
-rw-r--r--pkgs/games/ultimatestunts/default.nix19
-rw-r--r--pkgs/games/ultrastardx/default.nix60
-rw-r--r--pkgs/games/unciv/default.nix59
-rw-r--r--pkgs/games/unnethack/default.nix28
-rw-r--r--pkgs/games/unvanquished/default.nix192
-rw-r--r--pkgs/games/uqm/3dovideo.nix10
-rw-r--r--pkgs/games/uqm/default.nix12
-rw-r--r--pkgs/games/urbanterror/default.nix7
-rw-r--r--pkgs/games/ut2004/demo.nix6
-rw-r--r--pkgs/games/vapor/default.nix8
-rw-r--r--pkgs/games/vassal/default.nix21
-rw-r--r--pkgs/games/vdrift/default.nix10
-rw-r--r--pkgs/games/vectoroids/default.nix13
-rw-r--r--pkgs/games/vessel/default.nix15
-rw-r--r--pkgs/games/vitetris/default.nix4
-rw-r--r--pkgs/games/vms-empire/default.nix55
-rw-r--r--pkgs/games/voxelands/default.nix53
-rw-r--r--pkgs/games/wargus/default.nix39
-rw-r--r--pkgs/games/wargus/stratagus.nix35
-rw-r--r--pkgs/games/warmux/default.nix8
-rw-r--r--pkgs/games/warsow/default.nix6
-rw-r--r--pkgs/games/warsow/engine.nix39
-rw-r--r--pkgs/games/warzone2100/default.nix96
-rw-r--r--pkgs/games/wesnoth/default.nix14
-rw-r--r--pkgs/games/widelands/default.nix112
-rw-r--r--pkgs/games/worldofgoo/default.nix10
-rw-r--r--pkgs/games/wyvern/cargo-lock.patch2514
-rw-r--r--pkgs/games/wyvern/default.nix36
-rw-r--r--pkgs/games/xbill/default.nix18
-rw-r--r--pkgs/games/xboard/default.nix14
-rw-r--r--pkgs/games/xbomb/default.nix11
-rw-r--r--pkgs/games/xconq/default.nix4
-rw-r--r--pkgs/games/xcowsay/default.nix39
-rw-r--r--pkgs/games/xjump/default.nix4
-rw-r--r--pkgs/games/xmage/default.nix4
-rw-r--r--pkgs/games/xmoto/default.nix71
-rw-r--r--pkgs/games/xonotic/default.nix28
-rw-r--r--pkgs/games/xpilot/bloodspilot-client.nix10
-rw-r--r--pkgs/games/xpilot/bloodspilot-server.nix4
-rw-r--r--pkgs/games/xpilot/default.nix4
-rw-r--r--pkgs/games/xskat/default.nix40
-rw-r--r--pkgs/games/xsnow/default.nix28
-rw-r--r--pkgs/games/xsok/default.nix11
-rw-r--r--pkgs/games/xsokoban/default.nix4
-rw-r--r--pkgs/games/xtris/default.nix4
-rw-r--r--pkgs/games/zandronum/default.nix10
-rw-r--r--pkgs/games/zandronum/fmod.nix8
-rw-r--r--pkgs/games/zandronum/sqlite.nix7
-rw-r--r--pkgs/games/zangband/default.nix4
-rw-r--r--pkgs/games/zaz/default.nix14
-rw-r--r--pkgs/games/zdoom/bcc-git.nix9
-rw-r--r--pkgs/games/zdoom/default.nix6
-rw-r--r--pkgs/games/zdoom/zdbsp.nix25
-rw-r--r--pkgs/games/zod/0002-add-scaling-factor-to-source.patch161
-rw-r--r--pkgs/games/zod/default.nix147
-rw-r--r--pkgs/games/zoom/default.nix9
467 files changed, 12449 insertions, 3713 deletions
diff --git a/pkgs/games/0ad/data.nix b/pkgs/games/0ad/data.nix
index eeedae92440..9533af21b15 100644
--- a/pkgs/games/0ad/data.nix
+++ b/pkgs/games/0ad/data.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, zeroad-unwrapped }:
+{ lib, stdenv, fetchurl, zeroad-unwrapped }:
 
 stdenv.mkDerivation rec {
   pname = "0ad-data";
@@ -6,7 +6,7 @@ stdenv.mkDerivation rec {
 
   src = fetchurl {
     url = "http://releases.wildfiregames.com/0ad-${version}-alpha-unix-data.tar.xz";
-    sha256 = "04x7729hk6zw1xj3n4s4lvaviijsnbjf5rhzvjxlr5fygvg4l6z1";
+    sha256 = "0b53jzl64i49rk3n3c3x0hibwbl7vih2xym8jq5s56klg61qdxa1";
   };
 
   installPhase = ''
@@ -15,10 +15,11 @@ stdenv.mkDerivation rec {
     cp -r binaries/data $out/share/0ad/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free, open-source game of ancient warfare -- data files";
     homepage = "https://play0ad.com/";
     license = licenses.cc-by-sa-30;
+    maintainers = with maintainers; [ chvp ];
     platforms = platforms.linux;
     hydraPlatforms = [];
   };
diff --git a/pkgs/games/0ad/default.nix b/pkgs/games/0ad/default.nix
index d53942766bb..860db7c6d5a 100644
--- a/pkgs/games/0ad/default.nix
+++ b/pkgs/games/0ad/default.nix
@@ -1,14 +1,14 @@
-{ wxGTK, newScope }:
-
+{ wxGTK, stdenv, newScope }:
 let
   callPackage = newScope self;
 
   self = {
-    zeroad-unwrapped = callPackage ./game.nix { inherit wxGTK; };
+    zeroad-unwrapped = callPackage ./game.nix { inherit wxGTK stdenv; };
 
-    zeroad-data = callPackage ./data.nix { };
+    zeroad-data = callPackage ./data.nix { inherit stdenv; };
 
     zeroad = callPackage ./wrapper.nix { };
   };
 
-in self
+in
+self
diff --git a/pkgs/games/0ad/game.nix b/pkgs/games/0ad/game.nix
index 4c9ad706887..feaf4347329 100644
--- a/pkgs/games/0ad/game.nix
+++ b/pkgs/games/0ad/game.nix
@@ -1,29 +1,45 @@
-{ stdenv, lib, perl, fetchurl, python2
-, pkgconfig, spidermonkey_38, boost, icu, libxml2, libpng, libsodium
+{ stdenv, lib, perl, fetchurl, python2, fmt, libidn
+, pkg-config, spidermonkey_78, boost, icu, libxml2, libpng, libsodium
 , libjpeg, zlib, curl, libogg, libvorbis, enet, miniupnpc
 , openal, libGLU, libGL, xorgproto, libX11, libXcursor, nspr, SDL2
 , gloox, nvidia-texture-tools
-, withEditor ? true, wxGTK ? null
+, withEditor ? true, wxGTK
 }:
 
-assert withEditor -> wxGTK != null;
-
+# You can find more instructions on how to build 0ad here:
+#    https://trac.wildfiregames.com/wiki/BuildInstructions
+
+let
+  # the game requires a special version 78.6.0 of spidermonkey, otherwise
+  # we get compilation errors. We override the src attribute of spidermonkey_78
+  # in order to reuse that declartion, while giving it a different source input.
+  spidermonkey_78_6 = spidermonkey_78.overrideAttrs(old: rec {
+    version = "78.6.0";
+    src = fetchurl {
+      url = "mirror://mozilla/firefox/releases/${version}esr/source/firefox-${version}esr.source.tar.xz";
+      sha256 = "0lyg65v380j8i2lrylwz8a5ya80822l8vcnlx3dfqpd3s6zzjsay";
+    };
+    patches = (old.patches or []) ++ [
+      ./spidermonkey-cargo-toml.patch
+    ];
+  });
+in
 stdenv.mkDerivation rec {
   pname = "0ad";
-  version = "0.0.23b";
+  version = "0.0.24b";
 
   src = fetchurl {
     url = "http://releases.wildfiregames.com/0ad-${version}-alpha-unix-build.tar.xz";
-    sha256 = "0draa53xg69i5qhqym85658m45xhwkbiimaldj4sr3703rjgggq1";
+    sha256 = "1a1py45hkh2cswi09vbf9chikgxdv9xplsmg6sv6xhdznv4j6p1j";
   };
 
-  nativeBuildInputs = [ python2 perl pkgconfig ];
+  nativeBuildInputs = [ python2 perl pkg-config ];
 
   buildInputs = [
-    spidermonkey_38 boost icu libxml2 libpng libjpeg
-    zlib curl libogg libvorbis enet miniupnpc openal
+    spidermonkey_78_6 boost icu libxml2 libpng libjpeg
+    zlib curl libogg libvorbis enet miniupnpc openal libidn
     libGLU libGL xorgproto libX11 libXcursor nspr SDL2 gloox
-    nvidia-texture-tools libsodium
+    nvidia-texture-tools libsodium fmt
   ] ++ lib.optional withEditor wxGTK;
 
   NIX_CFLAGS_COMPILE = toString [
@@ -31,32 +47,20 @@ stdenv.mkDerivation rec {
     "-I${libX11.dev}/include/X11"
     "-I${libXcursor.dev}/include/X11"
     "-I${SDL2}/include/SDL2"
+    "-I${fmt.dev}/include"
   ];
 
-  patches = [
-    ./rootdir_env.patch
-    # Fixes build with spidermonkey-38.8.0, includes the minor version check:
-    # https://src.fedoraproject.org/rpms/0ad/c/26dc1657f6e3c0ad9f1180ca38cd79b933ef0c8b
-    (fetchurl {
-      url = "https://src.fedoraproject.org/rpms/0ad/raw/26dc1657f6e3c0ad9f1180ca38cd79b933ef0c8b/f/0ad-mozjs-incompatible.patch";
-      sha256 = "1rzpaalcrzihsgvlk3nqd87n2kxjldlwvb3qp5fcd5ffzr6k90wa";
-    })
-  ];
+  patches = [ ./rootdir_env.patch ];
 
   configurePhase = ''
     # Delete shipped libraries which we don't need.
     rm -rf libraries/source/{enet,miniupnpc,nvtt,spidermonkey}
 
-    # Workaround invalid pkgconfig name for mozjs
-    mkdir pkgconfig
-    ln -s ${spidermonkey_38}/lib/pkgconfig/* pkgconfig/mozjs-38.pc
-    PKG_CONFIG_PATH="$PWD/pkgconfig:$PKG_CONFIG_PATH"
-
     # Update Makefiles
     pushd build/workspaces
     ./update-workspaces.sh \
       --with-system-nvtt \
-      --with-system-mozjs38 \
+      --with-system-mozjs \
       ${lib.optionalString withEditor "--enable-atlas"} \
       --bindir="$out"/bin \
       --libdir="$out"/lib/0ad \
@@ -90,13 +94,14 @@ stdenv.mkDerivation rec {
     install -D build/resources/0ad.desktop $out/share/applications/0ad.desktop
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free, open-source game of ancient warfare";
     homepage = "https://play0ad.com/";
     license = with licenses; [
       gpl2 lgpl21 mit cc-by-sa-30
       licenses.zlib # otherwise masked by pkgs.zlib
     ];
+    maintainers = with maintainers; [ chvp ];
     platforms = subtractLists platforms.i686 platforms.linux;
   };
 }
diff --git a/pkgs/games/0ad/rootdir_env.patch b/pkgs/games/0ad/rootdir_env.patch
index c001473e510..95463c7e2df 100644
--- a/pkgs/games/0ad/rootdir_env.patch
+++ b/pkgs/games/0ad/rootdir_env.patch
@@ -1,7 +1,8 @@
-diff -ru3 0ad-0.0.20-alpha/source/ps/GameSetup/Paths.cpp 0ad-0.0.20-alpha-new/source/ps/GameSetup/Paths.cpp
---- 0ad-0.0.20-alpha/source/ps/GameSetup/Paths.cpp	2015-02-14 04:45:13.000000000 +0300
-+++ 0ad-0.0.20-alpha-new/source/ps/GameSetup/Paths.cpp	2016-11-03 16:23:47.241514876 +0300
-@@ -155,32 +155,8 @@
+diff --git a/source/ps/GameSetup/Paths.cpp b/source/ps/GameSetup/Paths.cpp
+index 474364e..bf084b4 100644
+--- a/source/ps/GameSetup/Paths.cpp
++++ b/source/ps/GameSetup/Paths.cpp
+@@ -155,32 +155,8 @@ Paths::Paths(const CmdLineArgs& args)
  
  /*static*/ OsPath Paths::Root(const OsPath& argv0)
  {
@@ -31,8 +32,8 @@ diff -ru3 0ad-0.0.20-alpha/source/ps/GameSetup/Paths.cpp 0ad-0.0.20-alpha-new/so
 -	return pathname;
 -
 -#endif
-+	UNUSED2(argv0);
-+	return getenv("ZEROAD_ROOTDIR");
++        UNUSED2(argv0);
++        return OsPath(getenv("ZEROAD_ROOTDIR"));
  }
  
  /*static*/ OsPath Paths::RootData(const OsPath& argv0)
diff --git a/pkgs/games/0ad/spidermonkey-cargo-toml.patch b/pkgs/games/0ad/spidermonkey-cargo-toml.patch
new file mode 100644
index 00000000000..4cb8c3735db
--- /dev/null
+++ b/pkgs/games/0ad/spidermonkey-cargo-toml.patch
@@ -0,0 +1,15 @@
+diff --git a/Cargo.toml b/Cargo.toml
+index 6f6199ab26..c3f92db9d8 100644
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -68,8 +68,8 @@ panic = "abort"
+ libudev-sys = { path = "dom/webauthn/libudev-sys" }
+ packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="3541e3818fdc7c2a24f87e3459151a4ce955a67a" }
+ rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="d510da5999a744c563b0acd18056069d1698273f" }
+-nix = { git = "https://github.com/shravanrn/nix/", branch = "r0.13.1", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" }
+-spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu3", rev = "20191ad2f370afd6d247edcb9ff9da32d3bedb9c" }
++nix = { git = "https://github.com/shravanrn/nix/", branch = "r0.13.1" }
++spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu3" }
+ # failure's backtrace feature might break our builds, see bug 1608157.
+ failure = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" }
+ failure_derive = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" }
diff --git a/pkgs/games/0ad/wrapper.nix b/pkgs/games/0ad/wrapper.nix
index ca7c8e16e3c..ede151307d5 100644
--- a/pkgs/games/0ad/wrapper.nix
+++ b/pkgs/games/0ad/wrapper.nix
@@ -6,7 +6,7 @@ buildEnv {
   name = "zeroad-${zeroad-unwrapped.version}";
   inherit (zeroad-unwrapped) meta;
 
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
 
   paths = [ zeroad-unwrapped zeroad-data ];
 
diff --git a/pkgs/games/0verkill/default.nix b/pkgs/games/0verkill/default.nix
new file mode 100644
index 00000000000..fa654832e2e
--- /dev/null
+++ b/pkgs/games/0verkill/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, gccStdenv
+, fetchFromGitHub
+, autoreconfHook
+, xorgproto
+, libX11
+, libXpm
+}:
+
+gccStdenv.mkDerivation rec {
+  pname = "0verkill";
+  version = "unstable-2011-01-13";
+
+  src = fetchFromGitHub {
+    owner = "hackndev";
+    repo = pname;
+    rev = "522f11a3e40670bbf85e0fada285141448167968";
+    sha256 = "WO7PN192HhcDl6iHIbVbH7MVMi1Tl2KyQbDa9DWRO6M=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ libX11 xorgproto libXpm ];
+
+  configureFlags = [ "--with-x" ];
+
+  preAutoreconf = ''
+    autoupdate
+  '';
+
+  hardeningDisable = [ "all" ]; # Someday the upstream will update the code...
+
+  meta = with lib; {
+    homepage = "https://github.com/hackndev/0verkill";
+    description = "ASCII-ART bloody 2D action deathmatch-like game";
+    license = with licenses; gpl2Only;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/pkgs/games/1oom/default.nix b/pkgs/games/1oom/default.nix
new file mode 100644
index 00000000000..54bfb4d0b32
--- /dev/null
+++ b/pkgs/games/1oom/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitLab, autoreconfHook, libsamplerate, SDL2, SDL2_mixer, readline }:
+
+stdenv.mkDerivation rec {
+  pname = "1oom";
+  version = "1.0";
+
+  src = fetchFromGitLab {
+    owner = "KilgoreTroutMaskReplicant";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-+HwSykSyAGHtITVOu4nIG87kWwVxGyFXb/NRSjhWlvs=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ libsamplerate SDL2 SDL2_mixer readline ];
+
+  outputs = [ "out" "doc" ];
+
+  postInstall = ''
+    install -d $doc/share/doc/${pname}
+    install -t $doc/share/doc/${pname} \
+      HACKING NEWS PHILOSOPHY README doc/*.txt
+  '';
+
+  meta = with lib; {
+    homepage = "https://kilgoretroutmaskreplicant.gitlab.io/plain-html/";
+    description = "Master of Orion (1993) game engine recreation";
+    license = licenses.gpl2Only;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/pkgs/games/2048-in-terminal/default.nix b/pkgs/games/2048-in-terminal/default.nix
index 446252062fa..8ac72db65f5 100644
--- a/pkgs/games/2048-in-terminal/default.nix
+++ b/pkgs/games/2048-in-terminal/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, ncurses }:
+{ lib, stdenv, fetchFromGitHub, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "2048-in-terminal";
@@ -24,7 +24,7 @@ stdenv.mkDerivation rec {
   '';
   installFlags = [ "DESTDIR=$(out)/bin" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     inherit (src.meta) homepage;
     description = "Animated console version of the 2048 game";
     license = licenses.mit;
diff --git a/pkgs/games/20kly/default.nix b/pkgs/games/20kly/default.nix
index 8c81b8b2360..0cc61367e28 100644
--- a/pkgs/games/20kly/default.nix
+++ b/pkgs/games/20kly/default.nix
@@ -1,16 +1,19 @@
-{ stdenv
-, fetchurl
-, python }:
+{ lib
+, fetchFromGitHub
+, python3Packages
+}:
 
-python.pkgs.buildPythonApplication rec {
+python3Packages.buildPythonApplication rec {
   pname = "20kly";
-  version = "1.4";
+  version = "1.5.0";
+
   format = "other";
-  disabled = !(python.isPy2 or false);
 
-  src = fetchurl {
-    url = "http://jwhitham.org.uk/20kly/lightyears-${version}.tar.bz2";
-    sha256 = "13h73cmfjqkipffimfc4iv0hf89if490ng6vd6xf3wcalpgaim5d";
+  src = fetchFromGitHub {
+    owner = "20kly";
+    repo = "20kly";
+    rev = "v${version}";
+    sha256 = "1zxsxg49a02k7zidx3kgk2maa0vv0n1f9wrl5vch07sq3ghvpphx";
   };
 
   patchPhase = ''
@@ -20,21 +23,24 @@ python.pkgs.buildPythonApplication rec {
         "LIGHTYEARS_DIR = \"$out/share\""
   '';
 
-  propagatedBuildInputs = with python.pkgs; [ pygame ];
+  propagatedBuildInputs = with python3Packages; [
+    pygame
+  ];
 
-  buildPhase = "python -O -m compileall .";
+  buildPhase = ''
+    python -O -m compileall .
+  '';
 
   installPhase = ''
     mkdir -p "$out/share"
-    cp -r audio code data lightyears "$out/share"
+    cp -r data lib20k lightyears "$out/share"
     install -Dm755 lightyears "$out/bin/lightyears"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A steampunk-themed strategy game where you have to manage a steam supply network";
     homepage = "http://jwhitham.org.uk/20kly/";
-    license = licenses.gpl2;
+    license = licenses.gpl2Only;
     maintainers = with maintainers; [ fgaz ];
   };
 }
-
diff --git a/pkgs/games/90secondportraits/default.nix b/pkgs/games/90secondportraits/default.nix
index 334a7f873bb..a5b504995f7 100644
--- a/pkgs/games/90secondportraits/default.nix
+++ b/pkgs/games/90secondportraits/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
 
 let
   pname = "90secondportraits";
@@ -48,7 +48,7 @@ stdenv.mkDerivation {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A silly speed painting game";
     maintainers = with maintainers; [ leenaars ];
     platforms = platforms.linux;
diff --git a/pkgs/games/abbaye-des-morts/default.nix b/pkgs/games/abbaye-des-morts/default.nix
index 103b67e99ed..3091c8feff2 100644
--- a/pkgs/games/abbaye-des-morts/default.nix
+++ b/pkgs/games/abbaye-des-morts/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, SDL2, SDL2_image, SDL2_mixer }:
+{ lib, stdenv, fetchFromGitHub, SDL2, SDL2_image, SDL2_mixer }:
 
 stdenv.mkDerivation rec {
   pname = "abbaye-des-morts";
@@ -15,7 +15,7 @@ stdenv.mkDerivation rec {
 
   makeFlags = [ "PREFIX=$(out)" "DESTDIR=" ];
 
-  preBuild = stdenv.lib.optionalString stdenv.cc.isClang
+  preBuild = lib.optionalString stdenv.cc.isClang
     ''
       substituteInPlace Makefile \
         --replace -fpredictive-commoning ""
@@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
     mkdir -p $out/share/applications
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://locomalito.com/abbaye_des_morts.php";
     description = "A retro arcade video game";
     license = licenses.gpl3;
diff --git a/pkgs/games/abuse/abuse.sh b/pkgs/games/abuse/abuse.sh
new file mode 100644
index 00000000000..de837d27181
--- /dev/null
+++ b/pkgs/games/abuse/abuse.sh
@@ -0,0 +1,18 @@
+#! @shell@
+
+if grep datadir ~/.abuse/abuserc &>/dev/null; then
+  if [ ! -d "$(grep datadir ~/.abuse/abuserc | cut -d= -f2)" ]; then
+    echo "Warning: ~/.abuse/abuserc references a datadir which is not existent." >&2
+    echo "Try removing ~/.abuse/abuserc, else abuse will most likely not run." >&2
+    echo >&2
+    # This can happen if the build hash of abuse changes and the older version
+    # is garbage-collected. The correct path of the datadir is compiled into
+    # the binary, but unfortunately abuse writes out the path into abuserc on
+    # first start. This entry may later become stale.
+  fi
+fi
+
+# The timidity bundled into SDL_mixer looks in . and in several global places
+# like /etc for its configuration file.
+cd @out@/etc
+exec @out@/bin/.abuse-bin "$@"
diff --git a/pkgs/games/abuse/default.nix b/pkgs/games/abuse/default.nix
new file mode 100644
index 00000000000..2e863022a68
--- /dev/null
+++ b/pkgs/games/abuse/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchurl, makeDesktopItem, copyDesktopItems, SDL, SDL_mixer, freepats }:
+
+stdenv.mkDerivation rec {
+  pname   = "abuse";
+  version = "0.8";
+
+  src = fetchurl {
+    url    = "http://abuse.zoy.org/raw-attachment/wiki/download/${pname}-${version}.tar.gz";
+    sha256 = "0104db5fd2695c9518583783f7aaa7e5c0355e27c5a803840a05aef97f9d3488";
+  };
+
+  configureFlags = [
+    "--with-x"
+    "--with-assetdir=$(out)/orig"
+    # The "--enable-debug" is to work around a segfault on start, see https://bugs.archlinux.org/task/52915.
+    "--enable-debug"
+  ];
+
+  desktopItems = [ (makeDesktopItem {
+    name = "abuse";
+    exec = "abuse";
+    icon = "abuse";
+    desktopName = "Abuse";
+    comment     = "Side-scroller action game that pits you against ruthless alien killers";
+    categories  = "Game;ActionGame;";
+  }) ];
+
+  postInstall = ''
+    mkdir $out/etc
+    echo -e "dir ${freepats}\nsource ${freepats}/freepats.cfg" > $out/etc/timidity.cfg
+
+    mv $out/bin/abuse $out/bin/.abuse-bin
+    substituteAll "${./abuse.sh}" $out/bin/abuse
+    chmod +x $out/bin/abuse
+
+    install -Dm644 doc/abuse.png $out/share/pixmaps/abuse.png
+  '';
+
+  nativeBuildInputs = [ copyDesktopItems ];
+  buildInputs       = [ SDL SDL_mixer freepats ];
+
+  meta = with lib; {
+    description = "Side-scroller action game that pits you against ruthless alien killers";
+    homepage    = "http://abuse.zoy.org/";
+    license     = with licenses; [ unfree ];
+    # Most of abuse is free (public domain, GPL2+, WTFPL), however the creator
+    # of its sfx and music only gave Debian permission to redistribute the
+    # files. Our friends from Debian thought about it some more:
+    # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=648272
+    maintainers = with maintainers; [ iblech ];
+    platforms   = platforms.unix;
+    broken      = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/adom/default.nix b/pkgs/games/adom/default.nix
index 055959fff2d..b40a608412e 100644
--- a/pkgs/games/adom/default.nix
+++ b/pkgs/games/adom/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, patchelf, zlib, libmad, libpng12, libcaca, libGLU, libGL, alsaLib, libpulseaudio
+{ lib, stdenv, fetchurl, patchelf, zlib, libmad, libpng12, libcaca, libGLU, libGL, alsa-lib, libpulseaudio
 , xorg }:
 
 let
 
   inherit (xorg) libXext libX11;
 
-  lpath = "${stdenv.cc.cc.lib}/lib64:" + stdenv.lib.makeLibraryPath [
-      zlib libmad libpng12 libcaca libXext libX11 libGLU libGL alsaLib libpulseaudio];
+  lpath = "${stdenv.cc.cc.lib}/lib64:" + lib.makeLibraryPath [
+      zlib libmad libpng12 libcaca libXext libX11 libGLU libGL alsa-lib libpulseaudio];
 
 in
 stdenv.mkDerivation rec {
@@ -47,7 +47,7 @@ stdenv.mkDerivation rec {
     chmod +x $out/bin/adom
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A rogue-like game with nice graphical interface";
     homepage = "http://adom.de/";
     license = licenses.unfreeRedistributable;
diff --git a/pkgs/games/airstrike/default.nix b/pkgs/games/airstrike/default.nix
index 10dfc7501fb..12b485764a5 100644
--- a/pkgs/games/airstrike/default.nix
+++ b/pkgs/games/airstrike/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, makeWrapper, SDL, SDL_image }:
+{ lib, stdenv, fetchurl, makeWrapper, SDL, SDL_image }:
 
 stdenv.mkDerivation rec {
   pname = "airstrike-pre";
@@ -9,7 +9,8 @@ stdenv.mkDerivation rec {
     sha256 = "1h6rv2zcp84ycmd0kv1pbpqjgwx57dw42x7878d2c2vnpi5jn8qi";
   };
 
-  buildInputs = [ makeWrapper SDL SDL_image ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ SDL SDL_image ];
 
   NIX_LDFLAGS = "-lm";
 
@@ -25,7 +26,7 @@ stdenv.mkDerivation rec {
       --run "cd $out/share"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A 2d dogfighting game";
     homepage = "https://icculus.org/airstrike/";
     license = licenses.gpl2;
diff --git a/pkgs/games/alephone/default.nix b/pkgs/games/alephone/default.nix
index 879571df7a1..347ccd8df63 100644
--- a/pkgs/games/alephone/default.nix
+++ b/pkgs/games/alephone/default.nix
@@ -1,35 +1,37 @@
-{ stdenv, fetchurl, boost, curl, ffmpeg, icoutils, libmad, libogg, libpng
-, libsndfile, libvorbis, lua, pkgconfig, SDL, SDL_image, SDL_net, SDL_ttf, smpeg
-, speex, zziplib, zlib, makeWrapper, makeDesktopItem, unzip, alephone }:
+{ lib, stdenv, fetchurl, boost, curl, ffmpeg, 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 }:
 
 let
   self = stdenv.mkDerivation rec {
     outputs = [ "out" "icons" ];
     pname = "alephone";
-    version = "20150620";
+    version = "1.4";
 
     src = fetchurl {
-      url =
-        "https://github.com/Aleph-One-Marathon/alephone/releases/download/release-${version}/AlephOne-${version}.tar.bz2";
-      sha256 = "0cz18fa3gx8mz5j09ywz8gq0r4q082kh6l9pbpwn8qjanzgn1wy0";
+      url = let date = "20210408";
+      in "https://github.com/Aleph-One-Marathon/alephone/releases/download/release-${date}/AlephOne-${date}.tar.bz2";
+      sha256 = "sha256-tMwATUhUpo8W2oSWxGSZcAHVkj1PWEvUR/rpMZwWCWA=";
     };
 
-    nativeBuildInputs = [ pkgconfig icoutils ];
+    nativeBuildInputs = [ pkg-config icoutils ];
 
     buildInputs = [
       boost
       curl
       ffmpeg
+      libGLU
       libmad
       libsndfile
       libogg
       libpng
       libvorbis
       lua
-      SDL
-      SDL_image
-      SDL_net
-      SDL_ttf
+      SDL2
+      SDL2_image
+      SDL2_net
+      SDL2_ttf
       smpeg
       speex
       zziplib
@@ -50,7 +52,7 @@ let
       popd
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description =
         "Aleph One is the open source continuation of Bungie’s Marathon 2 game engine";
       homepage = "https://alephone.lhowon.org/";
@@ -91,8 +93,8 @@ in self // {
       '';
 
       meta = alephone.meta // {
-        license = stdenv.lib.licenses.free;
+        license = lib.licenses.free;
         hydraPlatforms = [ ];
       } // meta;
-    });
+    } // extraArgs);
 }
diff --git a/pkgs/games/alephone/infinity/default.nix b/pkgs/games/alephone/infinity/default.nix
index fc3500d0eb9..f6002469a09 100644
--- a/pkgs/games/alephone/infinity/default.nix
+++ b/pkgs/games/alephone/infinity/default.nix
@@ -3,13 +3,13 @@
 alephone.makeWrapper rec {
   pname = "marathon-infinity";
   desktopName = "Marathon-Infinity";
-  version = "20190331";
+  version = "20210408";
   icon = alephone.icons + "/marathon-infinity.png";
 
   zip = fetchurl {
     url =
       "https://github.com/Aleph-One-Marathon/alephone/releases/download/release-${version}/MarathonInfinity-${version}-Data.zip";
-    sha256 = "03vn91arnsm71dakbfzrdfwpwh5vkwildl7i16xqi1apinmvvh86";
+    sha256 = "sha256-j9iwSrI7cjqnuRQX+qn8sWXQ6E+DQ19l7OzAL9KHcJU=";
   };
 
   meta = {
diff --git a/pkgs/games/alephone/marathon/default.nix b/pkgs/games/alephone/marathon/default.nix
index 1d0787067af..4518215a337 100644
--- a/pkgs/games/alephone/marathon/default.nix
+++ b/pkgs/games/alephone/marathon/default.nix
@@ -3,13 +3,13 @@
 alephone.makeWrapper rec {
   pname = "marathon";
   desktopName = "Marathon";
-  version = "20190331";
+  version = "20200904";
   icon = alephone.icons + "/marathon.png";
 
   zip = fetchurl {
     url =
       "https://github.com/Aleph-One-Marathon/alephone/releases/download/release-${version}/Marathon-${version}-Data.zip";
-    sha256 = "1d18a7hn8s50rqcs9i72ak5fq5a76hwk7nylfinrxjb134c9vlpz";
+    sha256 = "sha256-x5M8RkxH+Rn8hUJIIq/AFC5Ibn0zF95BqZIDEwM6wVg=";
   };
 
   meta = {
diff --git a/pkgs/games/alienarena/default.nix b/pkgs/games/alienarena/default.nix
index a28cf2508e2..39b232b267c 100644
--- a/pkgs/games/alienarena/default.nix
+++ b/pkgs/games/alienarena/default.nix
@@ -1,15 +1,17 @@
-{ stdenv, fetchurl, pkgconfig, libjpeg, libX11, libXxf86vm, curl, libogg
+{ lib, stdenv, fetchsvn, pkg-config, libjpeg, libX11, libXxf86vm, curl, libogg
 , libvorbis, freetype, openal, libGL }:
 
-stdenv.mkDerivation {
-  name = "alienarena-7.65";
+stdenv.mkDerivation rec {
+  pname = "alienarena";
+  version = "7.71.2";
 
-  src = fetchurl {
-    url = "https://icculus.org/alienarena/Files/alienarena-7.65-linux20130207.tar.gz";
-    sha256 = "03nnv4m2xmswr0020hssajncdb8sy95jp5yccsm53sgxga4r8igg";
+  src = fetchsvn {
+    url = "svn://svn.icculus.org/alienarena/trunk";
+    rev = "5673";
+    sha256 = "1qfrgrp7nznk5n1jqvjba6l1w8y2ixzyx9swkpvd02rdwlwrp9kw";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ libjpeg libX11 curl libogg libvorbis
                   freetype openal libGL libXxf86vm ];
 
@@ -19,7 +21,7 @@ stdenv.mkDerivation {
       --replace libGL.so.1 ${libGL}/lib/libGL.so.1
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free, stand-alone first-person shooter computer game";
     longDescription = ''
       Do you like old school deathmatch with modern features? How
diff --git a/pkgs/games/amoeba/data.nix b/pkgs/games/amoeba/data.nix
index f86ee71aa42..193c710b31a 100644
--- a/pkgs/games/amoeba/data.nix
+++ b/pkgs/games/amoeba/data.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "amoeba-data";
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
     cp demo.dat $out/share/amoeba/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast-paced, polished OpenGL demonstration by Excess (data files)";
     homepage = "https://packages.qa.debian.org/a/amoeba-data.html";
     license = licenses.unfree;
diff --git a/pkgs/games/amoeba/default.nix b/pkgs/games/amoeba/default.nix
index 0475a6b50b5..61f5a5bf824 100644
--- a/pkgs/games/amoeba/default.nix
+++ b/pkgs/games/amoeba/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, amoeba-data, alsaLib, expat, freetype, gtk2, libvorbis, libGLU, pkgconfig }:
+{ lib, stdenv, fetchurl, amoeba-data, alsa-lib, expat, freetype, gtk2, libvorbis, libGLU, xorg, pkg-config }:
 
 stdenv.mkDerivation rec {
   name = "amoeba-${version}-${debver}";
@@ -26,8 +26,8 @@ stdenv.mkDerivation rec {
     sed -i main/linux-config/linux-config.cpp -e 's|libgtk-x11-2.0.so.0|${gtk2}/lib/&|'
   '';
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ alsaLib expat freetype gtk2 libvorbis libGLU ];
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ alsa-lib expat freetype gtk2 libvorbis libGLU xorg.libXxf86vm ];
 
   installPhase = ''
     mkdir -p $out/bin $out/share/man/man1/
@@ -35,7 +35,7 @@ stdenv.mkDerivation rec {
     cp ../debian/amoeba.1 $out/share/man/man1/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast-paced, polished OpenGL demonstration by Excess";
     homepage = "https://packages.qa.debian.org/a/amoeba.html";
     license = licenses.gpl2; # Engine is GPLv2, data files in amoeba-data nonfree
diff --git a/pkgs/games/among-sus/default.nix b/pkgs/games/among-sus/default.nix
new file mode 100644
index 00000000000..454c7d181f9
--- /dev/null
+++ b/pkgs/games/among-sus/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromSourcehut, port ? "1234" }:
+
+stdenv.mkDerivation {
+  pname = "among-sus-unstable";
+  version = "2020-10-29";
+
+  src = fetchFromSourcehut {
+    owner = "~martijnbraam";
+    repo = "among-sus";
+    rev = "1f4c8d800d025d36ac66826937161be3252fbc57";
+    sha256 = "19jq7ygh9l11dl1h6702bg57m04y35nqd6yqx1rgp1kxwhp45xyh";
+  };
+
+  patchPhase = ''
+    sed -i 's/port = 1234/port = ${port}/g' main.c
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -Dm755 among-sus $out/bin
+  '';
+
+  meta = with lib; {
+    homepage = "https://git.sr.ht/~martijnbraam/among-sus";
+    description = "Among us, but it's a text adventure";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.eyjhb ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/andyetitmoves/default.nix b/pkgs/games/andyetitmoves/default.nix
index 84c1f545a38..9eb1c7594a1 100644
--- a/pkgs/games/andyetitmoves/default.nix
+++ b/pkgs/games/andyetitmoves/default.nix
@@ -1,17 +1,14 @@
-{ stdenv, fetchurl, libvorbis, libogg, libtheora, SDL, libXft, SDL_image, zlib, libX11, libpng, openal, runtimeShell, requireFile, commercialVersion ? false }:
+{ lib, stdenv, fetchurl, libvorbis, libogg, libtheora, SDL, libXft, SDL_image, zlib, libX11, libpng, openal, runtimeShell, requireFile, commercialVersion ? false }:
 
-let plainName = "andyetitmoves";
-    version   = "1.2.2";
-in
-
-stdenv.mkDerivation {
-  name = "${plainName}-${version}";
+stdenv.mkDerivation rec {
+  pname = "andyetitmoves";
+  version   = "1.2.2";
 
   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 = "${plainName}-${version}_${postfix}.tar.gz";
-          demoUrl        = "http://www.andyetitmoves.net/demo/${plainName}Demo-${version}_${postfix}.tar.gz";
+          commercialName = "${pname}-${version}_${postfix}.tar.gz";
+          demoUrl        = "http://www.andyetitmoves.net/demo/${pname}Demo-${version}_${postfix}.tar.gz";
       in
       if commercialVersion
         then requireFile {
@@ -68,8 +65,8 @@ stdenv.mkDerivation {
 
     homepage = "http://www.andyetitmoves.net/";
 
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
 
-    maintainers = with stdenv.lib.maintainers; [bluescreen303];
+    maintainers = with lib.maintainers; [bluescreen303];
   };
 }
diff --git a/pkgs/games/angband/default.nix b/pkgs/games/angband/default.nix
index 937fd30d405..e14629dce8f 100644
--- a/pkgs/games/angband/default.nix
+++ b/pkgs/games/angband/default.nix
@@ -1,21 +1,21 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, ncurses5 }:
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, ncurses5 }:
 
 stdenv.mkDerivation rec {
   pname = "angband";
-  version = "4.2.1";
+  version = "4.2.2";
 
   src = fetchFromGitHub {
     owner = "angband";
     repo = "angband";
     rev = version;
-    sha256 = "174fphiywwb4yb3kqavwaysx7c97an2n8wjbm4p4d41i1svjsryz";
+    sha256 = "sha256-z1HTt3+lWIr2F9YZFdw47lkYVgYl17qbb/OJ9YyYQa8=";
   };
 
   nativeBuildInputs = [ autoreconfHook ];
   buildInputs = [ ncurses5 ];
   installFlags = [ "bindir=$(out)/bin" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://rephial.org/";
     description = "A single-player roguelike dungeon exploration game";
     maintainers = [ maintainers.chattered ];
diff --git a/pkgs/games/anki/bin.nix b/pkgs/games/anki/bin.nix
new file mode 100644
index 00000000000..26b29b9228e
--- /dev/null
+++ b/pkgs/games/anki/bin.nix
@@ -0,0 +1,72 @@
+{ fetchurl, stdenv, lib, buildFHSUserEnv, appimageTools, writeShellScript, anki, undmg }:
+
+let
+  pname = "anki-bin";
+  # Update hashes for both Linux and Darwin!
+  version = "2.1.44";
+
+  unpacked = stdenv.mkDerivation {
+    inherit pname version;
+
+    src = fetchurl {
+      url = "https://github.com/ankitects/anki/releases/download/${version}/anki-${version}-linux.tar.bz2";
+      sha256 = "01d5ll3vsd4v0ikxgamv47bkwmag15vnmsgpda5wivc3dyawc9j9";
+    };
+
+    installPhase = ''
+      runHook preInstall
+
+      xdg-mime () {
+        echo Stubbed!
+      }
+      export -f xdg-mime
+
+      PREFIX=$out bash install.sh
+
+      runHook postInstall
+    '';
+  };
+
+  meta = with lib; {
+    inherit (anki.meta) license homepage description longDescription;
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+    maintainers = with maintainers; [ atemu ];
+  };
+in
+
+if stdenv.isLinux then buildFHSUserEnv (appimageTools.defaultFhsEnvArgs // {
+  name = "anki";
+
+  runScript = writeShellScript "anki-wrapper.sh" ''
+    # Wayland support is broken, disable via ENV variable
+    export QT_QPA_PLATFORM=xcb
+    exec ${unpacked}/bin/anki
+  '';
+
+  extraInstallCommands = ''
+    mkdir -p $out/share
+    cp -R ${unpacked}/share/applications \
+      ${unpacked}/share/man \
+      ${unpacked}/share/pixmaps \
+      $out/share/
+  '';
+
+  inherit meta;
+}) else stdenv.mkDerivation {
+  inherit pname version;
+
+  src = fetchurl {
+    url = "https://github.com/ankitects/anki/releases/download/${version}/anki-${version}-mac.dmg";
+    sha256 = "1zrdih4rjsq30480sf200pw59r42p3nq2md56kj2l641kbc7ljka";
+  };
+
+  nativeBuildInputs = [ undmg ];
+  sourceRoot = ".";
+
+  installPhase = ''
+    mkdir -p $out/Applications/
+    cp -a Anki.app $out/Applications/
+  '';
+
+  inherit meta;
+}
diff --git a/pkgs/games/anki/default.nix b/pkgs/games/anki/default.nix
index 0d713b1f71e..6edddfeed5c 100644
--- a/pkgs/games/anki/default.nix
+++ b/pkgs/games/anki/default.nix
@@ -4,8 +4,9 @@
 , python
 , fetchurl
 , fetchFromGitHub
+, fetchpatch
 , lame
-, mplayer
+, mpv-unwrapped
 , libpulseaudio
 , pyqtwebengine
 , decorator
@@ -105,11 +106,16 @@ buildPythonApplication rec {
   checkInputs = [ pytest glibcLocales nose ];
 
   nativeBuildInputs = [ pyqtwebengine.wrapQtAppsHook ];
-  buildInputs = [ lame mplayer libpulseaudio ];
+  buildInputs = [ lame mpv-unwrapped libpulseaudio ];
 
   patches = [
     # Disable updated version check.
     ./no-version-check.patch
+    (fetchpatch {
+      name = "fix-mpv-args.patch";
+      url = "https://sources.debian.org/data/main/a/anki/2.1.15+dfsg-3/debian/patches/fix-mpv-args.patch";
+      sha256 = "1dimnnawk64m5bbdbjrxw5k08q95l728n94cgkrrwxwavmmywaj2";
+    })
   ];
 
   # Anki does not use setup.py
@@ -128,6 +134,9 @@ buildPythonApplication rec {
   # UTF-8 locale needed for testing
   LC_ALL = "en_US.UTF-8";
 
+  # tests fail with to many open files
+  doCheck = !stdenv.isDarwin;
+
   # - Anki writes some files to $HOME during tests
   # - Skip tests using network
   checkPhase = ''
@@ -170,7 +179,7 @@ buildPythonApplication rec {
   preFixup = ''
     makeWrapperArgs+=(
       "''${qtWrapperArgs[@]}"
-      --prefix PATH ':' "${lame}/bin:${mplayer}/bin"
+      --prefix PATH ':' "${lame}/bin:${mpv-unwrapped}/bin"
     )
   '';
 
@@ -194,8 +203,7 @@ buildPythonApplication rec {
       or even practicing guitar chords!
     '';
     license = licenses.agpl3Plus;
-    broken = stdenv.hostPlatform.isAarch64;
     platforms = platforms.mesaPlatforms;
-    maintainers = with maintainers; [ oxij Profpatsch enzime ];
+    maintainers = with maintainers; [ oxij Profpatsch ];
   };
 }
diff --git a/pkgs/games/antsimulator/default.nix b/pkgs/games/antsimulator/default.nix
new file mode 100644
index 00000000000..b43b91d5cb9
--- /dev/null
+++ b/pkgs/games/antsimulator/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, cmake, sfml }:
+
+stdenv.mkDerivation rec {
+  pname = "antsimulator";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "johnBuffer";
+    repo = "AntSimulator";
+    rev = "v${version}";
+    sha256 = "0wz80971rf86kb7mcnxwrq75vriwhmyir5s5n3wzml12rzfnj5f1";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ sfml ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -Dm755 ./AntSimulator $out/bin/antsimulator
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/johnBuffer/AntSimulator";
+    description = "Simple Ants simulator";
+    license = licenses.free;
+    maintainers = with maintainers; [ ivar ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/arena/default.nix b/pkgs/games/arena/default.nix
index beba98b6316..16553a5f8ea 100644
--- a/pkgs/games/arena/default.nix
+++ b/pkgs/games/arena/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, gtk2-x11, glib, pango, cairo, atk, gdk-pixbuf, libX11 }:
+{ lib, stdenv, fetchurl, gtk2-x11, glib, pango, cairo, atk, gdk-pixbuf, libX11 }:
 
 # Arena is free software in the sense of "free beer" but not as in "free
 # speech". We can install it as we please, but we cannot re-distribute it in
@@ -7,15 +7,16 @@
 
 let
 
-  inherit (stdenv.lib) makeLibraryPath;
+  inherit (lib) makeLibraryPath;
   libDir = "lib64";
 
 in
 stdenv.mkDerivation rec {
-  name = "arena-3.10-beta";
+  pname = "arena";
+  version = "3.10-beta";
 
   src = fetchurl {
-    url = "http://www.playwitharena.de/downloads/arenalinux_64bit_3.10beta.tar.gz";
+    url = "http://www.playwitharena.de/downloads/arenalinux_64bit_${lib.replaceStrings ["-"] [""] version}.tar.gz";
     sha256 = "1pzb9sg4lzbbi4gbldvlb85p8xyl9xnplxwyb9pkk2mwzvvxkf0d";
   };
 
@@ -25,19 +26,19 @@ stdenv.mkDerivation rec {
   unpackPhase = ''
     # This is is a tar bomb, i.e. it extract a dozen files and directories to
     # the top-level, so we must create a sub-directory first.
-    mkdir -p $out/lib/${name}
-    tar -C $out/lib/${name} -xf ${src}
+    mkdir -p $out/lib/${pname}-${version}
+    tar -C $out/lib/${pname}-${version} -xf ${src}
 
     # Remove executable bits from data files. This matters for the find command
     # we'll use below to find all bundled engines.
-    chmod -x $out/lib/${name}/Engines/*/*.{txt,bin,bmp,zip}
+    chmod -x $out/lib/${pname}-${version}/Engines/*/*.{txt,bin,bmp,zip}
   '';
 
   buildPhase = ''
     # Arena has (at least) two executables plus a couple of bundled chess
     # engines that we need to patch.
     exes=( $(find $out -name '*x86_64_linux')
-           $(find $out/lib/${name}/Engines -type f -perm /u+x)
+           $(find $out/lib/${pname}-${version}/Engines -type f -perm /u+x)
          )
     for i in "''${exes[@]}"; do
       # Arminius is statically linked.
@@ -52,7 +53,7 @@ stdenv.mkDerivation rec {
 
   installPhase = ''
     mkdir -p $out/bin
-    ln -s $out/lib/${name}/Arena_x86_64_linux $out/bin/arena
+    ln -s $out/lib/${pname}-${version}/Arena_x86_64_linux $out/bin/arena
   '';
 
   dontStrip = true;
@@ -66,9 +67,9 @@ stdenv.mkDerivation rec {
       UCI protocol I, II. Furthermore, compatible to Chess960, DGT electronic
       chess board & DGT clocks and much more.
     '';
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
     platforms = ["x86_64-linux"];
-    hydraPlatforms = stdenv.lib.platforms.none;
+    hydraPlatforms = lib.platforms.none;
   };
 
 }
diff --git a/pkgs/games/armagetronad/default.nix b/pkgs/games/armagetronad/default.nix
index d4d2cbef164..27f509c3f72 100644
--- a/pkgs/games/armagetronad/default.nix
+++ b/pkgs/games/armagetronad/default.nix
@@ -1,30 +1,42 @@
-{ stdenv, fetchurl, SDL, libxml2, SDL_image, libjpeg, libpng, libGLU, libGL, zlib }:
+{ lib, stdenv, fetchurl
+, pkg-config, SDL, libxml2, SDL_image, libjpeg, libpng, libGLU, libGL, zlib
+, dedicatedServer ? false }:
 
 let
-  versionMajor = "0.2.8";
-  versionMinor = "3.5";
+  versionMajor = "0.2.9";
+  versionMinor = "1.0";
   version = "${versionMajor}.${versionMinor}";
 in
-
 stdenv.mkDerivation {
-  pname = "armagetron";
+  pname = if dedicatedServer then "armagetronad-dedicated" else "armagetronad";
   inherit version;
   src = fetchurl {
-    url = "https://launchpad.net/armagetronad/${versionMajor}/${versionMajor}.${versionMinor}/+download/armagetronad-${version}.src.tar.bz2";
-    sha256 = "1vyja7mzivs3pacxb7kznndsgqhq4p0f7x2zg55dckvzqwprdhqx";
+    url = "https://launchpad.net/armagetronad/${versionMajor}/${version}/+download/armagetronad-${version}.tbz";
+    sha256 = "sha256-WbbHwBzj+MylQ34z+XSmN1KVQaEapPUsGlwXSZ4m9qE";
   };
 
-  NIX_LDFLAGS = "-lSDL_image";
-
   enableParallelBuilding = true;
 
-  configureFlags = [ "--disable-etc" ];
-  buildInputs = [ SDL SDL_image libxml2 libjpeg libpng libGLU libGL zlib ];
+  configureFlags = [
+    "--enable-memmanager"
+    "--enable-automakedefaults"
+    "--disable-useradd"
+    "--disable-initscripts"
+    "--disable-etc"
+    "--disable-uninstall"
+    "--disable-sysinstall"
+  ] ++ lib.optional dedicatedServer "--enable-dedicated";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ libxml2 zlib ]
+    ++ lib.optionals (!dedicatedServer) [ SDL SDL_image libxml2 libjpeg libpng libGLU libGL ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://armagetronad.org";
-    description = "An multiplayer networked arcade racing game in 3D similar to Tron";
-    license = licenses.gpl2;
+    description = "A multiplayer networked arcade racing game in 3D similar to Tron";
+    maintainers = with maintainers; [ numinit ];
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/arx-libertatis/default.nix b/pkgs/games/arx-libertatis/default.nix
index 2e60f81f4d3..945ebf7b785 100644
--- a/pkgs/games/arx-libertatis/default.nix
+++ b/pkgs/games/arx-libertatis/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchFromGitHub, cmake, zlib, boost
+{ lib, stdenv, fetchFromGitHub, cmake, zlib, boost
 , openal, glm, freetype, libGLU, SDL2, epoxy
-, dejavu_fonts, inkscape_0, optipng, imagemagick
+, dejavu_fonts, inkscape, optipng, imagemagick
 , withCrashReporter ? !stdenv.isDarwin
 ,   qtbase ? null
 ,   wrapQtAppsHook ? null
@@ -8,21 +8,21 @@
 ,   gdb  ? null
 }:
 
-with stdenv.lib;
+with lib;
 
 stdenv.mkDerivation {
   pname = "arx-libertatis";
-  version = "2019-07-22";
+  version = "2020-10-20";
 
   src = fetchFromGitHub {
     owner = "arx";
     repo = "ArxLibertatis";
-    rev = "db77aa26bb8612f711b65e72b1cd8cf6481700c7";
-    sha256 = "0c88djyzjna17wjcvkgsfx3011m1rba5xdzdldy1hjmafpqgb4jj";
+    rev = "21df2e37664de79e117eff2af164873f05600f4c";
+    sha256 = "06plyyh0ddqv1j04m1vclz9j72609pgrp61v8wfjdcln8djm376i";
   };
 
   nativeBuildInputs = [
-    cmake inkscape_0 imagemagick optipng
+    cmake inkscape imagemagick optipng
   ] ++ optionals withCrashReporter [ wrapQtAppsHook ];
 
   buildInputs = [
@@ -37,7 +37,6 @@ stdenv.mkDerivation {
     "-DImageMagick_mogrify_EXECUTABLE=${imagemagick.out}/bin/mogrify"
   ];
 
-  enableParallelBuilding = true;
   dontWrapQtApps = true;
 
   postInstall = ''
diff --git a/pkgs/games/asc/default.nix b/pkgs/games/asc/default.nix
index 28b144a4e86..af3f9f40310 100644
--- a/pkgs/games/asc/default.nix
+++ b/pkgs/games/asc/default.nix
@@ -1,27 +1,28 @@
-{ fetchurl, stdenv, SDL, SDL_image, SDL_mixer, SDL_sound, libsigcxx, physfs
-, boost, expat, freetype, libjpeg, wxGTK, lua, perl, pkgconfig, zlib, zip, bzip2
+{ fetchurl, lib, stdenv, SDL, SDL_image, SDL_mixer, SDL_sound, libsigcxx, physfs
+, boost, expat, freetype, libjpeg, wxGTK, lua, perl, pkg-config, zlib, zip, bzip2
 , libpng, libtiff, fluidsynth, libmikmod, libvorbis, flac, libogg }:
 
 stdenv.mkDerivation rec {
-  name = "asc-2.6.0.0";
+  pname = "asc";
+  version = "2.6.0.0";
 
   src = fetchurl {
-    url = "mirror://sourceforge/asc-hq/${name}.tar.bz2";
+    url = "mirror://sourceforge/asc-hq/asc-${version}.tar.bz2";
     sha256 = "1fybasb6srqfg6pqbvh0s0vvzjq9r0n6aq0z44hs7n68kmaam775";
   };
 
   configureFlags = [ "--disable-paragui" "--disable-paraguitest" ];
 
-  NIX_CFLAGS_COMPILE = "-fpermissive"; # I'm too lazy to catch all gcc47-related problems
+  NIX_CFLAGS_COMPILE = "-fpermissive -Wno-error=narrowing"; # I'm too lazy to catch all gcc47-related problems
   hardeningDisable = [ "format" ];
 
   buildInputs = [
     SDL SDL_image SDL_mixer SDL_sound libsigcxx physfs boost expat
-    freetype libjpeg wxGTK lua perl pkgconfig zlib zip bzip2 libpng
+    freetype libjpeg wxGTK lua perl pkg-config zlib zip bzip2 libpng
     libtiff fluidsynth libmikmod flac libvorbis libogg
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Turn based strategy game";
 
     longDescription = ''
diff --git a/pkgs/games/assaultcube/default.nix b/pkgs/games/assaultcube/default.nix
index 6c3a7f1168e..640ea81c6c6 100644
--- a/pkgs/games/assaultcube/default.nix
+++ b/pkgs/games/assaultcube/default.nix
@@ -1,8 +1,8 @@
-{ fetchFromGitHub, stdenv, makeDesktopItem, openal, pkgconfig, libogg,
+{ fetchFromGitHub, lib, stdenv, makeDesktopItem, openal, pkg-config, libogg,
   libvorbis, SDL, SDL_image, makeWrapper, zlib, file,
   client ? true, server ? true }:
 
-with stdenv.lib;
+with lib;
 
 stdenv.mkDerivation rec {
 
@@ -17,12 +17,12 @@ stdenv.mkDerivation rec {
     sha256 = "1vfn3d55vmmipdykrcfvgk6dddi9y95vlclsliirm7jdp20f15hd";
   };
 
-  nativeBuildInputs = [ makeWrapper pkgconfig ];
+  nativeBuildInputs = [ makeWrapper pkg-config ];
 
   buildInputs = [ file zlib ] ++ optionals client [ openal SDL SDL_image libogg libvorbis ];
 
   targets = (optionalString server "server") + (optionalString client " client");
-  makeFlags = [ "-C source/src" "CXX=c++" targets ];
+  makeFlags = [ "-C source/src" "CXX=${stdenv.cc.targetPrefix}c++" targets ];
 
   desktop = makeDesktopItem {
     name = "AssaultCube";
@@ -50,7 +50,7 @@ stdenv.mkDerivation rec {
       cp ${desktop}/share/applications/* $out/share/applications
       install -Dpm644 packages/misc/icon.png $out/share/icons/assaultcube.png
       install -Dpm644 packages/misc/icon.png $out/share/pixmaps/assaultcube.png
-      
+
       makeWrapper $out/bin/ac_client $out/bin/${pname} \
         --run "cd $out/$gamedatadir" --add-flags "--home=\$HOME/.assaultcube/v1.2next --init"
     fi
@@ -65,8 +65,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Fast and fun first-person-shooter based on the Cube fps";
     homepage = "https://assault.cubers.net";
-    maintainers = [ maintainers.genesis ];
+    maintainers = [ ];
     platforms = platforms.linux; # should work on darwin with a little effort.
-    license = stdenv.lib.licenses.zlib;
+    license = lib.licenses.unfree;
   };
 }
diff --git a/pkgs/games/astromenace/default.nix b/pkgs/games/astromenace/default.nix
index 7f1ca325746..cbe2385ea12 100644
--- a/pkgs/games/astromenace/default.nix
+++ b/pkgs/games/astromenace/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv, cmake, xlibsWrapper, libGLU, libGL, SDL, openal, freealut, libogg, libvorbis, runtimeShell }:
+{ fetchurl, lib, stdenv, cmake, xlibsWrapper, libGLU, libGL, SDL, openal, freealut, libogg, libvorbis, runtimeShell }:
 
 stdenv.mkDerivation rec {
   version = "1.3.2";
@@ -9,7 +9,8 @@ stdenv.mkDerivation rec {
     sha256 = "1rkz6lwjcd5mwv72kf07ghvx6z46kf3xs250mjbmnmjpn7r5sxwv";
   };
 
-  buildInputs = [ cmake xlibsWrapper libGLU libGL SDL openal freealut libogg libvorbis ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ xlibsWrapper libGLU libGL SDL openal freealut libogg libvorbis ];
 
   buildPhase = ''
     cmake ./
@@ -30,7 +31,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Hardcore 3D space shooter with spaceship upgrade possibilities";
     homepage = "https://www.viewizard.com/";
-    license = stdenv.lib.licenses.gpl3;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/atanks/default.nix b/pkgs/games/atanks/default.nix
index bb11acf3866..f92f2e19c33 100644
--- a/pkgs/games/atanks/default.nix
+++ b/pkgs/games/atanks/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, allegro }:
+{ lib, stdenv, fetchurl, allegro }:
 
 stdenv.mkDerivation rec {
   pname = "atanks";
@@ -13,7 +13,7 @@ stdenv.mkDerivation rec {
 
   makeFlags = [ "PREFIX=$(out)/" "INSTALL=install" "CXX=g++" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Atomic Tanks ballistics game";
     homepage = "http://atanks.sourceforge.net/";
     maintainers = [ maintainers.raskin ];
diff --git a/pkgs/games/augustus/default.nix b/pkgs/games/augustus/default.nix
index cabe419ef5b..4693e290da6 100644
--- a/pkgs/games/augustus/default.nix
+++ b/pkgs/games/augustus/default.nix
@@ -1,24 +1,25 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, libpng }:
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, libpng }:
 
 stdenv.mkDerivation rec {
   pname = "augustus";
-  version = "1.4.1a";
+  version = "3.0.1";
 
   src = fetchFromGitHub {
     owner = "Keriew";
     repo = "augustus";
     rev = "v${version}";
-    sha256 = "1xqv8j8jh3f13fjhyf7hk1anrn799cwwsvsd75kpl9n5yh5s1j5y";
+    sha256 = "03pmnwq6bahq854vh1vmv1vabb8cs0alca8f36id8dlz8bw95nik";
   };
 
   nativeBuildInputs = [ cmake ];
   buildInputs = [ SDL2 SDL2_mixer libpng ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An open source re-implementation of Caesar III. Fork of Julius incorporating gameplay changes";
     homepage = "https://github.com/Keriew/augustus";
-    license = licenses.agpl3;
+    license = licenses.agpl3Only;
     platforms = platforms.all;
+    broken = stdenv.isDarwin;
     maintainers = with maintainers; [ Thra11 ];
   };
 }
diff --git a/pkgs/games/azimuth/default.nix b/pkgs/games/azimuth/default.nix
index 67bbd8558c3..dcc67533fac 100644
--- a/pkgs/games/azimuth/default.nix
+++ b/pkgs/games/azimuth/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, SDL, which, installTool ? false }:
+{ lib, stdenv, fetchFromGitHub, SDL, which, installTool ? false }:
 
 stdenv.mkDerivation rec {
   pname = "azimuth";
@@ -41,10 +41,10 @@ stdenv.mkDerivation rec {
       bosses to tangle with.
     '';
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
     homepage = "https://mdsteele.games/azimuth/index.html";
-    maintainers = with stdenv.lib.maintainers; [ marius851000 ];
-    platforms = stdenv.lib.platforms.linux;
+    maintainers = with lib.maintainers; [ marius851000 ];
+    platforms = lib.platforms.linux;
   };
 
 }
diff --git a/pkgs/games/ball-and-paddle/default.nix b/pkgs/games/ball-and-paddle/default.nix
index 862905efd3b..a935f3d4686 100644
--- a/pkgs/games/ball-and-paddle/default.nix
+++ b/pkgs/games/ball-and-paddle/default.nix
@@ -1,10 +1,11 @@
-{ fetchurl, stdenv, SDL, SDL_image, SDL_mixer, SDL_ttf, guile, gettext }:
+{ fetchurl, lib, stdenv, SDL, SDL_image, SDL_mixer, SDL_ttf, guile, gettext }:
 
 stdenv.mkDerivation rec {
-  name = "ballandpaddle-0.8.1";
+  pname = "ballandpaddle";
+  version = "0.8.1";
 
   src = fetchurl {
-    url = "mirror://gnu/ballandpaddle/${name}.tar.gz";
+    url = "mirror://gnu/ballandpaddle/ballandpaddle-${version}.tar.gz";
     sha256 = "0zgpydad0mj7fbkippw3n9hlda6nac084dq5xfbsks9jn1xd30ny";
   };
 
@@ -31,14 +32,14 @@ stdenv.mkDerivation rec {
       with Guile.  Follow the example level sets and the documentation.
     '';
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
     homepage = "https://www.gnu.org/software/ballandpaddle/";
 
     maintainers = [ ];
 
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
 
-    hydraPlatforms = stdenv.lib.platforms.linux; # sdl-config times out on darwin
+    hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin
   };
 }
diff --git a/pkgs/games/banner/default.nix b/pkgs/games/banner/default.nix
index 6da8e1bf9bf..084dd37d322 100644
--- a/pkgs/games/banner/default.nix
+++ b/pkgs/games/banner/default.nix
@@ -1,17 +1,20 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
-  name = "banner-1.3.4";
+  pname = "banner";
+  version = "1.3.5";
 
-  src = fetchurl {
-    url = "http://software.cedar-solutions.com/ftp/software/${name}.tar.gz";
-    sha256 = "04q5ribr0r9s8waky3nk356l0qdhfxw15ipz7lsfgv1fxq3qk6bz";
+  src = fetchFromGitHub {
+    owner = "pronovic";
+    repo = "banner";
+    rev = "BANNER_V${version}";
+    sha256 = "ISSnGzrFSzSj/+KxgeFtaw4H+4Ea5x5S5C8xjcjKWqQ=";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://software.cedar-solutions.com/utilities.html";
     description = "Print large banners to ASCII terminals";
-    license = licenses.gpl2;
+    license = licenses.gpl2Only;
 
     longDescription = ''
       An implementation of the traditional Unix-program used to display
diff --git a/pkgs/games/bastet/default.nix b/pkgs/games/bastet/default.nix
index d68a05137b4..053eca57528 100644
--- a/pkgs/games/bastet/default.nix
+++ b/pkgs/games/bastet/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchpatch, ncurses, boost }:
+{ lib, stdenv, fetchFromGitHub, fetchpatch, ncurses, boost }:
 
 stdenv.mkDerivation rec {
   pname = "bastet";
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
     cp bastet.6 "$out"/share/man/man6
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tetris clone with 'bastard' block-choosing AI";
     homepage = "http://fph.altervista.org/prog/bastet.html";
     license = licenses.gpl3;
diff --git a/pkgs/games/beret/default.nix b/pkgs/games/beret/default.nix
index f640e2c6aef..5d1bf0dd47c 100644
--- a/pkgs/games/beret/default.nix
+++ b/pkgs/games/beret/default.nix
@@ -1,13 +1,14 @@
-{ stdenv, fetchurl, SDL, SDL_image, SDL_ttf, SDL_mixer }:
+{ lib, stdenv, fetchurl, SDL, SDL_image, SDL_ttf, SDL_mixer }:
 
 stdenv.mkDerivation {
-  name = "beret-1.2.0";
+  pname = "beret";
+  version = "1.2.0";
 
   buildInputs = [ SDL SDL_image SDL_ttf SDL_mixer ];
 
   NIX_CFLAGS_COMPILE = "-I${SDL.dev}/include/SDL";
-  NIX_CFLAGS_LINK = stdenv.lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
-  NIX_LDFLAGS = stdenv.lib.optionalString stdenv.isDarwin
+  NIX_CFLAGS_LINK = lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
+  NIX_LDFLAGS = lib.optionalString stdenv.isDarwin
     "-framework CoreFoundation -framework OpenGL -framework Cocoa";
 
   patches = [ ./use-home-dir.patch ];
@@ -29,7 +30,7 @@ stdenv.mkDerivation {
     cp -av tahoma.ttf images music rooms sfx $out/share
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A 2D puzzle-platformer game about a scientist with telekinetic abilities";
     homepage    = "http://kiwisauce.com/beret/";
     license     = licenses.lgpl2;
diff --git a/pkgs/games/bitsnbots/default.nix b/pkgs/games/bitsnbots/default.nix
index 52286b32f90..e5e718e3ca5 100644
--- a/pkgs/games/bitsnbots/default.nix
+++ b/pkgs/games/bitsnbots/default.nix
@@ -1,7 +1,8 @@
-{ stdenv, fetchurl, SDL, lua, libGLU, libGL }:
+{ lib, stdenv, fetchurl, SDL, lua, libGLU, libGL }:
 
 stdenv.mkDerivation rec {
-  name = "bitsnbots-20111230";
+  pname = "bitsnbots";
+  version = "20111230";
 
   src = fetchurl {
     url = "http://moikmellah.org/downloads/bitsnbots/bitsnbots.source.tgz";
@@ -19,10 +20,10 @@ stdenv.mkDerivation rec {
   NIX_LDFLAGS = "-lGL";
 
   installPhase = ''
-    mkdir -p $out/share/${name}
-    cp -R bitsnbots resource scripts README $out/share/${name}
+    mkdir -p $out/share/${pname}-${version}
+    cp -R bitsnbots resource scripts README $out/share/${pname}-${version}
     mkdir -p $out/bin
-    ln -s $out/share/${name}/bitsnbots $out/bin
+    ln -s $out/share/${pname}-${version}/bitsnbots $out/bin
   '';
 
   buildInputs = [ SDL lua libGLU libGL ];
@@ -30,7 +31,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Simple puzzle game with moving robots";
     homepage = "http://moikmellah.org/blog/?page_id=19";
-    license = stdenv.lib.licenses.gpl3Plus;
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl3Plus;
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/black-hole-solver/default.nix b/pkgs/games/black-hole-solver/default.nix
new file mode 100644
index 00000000000..e859e72d96b
--- /dev/null
+++ b/pkgs/games/black-hole-solver/default.nix
@@ -0,0 +1,30 @@
+{
+  stdenv, lib, fetchurl,
+  cmake, perl, pkg-config, python3,
+  rinutils, PathTiny,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "black-hole-solver";
+  version = "1.10.1";
+
+  meta = with lib; {
+    homepage = "https://www.shlomifish.org/open-source/projects/black-hole-solitaire-solver/";
+    description = "A solver for Solitaire variants Golf, Black Hole, and All in a Row.";
+    license = licenses.mit;
+  };
+
+  src = fetchurl {
+    url = "https://fc-solve.shlomifish.org/downloads/fc-solve/${pname}-${version}.tar.xz";
+    sha256 = "1qhihmk4fwz6n16c7bnxnh3v7jhbb7xhkc9wk9484bp0k4x9bq9n";
+  };
+
+  nativeBuildInputs = [ cmake perl pkg-config python3 ];
+
+  buildInputs = [ rinutils PathTiny ];
+
+  prePatch = ''
+    patchShebangs ./scripts
+  '';
+
+}
diff --git a/pkgs/games/blackshades/default.nix b/pkgs/games/blackshades/default.nix
index e47e430d84c..bd29c7b616c 100644
--- a/pkgs/games/blackshades/default.nix
+++ b/pkgs/games/blackshades/default.nix
@@ -1,34 +1,36 @@
-{stdenv, fetchsvn, SDL, libGLU, libGL, openal, libvorbis, freealut, SDL_image}:
+{ lib, stdenv, fetchFromSourcehut
+, SDL, stb, libGLU, libGL, openal, libvorbis, freealut }:
 
-stdenv.mkDerivation {
-  name = "blackshades-svn-110";
-  src = fetchsvn {
-    url = "svn://svn.icculus.org/blackshades/trunk";
-    rev = "110";
-    sha256 = "0kbrh1dympk8scjxr6av24qs2bffz44l8qmw2m5gyqf4g3rxf6ra";
-  };
+stdenv.mkDerivation rec {
+  pname = "blackshades";
+  version = "1.3.1";
 
-  NIX_LDFLAGS = "-lSDL_image";
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "0yzp74ynkcp6hh5m4zmvrgx5gwm186hq7p3m7qkww54qdyijb3rv";
+  };
 
-  buildInputs = [ SDL SDL_image libGLU libGL openal libvorbis freealut ];
+  buildInputs = [ SDL stb libGLU libGL openal libvorbis freealut ];
 
-  patchPhase = ''
-    sed -i -e s,Data/,$out/opt/$name/Data/,g \
-      -e s,Data:,$out/opt/$name/Data/,g \
-      Source/*.cpp
+  postPatch = ''
+    sed -i -e s,Data/,$out/share/$pname/,g \
+      -e s,Data:,$out/share/$pname/,g \
+      src/*.cpp
   '';
 
   installPhase = ''
-    mkdir -p $out/bin $out/opt/$name
-    cp objs/blackshades $out/bin
-    cp -R Data IF* Readme $out/opt/$name/
+    mkdir -p $out/bin $out/share
+    cp build/blackshades $out/bin
+    cp -R Data $out/share/$pname
   '';
 
   meta = {
-    homepage = "http://icculus.org/blackshades/";
-    description = "Protect the VIP";
-    license = stdenv.lib.licenses.free;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    homepage = "https://sr.ht/~cnx/blackshades";
+    description = "A psychic bodyguard FPS";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ McSinyx viric ];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/blobby/default.nix b/pkgs/games/blobby/default.nix
index ea8bddfa16d..9dad0b84d1e 100644
--- a/pkgs/games/blobby/default.nix
+++ b/pkgs/games/blobby/default.nix
@@ -1,24 +1,21 @@
-{stdenv, fetchurl, SDL2, SDL2_image, libGLU, libGL, cmake, physfs, boost, zip, zlib
-, pkgconfig, unzip}:
+{ lib, stdenv, fetchurl, SDL2, SDL2_image, libGLU, libGL, cmake, physfs, boost, zip, zlib, pkg-config }:
+
 stdenv.mkDerivation rec {
-  version = "1.0";
   pname = "blobby-volley";
+  version = "1.0";
 
   src = fetchurl {
     url = "mirror://sourceforge/blobby/Blobby%20Volley%202%20%28Linux%29/1.0/blobby2-linux-1.0.tar.gz";
     sha256 = "1qpmbdlyhfbrdsq4vkb6cb3b8mh27fpizb71q4a21ala56g08yms";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [SDL2 SDL2_image libGLU libGL cmake physfs boost zip zlib
-    unzip];
+  nativeBuildInputs = [ cmake pkg-config zip ];
+  buildInputs = [ SDL2 SDL2_image libGLU libGL physfs boost zlib ];
 
   preConfigure=''
     sed -e '1i#include <iostream>' -i src/NetworkMessage.cpp
   '';
 
-  inherit unzip;
-
   postInstall = ''
     cp ../data/Icon.bmp "$out/share/blobby/"
     mv "$out/bin"/blobby{,.bin}
@@ -26,13 +23,12 @@ stdenv.mkDerivation rec {
     chmod a+x "$out/bin/blobby"
   '';
 
-  meta = {
-    description = ''A blobby volleyball game'';
-    license = stdenv.lib.licenses.bsd3;
-    platforms = with stdenv.lib.platforms; linux;
-    maintainers = with stdenv.lib.maintainers; [raskin];
+  meta = with lib; {
+    description = "A blobby volleyball game";
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ raskin ];
     homepage = "http://blobby.sourceforge.net/";
     downloadPage = "https://sourceforge.net/projects/blobby/files/Blobby%20Volley%202%20%28Linux%29/";
-    inherit version;
   };
 }
diff --git a/pkgs/games/blobwars/default.nix b/pkgs/games/blobwars/default.nix
new file mode 100644
index 00000000000..b99c9f2b8e3
--- /dev/null
+++ b/pkgs/games/blobwars/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, fetchurl, pkg-config, gettext, SDL2, SDL2_image, SDL2_mixer, SDL2_net, SDL2_ttf, zlib }:
+
+stdenv.mkDerivation rec {
+  pname = "blobwars";
+  version = "2.00";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "c406279f6cdf2aed3c6edb8d8be16efeda0217494acd525f39ee2bd3e77e4a99";
+  };
+
+  nativeBuildInputs = [ pkg-config gettext ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf zlib ];
+  NIX_CFLAGS_COMPILE = [ "-Wno-error" ];
+
+  makeFlags = [ "PREFIX=$(out)" "RELEASE=1" ];
+
+  postInstall = ''
+    install -Dm755 $out/games/blobwars -t $out/bin
+    rm -r $out/games
+    cp -r {data,gfx,sound,music} $out/share/games/blobwars/
+    # fix world readable bit
+    find $out/share/games/blobwars/. -type d -exec chmod 755 {} +
+    find $out/share/games/blobwars/. -type f -exec chmod 644 {} +
+  '';
+
+  meta = with lib; {
+    description = "Platform action game featuring a blob with lots of weapons";
+    homepage = "https://www.parallelrealities.co.uk/games/metalBlobSolid/";
+    license = with licenses; [ gpl2Plus free ];
+    maintainers = with maintainers; [ iblech ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/boohu/default.nix b/pkgs/games/boohu/default.nix
index 3ca8ee4693a..6b3c0e04f98 100644
--- a/pkgs/games/boohu/default.nix
+++ b/pkgs/games/boohu/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, buildGoPackage}:
+{lib, fetchurl, buildGoPackage}:
 
 buildGoPackage rec {
 
@@ -16,7 +16,7 @@ buildGoPackage rec {
 
   postInstall = "mv $out/bin/boohu.git $out/bin/boohu";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A new coffee-break roguelike game";
     longDescription = ''
       Break Out Of Hareka's Underground (Boohu) is a roguelike game mainly
@@ -27,6 +27,6 @@ buildGoPackage rec {
     homepage = "https://download.tuxfamily.org/boohu/index.html";
     license = licenses.isc;
     platforms = platforms.unix;
-    maintainers = with maintainers; [freepotion];
+    maintainers = with maintainers; [];
   };
 }
diff --git a/pkgs/games/braincurses/default.nix b/pkgs/games/braincurses/default.nix
index 86a8f865442..f3f862b97ef 100644
--- a/pkgs/games/braincurses/default.nix
+++ b/pkgs/games/braincurses/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, ncurses }:
+{ lib, stdenv, fetchFromGitHub, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "braincurses";
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
     install -Dt $out/bin braincurses
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/bderrly/braincurses";
     description = "A version of the classic game Mastermind";
     license = licenses.gpl2;
diff --git a/pkgs/games/brogue/default.nix b/pkgs/games/brogue/default.nix
index 1662f847bfa..77811e76e96 100644
--- a/pkgs/games/brogue/default.nix
+++ b/pkgs/games/brogue/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, SDL, ncurses, libtcod, makeDesktopItem }:
+{ lib, stdenv, fetchurl, SDL, ncurses, libtcod, makeDesktopItem }:
 
 stdenv.mkDerivation rec {
   pname = "brogue";
@@ -41,7 +41,7 @@ stdenv.mkDerivation rec {
   # fix crash; shouldn’t be a security risk because it’s an offline game
   hardeningDisable = [ "stackprotector" "fortify" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A roguelike game";
     homepage = "https://sites.google.com/site/broguegame/";
     license = licenses.agpl3;
diff --git a/pkgs/games/bsdgames/default.nix b/pkgs/games/bsdgames/default.nix
index 41414a573a6..837fb4e1768 100644
--- a/pkgs/games/bsdgames/default.nix
+++ b/pkgs/games/bsdgames/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, ncurses, openssl, flex, bison, less, miscfiles }:
+{ lib, stdenv, fetchurl, ncurses, openssl, flex, bison, less, miscfiles }:
 
-stdenv.mkDerivation {
-  name = "bsd-games-2.17";
+stdenv.mkDerivation rec {
+  pname = "bsd-games";
+  version = "2.17";
 
   src = fetchurl {
-    url = "ftp://metalab.unc.edu/pub/Linux/games/bsd-games-2.17.tar.gz";
+    url = "ftp://metalab.unc.edu/pub/Linux/games/bsd-games-${version}.tar.gz";
     sha256 = "0q7zdyyfvn15y0w4g54kq3gza89h61py727m8slmw73cxx594vq6";
   };
 
@@ -60,8 +61,8 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.t2-project.org/packages/bsd-games.html";
     description = "Ports of all the games from NetBSD-current that are free";
-    license = stdenv.lib.licenses.free;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.free;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/btanks/default.nix b/pkgs/games/btanks/default.nix
index 5bb7cfa215b..202bab0df66 100644
--- a/pkgs/games/btanks/default.nix
+++ b/pkgs/games/btanks/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchpatch, sconsPackages, pkgconfig, SDL, libGL, zlib, smpeg
+{ lib, stdenv, fetchurl, fetchpatch, sconsPackages, pkg-config, SDL, libGL, zlib, smpeg
 , SDL_image, libvorbis, expat, zip, lua }:
 
 stdenv.mkDerivation rec {
@@ -10,7 +10,7 @@ stdenv.mkDerivation rec {
     sha256 = "0ha35kxc8xlbg74wsrbapfgxvcrwy6psjkqi7c6adxs55dmcxliz";
   };
 
-  nativeBuildInputs = [ sconsPackages.scons_3_0_1 pkgconfig ];
+  nativeBuildInputs = [ sconsPackages.scons_3_0_1 pkg-config ];
 
   buildInputs = [ SDL libGL zlib smpeg SDL_image libvorbis expat zip lua ];
 
@@ -34,7 +34,7 @@ stdenv.mkDerivation rec {
     })
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast 2d tank arcade game";
     homepage = "https://sourceforge.net/projects/btanks/";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/bzflag/default.nix b/pkgs/games/bzflag/default.nix
index 1ec24e02be0..35a481fb2f4 100644
--- a/pkgs/games/bzflag/default.nix
+++ b/pkgs/games/bzflag/default.nix
@@ -1,17 +1,17 @@
-{ stdenv, lib, fetchurl, pkgconfig
+{ stdenv, lib, fetchurl, pkg-config
 , curl, SDL2, libGLU, libGL, glew, ncurses, c-ares
 , Carbon, CoreServices }:
 
 stdenv.mkDerivation rec {
   pname = "bzflag";
-  version = "2.4.20";
+  version = "2.4.22";
 
   src = fetchurl {
     url = "https://download.bzflag.org/${pname}/source/${version}/${pname}-${version}.tar.bz2";
-    sha256 = "16brxqmfiyz4j4lb8ihzjcbwqmpsms6vm3ijbp34lnw0blbwdjb2";
+    sha256 = "sha256-nmRlMwK2V72LX5b+EVCp/4Ch1Tptfoo1E4xrGwIAak0=";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ curl SDL2 libGLU libGL glew ncurses c-ares ]
     ++ lib.optionals stdenv.isDarwin [ Carbon CoreServices ];
 
diff --git a/pkgs/games/cataclysm-dda/common.nix b/pkgs/games/cataclysm-dda/common.nix
index 9ec73cdebe0..d91db073ff6 100644
--- a/pkgs/games/cataclysm-dda/common.nix
+++ b/pkgs/games/cataclysm-dda/common.nix
@@ -1,11 +1,11 @@
-{ stdenv, runtimeShell, pkgconfig, gettext, ncurses, CoreFoundation
+{ lib, stdenv, runtimeShell, pkg-config, gettext, ncurses, CoreFoundation
 , tiles, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, freetype, Cocoa
 , debug
 , useXdgDir
 }:
 
 let
-  inherit (stdenv.lib) optionals optionalString;
+  inherit (lib) optionals optionalString;
 
   cursesDeps = [ gettext ncurses ]
     ++ optionals stdenv.isDarwin [ CoreFoundation ];
@@ -13,17 +13,15 @@ let
   tilesDeps = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf freetype ]
     ++ optionals stdenv.isDarwin [ Cocoa ];
 
-  installXDGAppLauncher = ''
-    launcher="$out/share/applications/cataclysm-dda.desktop"
-    install -D -m 444 data/xdg/*cataclysm-dda.desktop -T "$launcher"
-    sed -i "$launcher" -e "s,\(Exec=\)\(cataclysm-tiles\),\1$out/bin/\2,"
-    install -D -m 444 data/xdg/cataclysm-dda.svg -t $out/share/icons/hicolor/scalable/apps
+  patchDesktopFile = ''
+    substituteInPlace $out/share/applications/org.cataclysmdda.CataclysmDDA.desktop \
+      --replace "Exec=cataclysm-tiles" "Exec=$out/bin/cataclysm-tiles"
   '';
 
   installMacOSAppLauncher = ''
     app=$out/Applications/Cataclysm.app
-    install -D -m 444 data/osx/Info.plist -t $app/Contents
-    install -D -m 444 data/osx/AppIcon.icns -t $app/Contents/Resources
+    install -D -m 444 build-data/osx/Info.plist -t $app/Contents
+    install -D -m 444 build-data/osx/AppIcon.icns -t $app/Contents/Resources
     mkdir $app/Contents/MacOS
     launcher=$app/Contents/MacOS/Cataclysm.sh
     cat << EOF > $launcher
@@ -37,7 +35,7 @@ in
 stdenv.mkDerivation {
   pname = "cataclysm-dda";
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
 
   buildInputs = cursesDeps ++ optionals tiles tilesDeps;
 
@@ -58,28 +56,25 @@ stdenv.mkDerivation {
   ] ++ optionals tiles [
     "TILES=1" "SOUND=1"
   ] ++ optionals stdenv.isDarwin [
-    "NATIVE=osx" "CLANG=1"
+    "NATIVE=osx"
+    "CLANG=1"
+    "OSX_MIN=${stdenv.targetPlatform.darwinMinVersion}"
   ];
 
   postInstall = optionalString tiles
   ( if !stdenv.isDarwin
-    then installXDGAppLauncher
+    then patchDesktopFile
     else installMacOSAppLauncher
   );
 
   dontStrip = debug;
 
-  # https://hydra.nixos.org/build/65193254
-  # src/weather_data.cpp:203:1: fatal error: opening dependency file obj/tiles/weather_data.d: No such file or directory
-  # make: *** [Makefile:687: obj/tiles/weather_data.o] Error 1
-  enableParallelBuilding = false;
-
   passthru = {
     isTiles = tiles;
     isCurses = !tiles;
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free, post apocalyptic, zombie infested rogue-like";
     longDescription = ''
       Cataclysm: Dark Days Ahead is a roguelike set in a post-apocalyptic world.
diff --git a/pkgs/games/cataclysm-dda/default.nix b/pkgs/games/cataclysm-dda/default.nix
index ada212ea7e9..1649cd031a4 100644
--- a/pkgs/games/cataclysm-dda/default.nix
+++ b/pkgs/games/cataclysm-dda/default.nix
@@ -33,7 +33,8 @@ let
     buildMod
     buildSoundPack
     buildTileSet
-    wrapCDDA;
+    wrapCDDA
+    attachPkgs;
 
     inherit pkgs;
   };
diff --git a/pkgs/games/cataclysm-dda/git.nix b/pkgs/games/cataclysm-dda/git.nix
index 36f37f7aeba..3dc0e944b5e 100644
--- a/pkgs/games/cataclysm-dda/git.nix
+++ b/pkgs/games/cataclysm-dda/git.nix
@@ -1,10 +1,10 @@
-{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA
+{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA, attachPkgs
 , tiles ? true, Cocoa
 , debug ? false
 , useXdgDir ? false
-, version ? "2019-11-22"
-, rev ? "a6c8ece992bffeae3788425dd4b3b5871e66a9cd"
-, sha256 ? "0ww2q5gykxm802z1kffmnrfahjlx123j1gfszklpsv0b1fccm1ab"
+, version ? "2021-07-03"
+, rev ? "9017808252e1e149446c8f8bd7a6582ce0f95285"
+, sha256 ? "0qrvkbyg098jb9hv69sg5093b1vj8f4n75p73v01jnmyxlz3ax28"
 }:
 
 let
@@ -26,11 +26,6 @@ let
       "VERSION=git-${version}-${lib.substring 0 8 src.rev}"
     ];
 
-    passthru = common.passthru // {
-      pkgs = pkgs.override { build = self; };
-      withMods = wrapCDDA self;
-    };
-
     meta = common.meta // {
       maintainers = with lib.maintainers;
       common.meta.maintainers ++ [ rardiol ];
@@ -38,4 +33,4 @@ let
   });
 in
 
-self
+attachPkgs pkgs self
diff --git a/pkgs/games/cataclysm-dda/lib.nix b/pkgs/games/cataclysm-dda/lib.nix
index 02678ed0228..f2b38a16aa5 100644
--- a/pkgs/games/cataclysm-dda/lib.nix
+++ b/pkgs/games/cataclysm-dda/lib.nix
@@ -1,6 +1,6 @@
 { callPackage }:
 
-{
+rec {
   buildMod = callPackage ./builder.nix {
     type = "mod";
   };
@@ -14,4 +14,33 @@
   };
 
   wrapCDDA = callPackage ./wrapper.nix {};
+
+  # Required to fix `pkgs` and `withMods` attrs after applying `overrideAttrs`.
+  #
+  # Example:
+  #     let
+  #       myBuild = cataclysmDDA.jenkins.latest.tiles.overrideAttrs (_: {
+  #         x = "hello";
+  #       });
+  #
+  #       # This refers to the derivation before overriding! So, `badExample.x` is not accessible.
+  #       badExample = myBuild.withMods (_: []);
+  #
+  #       # `myBuild` is correctly referred by `withMods` and `goodExample.x` is accessible.
+  #       goodExample = let
+  #         inherit (cataclysmDDA) attachPkgs pkgs;
+  #       in
+  #       (attachPkgs pkgs myBuild).withMods (_: []);
+  #     in
+  #     goodExample.x  # returns "hello"
+  attachPkgs = pkgs: super:
+  let
+    self = super.overrideAttrs (old: {
+      passthru = old.passthru // {
+        pkgs = pkgs.override { build = self; };
+        withMods = wrapCDDA self;
+      };
+    });
+  in
+  self;
 }
diff --git a/pkgs/games/cataclysm-dda/pkgs/default.nix b/pkgs/games/cataclysm-dda/pkgs/default.nix
index 6f3df09a786..39abad809c5 100644
--- a/pkgs/games/cataclysm-dda/pkgs/default.nix
+++ b/pkgs/games/cataclysm-dda/pkgs/default.nix
@@ -13,15 +13,17 @@ let
     };
   };
 
-  pkgs' = lib.mapAttrs (_: mod: lib.filterAttrs availableForBuild mod) pkgs;
+  pkgs' = lib.mapAttrs (_: mods: lib.filterAttrs isAvailable mods) pkgs;
 
-  availableForBuild = _: mod:
+  isAvailable = _: mod:
   if isNull build then
     true
   else if build.isTiles then
-    mod.forTiles
+    mod.forTiles or false
+  else if build.isCurses then
+    mod.forCurses or false
   else
-    mod.forCurses;
+    false;
 in
 
 lib.makeExtensible (_: pkgs')
diff --git a/pkgs/games/cataclysm-dda/stable.nix b/pkgs/games/cataclysm-dda/stable.nix
index 076a33a9e89..ba475ac9601 100644
--- a/pkgs/games/cataclysm-dda/stable.nix
+++ b/pkgs/games/cataclysm-dda/stable.nix
@@ -1,4 +1,4 @@
-{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA
+{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA, attachPkgs
 , tiles ? true, Cocoa
 , debug ? false
 , useXdgDir ? false
@@ -10,18 +10,13 @@ let
   };
 
   self = common.overrideAttrs (common: rec {
-    version = "0.E-2";
+    version = "0.F";
 
     src = fetchFromGitHub {
       owner = "CleverRaven";
       repo = "Cataclysm-DDA";
       rev = version;
-      sha256 = "15l6w6lxays7qmsv0ci2ry53asb9an9dh7l7fc13256k085qcg68";
-    };
-
-    passthru = common.passthru // {
-      pkgs = pkgs.override { build = self; };
-      withMods = wrapCDDA self;
+      sha256 = "1jid8lcl04y768b3psj1ifhx96lmd6fn1j2wzxhl4ic7ra66p2z3";
     };
 
     meta = common.meta // {
@@ -31,4 +26,4 @@ let
   });
 in
 
-self
+attachPkgs pkgs self
diff --git a/pkgs/games/cbonsai/default.nix b/pkgs/games/cbonsai/default.nix
new file mode 100644
index 00000000000..0425f4f56b3
--- /dev/null
+++ b/pkgs/games/cbonsai/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, lib, fetchFromGitLab, ncurses, pkg-config, nix-update-script }:
+
+stdenv.mkDerivation rec {
+  version = "1.2.1";
+  pname = "cbonsai";
+
+  src = fetchFromGitLab {
+    owner = "jallbrit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-kofJqMoBsvHrV3XfIQbSYO7OWpN7UgvrSs3WX3IVAJs=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ ncurses ];
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+  installFlags = [ "PREFIX=$(out)" ];
+
+  passthru.updateScript = nix-update-script { attrPath = pname; };
+
+  meta = with lib; {
+    description = "Grow bonsai trees in your terminal";
+    homepage = "https://gitlab.com/jallbrit/cbonsai";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ manveru ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/cdogs-sdl/default.nix b/pkgs/games/cdogs-sdl/default.nix
new file mode 100644
index 00000000000..c34c9efb167
--- /dev/null
+++ b/pkgs/games/cdogs-sdl/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, cmake
+, gtk3-x11
+, python3
+, protobuf
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cdogs";
+  version = "0.13.0";
+
+  src = fetchFromGitHub {
+    repo = "cdogs-sdl";
+    owner = "cxong";
+    rev = version;
+    sha256 = "sha256-7wNiDA/gOpqzSFWw8Bn6suC/f5RXdDTxPV49nCvOxas=";
+  };
+
+  postPatch = ''
+    patchShebangs src/proto/nanopb/generator/*
+  '';
+
+  cmakeFlags = [ "-DCDOGS_DATA_DIR=${placeholder "out"}/" ];
+
+  nativeBuildInputs = [
+    pkg-config
+    cmake
+    (python3.withPackages (pp: with pp; [ pp.protobuf setuptools ]))
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    gtk3-x11
+    protobuf
+  ];
+
+  meta = with lib; {
+    homepage = "https://cxong.github.io/cdogs-sdl";
+    description = "Open source classic overhead run-and-gun game";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ nixinator ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/cgoban/default.nix b/pkgs/games/cgoban/default.nix
new file mode 100644
index 00000000000..162de112fb5
--- /dev/null
+++ b/pkgs/games/cgoban/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, stdenv
+, writers
+, adoptopenjdk-jre-bin
+, fetchurl
+, makeWrapper
+}:
+stdenv.mkDerivation rec {
+  pname = "cgoban";
+  version = "3.5.23";
+
+  nativeBuildInputs = [ adoptopenjdk-jre-bin makeWrapper ];
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20210116034119/https://files.gokgs.com/javaBin/cgoban.jar";
+    sha256 = "0srw1hqr9prgr9dagfbh2j6p9ivaj40kdpyhs6zjkg7lhnnrrrcv";
+  };
+
+  dontConfigure = true;
+  dontUnpack = true;
+  dontBuild = true;
+  dontPatchELF = true;
+
+  installPhase = ''
+    runHook preInstall
+    install -D $src $out/lib/cgoban.jar
+    makeWrapper ${adoptopenjdk-jre-bin}/bin/java $out/bin/cgoban --add-flags "-jar $out/lib/cgoban.jar"
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Client for the KGS Go Server";
+    homepage = "https://www.gokgs.com/";
+    license = licenses.free;
+    maintainers = with maintainers; [ savannidgerinel ];
+    platforms = adoptopenjdk-jre-bin.meta.platforms;
+  };
+}
diff --git a/pkgs/games/chessdb/default.nix b/pkgs/games/chessdb/default.nix
index 76862c4bffe..6de8726722e 100644
--- a/pkgs/games/chessdb/default.nix
+++ b/pkgs/games/chessdb/default.nix
@@ -1,14 +1,16 @@
-{ stdenv, fetchurl, tcl, tk, libX11, makeWrapper }:
+{ lib, stdenv, fetchurl, tcl, tk, libX11, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "chessdb";
+  version = "3.6.19-beta-1";
 
-stdenv.mkDerivation {
-  name = "chessdb-3.6.19-beta-1";
-  
   src = fetchurl {
-    url = "mirror://sourceforge/chessdb/ChessDB-3.6.19-beta-1.tar.gz";
+    url = "mirror://sourceforge/chessdb/ChessDB-${version}.tar.gz";
     sha256 = "0brc3wln3bxp979iqj2w1zxpfd0pch8zzazhdmwf7acww4hrsz62";
   };
 
-  buildInputs = [ tcl tk libX11 makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ tcl tk libX11 ];
 
   makeFlags = [
     "BINDIR=$(out)/bin"
@@ -25,6 +27,6 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://chessdb.sourceforge.net/";
     description = "A free chess database";
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/chessx/default.nix b/pkgs/games/chessx/default.nix
index 0ff05556cdb..1d2b366cf38 100644
--- a/pkgs/games/chessx/default.nix
+++ b/pkgs/games/chessx/default.nix
@@ -1,6 +1,6 @@
 { mkDerivation
-, stdenv
-, pkgconfig
+, lib
+, pkg-config
 , zlib
 , qtbase
 , qtsvg
@@ -12,15 +12,15 @@
 
 mkDerivation rec {
   pname = "chessx";
-  version = "1.5.0";
+  version = "1.5.6";
 
   src = fetchurl {
     url = "mirror://sourceforge/chessx/chessx-${version}.tgz";
-    sha256 = "09rqyra28w3z9ldw8sx07k5ap3sjlli848p737maj7c240rasc6i";
+    sha256 = "sha256-0JpLU0qQnF8aOYxkBlBJov3zBJe8gcy98NlAQSNk0gU=";
   };
 
   nativeBuildInputs = [
-    pkgconfig
+    pkg-config
     qmake
   ];
 
@@ -46,9 +46,9 @@ mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://chessx.sourceforge.net/";
-    description = "ChessX allows you to browse and analyse chess games";
+    description = "Browse and analyse chess games";
     license = licenses.gpl2;
     maintainers = [ maintainers.luispedro ];
     platforms = platforms.linux;
diff --git a/pkgs/games/chiaki/default.nix b/pkgs/games/chiaki/default.nix
index be4ec7b73b4..ef454e50006 100644
--- a/pkgs/games/chiaki/default.nix
+++ b/pkgs/games/chiaki/default.nix
@@ -1,30 +1,63 @@
-{ lib, mkDerivation, fetchFromGitHub
-, cmake, ffmpeg, libopus, qtbase, qtmultimedia, qtsvg, pkgconfig, protobuf
-, python3Packages, SDL2 }:
+{ lib, stdenv
+, fetchgit
+, cmake
+, pkg-config
+, protobuf
+, python3Packages
+, ffmpeg
+, libopus
+, mkDerivation
+, qtbase
+, qtmultimedia
+, qtsvg
+, SDL2
+, libevdev
+, udev
+, qtmacextras
+}:
 
 mkDerivation rec {
   pname = "chiaki";
-  version = "1.2.1";
+  version = "2.1.0";
 
-  src = fetchFromGitHub {
+  src = fetchgit {
+    url = "https://git.sr.ht/~thestr4ng3r/chiaki";
     rev = "v${version}";
-    owner = "thestr4ng3r";
-    repo = "chiaki";
     fetchSubmodules = true;
-    sha256 = "00lzsbjd1w1bhlblgf7zp112sk8ac09c3bzi5ljxbn02mi0an3qp";
+    sha256 = "1hgh2j71rch53cnpm3f195gpfgrb4hd0yqa810k3ikar8zl4h7sd";
   };
 
   nativeBuildInputs = [
-    cmake pkgconfig protobuf python3Packages.python python3Packages.protobuf
+    cmake
+    pkg-config
+    protobuf
+    python3Packages.protobuf
+    python3Packages.python
+  ];
+
+  buildInputs = [
+    ffmpeg
+    libopus
+    qtbase
+    qtmultimedia
+    qtsvg
+    protobuf
+    SDL2
+  ] ++ lib.optionals stdenv.isLinux [
+    libevdev
+    udev
+  ] ++ lib.optionals stdenv.isDarwin [
+    qtmacextras
   ];
-  buildInputs = [ ffmpeg libopus qtbase qtmultimedia qtsvg protobuf SDL2 ];
 
   doCheck = true;
 
+  installCheckPhase = "$out/bin/chiaki --help";
+
   meta = with lib; {
-    homepage = "https://github.com/thestr4ng3r/chiaki";
-    description = "Free and Open Source PS4 Remote Play Client";
-    license = licenses.gpl3Plus;
+    homepage = "https://git.sr.ht/~thestr4ng3r/chiaki";
+    description = "Free and Open Source PlayStation Remote Play Client";
+    license = licenses.agpl3Only;
     maintainers = with maintainers; [ delroth ];
     platforms = platforms.all;
   };
diff --git a/pkgs/games/chocolate-doom/default.nix b/pkgs/games/chocolate-doom/default.nix
index 1b77a72f8d0..28ef9b6417e 100644
--- a/pkgs/games/chocolate-doom/default.nix
+++ b/pkgs/games/chocolate-doom/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, autoreconfHook, pkgconfig, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub }:
+{ lib, stdenv, autoreconfHook, pkg-config, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
   pname = "chocolate-doom";
@@ -15,16 +15,16 @@ stdenv.mkDerivation rec {
     sed -e 's#/games#/bin#g' -i src{,/setup}/Makefile.am
   '';
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
   buildInputs = [ SDL2 SDL2_mixer SDL2_net ];
   enableParallelBuilding = true;
 
   meta = {
     homepage = "http://chocolate-doom.org/";
     description = "A Doom source port that accurately reproduces the experience of Doom as it was played in the 1990s";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.unix;
-    hydraPlatforms = stdenv.lib.platforms.linux; # darwin times out
-    maintainers = with stdenv.lib.maintainers; [ MP2E ];
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    hydraPlatforms = lib.platforms.linux; # darwin times out
+    maintainers = with lib.maintainers; [ MP2E ];
   };
 }
diff --git a/pkgs/games/chromium-bsu/default.nix b/pkgs/games/chromium-bsu/default.nix
new file mode 100644
index 00000000000..1ab2fb8722b
--- /dev/null
+++ b/pkgs/games/chromium-bsu/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchurl
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, fontconfig
+, freealut
+, freeglut
+, ftgl
+, gettext
+, glpng
+, libGL
+, libGLU
+, openal
+, pkg-config
+, quesoglc
+}:
+
+stdenv.mkDerivation rec {
+  pname = "chromium-bsu";
+  version = "0.9.16.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/chromium-bsu/Chromium%20B.S.U.%20source%20code/${pname}-${version}.tar.gz";
+    hash = "sha256-ocFBo00ZpZYHroEWahmGTrjITPhrFVRi/tMabVbhYko=";
+  };
+
+  nativeBuildInputs = [
+    gettext
+    pkg-config
+  ];
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    fontconfig
+    freealut
+    freeglut
+    ftgl
+    glpng
+    libGL
+    libGLU
+    openal
+    quesoglc
+  ];
+
+  # Autodetection is somewhat buggy; this is to avoid SLD1 to be loaded
+  configureFlags = [
+    "--disable-sdlimage"
+    "--disable-sdlmixer"
+  ];
+
+
+  postInstall = ''
+    install -D misc/chromium-bsu.png $out/share/pixmaps/chromium-bsu.png
+    install -D misc/chromium-bsu.desktop $out/share/applications/chromium-bsu.desktop
+  '';
+
+  meta = with lib; {
+    homepage = "http://chromium-bsu.sourceforge.net/";
+    description = "A fast paced, arcade-style, top-scrolling space shooter";
+    license = licenses.artistic1;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+  };
+}
+# TODO [ AndersonTorres ]: joystick; gothic uralic font
diff --git a/pkgs/games/ckan/default.nix b/pkgs/games/ckan/default.nix
index a13ff8d66fa..3649369aeaa 100644
--- a/pkgs/games/ckan/default.nix
+++ b/pkgs/games/ckan/default.nix
@@ -1,44 +1,35 @@
-{ stdenv, fetchFromGitHub, makeWrapper, perl, mono, gtk2, curl }:
+{ lib, stdenv, fetchurl, makeWrapper, mono, gtk2, curl }:
 
 stdenv.mkDerivation rec {
   pname = "ckan";
-  version = "1.16.1";
+  version = "1.30.4";
 
-  src = fetchFromGitHub {
-    owner = "KSP-CKAN";
-    repo = "CKAN";
-    rev = "v${version}";
-    sha256 = "0lfvl8w09lakz35szp5grfvhq8xx486f5igvj1m6azsql4n929lg";
+  src = fetchurl {
+    url = "https://github.com/KSP-CKAN/CKAN/releases/download/v${version}/ckan.exe";
+    sha256 = "sha256-IgPqUEDpaIuGoaGoH2GCEzh3KxF3pkJC3VjTYXwSiQE=";
   };
 
-  buildInputs = [ makeWrapper perl mono ];
+  dontUnpack = true;
 
-  postPatch = ''
-    substituteInPlace bin/build \
-      --replace /usr/bin/perl ${perl}/bin/perl
-  '';
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ mono ];
 
-  # Tests don't currently work, as they try to write into /var/empty.
-  doCheck = false;
-  checkTarget = "test";
+  libraries = lib.makeLibraryPath [ gtk2 curl ];
 
-  libraries = stdenv.lib.makeLibraryPath [ gtk2 curl ];
+  buildPhase = "true";
 
   installPhase = ''
-    mkdir -p $out/bin
-    for exe in *.exe; do
-      install -m 0644 $exe $out/bin
-      makeWrapper ${mono}/bin/mono $out/bin/$(basename $exe .exe) \
-        --add-flags $out/bin/$exe \
-        --set LD_LIBRARY_PATH $libraries
-    done
+    install -m 644 -D $src $out/bin/ckan.exe
+    makeWrapper ${mono}/bin/mono $out/bin/ckan \
+      --add-flags $out/bin/ckan.exe \
+      --set LD_LIBRARY_PATH $libraries
   '';
 
-  meta = {
+  meta = with lib; {
     description = "Mod manager for Kerbal Space Program";
     homepage = "https://github.com/KSP-CKAN/CKAN";
-    license = stdenv.lib.licenses.mit;
-    maintainers = [ stdenv.lib.maintainers.Baughn ];
-    platforms = stdenv.lib.platforms.all;
-  };    
+    license = licenses.mit;
+    maintainers = with maintainers; [ Baughn ymarkus ];
+    platforms = platforms.all;
+  };
 }
diff --git a/pkgs/games/clonehero/default.nix b/pkgs/games/clonehero/default.nix
new file mode 100644
index 00000000000..cf1fad8d945
--- /dev/null
+++ b/pkgs/games/clonehero/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, alsa-lib
+, gtk2
+, libXrandr
+, libXScrnSaver
+, udev
+, zlib
+}:
+
+let
+  name = "clonehero";
+in
+stdenv.mkDerivation rec {
+  pname = "${name}-unwrapped";
+  version = "0.23.2.2";
+
+  src = fetchurl {
+    url = "http://dl.clonehero.net/${name}-v${lib.removePrefix "0" version}/${name}-linux.tar.gz";
+    sha256 = "0k9jcnd55yhr42gj8cmysd18yldp4k3cpk4z884p2ww03fyfq7mi";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [ autoPatchelfHook ];
+
+  buildInputs = [
+    # Load-time libraries (loaded from DT_NEEDED section in ELF binary)
+    gtk2
+    stdenv.cc.cc.lib
+    zlib
+
+    # Run-time libraries (loaded with dlopen)
+    alsa-lib # ALSA sound
+    libXrandr # X11 resolution detection
+    libXScrnSaver # X11 screensaver prevention
+    udev # udev input drivers
+  ];
+
+  installPhase = ''
+    mkdir -p "$out/bin" "$out/share"
+    install -Dm755 ${name} "$out/bin"
+    cp -r clonehero_Data "$out/share"
+
+    mkdir -p "$doc/share/${name}"
+    cp README.txt "$doc/share/${name}"
+  '';
+
+  # Patch required run-time libraries as load-time libraries
+  #
+  # Libraries found with:
+  # > strings clonehero | grep '\.so'
+  # and
+  # > strace clonehero 2>&1 | grep '\.so'
+  postFixup = ''
+    patchelf \
+      --add-needed libasound.so.2 \
+      --add-needed libudev.so.1 \
+      --add-needed libXrandr.so.2 \
+      --add-needed libXss.so.1 \
+      "$out/bin/${name}"
+  '';
+
+  meta = with lib; {
+    description = "Clone of Guitar Hero and Rockband-style games";
+    homepage = "https://clonehero.net";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ kira-bruneau ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/games/clonehero/fhs-wrapper.nix b/pkgs/games/clonehero/fhs-wrapper.nix
new file mode 100644
index 00000000000..97758b2c1fa
--- /dev/null
+++ b/pkgs/games/clonehero/fhs-wrapper.nix
@@ -0,0 +1,39 @@
+{ clonehero-unwrapped
+, makeDesktopItem
+, buildFHSUserEnv
+, liberation_ttf
+, callPackage
+}:
+
+let
+  name = "clonehero";
+  desktopName = "Clone Hero";
+  desktopItem = makeDesktopItem {
+    inherit name desktopName;
+    comment = clonehero-unwrapped.meta.description;
+    exec = name;
+    icon = name;
+    categories = "Game;";
+  };
+in
+buildFHSUserEnv {
+  inherit name;
+  inherit (clonehero-unwrapped) meta;
+
+  # Clone Hero has /usr/share/fonts hard-coded in its binary for looking up fonts.
+  # This workaround is necessary for rendering text on the keybinding screen (and possibly elsewhere)
+  # If a better solution is found, the FHS environment can be removed.
+  extraBuildCommands = ''
+    chmod +w usr/share
+    mkdir -p usr/share/fonts/truetype
+    ln -s ${liberation_ttf}/share/fonts/truetype/* usr/share/fonts/truetype
+  '';
+
+  extraInstallCommands = ''
+    mkdir -p "$out/share/applications" "$out/share/pixmaps"
+    cp ${desktopItem}/share/applications/* "$out/share/applications"
+    ln -s ${clonehero-unwrapped}/share/clonehero_Data/Resources/UnityPlayer.png "$out/share/pixmaps/${name}.png"
+  '';
+
+  runScript = callPackage ./xdg-wrapper.nix { };
+}
diff --git a/pkgs/games/clonehero/xdg-wrapper.nix b/pkgs/games/clonehero/xdg-wrapper.nix
new file mode 100644
index 00000000000..2890e469db0
--- /dev/null
+++ b/pkgs/games/clonehero/xdg-wrapper.nix
@@ -0,0 +1,21 @@
+{ stdenv, clonehero-unwrapped, writeScript }:
+
+# Clone Hero doesn't have an installer, so it just stores configuration & data relative to the binary.
+# This wrapper works around that limitation, storing game configuration & data in XDG_CONFIG_HOME.
+let
+  name = "clonehero";
+  desktopName = "Clone Hero";
+in
+writeScript "${name}-xdg-wrapper-${clonehero-unwrapped.version}" ''
+  #!${stdenv.shell} -e
+  configDir="''${XDG_CONFIG_HOME:-$HOME/.config}/unity3d/srylain Inc_/${desktopName}"
+  mkdir -p "$configDir"
+
+  # Force link shipped clonehero_Data, unless directory already exists (to allow modding)
+  if [ ! -d "$configDir/clonehero_Data" ] || [ -L "$configDir/clonehero_Data" ]; then
+    ln -snf ${clonehero-unwrapped}/share/clonehero_Data "$configDir"
+  fi
+
+  # Fake argv[0] to emulate running in the config directory
+  exec -a "$configDir/${name}" ${clonehero-unwrapped}/bin/${name} "$@"
+''
diff --git a/pkgs/games/cockatrice/default.nix b/pkgs/games/cockatrice/default.nix
index 9d07d09e27b..1388d830a9e 100644
--- a/pkgs/games/cockatrice/default.nix
+++ b/pkgs/games/cockatrice/default.nix
@@ -1,29 +1,29 @@
-{ stdenv, fetchFromGitHub, mkDerivation, cmake, protobuf
+{ lib, fetchFromGitHub, mkDerivation, cmake, protobuf
 , qtbase, qtmultimedia, qttools, qtwebsockets, wrapQtAppsHook
 }:
 
 mkDerivation rec {
   pname = "cockatrice";
-  version = "2020-03-20-Release-2.7.4";
+  version = "2021-02-03-Development-2.8.1-beta";
 
   src = fetchFromGitHub {
     owner = "Cockatrice";
     repo = "Cockatrice";
-    rev = "${version}";
-    sha256 = "1d229gswfcqxch19wb744d9h897qwzf2y9imwrbcwnlhpbr1j62k";
+    rev = version;
+    sha256 = "0g1d7zq4lh4jf08mvvgp6m2r2gdvy4y1mhf46c0s8607h2l8vavh";
   };
 
   buildInputs = [
-    cmake qtbase qtmultimedia protobuf qttools qtwebsockets
+     qtbase qtmultimedia protobuf qttools qtwebsockets
   ];
 
-  nativeBuildInputs = [ wrapQtAppsHook ];
+  nativeBuildInputs = [ cmake wrapQtAppsHook ];
 
   meta = {
     homepage = "https://github.com/Cockatrice/Cockatrice";
     description = "A cross-platform virtual tabletop for multiplayer card games";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [ evanjs ];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ evanjs ];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/colobot/data.nix b/pkgs/games/colobot/data.nix
new file mode 100644
index 00000000000..7ae9dbb2b5e
--- /dev/null
+++ b/pkgs/games/colobot/data.nix
@@ -0,0 +1,41 @@
+{ stdenv, lib, fetchFromGitHub, cmake
+, gettext, vorbis-tools
+, xmlstarlet, doxygen, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "colobot-data";
+  version = "0.1.12-alpha";
+
+  src = fetchFromGitHub {
+    owner = "colobot";
+    repo = "colobot-data";
+    rev = "colobot-gold-${version}";
+    sha256 = "1vm33s52ymwd03x24i9bqiglw5v3wgd7rlzyx9r5ww0nnqzwbwi6";
+  };
+
+  nativeBuildInputs = [ cmake vorbis-tools xmlstarlet doxygen python3 ];
+  buildInputs = [ gettext ];
+
+  enableParallelBuilding = false;
+  # Build procedure requires the data folder
+  patchPhase = ''
+    cp -r $src localSrc
+    chmod +w localSrc/help/bots/po
+    find -type d -exec chmod +w {} \;
+    for po in localSrc/help/{bots,cbot,object,generic,programs}/po/* localSrc/levels/*{/*/*,}/po/*; do
+      rm $po
+      touch $po
+    done
+    # skip music
+    rm localSrc/music/CMakeLists.txt
+    cd localSrc
+  '';
+
+  meta = with lib; {
+    homepage = "https://colobot.info/";
+    description = "Game data for colobot";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ freezeboy ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/colobot/default.nix b/pkgs/games/colobot/default.nix
new file mode 100644
index 00000000000..b26244ccc5f
--- /dev/null
+++ b/pkgs/games/colobot/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, cmake, boost, SDL2, SDL2_image, SDL2_ttf, libpng
+, glew, gettext, libsndfile, libvorbis, libogg, physfs, openal
+, xmlstarlet, doxygen, python3, callPackage }:
+
+let
+  colobot-data = callPackage ./data.nix {};
+in
+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";
+
+  src = fetchFromGitHub {
+    owner = "colobot";
+    repo = "colobot";
+    rev = "colobot-gold-${version}";
+    sha256 = "0viq5s4zqs33an7rdmc3anf74ml7mwwcwf60alhvp9hj5jr547s2";
+  };
+
+  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 ];
+
+  enableParallelBuilding = false;
+
+  # The binary ends in games directoy
+  postInstall = ''
+    mv $out/games $out/bin
+    for contents in ${colobot-data}/share/games/colobot/*; do
+      ln -s $contents $out/share/games/colobot
+    done
+  '';
+
+  meta = with lib; {
+    homepage = "https://colobot.info/";
+    description = "Colobot: Gold Edition is a real-time strategy game, where you can program your bots";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ freezeboy ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/commandergenius/default.nix b/pkgs/games/commandergenius/default.nix
index 251ea852cf1..725cc5231c7 100644
--- a/pkgs/games/commandergenius/default.nix
+++ b/pkgs/games/commandergenius/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitLab, SDL2, SDL2_image, pkgconfig
+{ lib, stdenv, fetchFromGitLab, SDL2, SDL2_image, pkg-config
 , libvorbis, libGL, boost, cmake, zlib, curl, SDL2_mixer, python3
 }:
 
@@ -20,14 +20,14 @@ stdenv.mkDerivation rec {
     export makeFlags="$makeFlags DESTDIR=$(out)"
   '';
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
 
   postPatch = ''
     NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(sdl2-config --cflags)"
     sed -i 's,APPDIR games,APPDIR bin,' src/install.cmake
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Modern Interpreter for the Commander Keen Games";
     longDescription = ''
       Commander Genius is an open-source clone of
diff --git a/pkgs/games/construo/default.nix b/pkgs/games/construo/default.nix
index 815c2f3fab4..2565d8599a5 100644
--- a/pkgs/games/construo/default.nix
+++ b/pkgs/games/construo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
 , libX11
 , zlib
@@ -18,9 +18,9 @@ stdenv.mkDerivation rec {
   };
 
   buildInputs = [ libX11 zlib xorgproto ]
-    ++ stdenv.lib.optional (libGL != null) libGL
-    ++ stdenv.lib.optional (libGLU != null) libGLU
-    ++ stdenv.lib.optional (freeglut != null) freeglut;
+    ++ lib.optional (libGL != null) libGL
+    ++ lib.optional (libGLU != null) libGLU
+    ++ lib.optional (freeglut != null) freeglut;
 
   preConfigure = ''
     substituteInPlace src/Makefile.in \
@@ -30,6 +30,6 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Masses and springs simulation game";
     homepage = "http://fs.fsf.org/construo/";
-    license = stdenv.lib.licenses.gpl3;
+    license = lib.licenses.gpl3;
   };
 }
diff --git a/pkgs/games/crack-attack/default.nix b/pkgs/games/crack-attack/default.nix
index 05c829441ad..fb13ce8c163 100644
--- a/pkgs/games/crack-attack/default.nix
+++ b/pkgs/games/crack-attack/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, pkgconfig, gtk2, freeglut, SDL, SDL_mixer, libGLU, libGL, libXi, libXmu }:
+{ lib, stdenv, fetchurl, pkg-config, gtk2, freeglut, SDL, SDL_mixer, libGLU, libGL, libXi, libXmu }:
 
-stdenv.mkDerivation {
-  name = "crack-attack-1.1.14";
+stdenv.mkDerivation rec {
+  pname = "crack-attack";
+  version = "1.1.14";
 
   src = fetchurl {
-    url = "mirror://savannah/crack-attack/crack-attack-1.1.14.tar.gz";
+    url = "mirror://savannah/crack-attack/crack-attack-${version}.tar.gz";
     sha256 = "1sakj9a2q05brpd7lkqxi8q30bccycdzd96ns00s6jbxrzjlijkm";
   };
 
@@ -19,7 +20,7 @@ stdenv.mkDerivation {
     "--datadir=${placeholder "out"}/share"
   ];
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ gtk2 freeglut SDL SDL_mixer libGLU libGL libXi libXmu ];
 
   hardeningDisable = [ "format" ];
@@ -28,8 +29,8 @@ stdenv.mkDerivation {
   meta = {
     description = "A fast-paced puzzle game inspired by the classic Super NES title Tetris Attack!";
     homepage = "https://www.nongnu.org/crack-attack/";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = [ stdenv.lib.maintainers.piotr ];
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+    maintainers = [ lib.maintainers.piotr ];
   };
 }
diff --git a/pkgs/games/crafty/default.nix b/pkgs/games/crafty/default.nix
index 191baa7e592..b5b53aa3c41 100644
--- a/pkgs/games/crafty/default.nix
+++ b/pkgs/games/crafty/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, unzip }:
+{ lib, stdenv, fetchurl, unzip }:
 
 stdenv.mkDerivation rec {
   pname = "crafty";
@@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
     sha256 = "12g70mgfifwssfvndzq94pin34dizlixhsga75vgj7dakysi2p7f";
   };
 
-  buildInputs = [ unzip ];
+  nativeBuildInputs = [ unzip ];
 
   unpackPhase = ''
     mkdir "craftysrc"
@@ -66,8 +66,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://www.craftychess.com/";
     description = "Chess program developed by Dr. Robert M. Hyatt";
-    license = stdenv.lib.licenses.unfree;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ stdenv.lib.maintainers.jwiegley ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.jwiegley ];
   };
 }
diff --git a/pkgs/games/crawl/crawl_purify.patch b/pkgs/games/crawl/crawl_purify.patch
index dda55b09f32..8650141744d 100644
--- a/pkgs/games/crawl/crawl_purify.patch
+++ b/pkgs/games/crawl/crawl_purify.patch
@@ -1,20 +1,5 @@
-diff --git a/crawl-ref/source/Makefile b/crawl-ref/source/Makefile
---- a/crawl-ref/source/Makefile
-+++ b/crawl-ref/source/Makefile
-@@ -248,9 +248,9 @@ ifeq ($(uname_S),Darwin)
- 	STRIP := strip -x
- 	NEED_APPKIT = YesPlease
- 	LIBNCURSES_IS_UNICODE = Yes
--	NO_PKGCONFIG = Yes
--	BUILD_SQLITE = YesPlease
--	BUILD_ZLIB = YesPlease
-+	#NO_PKGCONFIG = Yes
-+	#BUILD_SQLITE = YesPlease
-+	#BUILD_ZLIB = YesPlease
- 	ifdef TILES
- 		EXTRA_LIBS += -framework AppKit -framework AudioUnit -framework CoreAudio -framework ForceFeedback -framework Carbon -framework IOKit -framework OpenGL -framework AudioToolbox -framework CoreVideo contrib/install/$(ARCH)/lib/libSDL2main.a
- 		BUILD_FREETYPE = YesPlease
 diff --git a/crawl-ref/source/util/find_font b/crawl-ref/source/util/find_font
+index f8b576fd63..b95c21c0a1 100755
 --- a/crawl-ref/source/util/find_font
 +++ b/crawl-ref/source/util/find_font
 @@ -1,6 +1,6 @@
@@ -25,7 +10,7 @@ diff --git a/crawl-ref/source/util/find_font b/crawl-ref/source/util/find_font
  
  name=$1
  [ "$name" ] || { echo "Usage: $0 <fontname.ttf>" >&2; exit 100; }
-@@ -11,6 +11,6 @@
+@@ -11,6 +11,6 @@ name=$1
          for dir in $FONTDIRS; do
              [ -d "$dir" ] && echo "$dir"
          done
@@ -34,6 +19,7 @@ diff --git a/crawl-ref/source/util/find_font b/crawl-ref/source/util/find_font
        | head -n1
  } 2>/dev/null
 diff --git a/crawl-ref/source/windowmanager-sdl.cc b/crawl-ref/source/windowmanager-sdl.cc
+index e29ccff507..9bf01e040a 100644
 --- a/crawl-ref/source/windowmanager-sdl.cc
 +++ b/crawl-ref/source/windowmanager-sdl.cc
 @@ -20,7 +20,7 @@
diff --git a/pkgs/games/crawl/default.nix b/pkgs/games/crawl/default.nix
index eeb8bd7f9db..11ac23fcef3 100644
--- a/pkgs/games/crawl/default.nix
+++ b/pkgs/games/crawl/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, lib, fetchFromGitHub, fetchpatch, which, sqlite, lua5_1, perl, python3, zlib, pkgconfig, ncurses
+{ stdenv, lib, fetchFromGitHub, fetchpatch, which, sqlite, lua5_1, perl, python3, zlib, pkg-config, ncurses
 , dejavu_fonts, libpng, SDL2, SDL2_image, SDL2_mixer, libGLU, libGL, freetype, pngcrush, advancecomp
-, tileMode ? false, enableSound ? tileMode
+, tileMode ? false, enableSound ? tileMode, buildPackages
 
 # MacOS / Darwin builds
 , darwin ? null
@@ -8,19 +8,19 @@
 
 stdenv.mkDerivation rec {
   name = "crawl-${version}${lib.optionalString tileMode "-tiles"}";
-  version = "0.25.0";
+  version = "0.26.1";
 
   src = fetchFromGitHub {
     owner = "crawl";
     repo = "crawl";
     rev = version;
-    sha256 = "0swcl8cxz64yw8dl9macz8ar1ccwrkwz89j7s1f60inb5jlxifqm";
+    sha256 = "sha256-lh0lCMZRH+c6jSHjLFDU3wjy6Oyp59ZcPaqg5PWVrkk=";
   };
 
   # Patch hard-coded paths and remove force library builds
   patches = [ ./crawl_purify.patch ];
 
-  nativeBuildInputs = [ pkgconfig which perl pngcrush advancecomp ];
+  nativeBuildInputs = [ pkg-config which perl pngcrush advancecomp ];
 
   # Still unstable with luajit
   buildInputs = [ lua5_1 zlib sqlite ncurses ]
@@ -44,7 +44,8 @@ stdenv.mkDerivation rec {
 
   fontsPath = lib.optionalString tileMode dejavu_fonts;
 
-  makeFlags = [ "prefix=${placeholder "out"}" "FORCE_CC=cc" "FORCE_CXX=c++" "HOSTCXX=c++"
+  makeFlags = [ "prefix=${placeholder "out"}" "FORCE_CC=${stdenv.cc.targetPrefix}cc" "FORCE_CXX=${stdenv.cc.targetPrefix}c++" "HOSTCXX=${buildPackages.stdenv.cc.targetPrefix}c++"
+                "FORCE_PKGCONFIG=y"
                 "SAVEDIR=~/.crawl" "sqlite=${sqlite.dev}"
                 "DATADIR=${placeholder "out"}"
               ] ++ lib.optional tileMode "TILES=y"
@@ -60,7 +61,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Open-source, single-player, role-playing roguelike game";
     homepage = "http://crawl.develz.org/";
     longDescription = ''
diff --git a/pkgs/games/crispy-doom/default.nix b/pkgs/games/crispy-doom/default.nix
index 5bd6e714e42..04c0868510f 100644
--- a/pkgs/games/crispy-doom/default.nix
+++ b/pkgs/games/crispy-doom/default.nix
@@ -1,36 +1,27 @@
-{ stdenv, autoreconfHook, pkgconfig, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub, fetchpatch }:
+{ lib, stdenv, autoreconfHook, pkg-config, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub, python2 }:
 
 stdenv.mkDerivation rec {
   pname = "crispy-doom";
-  version = "5.8.0";
+  version = "5.10.1";
 
   src = fetchFromGitHub {
     owner = "fabiangreffrath";
     repo = pname;
     rev = "${pname}-${version}";
-    sha256 = "1b6gn0dysv631jynh769whww9xcss1gms78sz3nrn855q1dsvcb4";
+    sha256 = "sha256-5doytVxemqaXWXiqDSQUEAe71xmY0pOLASj/NJNyM5g=";
   };
 
-  patches = [
-    # Fixes CVE-2020-14983
-    (fetchpatch {
-      url = "https://github.com/chocolate-doom/chocolate-doom/commit/f1a8d991aa8a14afcb605cf2f65cd15fda204c56.diff";
-      sha256 = "1z6pxg9azcqq7g09hjc09d01knd803nhqilkw2kbx8648hil9mgn";
-    })
-    (fetchpatch {
-      url = "https://github.com/chocolate-doom/chocolate-doom/commit/54fb12eeaa7d527defbe65e7e00e37d5feb7c597.diff";
-      sha256 = "0ww21jn02ld73rkp06f7fqy92jqv8c9q4d1mvsryag1gmvy57znj";
-    })
-  ];
-
   postPatch = ''
     sed -e 's#/games#/bin#g' -i src{,/setup}/Makefile.am
+    for script in $(grep -lr '^#!/usr/bin/env python$'); do patchShebangs $script; done
   '';
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig ];
+  nativeBuildInputs = [ autoreconfHook pkg-config python2 ];
   buildInputs = [ SDL2 SDL2_mixer SDL2_net ];
   enableParallelBuilding = true;
 
+  strictDeps = true;
+
   meta = {
     homepage = "http://fabiangreffrath.github.io/crispy-doom";
     description = "A limit-removing enhanced-resolution Doom source port based on Chocolate Doom";
@@ -38,8 +29,8 @@ stdenv.mkDerivation rec {
       Crispy Doom is a limit-removing enhanced-resolution Doom source port based on Chocolate Doom.
       Its name means that 640x400 looks \"crisp\" and is also a slight reference to its origin.
     '';
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = with stdenv.lib.maintainers; [ neonfuz ];
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ neonfuz ];
   };
 }
diff --git a/pkgs/games/crrcsim/default.nix b/pkgs/games/crrcsim/default.nix
index e57d6bcab06..741f402870a 100644
--- a/pkgs/games/crrcsim/default.nix
+++ b/pkgs/games/crrcsim/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libGLU, libGL, SDL, SDL_mixer, plib, libjpeg }:
+{ lib, stdenv, fetchurl, libGLU, libGL, SDL, SDL_mixer, plib, libjpeg }:
 let
   version = "0.9.13";
 in
@@ -21,8 +21,8 @@ stdenv.mkDerivation rec {
 
   meta = {
     description = "A model-airplane flight simulator";
-    maintainers = with stdenv.lib.maintainers; [ raskin ];
+    maintainers = with lib.maintainers; [ raskin ];
     platforms = [ "i686-linux" "x86_64-linux" ];
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
   };
 }
diff --git a/pkgs/games/curseofwar/default.nix b/pkgs/games/curseofwar/default.nix
index 9aff3798b6b..6271a60f5b9 100644
--- a/pkgs/games/curseofwar/default.nix
+++ b/pkgs/games/curseofwar/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , ncurses
 , SDL
@@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
     "CC=${stdenv.cc.targetPrefix}cc"
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A fast-paced action strategy game";
     homepage = "https://a-nikolaev.github.io/curseofwar/";
     license = licenses.gpl3;
diff --git a/pkgs/games/cutemaze/default.nix b/pkgs/games/cutemaze/default.nix
index a293989d5e6..44c48af5c29 100644
--- a/pkgs/games/cutemaze/default.nix
+++ b/pkgs/games/cutemaze/default.nix
@@ -1,24 +1,24 @@
-{ stdenv, fetchurl, qmake, qttools, qtsvg, mkDerivation }:
+{ lib, stdenv, fetchurl, qmake, qttools, qtsvg, mkDerivation }:
 
 mkDerivation rec {
   pname = "cutemaze";
-  version = "1.2.6";
+  version = "1.3.0";
 
   src = fetchurl {
     url = "https://gottcode.org/cutemaze/${pname}-${version}-src.tar.bz2";
-    sha256 = "0pw31j2i3ifndikhz9w684ia00r8zvcgnb66ign9w4lgs1zjgcrw";
+    sha256 = "sha256-h7+H2E37ZVSnlPa6ID+lNEvFtU5PfdMSlBjqBumojoU=";
   };
 
   nativeBuildInputs = [ qmake qttools ];
 
   buildInputs = [ qtsvg ];
 
-  postInstall = stdenv.lib.optionalString stdenv.isDarwin ''
+  postInstall = lib.optionalString stdenv.isDarwin ''
     mkdir -p $out/Applications
     mv CuteMaze.app $out/Applications
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://gottcode.org/cutemaze/";
     description = "Simple, top-down game in which mazes are randomly generated";
     license = licenses.gpl3Plus;
diff --git a/pkgs/games/cuyo/default.nix b/pkgs/games/cuyo/default.nix
index 72c55fc1811..871812e097a 100644
--- a/pkgs/games/cuyo/default.nix
+++ b/pkgs/games/cuyo/default.nix
@@ -1,21 +1,21 @@
-{ stdenv, fetchurl, SDL, SDL_mixer, zlib }:
+{ lib, stdenv, fetchurl, SDL, SDL_mixer, zlib }:
 
 stdenv.mkDerivation {
   pname = "cuyo";
   version = "2.1.0";
-  
+
   src = fetchurl {
      url = "https://download.savannah.gnu.org/releases/cuyo/cuyo-2.1.0.tar.gz";
      sha256 = "17yqv924x7yvwix7yz9jdhgyar8lzdhqvmpvv0any8rdkajhj23c";
      };
 
   buildInputs = [ SDL SDL_mixer zlib ];
-     
+
   meta = {
      homepage = "http://karimmi.de/cuyo";
      description = "Stacking blocks game, with different rules for each level";
-     license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+     license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
-  
+
 }
diff --git a/pkgs/games/devilutionx/default.nix b/pkgs/games/devilutionx/default.nix
index 69d7e3ca666..fa457b1f1bc 100644
--- a/pkgs/games/devilutionx/default.nix
+++ b/pkgs/games/devilutionx/default.nix
@@ -1,20 +1,30 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, SDL2_ttf, libsodium, pkg-config }:
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, SDL2_ttf, libsodium, pkg-config }:
+
 stdenv.mkDerivation rec {
-  version = "1.0.1";
   pname = "devilutionx";
+  version = "1.2.1";
 
   src = fetchFromGitHub {
     owner = "diasurgical";
     repo = "devilutionX";
     rev = version;
-    sha256 = "1jvjlch9ql5s5jx9g5y5pkc2xn62199qylsmzpqzx1jc3k2vmw5i";
+    sha256 = "sha256-PgYlNO1p78d0uiL474bDJOL++SxJfeBLK65czdaylHU=";
   };
 
+  postPatch = ''
+    substituteInPlace Source/init.cpp --replace "/usr/share/diasurgical/devilutionx/" "${placeholder "out"}/share/diasurgical/devilutionx/"
+  '';
+
   NIX_CFLAGS_COMPILE = [
     "-I${SDL2_ttf}/include/SDL2"
     ''-DTTF_FONT_PATH="${placeholder "out"}/share/fonts/truetype/CharisSILB.ttf"''
   ];
 
+  cmakeFlags = [
+    "-DBINARY_RELEASE=ON"
+    "-DVERSION_NUM=${version}"
+  ];
+
   nativeBuildInputs = [ pkg-config cmake ];
   buildInputs = [ libsodium SDL2 SDL2_mixer SDL2_ttf ];
 
@@ -27,6 +37,7 @@ stdenv.mkDerivation rec {
   '' else ''
     install -Dm755 -t $out/bin devilutionx
     install -Dt $out/share/fonts/truetype ../Packaging/resources/CharisSILB.ttf
+    install -Dt $out/share/diasurgical/devilutionx ../Packaging/resources/devilutionx.mpq
 
     # TODO: icons and .desktop (see Packages/{debian,fedora}/*)
   '') + ''
@@ -34,12 +45,12 @@ stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/diasurgical/devilutionX";
     description = "Diablo build for modern operating systems";
     longDescription = "In order to play this game a copy of diabdat.mpq is required. Place a copy of diabdat.mpq in ~/.local/share/diasurgical/devilution before executing the game.";
     license = licenses.unlicense;
     maintainers = [ maintainers.karolchmist ];
-    platforms = platforms.linux ++ platforms.darwin ++ platforms.windows;
+    platforms = platforms.linux ++ platforms.windows;
   };
 }
diff --git a/pkgs/games/dhewm3/default.nix b/pkgs/games/dhewm3/default.nix
index 1735c4380f2..b5caa603eaf 100644
--- a/pkgs/games/dhewm3/default.nix
+++ b/pkgs/games/dhewm3/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, libGLU, libGL, zlib, libjpeg, libogg, libvorbis
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, libGLU, libGL, zlib, libjpeg, libogg, libvorbis
 , openal, curl }:
 
 stdenv.mkDerivation rec {
@@ -24,14 +24,12 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ cmake ];
   buildInputs = [ SDL2 libGLU libGL zlib libjpeg libogg libvorbis openal curl ];
 
-  enableParallelBuilding = true;
-
   hardeningDisable = [ "format" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/dhewm/dhewm3";
     description = "Doom 3 port to SDL";
-    license = stdenv.lib.licenses.gpl3;
+    license = lib.licenses.gpl3;
     maintainers = with maintainers; [ MP2E ];
     platforms = with platforms; linux;
   };
diff --git a/pkgs/games/domination/default.nix b/pkgs/games/domination/default.nix
new file mode 100644
index 00000000000..2fc4f8d36cb
--- /dev/null
+++ b/pkgs/games/domination/default.nix
@@ -0,0 +1,93 @@
+{ lib, stdenv
+, fetchsvn
+# jdk8 is needed for building, but the game runs on newer jres as well
+, jdk8
+, jre
+, ant
+, makeWrapper
+, makeDesktopItem
+}:
+
+let
+  desktopItem = makeDesktopItem {
+    type = "Application";
+    name = "Domination";
+    desktopName = "Domination";
+    exec = "domination";
+    icon = "domination";
+  };
+  editorDesktopItem = makeDesktopItem {
+    type = "Application";
+    name = "Domination Map Editor";
+    desktopName = "Domination Map Editor";
+    exec = "domination-map-editor";
+    icon = "domination";
+  };
+
+in stdenv.mkDerivation {
+  pname = "domination";
+  version = "1.2.3";
+
+  # The .zip releases do not contain the build.xml file
+  src = fetchsvn {
+    url = "https://svn.code.sf.net/p/domination/code/Domination";
+    # There are no tags in the repository.
+    # Look for commits like "new version x.y.z info on website"
+    # or "website update for x.y.z".
+    rev = "1964";
+    sha256 = "0718gns8d69a1dfq3ywc9kddl1khnrmxqyal7brckbjgay8dq42f";
+  };
+
+  nativeBuildInputs = [
+    jdk8
+    ant
+    makeWrapper
+  ];
+
+  buildPhase = "ant";
+
+  installPhase = ''
+    # Remove unnecessary files and launchers (they'd need to be wrapped anyway)
+    rm -r \
+      build/game/src.zip \
+      build/game/*.sh \
+      build/game/*.cmd \
+      build/game/*.exe \
+      build/game/*.app
+
+    mkdir -p $out/share/domination
+    cp -r build/game/* $out/share/domination/
+
+    # Reimplement the two launchers mentioned in Unix_shortcutSpec.xml with makeWrapper
+    mkdir -p $out/bin
+    makeWrapper ${jre}/bin/java $out/bin/domination \
+      --run "cd $out/share/domination" \
+      --add-flags "-jar $out/share/domination/Domination.jar"
+    makeWrapper ${jre}/bin/java $out/bin/domination-map-editor \
+      --run "cd $out/share/domination" \
+      --add-flags "-cp $out/share/domination/Domination.jar net.yura.domination.ui.swinggui.SwingGUIFrame"
+
+    install -Dm644 \
+      ${desktopItem}/share/applications/Domination.desktop \
+      $out/share/applications/Domination.desktop
+    install -Dm644 \
+      "${editorDesktopItem}/share/applications/Domination Map Editor.desktop" \
+      "$out/share/applications/Domination Map Editor.desktop"
+    install -Dm644 build/game/resources/icon.png $out/share/pixmaps/domination.png
+  '';
+
+  meta = with lib; {
+    homepage = "http://domination.sourceforge.net/";
+    downloadPage = "http://domination.sourceforge.net/download.shtml";
+    description = "A game that is a bit like the board game Risk or RisiKo";
+    longDescription = ''
+      Domination is a game that is a bit like the well known board game of Risk
+      or RisiKo. It has many game options and includes many maps.
+      It includes a map editor, a simple map format, multiplayer network play,
+      single player, hotseat, 5 user interfaces and many more features.
+    '';
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/duckmarines/default.nix b/pkgs/games/duckmarines/default.nix
index 7af31c606a9..ca2a7439141 100644
--- a/pkgs/games/duckmarines/default.nix
+++ b/pkgs/games/duckmarines/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
 
-let
+stdenv.mkDerivation rec {
   pname = "duckmarines";
   version = "1.0c";
 
@@ -19,11 +19,6 @@ let
     categories = "Game;";
   };
 
-in
-
-stdenv.mkDerivation rec {
-  name = "${pname}-${version}";
-
   src = fetchurl {
     url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-1.0c.love";
     sha256 = "1rvgpkvi4h9zhc4fwb4knhsa789yjcx4a14fi4vqfdyybhvg5sh9";
@@ -48,7 +43,7 @@ stdenv.mkDerivation rec {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Duck-themed action puzzle video game";
     maintainers = with maintainers; [ leenaars ];
     platforms = platforms.linux;
diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix
index 0664af117e1..7fd3dc61dd4 100644
--- a/pkgs/games/dwarf-fortress/default.nix
+++ b/pkgs/games/dwarf-fortress/default.nix
@@ -1,4 +1,4 @@
-{ pkgs, stdenv, stdenvNoCC, gccStdenv, lib, recurseIntoAttrs }:
+{ stdenv, stdenvNoCC, gccStdenv, lib, recurseIntoAttrs, libsForQt5, newScope, texlive, perlPackages, jdk8, jre8 }:
 
 # To whomever it may concern:
 #
@@ -35,59 +35,64 @@
 with lib;
 
 let
-  callPackage = pkgs.newScope self;
+  callPackage = newScope self;
 
   # The latest Dwarf Fortress version. Maintainers: when a new version comes
   # out, ensure that (unfuck|dfhack|twbt) are all up to date before changing
   # this.
-  latestVersion = "0.47.04";
+  latestVersion = "0.47.05";
 
   # Converts a version to a package name.
   versionToName = version: "dwarf-fortress_${lib.replaceStrings ["."] ["_"] version}";
 
-  dwarf-therapist-original = pkgs.qt5.callPackage ./dwarf-therapist {
-    texlive = pkgs.texlive.combine {
-      inherit (pkgs.texlive) scheme-basic float caption wrapfig adjmulticol sidecap preprint enumitem;
+  dwarf-therapist-original = libsForQt5.callPackage ./dwarf-therapist {
+    texlive = texlive.combine {
+      inherit (texlive) scheme-basic float caption wrapfig adjmulticol sidecap preprint enumitem;
     };
   };
 
   # A map of names to each Dwarf Fortress package we know about.
-  df-games = lib.listToAttrs (map (dfVersion: {
-    name = versionToName dfVersion;
-    value =
-      let
-        # I can't believe this syntax works. Spikes of Nix code indeed...
-        dwarf-fortress = callPackage ./game.nix {
-          inherit dfVersion;
-          inherit dwarf-fortress-unfuck;
+  df-games = lib.listToAttrs (map
+    (dfVersion: {
+      name = versionToName dfVersion;
+      value =
+        let
+          # I can't believe this syntax works. Spikes of Nix code indeed...
+          dwarf-fortress = callPackage ./game.nix {
+            inherit dfVersion;
+            inherit dwarf-fortress-unfuck;
+          };
+
+          # unfuck is linux-only right now, we will only use it there.
+          dwarf-fortress-unfuck =
+            if stdenv.isLinux then callPackage ./unfuck.nix { inherit dfVersion; }
+            else null;
+
+          twbt = callPackage ./twbt { inherit dfVersion; };
+
+          dfhack = callPackage ./dfhack {
+            inherit (perlPackages) XMLLibXML XMLLibXSLT;
+            inherit dfVersion twbt;
+            stdenv = gccStdenv;
+          };
+
+          dwarf-therapist = libsForQt5.callPackage ./dwarf-therapist/wrapper.nix {
+            inherit dwarf-fortress;
+            dwarf-therapist = dwarf-therapist-original;
+          };
+        in
+        callPackage ./wrapper {
+          inherit (self) themes;
+
+          dwarf-fortress = dwarf-fortress;
+          twbt = twbt;
+          dfhack = dfhack;
+          dwarf-therapist = dwarf-therapist;
+
+          jdk = jdk8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
         };
-
-        # unfuck is linux-only right now, we will only use it there.
-        dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { inherit dfVersion; }
-                                else null;
-
-        twbt = callPackage ./twbt { inherit dfVersion; };
-
-        dfhack = callPackage ./dfhack {
-          inherit (pkgs.perlPackages) XMLLibXML XMLLibXSLT;
-          inherit dfVersion twbt;
-          stdenv = gccStdenv;
-        };
-
-        dwarf-therapist = callPackage ./dwarf-therapist/wrapper.nix {
-          inherit dwarf-fortress;
-          dwarf-therapist = dwarf-therapist-original;
-        };
-      in
-      callPackage ./wrapper {
-        inherit (self) themes;
-
-        dwarf-fortress = dwarf-fortress;
-        twbt = twbt;
-        dfhack = dfhack;
-        dwarf-therapist = dwarf-therapist;
-      };
-  }) (lib.attrNames self.df-hashes));
+    })
+    (lib.attrNames self.df-hashes));
 
   self = rec {
     df-hashes = builtins.fromJSON (builtins.readFile ./game.json);
@@ -104,7 +109,9 @@ let
 
     soundSense = callPackage ./soundsense.nix { };
 
-    legends-browser = callPackage ./legends-browser {};
+    legends-browser = callPackage ./legends-browser {
+      jre = jre8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
+    };
 
     themes = recurseIntoAttrs (callPackage ./themes {
       stdenv = stdenvNoCC;
@@ -115,4 +122,5 @@ let
     cla-theme = themes.cla;
   };
 
-in self // df-games
+in
+self // df-games
diff --git a/pkgs/games/dwarf-fortress/dfhack/default.nix b/pkgs/games/dwarf-fortress/dfhack/default.nix
index 11c21b82c29..80fa1de18e4 100644
--- a/pkgs/games/dwarf-fortress/dfhack/default.nix
+++ b/pkgs/games/dwarf-fortress/dfhack/default.nix
@@ -1,7 +1,20 @@
-{ stdenv, buildEnv, lib, fetchFromGitHub, cmake, writeScriptBin
-, perl, XMLLibXML, XMLLibXSLT, zlib, ruby
-, enableStoneSense ? false,  allegro5, libGLU, libGL
-, enableTWBT ? true, twbt
+{ stdenv
+, buildEnv
+, lib
+, fetchFromGitHub
+, cmake
+, writeScriptBin
+, perl
+, XMLLibXML
+, XMLLibXSLT
+, zlib
+, ruby
+, enableStoneSense ? false
+, allegro5
+, libGLU
+, libGL
+, enableTWBT ? true
+, twbt
 , SDL
 , dfVersion
 }:
@@ -58,11 +71,19 @@ let
       xmlRev = "036b662a1bbc96b4911f3cbe74dfa1243b6459bc";
       prerelease = false;
     };
+    "0.47.05" = {
+      dfHackRelease = "0.47.05-r1";
+      sha256 = "sha256-B0iv7fpIcnaO8sx9wPqI7/WuyLK15p8UYlYIcF5F5bw=";
+      xmlRev = "11c379ffd31255f2a1415d98106114a46245e1c3";
+      prerelease = false;
+    };
+
   };
 
-  release = if hasAttr dfVersion dfhack-releases
-            then getAttr dfVersion dfhack-releases
-            else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}";
+  release =
+    if hasAttr dfVersion dfhack-releases
+    then getAttr dfVersion dfhack-releases
+    else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}";
 
   version = release.dfHackRelease;
 
@@ -125,7 +146,7 @@ let
     nativeBuildInputs = [ cmake perl XMLLibXML XMLLibXSLT fakegit ];
     # We don't use system libraries because dfhack needs old C++ ABI.
     buildInputs = [ zlib SDL ]
-               ++ lib.optionals enableStoneSense [ allegro5 libGLU libGL ];
+      ++ lib.optionals enableStoneSense [ allegro5 libGLU libGL ];
 
     preConfigure = ''
       # Trick build system into believing we have .git
@@ -138,7 +159,7 @@ let
     '';
 
     cmakeFlags = [ "-DDFHACK_BUILD_ARCH=${arch}" "-DDOWNLOAD_RUBY=OFF" ]
-              ++ lib.optionals enableStoneSense [ "-DBUILD_STONESENSE=ON" "-DSTONESENSE_INTERNAL_SO=OFF" ];
+      ++ lib.optionals enableStoneSense [ "-DBUILD_STONESENSE=ON" "-DSTONESENSE_INTERNAL_SO=OFF" ];
 
     # dfhack expects an unversioned libruby.so to be present in the hack
     # subdirectory for ruby plugins to function.
@@ -146,7 +167,6 @@ let
       ln -s ${ruby}/lib/libruby-*.so $out/hack/libruby.so
     '';
 
-    enableParallelBuilding = true;
   };
 in
 
@@ -157,7 +177,7 @@ buildEnv {
 
   paths = [ dfhack ] ++ lib.optionals enableTWBT [ twbt.lib ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Memory hacking library for Dwarf Fortress and a set of tools that use it";
     homepage = "https://github.com/DFHack/dfhack/";
     license = licenses.zlib;
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix b/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix
index f5c093e1f16..ec765e71158 100644
--- a/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix
@@ -1,26 +1,36 @@
-{ stdenv, fetchFromGitHub, qtbase
-, qtdeclarative, cmake, texlive, ninja }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, qtbase
+, qtdeclarative
+, cmake
+, texlive
+, ninja
+}:
 
 stdenv.mkDerivation rec {
   pname = "dwarf-therapist";
-  version = "41.1.5";
+  version = "41.2.2";
 
   src = fetchFromGitHub {
     owner = "Dwarf-Therapist";
     repo = "Dwarf-Therapist";
     rev = "v${version}";
-    sha256 = "0w1mwwf49vdmvmdfvlkn4m0hzvlj111rpl8hv4rw6v8nv6yfb2y4";
+    sha256 = "sha256-zsEG68ioSw64UfmqlTLO1i5sObg8C4zxvdPxdQGMhhU=";
   };
 
   nativeBuildInputs = [ texlive cmake ninja ];
   buildInputs = [ qtbase qtdeclarative ];
 
-  installPhase = if stdenv.isDarwin then ''
-    mkdir -p $out/Applications
-    cp -r DwarfTherapist.app $out/Applications
-  '' else null;
+  installPhase =
+    if stdenv.isDarwin then ''
+      mkdir -p $out/Applications
+      cp -r DwarfTherapist.app $out/Applications
+    '' else null;
 
-  meta = with stdenv.lib; {
+  dontWrapQtApps = true;
+
+  meta = with lib; {
     description = "Tool to manage dwarves in a running game of Dwarf Fortress";
     maintainers = with maintainers; [ abbradar bendlas numinit jonringer ];
     license = licenses.mit;
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
index 77936c430e2..5ae0a35b5e2 100644
--- a/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
@@ -5,22 +5,21 @@
 install_dir="@install@"
 therapist_dir="@therapist@"
 
-cat <<EOF >&2
+@cat@ <<EOF >&2
 Using $DT_DIR as Dwarf Therapist overlay directory.
 EOF
 
 update_path() {
   local path="$1"
 
-  mkdir -p "$DT_DIR/$(dirname "$path")"
+  @mkdir@ -p "$DT_DIR/$(@dirname@ "$path")"
   if [ ! -e "$DT_DIR/$path" ] || [ -L "$DT_DIR/$path" ]; then
-    rm -f "$DT_DIR/$path"
-    ln -s "$install_dir/share/dwarftherapist/$path" "$DT_DIR/$path"
+    @rm@ -f "$DT_DIR/$path"
+    @ln@ -s "$install_dir/share/dwarftherapist/$path" "$DT_DIR/$path"
   fi
 }
 
 cd "$install_dir/share/dwarftherapist"
 update_path memory_layouts
 
-QT_QPA_PLATFORM_PLUGIN_PATH="@qt_plugin_path@" \
-  exec "$therapist_dir/bin/dwarftherapist" "$@"
+exec "$therapist_dir/bin/dwarftherapist" "$@"
diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
index 6871a611784..93f51df1819 100644
--- a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
+++ b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
@@ -1,33 +1,42 @@
-{ pkgs, stdenv, dwarf-therapist, dwarf-fortress, makeWrapper }:
+{ stdenv, dwarf-therapist, dwarf-fortress, substituteAll, coreutils, wrapQtAppsHook }:
 
 let
-  platformSlug = if stdenv.targetPlatform.is32bit then
-    "linux32" else "linux64";
+  platformSlug =
+    if stdenv.targetPlatform.is32bit then
+      "linux32" else "linux64";
   inifile = "linux/v0.${dwarf-fortress.baseVersion}.${dwarf-fortress.patchVersion}_${platformSlug}.ini";
 
 in
-  
+
 stdenv.mkDerivation {
   name = "dwarf-therapist-${dwarf-therapist.version}";
-  
-  wrapper = ./dwarf-therapist.in;
+
+  wrapper = substituteAll {
+    src = ./dwarf-therapist.in;
+    stdenv_shell = "${stdenv.shell}";
+    rm = "${coreutils}/bin/rm";
+    ln = "${coreutils}/bin/ln";
+    cat = "${coreutils}/bin/cat";
+    mkdir = "${coreutils}/bin/mkdir";
+    dirname = "${coreutils}/bin/dirname";
+    therapist = "${dwarf-therapist}";
+  };
 
   paths = [ dwarf-therapist ];
 
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ wrapQtAppsHook ];
 
   passthru = { inherit dwarf-fortress dwarf-therapist; };
 
   buildCommand = ''
     mkdir -p $out/bin
+
+    install -Dm755 $wrapper $out/bin/dwarftherapist
     ln -s $out/bin/dwarftherapist $out/bin/DwarfTherapist
-    substitute $wrapper $out/bin/dwarftherapist \
-      --subst-var-by stdenv_shell ${stdenv.shell} \
-      --subst-var-by install $out \
-      --subst-var-by therapist ${dwarf-therapist} \
-      --subst-var-by qt_plugin_path "${pkgs.qt5.qtbase}/lib/qt-${pkgs.qt5.qtbase.qtCompatVersion}/plugins/platforms"
 
-    chmod 755 $out/bin/dwarftherapist
+    substituteInPlace $out/bin/dwarftherapist \
+      --subst-var-by install $out
+    wrapQtApp $out/bin/dwarftherapist
 
     # Fix up memory layouts
     rm -rf $out/share/dwarftherapist/memory_layouts/linux
diff --git a/pkgs/games/dwarf-fortress/game.json b/pkgs/games/dwarf-fortress/game.json
index f5f1f389904..522cccdcda4 100644
--- a/pkgs/games/dwarf-fortress/game.json
+++ b/pkgs/games/dwarf-fortress/game.json
@@ -121,5 +121,19 @@
     "legacy_s": "19ai7lvxx0y3iha9qrbl5krric547rzs6vm4ibk8x61vv97jrbd8",
     "legacy32": "0lli6s1g7yj3p3h26ajgq3h619n88qn6s7amyz6z8w7hyzfi7wij",
     "legacy32_s": "1wzxbzgln9pmsk2nchrl94d2yd09xdgynmjl4qwcaqzkrnf3sfqc"
+  },
+  "0.47.05": {
+    "linux": "18zwmz2nsgwjxbr2yd9jcrgw6l5b481hh1848cgn5nfpnzdscx5c",
+    "linux32": "1jbav7ghsjsxd6cdp6f2x5qn83zc8707dqan5sp73fp6mbj2jasl",
+    "osx": "092z1vhc5sbdc5irggdz5ai7rxifmg4yhy33aicpsjcnvcmajydw",
+    "osx32": "0lpbwfiagp0zp280aw3fmj8938w5fc5r9gibzk2h86jy63ps29ww",
+    "win": "0bbk7j3d4h2wn9hmbsbbbbr0ajf3ddlprxfaajfbnbiyv72cpn9s",
+    "win_s": "0nl7c9dpfx7jjpy7y52z8h3kiy4cpax1m58apbcfyy95an4jz8s4",
+    "win32": "08ka1lklly82h4mr770y9p0a21x9dx6jqvjgxdsxj5979f26il1v",
+    "win32_s": "06w844zxzx3lfykibgkk4gbg4xymnqraj1ikv4mzlv31l727a1x4",
+    "legacy": "042a0gbad3cp5dwhnrzg3vr9w48b8ybqgxgw5i9rk4c1i0gjjpw2",
+    "legacy_s": "1rb7h8lzlsjs08rvhhl3nwbrpj54zijijp4y0qdp4vyzsig6nisk",
+    "legacy32": "0ayw09x9smihh8qp5pdvr6vvhwkvcqz36h3lh4g1b5kzxj7g9cyf",
+    "legacy32_s": "10gfxlysfs9gyi1mv52idp5xk45g9h517g2jq4a8cqp2j7594v9c"
   }
 }
diff --git a/pkgs/games/dwarf-fortress/game.nix b/pkgs/games/dwarf-fortress/game.nix
index 9200d01aa98..e4b7349a690 100644
--- a/pkgs/games/dwarf-fortress/game.nix
+++ b/pkgs/games/dwarf-fortress/game.nix
@@ -1,10 +1,16 @@
-{ stdenv, lib, fetchurl
-, SDL, dwarf-fortress-unfuck
-
-# Our own "unfuck" libs for macOS
-, ncurses, fmodex, gcc
-
-, dfVersion, df-hashes
+{ stdenv
+, lib
+, fetchurl
+, SDL
+, dwarf-fortress-unfuck
+
+  # Our own "unfuck" libs for macOS
+, ncurses
+, fmodex
+, gcc
+
+, dfVersion
+, df-hashes
 }:
 
 with lib;
@@ -30,20 +36,24 @@ let
   baseVersion = elemAt dfVersionTriple 1;
   patchVersion = elemAt dfVersionTriple 2;
 
-  game = if hasAttr dfVersion df-hashes
-         then getAttr dfVersion df-hashes
-         else throw "Unknown Dwarf Fortress version: ${dfVersion}";
-  dfPlatform = if hasAttr stdenv.hostPlatform.system platforms
-               then getAttr stdenv.hostPlatform.system platforms
-               else throw "Unsupported system: ${stdenv.hostPlatform.system}";
-  sha256 = if hasAttr dfPlatform game
-           then getAttr dfPlatform game
-           else throw "Unsupported dfPlatform: ${dfPlatform}";
+  game =
+    if hasAttr dfVersion df-hashes
+    then getAttr dfVersion df-hashes
+    else throw "Unknown Dwarf Fortress version: ${dfVersion}";
+  dfPlatform =
+    if hasAttr stdenv.hostPlatform.system platforms
+    then getAttr stdenv.hostPlatform.system platforms
+    else throw "Unsupported system: ${stdenv.hostPlatform.system}";
+  sha256 =
+    if hasAttr dfPlatform game
+    then getAttr dfPlatform game
+    else throw "Unsupported dfPlatform: ${dfPlatform}";
 
 in
 
 stdenv.mkDerivation {
-  name = "dwarf-fortress-${dfVersion}";
+  pname = "dwarf-fortress";
+  version = dfVersion;
 
   src = fetchurl {
     url = "${homepage}df_${baseVersion}_${patchVersion}_${dfPlatform}.tar.bz2";
diff --git a/pkgs/games/dwarf-fortress/lazy-pack.nix b/pkgs/games/dwarf-fortress/lazy-pack.nix
index 03aa5d54304..b34dbd3c74b 100644
--- a/pkgs/games/dwarf-fortress/lazy-pack.nix
+++ b/pkgs/games/dwarf-fortress/lazy-pack.nix
@@ -1,5 +1,10 @@
-{ stdenvNoCC, lib, buildEnv
-, df-games, themes, latestVersion, versionToName
+{ stdenvNoCC
+, lib
+, buildEnv
+, df-games
+, themes
+, latestVersion
+, versionToName
 , dfVersion ? latestVersion
   # This package should, at any given time, provide an opinionated "optimal"
   # DF experience. It's the equivalent of the Lazy Newbie Pack, that is, and
@@ -9,9 +14,10 @@
 , enableSoundSense ? true
 , enableStoneSense ? true
 , enableDwarfTherapist ? true
-, enableLegendsBrowser ? true, legends-browser
+, enableLegendsBrowser ? true
+, legends-browser
 , theme ? themes.phoebus
-# General config options:
+  # General config options:
 , enableIntro ? true
 , enableTruetype ? true
 , enableFPS ? false
@@ -23,9 +29,10 @@ with lib;
 
 let
   dfGame = versionToName dfVersion;
-  dwarf-fortress = if hasAttr dfGame df-games
-                   then getAttr dfGame df-games
-                   else throw "Unknown Dwarf Fortress version: ${dfVersion}";
+  dwarf-fortress =
+    if hasAttr dfGame df-games
+    then getAttr dfGame df-games
+    else throw "Unknown Dwarf Fortress version: ${dfVersion}";
   dwarf-therapist = dwarf-fortress.dwarf-therapist;
 in
 buildEnv {
@@ -33,12 +40,13 @@ buildEnv {
   paths = [
     (dwarf-fortress.override {
       inherit enableDFHack enableTWBT enableSoundSense enableStoneSense theme
-              enableIntro enableTruetype enableFPS enableTextMode enableSound;
-    })]
-    ++ lib.optional enableDwarfTherapist dwarf-therapist
-    ++ lib.optional enableLegendsBrowser legends-browser;
+        enableIntro enableTruetype enableFPS enableTextMode enableSound;
+    })
+  ]
+  ++ lib.optional enableDwarfTherapist dwarf-therapist
+  ++ lib.optional enableLegendsBrowser legends-browser;
 
-  meta = with stdenvNoCC.lib; {
+  meta = with lib; {
     description = "An opinionated wrapper for Dwarf Fortress";
     maintainers = with maintainers; [ Baughn numinit ];
     license = licenses.mit;
diff --git a/pkgs/games/dwarf-fortress/legends-browser/default.nix b/pkgs/games/dwarf-fortress/legends-browser/default.nix
index b1106002515..2a3da233b45 100644
--- a/pkgs/games/dwarf-fortress/legends-browser/default.nix
+++ b/pkgs/games/dwarf-fortress/legends-browser/default.nix
@@ -1,4 +1,4 @@
-{ stdenvNoCC, buildEnv, writeShellScriptBin, fetchurl, jre }:
+{ lib, buildEnv, writeShellScriptBin, fetchurl, jre }:
 
 let
   name = "legends-browser-${version}";
@@ -8,7 +8,7 @@ let
     url = "https://github.com/robertjanetzko/LegendsBrowser/releases/download/${version}/legendsbrowser-${version}.jar";
     sha256 = "05b4ksbl4481rh3ykfirbp6wvxhppcd5mvclhn9995gsrcaj8gx9";
   };
-  
+
   script = writeShellScriptBin "legends-browser" ''
     set -eu
     BASE="$HOME/.local/share/df_linux/legends-browser/"
@@ -26,7 +26,7 @@ buildEnv {
   inherit name;
   paths = [ script ];
 
-  meta = with stdenvNoCC.lib; {
+  meta = with lib; {
     description = "A multi-platform, open source, java-based legends viewer for dwarf fortress";
     maintainers = with maintainers; [ Baughn ];
     license = licenses.mit;
diff --git a/pkgs/games/dwarf-fortress/soundsense.nix b/pkgs/games/dwarf-fortress/soundsense.nix
index a59c8730690..5202c13b5b8 100644
--- a/pkgs/games/dwarf-fortress/soundsense.nix
+++ b/pkgs/games/dwarf-fortress/soundsense.nix
@@ -1,4 +1,6 @@
-{ stdenv, fetchzip, dos2unix
+{ stdenv
+, fetchzip
+, dos2unix
 , soundPack ? stdenv.mkDerivation {
     name = "soundsense-soundpack";
     src = fetchzip {
@@ -8,7 +10,8 @@
     installPhase = ''
       cp -r . $out
     '';
-}}:
+  }
+}:
 
 stdenv.mkDerivation rec {
   version = "2016-1_196";
diff --git a/pkgs/games/dwarf-fortress/themes/default.nix b/pkgs/games/dwarf-fortress/themes/default.nix
index 6241df7590d..c6987a1d16b 100644
--- a/pkgs/games/dwarf-fortress/themes/default.nix
+++ b/pkgs/games/dwarf-fortress/themes/default.nix
@@ -1,19 +1,21 @@
-{lib, fetchFromGitHub, ...}:
+{ lib, fetchFromGitHub, ... }:
 
 with builtins;
 
-listToAttrs (map (v: {
-  inherit (v) name;
-  value = fetchFromGitHub {
-    name = "${v.name}-${v.version}";
-    owner = "DFgraphics";
-    repo = v.name;
-    rev = v.version;
-    sha256 = v.sha256;
-    meta = with lib; {
-      platforms = platforms.all;
-      maintainers = [ maintainers.matthewbauer maintainers.shazow ];
-      license = licenses.free;
+listToAttrs (map
+  (v: {
+    inherit (v) name;
+    value = fetchFromGitHub {
+      name = "${v.name}-${v.version}";
+      owner = "DFgraphics";
+      repo = v.name;
+      rev = v.version;
+      sha256 = v.sha256;
+      meta = with lib; {
+        platforms = platforms.all;
+        maintainers = [ maintainers.matthewbauer maintainers.shazow ];
+        license = licenses.free;
+      };
     };
-  };
-}) (fromJSON (readFile ./themes.json)))
+  })
+  (fromJSON (readFile ./themes.json)))
diff --git a/pkgs/games/dwarf-fortress/themes/themes.json b/pkgs/games/dwarf-fortress/themes/themes.json
index 48f47c4fbb9..1b2449addf4 100644
--- a/pkgs/games/dwarf-fortress/themes/themes.json
+++ b/pkgs/games/dwarf-fortress/themes/themes.json
@@ -1,8 +1,8 @@
 [
   {
     "name": "afro-graphics",
-    "version": "47.02",
-    "sha256": "0np4jc05905q3bjplbrfi09q4rq3pjbf2vmbrmazfagj2mp8m7z5"
+    "version": "47.05",
+    "sha256": "0gqrxb4bbx1h93xjz4ygd7yp8g5barj2zc6y7xvr94ww8b9a2r28"
   },
   {
     "name": "autoreiv",
@@ -21,48 +21,53 @@
   },
   {
     "name": "gemset",
-    "version": "47.02",
-    "sha256": "0gz6cfx9kyldh5dxicyw0yl9lq4qw51vvlpzl767ml0bx3w38bwy"
+    "version": "47.05",
+    "sha256": "1ivsbj71w3zwxnaz0405xhqhn4yzdfziijc0s0vmbmcphhhqnjaj"
   },
   {
     "name": "ironhand",
-    "version": "47.02",
-    "sha256": "0j612xxz8g91zslw3a6yls3bzzmz0xdi2n0zx9zkmpzcl67f39ry"
+    "version": "47.05",
+    "sha256": "003yrwishkzf6nvr6xlldbnd3x7rf5ds7l91mc0npdq1lcl0br9w"
   },
   {
     "name": "jolly-bastion",
-    "version": "47.02",
-    "sha256": "1df2hvm72lklmhhphcwsqm1m3dnaqxd8qvpygg5x71cfgkjd41ic"
+    "version": "47.04",
+    "sha256": "0799ad90g62nvpdcl6zq3vr2nvfc62lprm4br9n2hbs8wgrra6rq"
   },
   {
     "name": "mayday",
-    "version": "47.01",
-    "sha256": "02fby7y4zzq8qgq2wsdvzp1k6zgfhdkm768zp0zzj9byi6gmnaq6"
+    "version": "47.05",
+    "sha256": "17sdvr9a98xx5r2nrr3m4jlddvlb4h6qlch8r23g9g4mj0hsifnj"
+  },
+  {
+    "name": "meph",
+    "version": "47.05_v5.5.1-V",
+    "sha256": "1kiqxiqw686dii5x7zav2nsw15csg0grv4h8hrb764rl4fw6x9nl"
   },
   {
     "name": "obsidian",
-    "version": "47.02",
-    "sha256": "03b26z557099k0l44lizagh17pz1y6apy496ivzv426xy0mzz684"
+    "version": "47.05",
+    "sha256": "1dkwdwm52fsj4gqqqr5vppbsk8a4kd3i7d3qawawgl0qn6q139xs"
   },
   {
     "name": "phoebus",
-    "version": "47.02a",
-    "sha256": "16zllnkrxi2365rd5m392xv72a9wvai0l3pz8xwkb8nlws8f58lb"
+    "version": "47.05",
+    "sha256": "18pn3dqyk9hp82gva92c6y3vk52s366rrx74rdnvahswdr5dmq4d"
   },
   {
     "name": "rally-ho",
-    "version": "47.02",
-    "sha256": "0xw2psmfjrgab0267scc7frgl9h1ypc0mbymn8z3x06m5wc3hbdh"
+    "version": "47.05",
+    "sha256": "1h3jqq0yq2rbzbl70sq85lgdpwswczpay16kqfwq1n8zdisl4gqn"
   },
   {
     "name": "spacefox",
-    "version": "47.02",
-    "sha256": "180fp2s489m2arc2z11j1qjnpcadjjkyami13yr3zd0v7msg64h8"
+    "version": "47.05a",
+    "sha256": "1y1rbsxr1m0mb2k02q6gh24c4nyqc9lw98dvfckp2bzc5f9cx3ks"
   },
   {
     "name": "taffer",
-    "version": "47.01b",
-    "sha256": "0b5hnli3gg32r7yvb3x1fqrmpxlk33j1hila2wiihybkkfnvxy5f"
+    "version": "47.04",
+    "sha256": "1ly2sc0pb2kybb8grj19zx372whblmd0bj8p64akpi2rrywi13sy"
   },
   {
     "name": "tergel",
@@ -70,8 +75,13 @@
     "sha256": "142sd1i11vvirn68rp4gqzl67ww597df1lc57ycnpnz0n3q39kxy"
   },
   {
+    "name": "vettlingr",
+    "version": "47.05",
+    "sha256": "0s1vy3ssp1hk8f6wlkz09xy5v747dpbsgw5vi6i1mq3lnlcy68vq"
+  },
+  {
     "name": "wanderlust",
-    "version": "47.02",
-    "sha256": "0c36nxry189qdyinjk03wwm3j7q9q7b2sabkv7glx8yz2i61j5q9"
+    "version": "47.04",
+    "sha256": "1z56m8zplq5d18sbkwg5lwcy8iwfa5hbxixsm3hdxm04qyld1z89"
   }
 ]
diff --git a/pkgs/games/dwarf-fortress/twbt/default.nix b/pkgs/games/dwarf-fortress/twbt/default.nix
index a0990e04f93..7882cf06a07 100644
--- a/pkgs/games/dwarf-fortress/twbt/default.nix
+++ b/pkgs/games/dwarf-fortress/twbt/default.nix
@@ -1,4 +1,7 @@
-{ stdenvNoCC, lib, fetchurl, unzip
+{ stdenvNoCC
+, lib
+, fetchurl
+, unzip
 , dfVersion
 }:
 
@@ -47,11 +50,18 @@ let
       sha256 = "092dgp8fh1j4nqr9wbzn89ib1nhscclr8m91lfxsvg0mgn7j8xlv";
       prerelease = true;
     };
+    "0.47.05" = {
+      twbtRelease = "6.xx";
+      dfhackRelease = "0.47.05-beta1";
+      sha256 = "sha256-Y6G0qBMHvotp/oyiqANlzXZVklL270dhskd135PnE9Q=";
+      prerelease = true;
+    };
   };
 
-  release = if hasAttr dfVersion twbt-releases
-            then getAttr dfVersion twbt-releases
-            else throw "[TWBT] Unsupported Dwarf Fortress version: ${dfVersion}";
+  release =
+    if hasAttr dfVersion twbt-releases
+    then getAttr dfVersion twbt-releases
+    else throw "[TWBT] Unsupported Dwarf Fortress version: ${dfVersion}";
 in
 
 stdenvNoCC.mkDerivation rec {
@@ -71,7 +81,7 @@ stdenvNoCC.mkDerivation rec {
 
   outputs = [ "lib" "art" "out" ];
 
-  buildInputs = [ unzip ];
+  nativeBuildInputs = [ unzip ];
 
   installPhase = ''
     mkdir -p $lib/hack/{plugins,lua} $art/data/art
@@ -80,7 +90,7 @@ stdenvNoCC.mkDerivation rec {
     cp -a *.png $art/data/art/
   '';
 
-  meta = with stdenvNoCC.lib; {
+  meta = with lib; {
     description = "A plugin for Dwarf Fortress / DFHack that improves various aspects the game interface.";
     maintainers = with maintainers; [ Baughn numinit ];
     license = licenses.mit;
diff --git a/pkgs/games/dwarf-fortress/unfuck.nix b/pkgs/games/dwarf-fortress/unfuck.nix
index 533649131f5..5b25cf4ff40 100644
--- a/pkgs/games/dwarf-fortress/unfuck.nix
+++ b/pkgs/games/dwarf-fortress/unfuck.nix
@@ -1,7 +1,22 @@
-{ stdenv, lib, fetchFromGitHub, cmake
-, libGL, libSM, SDL, SDL_image, SDL_ttf, glew, openalSoft
-, ncurses, glib, gtk2, libsndfile, zlib
-, dfVersion, pkg-config
+{ stdenv
+, lib
+, fetchFromGitHub
+, cmake
+, libGL
+, libSM
+, SDL
+, SDL_image
+, SDL_ttf
+, glew
+, openalSoft
+, ncurses
+, glib
+, gtk2
+, gtk3
+, libsndfile
+, zlib
+, dfVersion
+, pkg-config
 }:
 
 with lib;
@@ -44,11 +59,16 @@ let
       unfuckRelease = "0.47.04";
       sha256 = "1wa990xbsyiiz7abq153xmafvvk1dmgz33rp907d005kzl1z86i9";
     };
+    "0.47.05" = {
+      unfuckRelease = "0.47.04";
+      sha256 = "1wa990xbsyiiz7abq153xmafvvk1dmgz33rp907d005kzl1z86i9";
+    };
   };
 
-  release = if hasAttr dfVersion unfuck-releases
-            then getAttr dfVersion unfuck-releases
-            else throw "[unfuck] Unknown Dwarf Fortress version: ${dfVersion}";
+  release =
+    if hasAttr dfVersion unfuck-releases
+    then getAttr dfVersion unfuck-releases
+    else throw "[unfuck] Unknown Dwarf Fortress version: ${dfVersion}";
 in
 
 stdenv.mkDerivation {
@@ -68,9 +88,23 @@ stdenv.mkDerivation {
 
   nativeBuildInputs = [ cmake pkg-config ];
   buildInputs = [
-    libSM SDL SDL_image SDL_ttf glew openalSoft
-    ncurses gtk2 libsndfile zlib libGL
-  ];
+    libSM
+    SDL
+    SDL_image
+    SDL_ttf
+    glew
+    openalSoft
+    ncurses
+    libsndfile
+    zlib
+    libGL
+  ]
+  # switched to gtk3 in 0.47.05
+  ++ (if lib.versionOlder release.unfuckRelease "0.47.05" then [
+    gtk2
+  ] else [
+    gtk3
+  ]);
 
   # Don't strip unused symbols; dfhack hooks into some of them.
   dontStrip = true;
@@ -79,14 +113,12 @@ stdenv.mkDerivation {
     install -D -m755 ../build/libgraphics.so $out/lib/libgraphics.so
   '';
 
-  enableParallelBuilding = true;
-
   # Breaks dfhack because of inlining.
   hardeningDisable = [ "fortify" ];
 
   passthru = { inherit dfVersion; };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Unfucked multimedia layer for Dwarf Fortress";
     homepage = "https://github.com/svenstaro/dwarf_fortress_unfuck";
     license = licenses.free;
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
index 79b63e3ce9e..ce989b98ffb 100644
--- a/pkgs/games/dwarf-fortress/wrapper/default.nix
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -1,13 +1,22 @@
-{ stdenv, lib, buildEnv, substituteAll, runCommand
+{ stdenv
+, lib
+, buildEnv
+, substituteAll
+, runCommand
+, coreutils
 , dwarf-fortress
 , dwarf-therapist
-, enableDFHack ? false, dfhack
-, enableSoundSense ? false, soundSense, jdk
+, enableDFHack ? false
+, dfhack
+, enableSoundSense ? false
+, soundSense
+, jdk
 , enableStoneSense ? false
-, enableTWBT ? false, twbt
-, themes ? {}
+, enableTWBT ? false
+, twbt
+, themes ? { }
 , theme ? null
-# General config options:
+  # General config options:
 , enableIntro ? true
 , enableTruetype ? true
 , enableFPS ? false
@@ -31,11 +40,11 @@ let
   # These are in inverse order for first packages to override the next ones.
   themePkg = lib.optional (theme != null) ptheme;
   pkgs = lib.optional enableDFHack dfhack_
-         ++ lib.optional enableSoundSense soundSense
-         ++ lib.optional enableTWBT twbt.art
-         ++ [ dwarf-fortress ];
+    ++ lib.optional enableSoundSense soundSense
+    ++ lib.optional enableTWBT twbt.art
+    ++ [ dwarf-fortress ];
 
-  fixup = lib.singleton (runCommand "fixup" {} (''
+  fixup = lib.singleton (runCommand "fixup" { } (''
     mkdir -p $out/data/init
   '' + (if (theme != null) then ''
     cp ${lib.head themePkg}/data/init/init.txt $out/data/init/init.txt
@@ -60,8 +69,8 @@ let
   '' + lib.optionalString enableTWBT ''
     substituteInPlace $out/data/init/init.txt \
       --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]'
-  '' + 
- lib.optionalString enableTextMode ''
+  '' +
+  lib.optionalString enableTextMode ''
     substituteInPlace $out/data/init/init.txt \
       --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TEXT]'
   '' + ''
@@ -89,8 +98,15 @@ stdenv.mkDerivation {
     name = "dwarf-fortress-init";
     src = ./dwarf-fortress-init.in;
     inherit env;
-    exe = if stdenv.isLinux then "libs/Dwarf_Fortress"
-                            else "dwarfort.exe";
+    exe =
+      if stdenv.isLinux then "libs/Dwarf_Fortress"
+      else "dwarfort.exe";
+    stdenv_shell = "${stdenv.shell}";
+    cp = "${coreutils}/bin/cp";
+    rm = "${coreutils}/bin/rm";
+    ln = "${coreutils}/bin/ln";
+    cat = "${coreutils}/bin/cat";
+    mkdir = "${coreutils}/bin/mkdir";
   };
 
   runDF = ./dwarf-fortress.in;
diff --git a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
index b041067d89e..27639e57f21 100644
--- a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
+++ b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
@@ -1,3 +1,4 @@
+#!@stdenv_shell@ -e
 shopt -s extglob
 
 [ -z "$DF_DIR" ] && export DF_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/df_linux"
@@ -7,25 +8,25 @@ exe="$env_dir/@exe@"
 update_path() {
   local path="$1"
 
-  mkdir -p "$DF_DIR/$(dirname "$path")"
+  @mkdir@ -p "$DF_DIR/$(dirname "$path")"
   # If user has replaced these data directories, let them stay.
   if [ ! -e "$DF_DIR/$path" ] || [ -L "$DF_DIR/$path" ]; then
-    rm -f "$DF_DIR/$path"
-    ln -s "$env_dir/$path" "$DF_DIR/$path"
+    @rm@ -f "$DF_DIR/$path"
+    @ln@ -s "$env_dir/$path" "$DF_DIR/$path"
   fi
 }
 
 forcecopy_path() {
   local path="$1"
 
-  mkdir -p "$DF_DIR/$(dirname "$path")"
-  rm -rf "$DF_DIR/$path"
-  cp -rL --no-preserve=all "$env_dir/$path" "$DF_DIR/$path"
+  @mkdir@ -p "$DF_DIR/$(dirname "$path")"
+  @rm@ -rf "$DF_DIR/$path"
+  @cp@ -rL --no-preserve=all "$env_dir/$path" "$DF_DIR/$path"
 }
 
-mkdir -p "$DF_DIR"
+@mkdir@ -p "$DF_DIR"
 
-cat <<EOF >&2
+@cat@ <<EOF >&2
 Using $DF_DIR as Dwarf Fortress overlay directory.
 If you do any changes in it, don't forget to clean it when updating the game version!
 We try to detect changes based on data directories being symbolic links -- keep this in mind.
diff --git a/pkgs/games/dxx-rebirth/assets.nix b/pkgs/games/dxx-rebirth/assets.nix
index 47a8222cd6a..b214d49659b 100644
--- a/pkgs/games/dxx-rebirth/assets.nix
+++ b/pkgs/games/dxx-rebirth/assets.nix
@@ -1,4 +1,4 @@
-{ stdenv, requireFile, gogUnpackHook }:
+{ lib, stdenv, requireFile, gogUnpackHook }:
 
 let
   generic = ver: source: let
@@ -40,7 +40,7 @@ let
       runHook postInstall
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Descent ${toString ver} assets from GOG";
       homepage    = "https://www.dxx-rebirth.com/";
       license     = licenses.unfree;
diff --git a/pkgs/games/dxx-rebirth/default.nix b/pkgs/games/dxx-rebirth/default.nix
index aa2563d4e4b..c2e3fac7e15 100644
--- a/pkgs/games/dxx-rebirth/default.nix
+++ b/pkgs/games/dxx-rebirth/default.nix
@@ -1,9 +1,9 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , fetchurl
 , fetchpatch
 , scons
-, pkgconfig
+, pkg-config
 , SDL
 , SDL_mixer
 , libGLU
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
     sha256 = "1lsrlp47aby2m9hh7i3nv5rb0srlkmnq1w2ca6vyvlga9m9h7jrk";
   };
 
-  nativeBuildInputs = [ pkgconfig scons ];
+  nativeBuildInputs = [ pkg-config scons ];
 
   buildInputs = [ libGLU libGL libpng physfs SDL SDL_mixer ];
 
@@ -46,7 +46,7 @@ stdenv.mkDerivation rec {
     install -Dm644 -t $out/share/doc/dxx-rebirth *.txt
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Source Port of the Descent 1 and 2 engines";
     homepage = "https://www.dxx-rebirth.com/";
     license = licenses.gpl3;
diff --git a/pkgs/games/dxx-rebirth/full.nix b/pkgs/games/dxx-rebirth/full.nix
index 782a2d21112..f3349c114ee 100644
--- a/pkgs/games/dxx-rebirth/full.nix
+++ b/pkgs/games/dxx-rebirth/full.nix
@@ -1,4 +1,4 @@
-{ stdenv, makeWrapper
+{ lib, stdenv, makeWrapper
 , dxx-rebirth, descent1-assets, descent2-assets }:
 
 let
@@ -14,7 +14,7 @@ let
         --add-flags "-hogdir ${assets}/share/games/descent${toString ver}"
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Descent ${toString ver} using the DXX-Rebirth project engine and game assets from GOG";
       homepage    = "https://www.dxx-rebirth.com/";
       license     = with licenses; [ free unfree ];
diff --git a/pkgs/games/easyrpg-player/default.nix b/pkgs/games/easyrpg-player/default.nix
index 79628d0d2ae..81968d25e3d 100644
--- a/pkgs/games/easyrpg-player/default.nix
+++ b/pkgs/games/easyrpg-player/default.nix
@@ -1,20 +1,20 @@
-{ stdenv, fetchFromGitHub, cmake, doxygen ? null, pkgconfig, freetype ? null, glib, harfbuzz ? null
+{ lib, stdenv, fetchFromGitHub, cmake, doxygen ? null, pkg-config, freetype ? null, 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 }:
 
 stdenv.mkDerivation rec {
   pname = "easyrpg-player";
-  version = "0.6.2.1";
+  version = "0.6.2.3";
 
   src = fetchFromGitHub {
     owner = "EasyRPG";
     repo = "Player";
     rev = version;
-    sha256 = "19wpjvlkjmjhdv1dbph6i2da1xx479zhr532x0ili1aphw1j9hi6";
+    sha256 = "103ywad12dcfjpf97kyx22smilqrw1f20xcfvjjr4mm3walc2mdp";
   };
 
-  nativeBuildInputs = [ cmake doxygen pkgconfig ];
+  nativeBuildInputs = [ cmake doxygen pkg-config ];
 
   buildInputs = [
     freetype
@@ -42,7 +42,7 @@ stdenv.mkDerivation rec {
     zlib
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "RPG Maker 2000/2003 and EasyRPG games interpreter";
     homepage = "https://easyrpg.org/";
     license = licenses.gpl3;
diff --git a/pkgs/games/eboard/default.nix b/pkgs/games/eboard/default.nix
index b11cc90d11f..293811e9b04 100644
--- a/pkgs/games/eboard/default.nix
+++ b/pkgs/games/eboard/default.nix
@@ -1,17 +1,18 @@
-{ stdenv, fetchurl, perl, pkgconfig, gtk2 }:
+{ lib, stdenv, fetchurl, perl, pkg-config, gtk2 }:
 
-stdenv.mkDerivation {
-  name = "eboard-1.1.1";
+stdenv.mkDerivation rec {
+  pname = "eboard";
+  version = "1.1.1";
 
   src = fetchurl {
-    url = "mirror://sourceforge/eboard/eboard-1.1.1.tar.bz2";
+    url = "mirror://sourceforge/eboard/eboard-${version}.tar.bz2";
     sha256 = "0vm25j1s2zg1lipwjv9qrcm877ikfmk1yh34i8f5l3bwd63115xd";
   };
 
   patches = [ ./eboard.patch ];
 
   buildInputs = [ gtk2 ];
-  nativeBuildInputs = [ perl pkgconfig ];
+  nativeBuildInputs = [ perl pkg-config ];
 
   hardeningDisable = [ "format" ];
 
@@ -25,6 +26,6 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.bergo.eng.br/eboard/";
     description = "Chess interface for Unix-like systems";
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/eduke32/default.nix b/pkgs/games/eduke32/default.nix
index 53baac79eed..8c7a79ff982 100644
--- a/pkgs/games/eduke32/default.nix
+++ b/pkgs/games/eduke32/default.nix
@@ -1,11 +1,8 @@
-{ stdenv, fetchurl, makeWrapper, pkgconfig, nasm, makeDesktopItem
-, flac, gtk2, libvorbis, libvpx, libGLU, libGL
+{ lib, stdenv, fetchurl, makeWrapper, pkg-config, nasm, makeDesktopItem
+, alsa-lib, flac, gtk2, libvorbis, libvpx, libGLU, libGL
 , SDL2, SDL2_mixer }:
 
 let
-  version = "20190330";
-  rev = "7470";
-
   desktopItem = makeDesktopItem {
     name = "eduke32";
     exec = "@out@/bin/${wrapper}";
@@ -17,19 +14,21 @@ let
 
   wrapper = "eduke32-wrapper";
 
-in stdenv.mkDerivation {
+in stdenv.mkDerivation rec {
   pname = "eduke32";
-  inherit version;
+  version = "20210722";
+  rev = "9484";
+  revExtra = "f3fea8c15";
 
   src = fetchurl {
-    url = "http://dukeworld.duke4.net/eduke32/synthesis/latest/eduke32_src_${version}-${rev}.tar.xz";
-    sha256 = "09a7l23i6sygicc82w1in9hjw0jvivlf7q0vw8kcx9j98lm23mkn";
+    url = "http://dukeworld.duke4.net/eduke32/synthesis/${version}-${rev}-${revExtra}/eduke32_src_${version}-${rev}-${revExtra}.tar.xz";
+    sha256 = "0fdl2i465cl5x7129772ksx97lvim98m9009q5cfmf6scagj9pvz";
   };
 
-  buildInputs = [ flac gtk2 libvorbis libvpx libGL libGLU SDL2 SDL2_mixer ];
+  buildInputs = [ alsa-lib flac gtk2 libvorbis libvpx libGL libGLU SDL2 SDL2_mixer ];
 
-  nativeBuildInputs = [ makeWrapper pkgconfig ]
-    ++ stdenv.lib.optional (stdenv.hostPlatform.system == "i686-linux") nasm;
+  nativeBuildInputs = [ makeWrapper pkg-config ]
+    ++ lib.optional (stdenv.hostPlatform.system == "i686-linux") nasm;
 
   postPatch = ''
     substituteInPlace source/build/src/glbuild.cpp \
@@ -65,7 +64,7 @@ in stdenv.mkDerivation {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Enhanched port of Duke Nukem 3D for various platforms";
     homepage = "http://eduke32.com";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/egoboo/default.nix b/pkgs/games/egoboo/default.nix
index 138ad8a757f..56ebcb1444e 100644
--- a/pkgs/games/egoboo/default.nix
+++ b/pkgs/games/egoboo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libGLU, libGL, SDL, SDL_mixer, SDL_image, SDL_ttf }:
+{ lib, stdenv, fetchurl, libGLU, libGL, SDL, SDL_mixer, SDL_image, SDL_ttf }:
 
 stdenv.mkDerivation rec {
   # pf5234 (a developer?) at freenode #egoboo told me that I better use 2.7.3 until
@@ -50,10 +50,10 @@ stdenv.mkDerivation rec {
     description = "3D dungeon crawling adventure";
 
     homepage = "http://www.freedink.org/";
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
 
     # I take it out of hydra as it does not work as well as I'd like
-    # maintainers = [ stdenv.lib.maintainers.bjg ];
-    # platforms = stdenv.lib.platforms.all;
+    # maintainers = [ lib.maintainers.bjg ];
+    # platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/games/eidolon/default.nix b/pkgs/games/eidolon/default.nix
index e982c95c4d6..a224ba112e0 100644
--- a/pkgs/games/eidolon/default.nix
+++ b/pkgs/games/eidolon/default.nix
@@ -1,22 +1,23 @@
-{ stdenv, fetchgit, rustPlatform, pkgconfig, openssl }:
+{ lib, fetchFromSourcehut, rustPlatform, pkg-config, openssl }:
 
 rustPlatform.buildRustPackage rec {
   pname = "eidolon";
   version = "1.4.6";
 
-  src = fetchgit {
-    url = "https://git.sr.ht/~nicohman/eidolon";
-    rev = "${version}";
+  src = fetchFromSourcehut {
+    owner = "~nicohman";
+    repo = pname;
+    rev = version;
     sha256 = "1yn3k569pxzw43mmsk97088xpkdc714rks3ncchbb6ccx25kgxrr";
   };
   cargoPatches = [ ./cargo-lock.patch ];
 
-  cargoSha256 = "1i8qfphynwi42pkhhgllxq42dnw9f0dd6f829z94a3g91czyqvsw";
+  cargoSha256 = "01mnfn6j4sj9iqw5anpx8lqm9jmk7wdrx3h2hcvqcmkyrk1nggx0";
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ openssl ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A single TUI-based registry for drm-free, wine and steam games on linux, accessed through a rofi launch menu";
     homepage = "https://github.com/nicohman/eidolon";
     license = licenses.gpl3;
diff --git a/pkgs/games/empty-epsilon/0001-bundle-system-glm-in-seriousproton.patch b/pkgs/games/empty-epsilon/0001-bundle-system-glm-in-seriousproton.patch
new file mode 100644
index 00000000000..d59d548a4a4
--- /dev/null
+++ b/pkgs/games/empty-epsilon/0001-bundle-system-glm-in-seriousproton.patch
@@ -0,0 +1,34 @@
+From 9718cdb4bdaf7203d07789b2dc5eec4060538889 Mon Sep 17 00:00:00 2001
+From: Maximilian Bosch <maximilian@mbosch.me>
+Date: Fri, 9 Jul 2021 11:37:22 +0200
+Subject: [PATCH] bundle system-glm in seriousproton
+
+---
+ CMakeLists.txt | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index cbd68ca..730df82 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -81,6 +81,9 @@ if(NOT ${SFML_FOUND})
+     )
+ endif()
+ 
++
++find_package(glm)
++
+ add_subdirectory(src/Box2D)
+ add_subdirectory(src/lua)
+ add_subdirectory(src/GL)
+@@ -205,7 +208,7 @@ target_compile_options(seriousproton_deps
+ 
+ target_link_libraries(seriousproton_deps
+     INTERFACE 
+-        box2d lua glew ${SFML_LIBRARIES}
++        box2d lua glew ${SFML_LIBRARIES} glm
+         "$<$<BOOL:${WIN32}>:wsock32>"
+         # LTO flag must be on the linker's list as well.
+         "$<$<AND:$<BOOL:${CMAKE_COMPILER_IS_GNUCC}>,$<OR:$<CONFIG:RelWithDebInfo>,$<CONFIG:Release>>>:-flto>"
+-- 
+2.31.1
diff --git a/pkgs/games/empty-epsilon/default.nix b/pkgs/games/empty-epsilon/default.nix
index 098ed35406f..bee806fcdd5 100644
--- a/pkgs/games/empty-epsilon/default.nix
+++ b/pkgs/games/empty-epsilon/default.nix
@@ -1,26 +1,45 @@
-{ lib, stdenv, fetchFromGitHub, cmake, sfml, libX11, glew, python3 }:
+{ lib, stdenv, fetchFromGitHub, cmake, sfml, libX11, glew, python3, fetchpatch, applyPatches, glm}:
 
 let
 
-  major = "2020";
-  minor = "08";
-  patch = "07";
+  major = "2021";
+  minor = "06";
+  patch.seriousproton = "23";
+  patch.emptyepsilon = "23";
 
-  version = "${major}.${minor}.${patch}";
+  version.seriousproton = "${major}.${minor}.${patch.seriousproton}";
+  version.emptyepsilon = "${major}.${minor}.${patch.emptyepsilon}";
 
   serious-proton = stdenv.mkDerivation {
     pname = "serious-proton";
-    inherit version;
+    version = version.seriousproton;
 
-    src = fetchFromGitHub {
-      owner = "daid";
-      repo = "SeriousProton";
-      rev = "EE-${version}";
-      sha256 = "1mfizhmwh6xgb5n34l3wrbxm21f7gsvsyacsmnxw9rkz0ya7ch30";
+    src = applyPatches {
+      src = fetchFromGitHub {
+        owner = "daid";
+        repo = "SeriousProton";
+        rev = "EE-${version.seriousproton}";
+        sha256 = "sha256-02cHHWKoe99257qLgxtMjeXnhi0UYajh4v87B57felM=";
+      };
+
+      patches = [
+        # Various CMake fixes for `json11`. Can be removed on the next release.
+        (fetchpatch {
+          url = "https://github.com/daid/SeriousProton/commit/adbba45fd9ae5e020e43e5d7f9326f1355391209.patch";
+          sha256 = "sha256-gMTpIGPGCREmZ/ZxvEc7RVsVUxWXbu2BPUCE3A62sCI=";
+        })
+
+        # Simplified variant of
+        # * https://github.com/daid/SeriousProton/commit/0d1ac45b738195db5e2785531db713328f547e60
+        # * https://github.com/daid/SeriousProton/commit/32509f2db91a58b9528aeb1bb505e9426b52b825
+        #
+        # To fix configure errors when building EmptyEpsilon, can be removed on the next release.
+        ./0001-bundle-system-glm-in-seriousproton.patch
+      ];
     };
 
     nativeBuildInputs = [ cmake ];
-    buildInputs = [ sfml libX11 ];
+    buildInputs = [ sfml libX11 glm ];
 
     meta = with lib; {
       description = "C++ game engine coded on top of SFML used for EmptyEpsilon";
@@ -36,24 +55,36 @@ in
 
 stdenv.mkDerivation {
   pname = "empty-epsilon";
-  inherit version;
+  version = version.emptyepsilon;
 
   src = fetchFromGitHub {
     owner = "daid";
     repo = "EmptyEpsilon";
-    rev = "EE-${version}";
-    sha256 = "0p41wx9yk09xjmfkjpdgi3b2999ps2am3xqwd866q11f6ci7viv5";
+    rev = "EE-${version.emptyepsilon}";
+    sha256 = "sha256-dc/Ic1/DULTQO6y9xSop2HxFvUh4kN57oSF/HBmbmF4=";
   };
 
+  patches = [
+    # Various CMake fixes that can be removed when upgrading to the next release.
+    (fetchpatch {
+      url = "https://github.com/daid/EmptyEpsilon/commit/ee0cd42bfe5fd20b8339e8e02eb7f69766168d57.patch";
+      sha256 = "sha256-8dXtl/izfzqbwHtjuugjH34vYP+d4AobqZhxL2GXTzw=";
+    })
+    (fetchpatch {
+      url = "https://github.com/daid/EmptyEpsilon/commit/69d93e6acdae3259755924f9d35e7e5ae949d377.patch";
+      sha256 = "sha256-30AGo4mi73GrW9GNS3vF3mTOS7J5/41LvjOzNjeFhOg=";
+    })
+  ];
+
   nativeBuildInputs = [ cmake ];
-  buildInputs = [ serious-proton sfml glew libX11 python3 ];
+  buildInputs = [ serious-proton sfml glew libX11 python3 glm ];
 
   cmakeFlags = [
     "-DSERIOUS_PROTON_DIR=${serious-proton.src}"
-    "-DCPACK_PACKAGE_VERSION=${version}"
+    "-DCPACK_PACKAGE_VERSION=${version.emptyepsilon}"
     "-DCPACK_PACKAGE_VERSION_MAJOR=${major}"
     "-DCPACK_PACKAGE_VERSION_MINOR=${minor}"
-    "-DCPACK_PACKAGE_VERSION_PATCH=${patch}"
+    "-DCPACK_PACKAGE_VERSION_PATCH=${patch.emptyepsilon}"
   ];
 
   meta = with lib; {
diff --git a/pkgs/games/endgame-singularity/default.nix b/pkgs/games/endgame-singularity/default.nix
index 4e855dbd053..d6b15301872 100644
--- a/pkgs/games/endgame-singularity/default.nix
+++ b/pkgs/games/endgame-singularity/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib
 , fetchurl
 , fetchFromGitHub
 , unzip
@@ -17,7 +17,7 @@ python3.pkgs.buildPythonApplication rec {
       rev = "v${version}";
       sha256 = "0ndrnxwii8lag6vrjpwpf5n36hhv223bb46d431l9gsigbizv0hl";
     })
-  ] ++ stdenv.lib.optional enableDefaultMusicPack (
+  ] ++ lib.optional enableDefaultMusicPack (
     fetchurl {
       url = "http://www.emhsoft.com/singularity/endgame-singularity-music-007.zip";
       sha256 = "0vf2qaf66jh56728pq1zbnw50yckjz6pf6c6qw6dl7vk60kkqnpb";
@@ -29,7 +29,7 @@ python3.pkgs.buildPythonApplication rec {
   propagatedBuildInputs = with python3.pkgs; [ pygame numpy polib ];
 
   # Add the music
-  postInstall = stdenv.lib.optionalString enableDefaultMusicPack ''
+  postInstall = lib.optionalString enableDefaultMusicPack ''
     cp -R "../endgame-singularity-music-007" \
           "$(echo $out/lib/python*/site-packages/singularity)/music"
           # ↑ we cannot glob on [...]/music, it doesn't exist yet
@@ -42,7 +42,7 @@ python3.pkgs.buildPythonApplication rec {
       A simulation of a true AI. Go from computer to computer, pursued by the
       entire world. Keep hidden, and you might have a chance
     '';
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [ fgaz ];
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ fgaz ];
   };
 }
diff --git a/pkgs/games/endless-sky/default.nix b/pkgs/games/endless-sky/default.nix
index 76ab6542a7f..0c9871037f8 100644
--- a/pkgs/games/endless-sky/default.nix
+++ b/pkgs/games/endless-sky/default.nix
@@ -1,14 +1,10 @@
-{ stdenv, fetchFromGitHub
+{ lib, stdenv, fetchFromGitHub, fetchpatch
 , SDL2, libpng, libjpeg, glew, openal, scons, libmad
 }:
 
-let
-  version = "0.9.12";
-
-in
-stdenv.mkDerivation {
+stdenv.mkDerivation rec {
   pname = "endless-sky";
-  inherit version;
+  version = "0.9.12";
 
   src = fetchFromGitHub {
     owner = "endless-sky";
@@ -17,6 +13,15 @@ stdenv.mkDerivation {
     sha256 = "1hly68ljm7yv01jfxyr7g6jivhj0igg6xx7vi92zqymick0hlh7a";
   };
 
+  patches = [
+    (fetchpatch {
+      name = "endless-sky-gcc10.patch";
+      url = "https://github.com/endless-sky/endless-sky/commit/bc3cab5992694547f9c6c067b5579ef06224781b.patch";
+      sha256 = "0v3913jyzhh1d81dxv738kcd3xhh7mrl06qnmj7a3ya2xd9pq4dk";
+    })
+    ./fixes.patch
+  ];
+
   enableParallelBuilding = true;
 
   buildInputs = [
@@ -25,11 +30,7 @@ stdenv.mkDerivation {
 
   prefixKey = "PREFIX=";
 
-  patches = [
-    ./fixes.patch
-  ];
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A sandbox-style space exploration game similar to Elite, Escape Velocity, or Star Control";
     homepage = "https://endless-sky.github.io/";
     license = with licenses; [
diff --git a/pkgs/games/enigma/default.nix b/pkgs/games/enigma/default.nix
new file mode 100644
index 00000000000..131bd00e185
--- /dev/null
+++ b/pkgs/games/enigma/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl, makeWrapper, pkg-config, gettext, imagemagick, curl, libpng, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, xercesc, xdg-utils, hicolor-icon-theme }:
+stdenv.mkDerivation rec {
+  pname = "enigma";
+  version = "1.30-alpha";
+
+  src = fetchurl {
+    url = "https://github.com/Enigma-Game/Enigma/releases/download/${version}/${pname}-${version}.tar.gz";
+    sha256 = "1zyk3j43gzfr1lhc6g13j7qai5f33fv5xm5735nnznaqvaz17949";
+  };
+
+  nativeBuildInputs = [ pkg-config gettext makeWrapper imagemagick ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf libpng xercesc curl xdg-utils ];
+
+  # For some reason (might be related to the alpha status), some includes
+  # which are required by lib-src/enigma-core are not picked up by the
+  # configure script. Hence we add them manually.
+  CPPFLAGS = "-I${SDL2.dev}/include/SDL2 -I${SDL2_ttf}/include/SDL2 -I${SDL2_image}/include/SDL2 -I${SDL2_mixer}/include/SDL2";
+
+  postInstall = ''
+    rm -r $out/include
+    wrapProgram $out/bin/enigma --prefix PATH : "${lib.makeBinPath [ xdg-utils ]}"
+  '';
+
+  meta = with lib; {
+    description = "Puzzle game inspired by Oxyd on the Atari ST and Rock'n'Roll on the Amiga";
+    license = with licenses; [ gpl2 free ]; # source + bundles libs + art
+    platforms = platforms.unix;
+    broken = stdenv.targetPlatform.isDarwin;
+    maintainers = with maintainers; [ iblech ];
+    homepage = "https://www.nongnu.org/enigma/";
+  };
+}
diff --git a/pkgs/games/enyo-doom/default.nix b/pkgs/games/enyo-doom/default.nix
index ba07b50a1e7..eeb4086f924 100644
--- a/pkgs/games/enyo-doom/default.nix
+++ b/pkgs/games/enyo-doom/default.nix
@@ -1,27 +1,25 @@
-{ mkDerivation, stdenv, fetchFromGitLab, cmake, qtbase }:
+{ mkDerivation, lib, fetchFromGitLab, cmake, qtbase }:
 
 mkDerivation rec {
   pname = "enyo-doom";
-  version = "1.06.9";
+  version = "2.0.2";
 
   src = fetchFromGitLab {
     owner = "sdcofer70";
     repo = "enyo-doom";
     rev = version;
-    sha256 = "0vx5zy47cqrqdgyx31wg56ivva0qqiyww8bp1x32ax99danymjyf";
+    sha256 = "1s1vpwrrpb9c7r2b0k1j7dlsfasfzmi6prcwql4mxwixrl7f8ms1";
   };
 
   nativeBuildInputs = [ cmake ];
 
   buildInputs = [ qtbase ];
 
-  enableParallelBuilding = true;
-
   meta = {
     homepage = "https://gitlab.com/sdcofer70/enyo-doom";
     description = "Frontend for Doom engines";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ stdenv.lib.maintainers.tadfisher ];
+    license = lib.licenses.gpl3Plus;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.tadfisher ];
   };
 }
diff --git a/pkgs/games/eternity-engine/default.nix b/pkgs/games/eternity-engine/default.nix
index c170c0b9c18..42111556105 100644
--- a/pkgs/games/eternity-engine/default.nix
+++ b/pkgs/games/eternity-engine/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, cmake, libGL, SDL, SDL_mixer, SDL_net, fetchFromGitHub, makeWrapper }:
+{ lib, stdenv, cmake, libGL, SDL, SDL_mixer, SDL_net, fetchFromGitHub, makeWrapper }:
 
 stdenv.mkDerivation rec {
   pname = "eternity-engine";
@@ -13,8 +13,6 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ cmake makeWrapper ];
   buildInputs = [ libGL SDL SDL_mixer SDL_net ];
 
-  enableParallelBuilding = true;
-
   installPhase = ''
     install -Dm755 source/eternity $out/lib/eternity/eternity
     cp -r $src/base $out/lib/eternity/base
@@ -25,8 +23,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://doomworld.com/eternity";
     description = "New school Doom port by James Haley";
-    license = stdenv.lib.licenses.gpl3;
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = with stdenv.lib.maintainers; [ MP2E ];
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ MP2E ];
   };
 }
diff --git a/pkgs/games/extremetuxracer/default.nix b/pkgs/games/extremetuxracer/default.nix
index 1c0a47e4b61..d114ed84800 100644
--- a/pkgs/games/extremetuxracer/default.nix
+++ b/pkgs/games/extremetuxracer/default.nix
@@ -1,23 +1,23 @@
-{ stdenv, fetchurl, libGLU, libGL, libX11, xorgproto, tcl, freeglut, freetype
+{ lib, stdenv, fetchurl, libGLU, libGL, libX11, xorgproto, tcl, freeglut, freetype
 , sfml, libXi
 , libXmu, libXext, libXt, libSM, libICE
-, libpng, pkgconfig, gettext, intltool
+, libpng, pkg-config, gettext, intltool
 }:
 
 stdenv.mkDerivation rec {
-  version = "0.8.0";
+  version = "0.8.1";
   pname = "extremetuxracer";
 
   src = fetchurl {
     url = "mirror://sourceforge/extremetuxracer/etr-${version}.tar.xz";
-    sha256 = "05ysaxvsgps9fxc421kdifsxmc1sn6n79cjaa0k0i3fs9qqrja2b";
+    sha256 = "sha256-ktqWPtMqub/xJjRu37lUnocdfDzsdT9KxQmODVPDg0E=";
   };
 
   buildInputs = [
     libGLU libGL libX11 xorgproto tcl freeglut freetype
     sfml libXi
     libXmu libXext libXt libSM libICE
-    libpng pkgconfig gettext intltool
+    libpng pkg-config gettext intltool
   ];
 
   configureFlags = [ "--with-tcl=${tcl}/lib" ];
@@ -31,9 +31,9 @@ stdenv.mkDerivation rec {
     longDescription = ''
       ExtremeTuxRacer - Tux lies on his belly and accelerates down ice slopes.
     '';
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     homepage = "https://sourceforge.net/projects/extremetuxracer/";
-    maintainers = with stdenv.lib.maintainers; [ ];
-    platforms = with stdenv.lib.platforms; linux;
+    maintainers = with lib.maintainers; [ ];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/exult/arch.patch b/pkgs/games/exult/arch.patch
deleted file mode 100644
index 70de34184a2..00000000000
--- a/pkgs/games/exult/arch.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-diff -aur exult-1.4.9rc1.orig/desktop/exult.desktop exult-1.4.9rc1/desktop/exult.desktop
---- exult-1.4.9rc1.orig/desktop/exult.desktop	2008-07-11 05:41:06.000000000 +0600
-+++ exult-1.4.9rc1/desktop/exult.desktop	2012-05-19 13:15:30.616084585 +0600
-@@ -1,9 +1,8 @@
- [Desktop Entry]
--Encoding=UTF-8
- Name=Exult
- Comment=Exult Ultima 7 Engine
- Exec=exult
--Icon=exult.png
-+Icon=exult
- Terminal=false
- Type=Application
--Categories=Application;Game;RolePlaying;
-+Categories=Game;RolePlaying;
-diff -aur exult-1.4.9rc1.orig/files/databuf.h exult-1.4.9rc1/files/databuf.h
---- exult-1.4.9rc1.orig/files/databuf.h	2010-03-10 09:07:05.000000000 +0500
-+++ exult-1.4.9rc1/files/databuf.h	2012-05-19 12:50:16.856076030 +0600
-@@ -18,6 +18,7 @@
- #define DATA_H
- 
- #include <cstdio>
-+#include <cstddef>
- #include <cstring>
- #include <cassert>
- #include <fstream>
-diff -aur exult-1.4.9rc1.orig/files/U7obj.h exult-1.4.9rc1/files/U7obj.h
---- exult-1.4.9rc1.orig/files/U7obj.h	2010-02-25 07:52:07.000000000 +0500
-+++ exult-1.4.9rc1/files/U7obj.h	2012-05-19 12:50:35.916076137 +0600
-@@ -26,6 +26,7 @@
- #include <string>
- #include <vector>
- #include <cstring>
-+#include <cstddef>
- #include "common_types.h"
- #include "utils.h"
- 
-diff -aur exult-1.4.9rc1.orig/imagewin/manip.h exult-1.4.9rc1/imagewin/manip.h
---- exult-1.4.9rc1.orig/imagewin/manip.h	2010-08-29 20:26:00.000000000 +0600
-+++ exult-1.4.9rc1/imagewin/manip.h	2012-05-19 13:02:45.159413596 +0600
-@@ -319,7 +319,7 @@
- 	static uintD copy(uintS src)
- 	{
- 		unsigned int r, g, b;
--		split_source(src,r,g,b);
-+		ManipBaseSrc<color_s,color_d>::split_source(src,r,g,b);
- 		return ManipBaseDest<color_d>::rgb(r,g,b);
- 	}
- 	static void copy(uintD& dest, uintS src)
-diff -aur exult-1.4.9rc1.orig/istring.h exult-1.4.9rc1/istring.h
---- exult-1.4.9rc1.orig/istring.h	2005-06-07 15:55:39.000000000 +0600
-+++ exult-1.4.9rc1/istring.h	2012-05-19 13:01:14.886079750 +0600
-@@ -162,19 +162,19 @@
- 
- 	_Myt& operator+=(const _Myt& _Right)
- 		{	// append _Right
--		append(_Right);
-+		this->append(_Right);
- 		return (*this);
- 		}
- 
- 	_Myt& operator+=(const _Elem *_Ptr)
- 		{	// append [_Ptr, <null>)
--		append(_Ptr);
-+		this->append(_Ptr);
- 		return (*this);
- 		}
- 
- 	_Myt& operator+=(_Elem _Ch)
- 		{	// append 1 * _Ch
--		append(static_cast<size_type>(1), _Ch);
-+		this->append(static_cast<size_type>(1), _Ch);
- 		return (*this);
- 		}
- 
-diff -aur exult-1.4.9rc1.orig/shapes/pngio.cc exult-1.4.9rc1/shapes/pngio.cc
---- exult-1.4.9rc1.orig/shapes/pngio.cc	2010-02-15 18:48:11.000000000 -0200
-+++ exult-1.4.9rc1/shapes/pngio.cc	2013-09-22 20:56:37.809763588 -0300
-@@ -26,6 +26,7 @@
- #ifdef HAVE_CONFIG_H
- #  include <config.h>
- #endif
-+#include <string.h>
- 
- #ifdef HAVE_PNG_H
- 
-@@ -79,7 +80,7 @@
- 		}
- 					// Allocate info. structure.
- 	png_infop info = png_create_info_struct(png);
--	if (setjmp(png->jmpbuf))	// Handle errors.
-+	if (setjmp(png_jmpbuf(png)))	// Handle errors.
- 		{
- 		png_destroy_read_struct(&png, &info, 0);
- 		fclose(fp);
-@@ -208,7 +209,7 @@
- 		}
- 					// Allocate info. structure.
- 	png_infop info = png_create_info_struct(png);
--	if (setjmp(png->jmpbuf))	// Handle errors.
-+	if (setjmp(png_jmpbuf(png)))	// Handle errors.
- 		{
- 		png_destroy_write_struct(&png, &info);
- 		fclose(fp);
-@@ -306,7 +307,7 @@
- 		}
- 					// Allocate info. structure.
- 	png_infop info = png_create_info_struct(png);
--	if (setjmp(png->jmpbuf))	// Handle errors.
-+	if (setjmp(png_jmpbuf(png)))	// Handle errors.
- 		{
- 		png_destroy_read_struct(&png, &info, 0);
- 		fclose(fp);
-@@ -395,7 +396,7 @@
- 		}
- 					// Allocate info. structure.
- 	png_infop info = png_create_info_struct(png);
--	if (setjmp(png->jmpbuf))	// Handle errors.
-+	if (setjmp(png_jmpbuf(png)))	// Handle errors.
- 		{
- 		png_destroy_write_struct(&png, &info);
- 		fclose(fp);
-
diff --git a/pkgs/games/exult/default.nix b/pkgs/games/exult/default.nix
index e735c9c5817..fe401a627b5 100644
--- a/pkgs/games/exult/default.nix
+++ b/pkgs/games/exult/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, pkgconfig, SDL, libogg, libvorbis, zlib, unzip }:
+{ lib, stdenv, fetchurl, pkg-config, SDL2, libogg, libvorbis, zlib, unzip }:
 
 let
 
@@ -12,27 +12,21 @@ let
 in
 
 stdenv.mkDerivation rec {
-  name = "exult-1.4.9rc1";
+  pname = "exult";
+  version = "1.6";
 
   src = fetchurl {
-    url = "mirror://sourceforge/exult/${name}.tar.gz";
-    sha256 = "0a03a2l3ji6h48n106d4w55l8v6lni1axniafnvvv5c5n3nz5bgd";
+    url = "mirror://sourceforge/exult/exult-${version}.tar.gz";
+    sha256 = "1dm27qkxj30567zb70q4acddsizn0xyi3z87hg7lysxdkyv49s3s";
   };
 
   configureFlags = [ "--disable-tools" ];
 
-  patches =
-    [ # Arch Linux patch set.
-      ./arch.patch
-    ];
-
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ SDL libogg libvorbis zlib unzip ];
+  nativeBuildInputs = [ pkg-config unzip ];
+  buildInputs = [ SDL2 libogg libvorbis zlib ];
 
   enableParallelBuilding = true;
 
-  makeFlags = [ "DESTDIR=$(out)" ];
-
   NIX_LDFLAGS = "-lX11";
 
   postInstall =
@@ -45,9 +39,9 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://exult.sourceforge.net/";
     description = "A reimplementation of the Ultima VII game engine";
-    maintainers = [ stdenv.lib.maintainers.eelco ];
-    platforms = stdenv.lib.platforms.unix;
-    hydraPlatforms = stdenv.lib.platforms.linux; # darwin times out
-    license = stdenv.lib.licenses.gpl2Plus;
+    maintainers = [ lib.maintainers.eelco ];
+    platforms = lib.platforms.unix;
+    hydraPlatforms = lib.platforms.linux; # darwin times out
+    license = lib.licenses.gpl2Plus;
   };
 }
diff --git a/pkgs/games/ezquake/default.nix b/pkgs/games/ezquake/default.nix
index 83dadb7192c..90ddb6d6452 100644
--- a/pkgs/games/ezquake/default.nix
+++ b/pkgs/games/ezquake/default.nix
@@ -1,24 +1,24 @@
-{ stdenv, fetchFromGitHub, curl, expat
+{ lib, stdenv, fetchFromGitHub, curl, expat
 , jansson, libpng, libjpeg, libGLU, libGL, libXxf86vm, pcre
-, pkgconfig, SDL2, vim, speex }:
+, pkg-config, SDL2, vim, speex }:
 
 stdenv.mkDerivation rec {
   pname = "ezquake";
-  version = "3.2";
+  version = "3.2.3";
 
   src = fetchFromGitHub {
     owner = "ezQuake";
     repo = pname + "-source";
     rev = version;
-    sha256 = "11kyrqpc8w393kvfz2p2h2m7k8rm4w644m86w733b8w157f2fsk0";
+    sha256 = "sha256-EBhKmoX11JavTG6tPfg15FY2lqOFfzSDg3058OWfcYQ=";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [
     expat curl jansson libpng libjpeg libGLU libGL libXxf86vm pcre SDL2 vim speex
   ];
 
-  installPhase = with stdenv.lib; let
+  installPhase = with lib; let
     sys = last (splitString "-" stdenv.hostPlatform.system);
     arch = head (splitString "-" stdenv.hostPlatform.system);
   in ''
@@ -29,7 +29,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://ezquake.github.io/";
     description = "A modern QuakeWorld client focused on competitive online play";
     license = licenses.gpl2;
diff --git a/pkgs/games/factorio/default.nix b/pkgs/games/factorio/default.nix
index 0226acf1604..9798d659322 100644
--- a/pkgs/games/factorio/default.nix
+++ b/pkgs/games/factorio/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchurl, makeWrapper, makeDesktopItem
-, alsaLib, libpulseaudio, libX11, libXcursor, libXinerama, libXrandr, libXi, libGL
+{ lib, stdenv, fetchurl, makeWrapper, makeDesktopItem
+, alsa-lib, libpulseaudio, libX11, libXcursor, libXinerama, libXrandr, libXi, libGL
 , libSM, libICE, libXext, factorio-utils
 , releaseType
 , mods ? []
@@ -13,6 +13,8 @@ assert releaseType == "alpha"
 
 let
 
+  inherit (lib) importJSON;
+
   helpMsg = ''
 
     ===FETCH FAILED===
@@ -40,7 +42,7 @@ let
 
       releaseType=alpha
       version=0.17.74
-      nix-prefetch-url file://$HOME/Downloads/factorio_\''${releaseType}_x64_\''${version}.tar.xz --name factorio_\''${releaseType}_x64-\''${version}.tar.xz
+      nix-prefetch-url file://\''$HOME/Downloads/factorio_\''${releaseType}_x64_\''${version}.tar.xz --name factorio_\''${releaseType}_x64-\''${version}.tar.xz
 
     Note the ultimate "_" is replaced with "-" in the --name arg!
   '';
@@ -59,67 +61,54 @@ let
 
   # NB `experimental` directs us to take the latest build, regardless of its branch;
   # hence the (stable, experimental) pairs may sometimes refer to the same distributable.
-  binDists = {
-    x86_64-linux = let bdist = bdistForArch { inUrl = "linux64"; inTar = "x64"; }; in {
-      alpha = {
-        stable        = bdist { sha256 = "0zixscff0svpb0yg8nzczp2z4filqqxi1k0z0nrpzn2hhzhf1464"; version = "1.0.0"; withAuth = true; };
-        experimental  = bdist { sha256 = "0zixscff0svpb0yg8nzczp2z4filqqxi1k0z0nrpzn2hhzhf1464"; version = "1.0.0"; withAuth = true; };
-      };
-      headless = {
-        stable        = bdist { sha256 = "0r0lplns8nxna2viv8qyx9mp4cckdvx6k20w2g2fwnj3jjmf3nc1"; version = "1.0.0"; };
-        experimental  = bdist { sha256 = "0r0lplns8nxna2viv8qyx9mp4cckdvx6k20w2g2fwnj3jjmf3nc1"; version = "1.0.0"; };
-      };
-      demo = {
-        stable        = bdist { sha256 = "0h9cqbp143w47zcl4qg4skns4cngq0k40s5jwbk0wi5asjz8whqn"; version = "1.0.0"; };
-      };
-    };
-    i686-linux = let bdist = bdistForArch { inUrl = "linux32"; inTar = "i386"; }; in {
-      alpha = {
-        stable        = bdist { sha256 = "0nnfkxxqnywx1z05xnndgh71gp4izmwdk026nnjih74m2k5j086l"; version = "0.14.23"; withAuth = true; nameMut = asGz; };
-      };
-    };
-  };
+  versions = importJSON ./versions.json;
+  binDists = makeBinDists versions;
 
   actual = binDists.${stdenv.hostPlatform.system}.${releaseType}.${branch} or (throw "Factorio ${releaseType}-${branch} binaries for ${stdenv.hostPlatform.system} are not available for download.");
 
-  bdistForArch = arch: { version
-                       , sha256
-                       , withAuth ? false
-                       , nameMut ? x: x
-                       }:
-    let
-      url = "https://factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}";
-      name = nameMut "factorio_${releaseType}_${arch.inTar}-${version}.tar.xz";
-    in {
-      inherit version arch;
-      src =
-        if withAuth then
-          (stdenv.lib.overrideDerivation
-            (fetchurl {
-              inherit name url sha256;
-              curlOpts = [
-                "--get"
-                "--data-urlencode" "username@username"
-                "--data-urlencode" "token@token"
-              ];
-            })
-            (_: { # This preHook hides the credentials from /proc
-                  preHook = ''
+  makeBinDists = versions:
+    let f = path: name: value:
+      if builtins.isAttrs value then
+        if value ? "name" then
+          makeBinDist value
+        else
+          builtins.mapAttrs (f (path ++ [ name ])) value
+      else
+        throw "expected attrset at ${toString path} - got ${toString value}";
+    in
+      builtins.mapAttrs (f []) versions;
+  makeBinDist = { name, version, tarDirectory, url, sha256, needsAuth }: {
+    inherit version tarDirectory;
+    src =
+      if !needsAuth then
+        fetchurl { inherit name url sha256; }
+      else
+        (lib.overrideDerivation
+          (fetchurl {
+            inherit name url sha256;
+            curlOpts = [
+              "--get"
+              "--data-urlencode" "username@username"
+              "--data-urlencode" "token@token"
+            ];
+          })
+          (_: { # This preHook hides the credentials from /proc
+                preHook =
+                  if username != "" && token != "" then ''
                     echo -n "${username}" >username
                     echo -n "${token}"    >token
+                  '' else ''
+                    # Deliberately failing since username/token was not provided, so we can't fetch.
+                    # We can't use builtins.throw since we want the result to be used if the tar is in the store already.
+                    exit 1
                   '';
-                  failureHook = ''
-                    cat <<EOF
-                    ${helpMsg}
-                    EOF
-                  '';
-            })
-          )
-        else
-          fetchurl { inherit name url sha256; };
-    };
-
-  asGz = builtins.replaceStrings [".xz"] [".gz"];
+                failureHook = ''
+                  cat <<EOF
+                  ${helpMsg}
+                  EOF
+                '';
+              }));
+  };
 
   configBaseCfg = ''
     use-system-read-write-data-directories=false
@@ -154,12 +143,16 @@ let
     installPhase = ''
       mkdir -p $out/{bin,share/factorio}
       cp -a data $out/share/factorio
-      cp -a bin/${arch.inTar}/factorio $out/bin/factorio
+      cp -a bin/${tarDirectory}/factorio $out/bin/factorio
       patchelf \
         --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
         $out/bin/factorio
     '';
 
+    passthru.updateScript = if (username != "" && token != "") then [
+      ./update.py "--username=${username}" "--token=${token}"
+    ] else null;
+
     meta = {
       description = "A game in which you build and maintain factories";
       longDescription = ''
@@ -171,13 +164,13 @@ let
         ingenious structures, apply management skills to keep it working and
         finally protect it from the creatures who don't really like you.
 
-        Factorio has been in development since spring of 2012 and it is
-        currently in late alpha.
+        Factorio has been in development since spring of 2012, and reached
+        version 1.0 in mid 2020.
       '';
       homepage = "https://www.factorio.com/";
-      license = stdenv.lib.licenses.unfree;
-      maintainers = with stdenv.lib.maintainers; [ Baughn elitak erictapen priegger ];
-      platforms = [ "i686-linux" "x86_64-linux" ];
+      license = lib.licenses.unfree;
+      maintainers = with lib.maintainers; [ Baughn elitak erictapen priegger lukegb ];
+      platforms = [ "x86_64-linux" ];
     };
   };
 
@@ -185,10 +178,11 @@ let
     headless = base;
     demo = base // {
 
-      buildInputs = [ makeWrapper libpulseaudio ];
+      nativeBuildInputs = [ makeWrapper ];
+      buildInputs = [ libpulseaudio ];
 
-      libPath = stdenv.lib.makeLibraryPath [
-        alsaLib
+      libPath = lib.makeLibraryPath [
+        alsa-lib
         libpulseaudio
         libX11
         libXcursor
diff --git a/pkgs/games/factorio/mods.nix b/pkgs/games/factorio/mods.nix
index 5c9b4f0628a..7327b9e2287 100644
--- a/pkgs/games/factorio/mods.nix
+++ b/pkgs/games/factorio/mods.nix
@@ -2,12 +2,12 @@
 # mods. It will eventually be replaced by a nixos-channel that will provide
 # derivations for most or all of the mods tracked through the official mod
 # manager site.
-{ stdenv, fetchurl
+{ lib, fetchurl
 , factorio-utils
 , allRecommendedMods ? true
 , allOptionalMods ? false
 }:
-with stdenv.lib;
+with lib;
 let
   modDrv = factorio-utils.modDrv { inherit allRecommendedMods allOptionalMods; };
 in
diff --git a/pkgs/games/factorio/update.py b/pkgs/games/factorio/update.py
new file mode 100755
index 00000000000..3806ba3614f
--- /dev/null
+++ b/pkgs/games/factorio/update.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i python -p "python3.withPackages (ps: with ps; [ ps.absl-py ps.requests ])" nix
+
+from collections import defaultdict
+import copy
+from dataclasses import dataclass
+import json
+import os.path
+import subprocess
+from typing import Callable, Dict
+
+from absl import app
+from absl import flags
+from absl import logging
+import requests
+
+
+FACTORIO_API = "https://factorio.com/api/latest-releases"
+
+
+FLAGS = flags.FLAGS
+
+flags.DEFINE_string('username', '', 'Factorio username for retrieving binaries.')
+flags.DEFINE_string('token', '', 'Factorio token for retrieving binaries.')
+flags.DEFINE_string('out', '', 'Output path for versions.json.')
+
+
+@dataclass
+class System:
+    nix_name: str
+    url_name: str
+    tar_name: str
+
+
+@dataclass
+class ReleaseType:
+    name: str
+    needs_auth: bool = False
+
+
+@dataclass
+class ReleaseChannel:
+    name: str
+
+
+FactorioVersionsJSON = Dict[str, Dict[str, str]]
+OurVersionJSON = Dict[str, Dict[str, Dict[str, Dict[str, str]]]]
+
+
+SYSTEMS = [
+    System(nix_name="x86_64-linux", url_name="linux64", tar_name="x64"),
+]
+
+RELEASE_TYPES = [
+    ReleaseType("alpha", needs_auth=True),
+    ReleaseType("demo"),
+    ReleaseType("headless"),
+]
+
+RELEASE_CHANNELS = [
+    ReleaseChannel("experimental"),
+    ReleaseChannel("stable"),
+]
+
+
+def find_versions_json() -> str:
+    if FLAGS.out:
+        return out
+    try_paths = ["pkgs/games/factorio/versions.json", "versions.json"]
+    for path in try_paths:
+        if os.path.exists(path):
+            return path
+    raise Exception("Couldn't figure out where to write versions.json; try specifying --out")
+
+
+def fetch_versions() -> FactorioVersionsJSON:
+    return json.loads(requests.get("https://factorio.com/api/latest-releases").text)
+
+
+def generate_our_versions(factorio_versions: FactorioVersionsJSON) -> OurVersionJSON:
+    rec_dd = lambda: defaultdict(rec_dd)
+    output = rec_dd()
+
+    # Deal with times where there's no experimental version
+    for rc in RELEASE_CHANNELS:
+        if not factorio_versions[rc.name]:
+            factorio_versions[rc.name] = factorio_versions['stable']
+
+    for system in SYSTEMS:
+        for release_type in RELEASE_TYPES:
+            for release_channel in RELEASE_CHANNELS:
+                version = factorio_versions[release_channel.name][release_type.name]
+                this_release = {
+                    "name":         f"factorio_{release_type.name}_{system.tar_name}-{version}.tar.xz",
+                    "url":          f"https://factorio.com/get-download/{version}/{release_type.name}/{system.url_name}",
+                    "version":      version,
+                    "needsAuth":    release_type.needs_auth,
+                    "tarDirectory": system.tar_name,
+                }
+                output[system.nix_name][release_type.name][release_channel.name] = this_release
+    return output
+
+
+def iter_version(versions: OurVersionJSON, it: Callable[[str, str, str, Dict[str, str]], Dict[str, str]]) -> OurVersionJSON:
+    versions = copy.deepcopy(versions)
+    for system_name, system in versions.items():
+        for release_type_name, release_type in system.items():
+            for release_channel_name, release in release_type.items():
+                release_type[release_channel_name] = it(system_name, release_type_name, release_channel_name, dict(release))
+    return versions
+
+
+def merge_versions(old: OurVersionJSON, new: OurVersionJSON) -> OurVersionJSON:
+    """Copies already-known hashes from version.json to avoid having to re-fetch."""
+    def _merge_version(system_name: str, release_type_name: str, release_channel_name: str, release: Dict[str, str]) -> Dict[str, str]:
+        old_system = old.get(system_name, {})
+        old_release_type = old_system.get(release_type_name, {})
+        old_release = old_release_type.get(release_channel_name, {})
+        if not "sha256" in old_release:
+            logging.info("%s/%s/%s: not copying sha256 since it's missing", system_name, release_type_name, release_channel_name)
+            return release
+        if not all(old_release.get(k, None) == release[k] for k in ['name', 'version', 'url']):
+            logging.info("%s/%s/%s: not copying sha256 due to mismatch", system_name, release_type_name, release_channel_name)
+            return release
+        release["sha256"] = old_release["sha256"]
+        return release
+    return iter_version(new, _merge_version)
+
+
+def nix_prefetch_url(name: str, url: str, algo: str = 'sha256') -> str:
+    cmd = ['nix-prefetch-url', '--type', algo, '--name', name, url]
+    logging.info('running %s', cmd)
+    out = subprocess.check_output(cmd)
+    return out.decode('utf-8').strip()
+
+
+def fill_in_hash(versions: OurVersionJSON) -> OurVersionJSON:
+    """Fill in sha256 hashes for anything missing them."""
+    urls_to_hash = {}
+    def _fill_in_hash(system_name: str, release_type_name: str, release_channel_name: str, release: Dict[str, str]) -> Dict[str, str]:
+        if "sha256" in release:
+            logging.info("%s/%s/%s: skipping fetch, sha256 already present", system_name, release_type_name, release_channel_name)
+            return release
+        url = release["url"]
+        if url in urls_to_hash:
+            logging.info("%s/%s/%s: found url %s in cache", system_name, release_type_name, release_channel_name, url)
+            release["sha256"] = urls_to_hash[url]
+            return release
+        logging.info("%s/%s/%s: fetching %s", system_name, release_type_name, release_channel_name, url)
+        if release["needsAuth"]:
+            if not FLAGS.username or not FLAGS.token:
+                raise Exception("fetching %s/%s/%s from %s requires --username and --token" % (system_name, release_type_name, release_channel_name, url))
+            url += f"?username={FLAGS.username}&token={FLAGS.token}"
+        release["sha256"] = nix_prefetch_url(release["name"], url)
+        urls_to_hash[url] = release["sha256"]
+        return release
+    return iter_version(versions, _fill_in_hash)
+
+
+def main(argv):
+    factorio_versions = fetch_versions()
+    new_our_versions = generate_our_versions(factorio_versions)
+    old_our_versions = None
+    our_versions_path = find_versions_json()
+    if our_versions_path:
+        logging.info('Loading old versions.json from %s', our_versions_path)
+        with open(our_versions_path, 'r') as f:
+            old_our_versions = json.load(f)
+    if old_our_versions:
+        logging.info('Merging in old hashes')
+        new_our_versions = merge_versions(old_our_versions, new_our_versions)
+    logging.info('Fetching necessary tars to get hashes')
+    new_our_versions = fill_in_hash(new_our_versions)
+    with open(our_versions_path, 'w') as f:
+        logging.info('Writing versions.json to %s', our_versions_path)
+        json.dump(new_our_versions, f, sort_keys=True, indent=2)
+        f.write("\n")
+
+if __name__ == '__main__':
+    app.run(main)
diff --git a/pkgs/games/factorio/utils.nix b/pkgs/games/factorio/utils.nix
index 2764592a324..be5b7fd5ecc 100644
--- a/pkgs/games/factorio/utils.nix
+++ b/pkgs/games/factorio/utils.nix
@@ -1,7 +1,7 @@
 # This file provides a top-level function that will be used by both nixpkgs and nixos
 # to generate mod directories for use at runtime by factorio.
-{ stdenv }:
-with stdenv.lib;
+{ lib, stdenv }:
+with lib;
 {
   mkModDirDrv = mods: # a list of mod derivations
     let
diff --git a/pkgs/games/factorio/versions.json b/pkgs/games/factorio/versions.json
new file mode 100644
index 00000000000..500181ff70e
--- /dev/null
+++ b/pkgs/games/factorio/versions.json
@@ -0,0 +1,58 @@
+{
+  "x86_64-linux": {
+    "alpha": {
+      "experimental": {
+        "name": "factorio_alpha_x64-1.1.36.tar.xz",
+        "needsAuth": true,
+        "sha256": "1x9a2lv6zbqawqlxg8bcbx04hjy0pq40macfa4sqi8w6h14wgww8",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.36/alpha/linux64",
+        "version": "1.1.36"
+      },
+      "stable": {
+        "name": "factorio_alpha_x64-1.1.36.tar.xz",
+        "needsAuth": true,
+        "sha256": "1x9a2lv6zbqawqlxg8bcbx04hjy0pq40macfa4sqi8w6h14wgww8",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.36/alpha/linux64",
+        "version": "1.1.36"
+      }
+    },
+    "demo": {
+      "experimental": {
+        "name": "factorio_demo_x64-1.1.35.tar.xz",
+        "needsAuth": false,
+        "sha256": "0yqb4gf2avpxr4vwafws9pv74xyd9g84zggfikfc801ldc7sp29f",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.35/demo/linux64",
+        "version": "1.1.35"
+      },
+      "stable": {
+        "name": "factorio_demo_x64-1.1.36.tar.xz",
+        "needsAuth": false,
+        "sha256": "15fl4pza7n107rrmmdm26kkc12fnrmpn6rjb4ampgzqzn1fq854s",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.36/demo/linux64",
+        "version": "1.1.36"
+      }
+    },
+    "headless": {
+      "experimental": {
+        "name": "factorio_headless_x64-1.1.36.tar.xz",
+        "needsAuth": false,
+        "sha256": "1s8g030xp5nrlmnn21frrd8n4nd7jjmb5hbpj1vhxjrk6vpijh24",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.36/headless/linux64",
+        "version": "1.1.36"
+      },
+      "stable": {
+        "name": "factorio_headless_x64-1.1.36.tar.xz",
+        "needsAuth": false,
+        "sha256": "1s8g030xp5nrlmnn21frrd8n4nd7jjmb5hbpj1vhxjrk6vpijh24",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.36/headless/linux64",
+        "version": "1.1.36"
+      }
+    }
+  }
+}
diff --git a/pkgs/games/fairymax/default.nix b/pkgs/games/fairymax/default.nix
index b5e3afa9e3b..49a91e7a64d 100644
--- a/pkgs/games/fairymax/default.nix
+++ b/pkgs/games/fairymax/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl}:
+{lib, stdenv, fetchurl}:
 stdenv.mkDerivation rec {
   pname = "fairymax";
   version = "4.8";
@@ -15,7 +15,7 @@ stdenv.mkDerivation rec {
     cp ${ini} fmax.ini
   '';
   buildPhase = ''
-    gcc *.c -o fairymax -DINI_FILE='"'"$out/share/fairymax/fmax.ini"'"'
+    $CC *.c -Wno-return-type -o fairymax -DINI_FILE='"'"$out/share/fairymax/fmax.ini"'"'
   '';
   installPhase = ''
     mkdir -p "$out"/{bin,share/fairymax}
@@ -23,8 +23,7 @@ stdenv.mkDerivation rec {
     cp fmax.ini "$out/share/fairymax"
   '';
   meta = {
-    inherit version;
-    description = ''A small chess engine supporting fairy pieces'';
+    description = "A small chess engine supporting fairy pieces";
     longDescription = ''
        A version of micro-Max that reads the piece description
        from a file fmax.ini, so that arbitrary fairy pieces can be
@@ -32,9 +31,9 @@ stdenv.mkDerivation rec {
        and board sizes up to 12x8. A Linux port exists in the
        format of a debian package.
     '';
-    license = stdenv.lib.licenses.free ;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.free ;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.all;
     homepage = "http://home.hccnet.nl/h.g.muller/dwnldpage.html";
   };
 }
diff --git a/pkgs/games/fheroes2/default.nix b/pkgs/games/fheroes2/default.nix
new file mode 100644
index 00000000000..ea154db121e
--- /dev/null
+++ b/pkgs/games/fheroes2/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, fetchFromGitHub
+, gettext, libpng, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fheroes2";
+  version = "0.9.5";
+
+  src = fetchFromGitHub {
+    owner = "ihhub";
+    repo = "fheroes2";
+    rev = version;
+    sha256 = "sha256-fqV2u6vChzU8387aQGf3OKeiWX188GouYZr4ZUmXWxs=";
+  };
+
+  buildInputs = [ gettext libpng SDL2 SDL2_image SDL2_mixer SDL2_ttf zlib ];
+
+  makeFlags = [
+    "FHEROES2_STRICT_COMPILATION=1"
+    "RELEASE=1"
+  ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 $PWD/src/dist/fheroes2 $out/bin/fheroes2
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ihhub/fheroes2";
+    description = "Free implementation of Heroes of Might and Magic II game engine";
+    longDescription = ''
+        In order to play this game, an original game data is required.
+        Please refer to README of the project for instructions.
+        On linux, the data can be placed in ~/.local/share/fheroes2 folder.
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = [ maintainers.karolchmist ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/fish-fillets-ng/default.nix b/pkgs/games/fish-fillets-ng/default.nix
index 638bf59fc78..5ddad7fda4c 100644
--- a/pkgs/games/fish-fillets-ng/default.nix
+++ b/pkgs/games/fish-fillets-ng/default.nix
@@ -1,7 +1,9 @@
-{stdenv, fetchurl, SDL, lua5_1, pkgconfig, SDL_mixer, SDL_image, SDL_ttf}:
+{ lib, stdenv, fetchurl, makeDesktopItem, copyDesktopItems, SDL, lua5_1, pkg-config, SDL_mixer, SDL_image, SDL_ttf }:
+
 stdenv.mkDerivation rec {
   pname = "fish-fillets-ng";
   version = "1.0.1";
+
   src = fetchurl {
     url = "mirror://sourceforge/fillets/fillets-ng-${version}.tar.gz";
     sha256 = "1nljp75aqqb35qq3x7abhs2kp69vjcj0h1vxcpdyn2yn2nalv6ij";
@@ -10,18 +12,30 @@ stdenv.mkDerivation rec {
     url = "mirror://sourceforge/fillets/fillets-ng-data-${version}.tar.gz";
     sha256 = "169p0yqh2gxvhdilvjc2ld8aap7lv2nhkhkg4i1hlmgc6pxpkjgh";
   };
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [SDL lua5_1 SDL_mixer SDL_image SDL_ttf];
-  postInstall=''
-    mkdir -p "$out/share/games/fillets-ng/"
-    tar -xf ${data} -C "$out/share/games/fillets-ng/" --strip-components=1
+
+  nativeBuildInputs = [ pkg-config copyDesktopItems ];
+  buildInputs = [ SDL lua5_1 SDL_mixer SDL_image SDL_ttf ];
+
+  desktopItems = [ (makeDesktopItem {
+    name = "fish-fillets-ng";
+    exec = "fillets";
+    icon = "fish-fillets-ng";
+    desktopName = "Fish Fillets";
+    comment     = "Puzzle game about witty fish saving the world sokoban-style";
+    categories  = "Game;LogicGame;";
+  }) ];
+
+  postInstall = ''
+    mkdir -p $out/share/games/fillets-ng
+    tar -xf ${data} -C $out/share/games/fillets-ng --strip-components=1
+    install -Dm644 ${./icon.xpm} $out/share/pixmaps/fish-fillets-ng.xpm
   '';
-  meta = {
-    inherit version;
-    description = ''A puzzle game'';
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+
+  meta = with lib; {
+    description = "A puzzle game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
     homepage = "http://fillets.sourceforge.net/";
   };
 }
diff --git a/pkgs/games/fish-fillets-ng/icon.xpm b/pkgs/games/fish-fillets-ng/icon.xpm
new file mode 100644
index 00000000000..9947c54e7e5
--- /dev/null
+++ b/pkgs/games/fish-fillets-ng/icon.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char * fillets_ng_xpm[] = {
+"32 32 4 1",
+"   c None",
+".  c #000000",
+"+  c #808000",
+"@  c #FFFF00",
+"           ..........           ",
+"         ...+@@@@@@+...         ",
+"       ...@@@@@@@@@@@@...       ",
+"      ..+@@@+......+@@@+..      ",
+"     ..@@@+..........+@@@..     ",
+"    ..@@@..............@@@..    ",
+"   ..@@@................@@@..   ",
+"  ..@@@..................@@@..  ",
+"  .+@@....................@@+.  ",
+" ..@@......................@@.. ",
+" .@@+......................+@@. ",
+"..@@.....@@@@@.........@@...@@..",
+".+@+...@@@@@@@@@.....@@@@...+@+.",
+".@@...@@@.....@@@...@@+@@....@@.",
+".@@...@@.+@....+@@+@@+.@@....@@.",
+".@@..@@..@@.....+@@@+..@@....@@.",
+".@@..@@.........+@@@+..@@....@@.",
+".@@...@@.......+@@+@@+.@@....@@.",
+".@@...@@@.....@@@...@@+@@....@@.",
+".+@+...@@@@@@@@@.....@@@@...+@+.",
+"..@@.....@@@@@.........@@...@@..",
+" .@@+......................+@@. ",
+" ..@@......................@@.. ",
+"  .+@@....................@@+.  ",
+"  ..@@@..................@@@..  ",
+"   ..@@@................@@@..   ",
+"    ..@@@..............@@@..    ",
+"     ..@@@+..........+@@@..     ",
+"      ..+@@@+......+@@@+..      ",
+"       ...@@@@@@@@@@@@...       ",
+"         ...+@@@@@@+...         ",
+"           ..........           "};
diff --git a/pkgs/games/flare/default.nix b/pkgs/games/flare/default.nix
index 2058abebb55..8cd70aed614 100644
--- a/pkgs/games/flare/default.nix
+++ b/pkgs/games/flare/default.nix
@@ -1,14 +1,14 @@
 { lib, buildEnv, callPackage, makeWrapper, Cocoa }:
 
 buildEnv {
-  name = "flare-1.11";
+  name = "flare-1.12rc2";
 
   paths = [
     (callPackage ./engine.nix { inherit Cocoa; })
     (callPackage ./game.nix {})
   ];
 
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
   postBuild = ''
     mkdir -p $out/bin
     makeWrapper $out/games/flare $out/bin/flare --run "cd $out/share/games/flare"
diff --git a/pkgs/games/flare/desktop.patch b/pkgs/games/flare/desktop.patch
new file mode 100644
index 00000000000..1ef3c21d010
--- /dev/null
+++ b/pkgs/games/flare/desktop.patch
@@ -0,0 +1,15 @@
+diff --git a/distribution/flare.desktop.in b/distribution/flare.desktop.in
+index c740e2a6..eef91a89 100644
+--- a/distribution/flare.desktop.in
++++ b/distribution/flare.desktop.in
+@@ -14,8 +14,8 @@ Comment[fr]=Un jeu de rôle d'action monojoueur en 2D isométrique
+ Comment[gl]=Xogo individual de acción e rol cunha vista isométrica en dúas dimensións.
+ Comment[ru]=Изометрический ролевой боевик для одного игрока
+ Comment[uk]=Ізометричний рольовий екшн (Action/RPG) для одного гравця
+-TryExec=@FLARE_EXECUTABLE_PATH@
+-Exec=@FLARE_EXECUTABLE_PATH@
++TryExec=flare
++Exec=flare
+ Categories=Game;RolePlaying;
+ Icon=flare
+ Terminal=false
diff --git a/pkgs/games/flare/engine.nix b/pkgs/games/flare/engine.nix
index 74f983c6441..1f1f35a3762 100644
--- a/pkgs/games/flare/engine.nix
+++ b/pkgs/games/flare/engine.nix
@@ -1,21 +1,23 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, Cocoa }:
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, Cocoa }:
 
 stdenv.mkDerivation rec {
   pname = "flare-engine";
-  version = "1.11";
+  version = "1.12rc2";
 
   src = fetchFromGitHub {
     owner = "flareteam";
     repo = pname;
     rev = "v${version}";
-    sha256 = "1j6raymz128miq517h9drks4gj79dajw3lsr0msqxz0z3zm6cc4n";
+    sha256 = "10il9dpbcka1w5glmhv48bqwww44csmhq426lvsc7z84444gvvgq";
   };
 
+  patches = [ ./desktop.patch ];
+
   nativeBuildInputs = [ cmake ];
   buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf ]
-    ++ stdenv.lib.optional stdenv.isDarwin Cocoa;
+    ++ lib.optional stdenv.isDarwin Cocoa;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Free/Libre Action Roleplaying Engine";
     homepage = "https://github.com/flareteam/flare-engine";
     maintainers = [ maintainers.aanderse ];
diff --git a/pkgs/games/flare/game.nix b/pkgs/games/flare/game.nix
index 6a231a5ff7d..10e27b4d39c 100644
--- a/pkgs/games/flare/game.nix
+++ b/pkgs/games/flare/game.nix
@@ -1,19 +1,19 @@
-{ stdenv, fetchFromGitHub, cmake }:
+{ lib, stdenv, fetchFromGitHub, cmake }:
 
 stdenv.mkDerivation rec {
   pname = "flare-game";
-  version = "1.11";
+  version = "1.12rc2";
 
   src = fetchFromGitHub {
     owner = "flareteam";
     repo = pname;
     rev = "v${version}";
-    sha256 = "18m2qfbbaqklm20gnr7wzrwbmylp1jh781a4p1dq0hymqcg92x5l";
+    sha256 = "0k9fnbaqfgmih8bd0sh3kbk6f6v74i95wrbkij48gp48pq8yqbf9";
   };
 
   nativeBuildInputs = [ cmake ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fantasy action RPG using the FLARE engine";
     homepage = "https://github.com/flareteam/flare-game";
     maintainers = [ maintainers.aanderse ];
diff --git a/pkgs/games/flightgear/default.nix b/pkgs/games/flightgear/default.nix
index e32f2e96d4f..0996d4bd512 100644
--- a/pkgs/games/flightgear/default.nix
+++ b/pkgs/games/flightgear/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, wrapQtAppsHook
+{ lib, stdenv, fetchurl, wrapQtAppsHook
 , freeglut, freealut, libGLU, libGL, libICE, libjpeg, openal, openscenegraph, plib
 , libSM, libunwind, libX11, xorgproto, libXext, libXi
 , libXmu, libXt, simgear, zlib, boost, cmake, libpng, udev, fltk13, apr
@@ -6,15 +6,15 @@
 }:
 
 let
-  version = "2020.1.2";
+  version = "2020.3.8";
   shortVersion = builtins.substring 0 6 version;
   data = stdenv.mkDerivation rec {
     pname = "flightgear-data";
     inherit version;
 
     src = fetchurl {
-      url = "mirror://sourceforge/flightgear/release-${shortVersion}/FlightGear-${version}-data.tar.bz2";
-      sha256 = "0ldsjb54k8nb99h6n4f4x20nawd2pa0a8skkwkrgckdpmdv0zwyk";
+      url = "mirror://sourceforge/flightgear/release-${shortVersion}/FlightGear-${version}-data.txz";
+      sha256 = "sha256-/KFumHRkmRvsU/L1i11jG/KbqobnOEP7l4lyPMKHycA=";
     };
 
     phases = [ "installPhase" ];
@@ -32,13 +32,13 @@ stdenv.mkDerivation rec {
 
   src = fetchurl {
     url = "mirror://sourceforge/flightgear/release-${shortVersion}/${pname}-${version}.tar.bz2";
-    sha256 = "1770kgwa7z70sx6da9x1q9cszpd3ywz6nn8jrb6xv8ldjqcpqpvb";
+    sha256 = "XXDqhZ9nR+FwQ3LauZe8iGxOjlyDXDrEtj61BQGVDYc=";
   };
 
   # Of all the files in the source and data archives, there doesn't seem to be
   # a decent icon :-)
   iconsrc = fetchurl {
-    url = "http://wiki.flightgear.org/images/6/62/FlightGear_logo.png";
+    url = "https://wiki.flightgear.org/w/images/6/62/FlightGear_logo.png";
     sha256 = "1ikz413jia55vfnmx8iwrlxvx8p16ggm81mbrj66wam3q7s2dm5p";
   };
 
@@ -69,9 +69,7 @@ stdenv.mkDerivation rec {
     "--set FG_ROOT ${data}/share/FlightGear"
   ];
 
-  enableParallelBuilding = true;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Flight simulator";
     maintainers = with maintainers; [ raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/fltrator/default.nix b/pkgs/games/fltrator/default.nix
index 7cf16e0783e..9df7d9cccfd 100644
--- a/pkgs/games/fltrator/default.nix
+++ b/pkgs/games/fltrator/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, unzip, fltk, which, libjpeg }:
+{ lib, stdenv, fetchurl, unzip, fltk, which, libjpeg }:
 
 stdenv.mkDerivation rec {
   pname = "fltrator";
@@ -32,8 +32,8 @@ stdenv.mkDerivation rec {
     cp rsc/fltrator-128.png $out/share/icons/hicolor/128x128/apps/fltrator2.png
   '';
 
-  meta = with stdenv.lib; {
-    description = "A simple retro style arcade side-scroller game.";
+  meta = with lib; {
+    description = "A simple retro style arcade side-scroller game";
     longDescription = '' FLTrator is a simple retro style arcade side-scroller game in which you steer a spaceship through a landscape with hostile rockets and other obstacles.
     It has ten different levels and a level editor to create new levels or modify the existing.''; # from https://libregamewiki.org/FLTrator
     homepage = "http://fltrator.sourceforge.net/";
diff --git a/pkgs/games/freecell-solver/default.nix b/pkgs/games/freecell-solver/default.nix
index 1845ba825eb..065e82a0e47 100644
--- a/pkgs/games/freecell-solver/default.nix
+++ b/pkgs/games/freecell-solver/default.nix
@@ -1,8 +1,8 @@
-{ stdenv, fetchurl, pkgconfig, cmake
+{ lib, stdenv, fetchurl, pkg-config, cmake
 , perl, gmp, libtap, gperf
 , perlPackages, python3 }:
 
-with stdenv.lib;
+with lib;
 stdenv.mkDerivation rec {
 
   pname = "freecell-solver";
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [
-    cmake perl pkgconfig
+    cmake perl pkg-config
   ] ++ (with perlPackages; TaskFreecellSolverTesting.buildInputs ++ [
     GamesSolitaireVerify StringShellQuote TaskFreecellSolverTesting TemplateToolkit
   ]);
diff --git a/pkgs/games/freeciv/default.nix b/pkgs/games/freeciv/default.nix
index 3f64d92f07f..1560a45b061 100644
--- a/pkgs/games/freeciv/default.nix
+++ b/pkgs/games/freeciv/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, lua5_3, pkgconfig, python3
-, zlib, bzip2, curl, lzma, gettext, libiconv
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, lua5_3, pkg-config, python3
+, zlib, bzip2, curl, xz, gettext, libiconv
 , sdlClient ? true, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_gfx, freetype, fluidsynth
 , gtkClient ? false, gtk3
 , qtClient ? false, qt5
@@ -8,17 +8,17 @@
 }:
 
 let
-  inherit (stdenv.lib) optional optionals;
+  inherit (lib) optional optionals;
 
 in stdenv.mkDerivation rec {
   pname = "freeciv";
-  version = "2.6.2";
+  version = "2.6.5";
 
   src = fetchFromGitHub {
     owner = "freeciv";
     repo = "freeciv";
     rev = "R${builtins.replaceStrings [ "." ] [ "_" ] version}";
-    sha256 = "023slffi06j52amrnmd8n12rmf778cngxx6xg4hbsgckj2nyfmg9";
+    sha256 = "sha256-7KVtBGihABpcbUm5ac2fuBVaDvbucEJSREPulGUdnUE=";
   };
 
   postPatch = ''
@@ -28,15 +28,18 @@ in stdenv.mkDerivation rec {
     done
   '';
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ]
+    ++ optional qtClient [ qt5.wrapQtAppsHook ];
 
-  buildInputs = [ lua5_3 zlib bzip2 curl lzma gettext libiconv ]
+  buildInputs = [ lua5_3 zlib bzip2 curl xz gettext libiconv ]
     ++ optionals sdlClient [ SDL SDL_mixer SDL_image SDL_ttf SDL_gfx freetype fluidsynth ]
     ++ optionals gtkClient [ gtk3 ]
     ++ optionals qtClient  [ qt5.qtbase ]
     ++ optional server readline
     ++ optional enableSqlite sqlite;
 
+  dontWrapQtApps = true;
+
   configureFlags = [ "--enable-shared" ]
     ++ optional sdlClient "--enable-client=sdl"
     ++ optionals qtClient [
@@ -49,7 +52,7 @@ in stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Multiplayer (or single player), turn-based strategy game";
 
     longDescription = ''
diff --git a/pkgs/games/freedink/default.nix b/pkgs/games/freedink/default.nix
index 735a49bee62..c80dc2b0703 100644
--- a/pkgs/games/freedink/default.nix
+++ b/pkgs/games/freedink/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_gfx
-, pkgconfig, intltool, fontconfig, libzip, zip, zlib }:
+{ lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_gfx
+, pkg-config, intltool, fontconfig, libzip, zip, zlib }:
 
 let
   version = "1.08.20121209";
@@ -27,7 +27,7 @@ in stdenv.mkDerivation rec {
 
   buildInputs = [
     SDL SDL_mixer SDL_image SDL_ttf SDL_gfx
-    pkgconfig intltool fontconfig libzip zip zlib
+    pkg-config intltool fontconfig libzip zip zlib
   ];
 
   preConfigure = ''
@@ -52,10 +52,10 @@ in stdenv.mkDerivation rec {
     '';
 
     homepage = "http://www.freedink.org/";
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
-    maintainers = [ stdenv.lib.maintainers.bjg ];
-    platforms = stdenv.lib.platforms.all;
-    hydraPlatforms = stdenv.lib.platforms.linux; # sdl-config times out on darwin
+    maintainers = [ lib.maintainers.bjg ];
+    platforms = lib.platforms.all;
+    hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin
   };
 }
diff --git a/pkgs/games/freedroid/default.nix b/pkgs/games/freedroid/default.nix
new file mode 100644
index 00000000000..266407d17db
--- /dev/null
+++ b/pkgs/games/freedroid/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, fetchFromGitHub
+, makeDesktopItem, copyDesktopItems
+, imagemagick
+, autoreconfHook
+, SDL, SDL_mixer, SDL_image, SDL_gfx
+, libvorbis
+, libjpeg, libpng
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname   = "freedroid";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner  = "ReinhardPrix";
+    repo   = "FreedroidClassic";
+    rev    = "release-${version}";
+    sha256 = "027wns25nyyc8afyhyp5a8wn13x9nlzmnqzqyyma1055xjy5imis";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems imagemagick autoreconfHook ];
+  buildInputs = [ SDL SDL_image SDL_gfx SDL_mixer libjpeg libpng libvorbis zlib ];
+
+  postPatch = ''
+    touch NEWS
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/icons/hicolor/32x32/apps
+    convert graphics/paraicon.bmp $out/share/icons/hicolor/32x32/apps/freedroid.png
+  '';
+
+  desktopItems = [ (makeDesktopItem {
+    name = pname;
+    exec = pname;
+    icon = pname;
+    desktopName = "Freedroid Classic";
+    comment     = "A clone of the classic game 'Paradroid' on Commodore 64";
+    categories  = "Game;ArcadeGame;";
+  }) ];
+
+  meta = with lib; {
+    description = "A clone of the classic game 'Paradroid' on Commodore 64";
+    homepage    = "https://github.com/ReinhardPrix/FreedroidClassic";
+    license     = licenses.gpl2Only;
+    maintainers = with maintainers; [ iblech ];
+    platforms   = platforms.unix;
+    # Builds but fails to render to the screen at runtime.
+    broken      = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/freedroidrpg/default.nix b/pkgs/games/freedroidrpg/default.nix
index 443d60b9d67..53b008d11dd 100644
--- a/pkgs/games/freedroidrpg/default.nix
+++ b/pkgs/games/freedroidrpg/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv, pkgconfig, gettext, python3, SDL, SDL_image, SDL_gfx, SDL_mixer, libogg, libvorbis, lua5_3, libjpeg, libpng, zlib, libiconv }:
+{ fetchurl, lib, stdenv, pkg-config, gettext, python3, SDL, SDL_image, SDL_gfx, SDL_mixer, libogg, libvorbis, lua5_3, libjpeg, libpng, zlib, libiconv }:
 
 let
   version = "0.16.1";
@@ -7,17 +7,17 @@ in stdenv.mkDerivation {
   inherit version;
 
   src = fetchurl {
-    url = "ftp://ftp.osuosl.org/pub/freedroid/freedroidRPG-${stdenv.lib.versions.majorMinor version}/freedroidRPG-${version}.tar.gz";
+    url = "ftp://ftp.osuosl.org/pub/freedroid/freedroidRPG-${lib.versions.majorMinor version}/freedroidRPG-${version}.tar.gz";
     sha256 = "0n4kn38ncmcy3lrxmq8fjry6c1z50z4q1zcqfig0j4jb0dsz2va2";
   };
 
-  nativeBuildInputs = [ pkgconfig gettext python3 ];
+  nativeBuildInputs = [ pkg-config gettext python3 ];
 
   buildInputs = [
     SDL SDL_image SDL_gfx SDL_mixer libogg libvorbis lua5_3 libjpeg libpng zlib
-  ] ++ stdenv.lib.optional stdenv.isDarwin libiconv;
+  ] ++ lib.optional stdenv.isDarwin libiconv;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Isometric 3D RPG similar to game Diablo";
 
     longDescription = ''
diff --git a/pkgs/games/freenukum/default.nix b/pkgs/games/freenukum/default.nix
new file mode 100644
index 00000000000..ff1e8872233
--- /dev/null
+++ b/pkgs/games/freenukum/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv
+, rustPlatform
+, fetchFromGitLab
+, makeDesktopItem
+, installShellFiles
+, dejavu_fonts
+, SDL2
+, SDL2_ttf
+}:
+let
+  pname = "freenukum";
+  description = "Clone of the original Duke Nukum 1 Jump'n Run game";
+
+  desktopItem = makeDesktopItem {
+    desktopName = pname;
+    name = pname;
+    exec = pname;
+    icon = pname;
+    terminal = "false";
+    comment = description;
+    type = "Application";
+    categories = "Game;ArcadeGame;ActionGame";
+    genericName = pname;
+    fileValidation = false;
+  };
+
+in
+rustPlatform.buildRustPackage rec {
+  inherit pname;
+  version = "0.3.5";
+
+  src = fetchFromGitLab {
+    owner = "silwol";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0yqfzh0c8fqk92q9kmidy15dc5li0ak1gbn3v7p3xw5fkrzf99gy";
+  };
+
+  cargoSha256 = "1nss5zbdvxkr1mfb6vi6yjxcih99w836kvfr4r3n5dvzlkvga2vf";
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_ttf
+  ];
+
+  postPatch = ''
+    substituteInPlace src/graphics.rs \
+      --replace /usr $out
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/fonts/truetype/dejavu
+    ln -sf \
+      ${dejavu_fonts}/share/fonts/truetype/DejaVuSans.ttf \
+      $out/share/fonts/truetype/dejavu/DejaVuSans.ttf
+    mkdir -p $out/share/doc/freenukum
+    install -Dm644 README.md CHANGELOG.md COPYING $out/share/doc/freenukum/
+    installManPage doc/freenukum.6
+    install -Dm644 "${desktopItem}/share/applications/"* -t $out/share/applications/
+  '';
+
+  meta = with lib; {
+    description = "Clone of the original Duke Nukum 1 Jump'n Run game";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ _0x4A6F ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/freeorion/default.nix b/pkgs/games/freeorion/default.nix
index 27be32071c1..dea5190d976 100644
--- a/pkgs/games/freeorion/default.nix
+++ b/pkgs/games/freeorion/default.nix
@@ -1,48 +1,85 @@
-{ stdenv, fetchFromGitHub, cmake, doxygen, graphviz, makeWrapper
-, boost168, SDL2, python2, freetype, openal, libogg, libvorbis, zlib, libpng, libtiff
-, libjpeg, libGLU, libGL, glew, libxslt
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, doxygen
+, graphviz
+, makeWrapper
+, cppcheck
+, boost16x
+, SDL2
+, python3
+, freetype
+, openal
+, libogg
+, libvorbis
+, zlib
+, libpng
+, libtiff
+, libjpeg
+, libGLU
+, libGL
+, glew
+, libxslt
 }:
 
 stdenv.mkDerivation rec {
-  version = "0.4.9";
+  version = "0.4.10.1";
   pname = "freeorion";
 
   src = fetchFromGitHub {
-    owner  = "freeorion";
-    repo   = "freeorion";
+    owner = "freeorion";
+    repo = "freeorion";
     rev = "v${version}";
-    sha256 = "18xigx4qla225ybf7mc1w8zfm81nhcm1i5181n5l2fbndvslb1wf";
+    sha256 = "sha256-Itt2JIStx+JsnMMBvbeJXSEJpaS/pd1UMvPGNd50k7I=";
   };
 
   buildInputs = [
-	(boost168.override { enablePython = true; })
-    SDL2 python2 freetype openal libogg libvorbis zlib libpng libtiff libjpeg libGLU libGL glew ];
-
-  nativeBuildInputs = [ cmake doxygen graphviz makeWrapper ];
-
-  enableParallelBuilding = true;
+    (boost16x.override { enablePython = true; python = python3; })
+    (python3.withPackages (p: with p; [ pycodestyle ]))
+    SDL2
+    freetype
+    glew
+    libGL
+    libGLU
+    libjpeg
+    libogg
+    libpng
+    libtiff
+    libvorbis
+    openal
+    zlib
+  ];
 
-  patches = [
+  nativeBuildInputs = [
+    cmake
+    cppcheck
+    doxygen
+    graphviz
+    makeWrapper
   ];
 
+  # as of 0.4.10.1 FreeOrion doesn't work with "-DOpenGL_GL_PREFERENCE=GLVND"
+  cmakeFlags = [ "-DOpenGL_GL_PREFERENCE=LEGACY" ];
+
   postInstall = ''
-    mkdir -p $out/fixpaths
+    mkdir -p $out/libexec
     # We need final slashes for XSLT replace to work properly
-    substitute ${./fix-paths.xslt} $out/fixpaths/fix-paths.xslt \
+    substitute ${./fix-paths.xslt} $out/share/freeorion/fix-paths.xslt \
       --subst-var-by nixStore "$NIX_STORE/" \
       --subst-var-by out "$out/"
-    substitute ${./fix-paths.sh} $out/fixpaths/fix-paths \
+    substitute ${./fix-paths.sh} $out/libexec/fix-paths \
       --subst-var-by libxsltBin ${libxslt.bin} \
       --subst-var-by shell ${stdenv.shell} \
       --subst-var out
-    chmod +x $out/fixpaths/fix-paths
+    chmod +x $out/libexec/fix-paths
 
     wrapProgram $out/bin/freeorion \
-      --run $out/fixpaths/fix-paths \
+      --run $out/libexec/fix-paths \
       --prefix LD_LIBRARY_PATH : $out/lib/freeorion
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free, open source, turn-based space empire and galactic conquest (4X) computer game";
     homepage = "http://www.freeorion.org";
     license = with licenses; [ gpl2 cc-by-sa-30 ];
diff --git a/pkgs/games/freeorion/fix-paths.sh b/pkgs/games/freeorion/fix-paths.sh
index 3f82533dd60..def017ddc5b 100644
--- a/pkgs/games/freeorion/fix-paths.sh
+++ b/pkgs/games/freeorion/fix-paths.sh
@@ -1,6 +1,6 @@
 #!@shell@
 
 if [ -e ~/.config/freeorion/config.xml ]; then
-  @libxsltBin@/bin/xsltproc -o ~/.config/freeorion/config.xml @out@/fixpaths/fix-paths.xslt ~/.config/freeorion/config.xml
+  @libxsltBin@/bin/xsltproc -o ~/.config/freeorion/config.xml @out@/share/freeorion/fix-paths.xslt ~/.config/freeorion/config.xml
 fi
 exit 0
diff --git a/pkgs/games/freesweep/default.nix b/pkgs/games/freesweep/default.nix
index fdaaadbe42f..7c17877e934 100644
--- a/pkgs/games/freesweep/default.nix
+++ b/pkgs/games/freesweep/default.nix
@@ -1,4 +1,4 @@
-{ fetchFromGitHub, ncurses, stdenv,
+{ fetchFromGitHub, ncurses, lib, stdenv,
   updateAutotoolsGnuConfigScriptsHook }:
 
 stdenv.mkDerivation rec {
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A console minesweeper-style game written in C for Unix-like systems";
     homepage = "https://github.com/rwestlund/freesweep";
     license = licenses.gpl2;
diff --git a/pkgs/games/frogatto/data.nix b/pkgs/games/frogatto/data.nix
index ab5bbe2dd9f..d31826ad295 100644
--- a/pkgs/games/frogatto/data.nix
+++ b/pkgs/games/frogatto/data.nix
@@ -1,15 +1,15 @@
-{ stdenv, fetchFromGitHub }:
-  
+{ lib, stdenv, fetchFromGitHub }:
+
 stdenv.mkDerivation {
   pname = "frogatto-data";
-  version = "unstable-2018-12-18";
-  
+  version = "unstable-2021-05-24";
+
   src = fetchFromGitHub {
     owner = "frogatto";
     repo = "frogatto";
-    # master branch as of 2018-12-18
-    rev = "8f261b5d3fca3c88e6a534316a28378cf687d3e5";
-    sha256 = "0nyfwfyy5gxp61ydna299nq9p5wra9mk0bf1drdngg6bwws1hrqx";
+    # master branch as of 2020-12-17
+    rev = "8b0f2bc8f9f172f6225b8e0d806552cb94f35e2a";
+    sha256 = "09nrna9l1zj2ma2bazdhdvphwy570kfz4br4xgpwq21rsjrvrqiy";
   };
 
   installPhase = ''
@@ -17,7 +17,7 @@ stdenv.mkDerivation {
     cp -ar . $out/share/frogatto/modules/frogatto
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/frogatto/frogatto";
     description = "Data files to the frogatto game";
     license = with licenses; [ cc-by-30 unfree ];
diff --git a/pkgs/games/frogatto/default.nix b/pkgs/games/frogatto/default.nix
index efcff024a54..0b53e3d0bea 100644
--- a/pkgs/games/frogatto/default.nix
+++ b/pkgs/games/frogatto/default.nix
@@ -1,4 +1,4 @@
-{ buildEnv, stdenv, callPackage, makeWrapper, makeDesktopItem }:
+{ buildEnv, lib, callPackage, makeWrapper, makeDesktopItem }:
 
 let
   description = "Action-adventure game, starring a certain quixotic frog";
@@ -14,7 +14,7 @@ let
     genericName = "frogatto";
     categories = "Game;ArcadeGame;";
   };
-  version = "unstable-2018-12-18";
+  version = "unstable-2020-12-04";
 in buildEnv {
   name = "frogatto-${version}";
 
@@ -33,7 +33,7 @@ in buildEnv {
       --run "cd $out/share/frogatto"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://frogatto.com";
     description = description;
     license = with licenses; [ cc-by-30 unfree ];
diff --git a/pkgs/games/frogatto/engine.nix b/pkgs/games/frogatto/engine.nix
index d51cfcb8f20..22aab537c21 100644
--- a/pkgs/games/frogatto/engine.nix
+++ b/pkgs/games/frogatto/engine.nix
@@ -1,22 +1,26 @@
-{ stdenv, fetchFromGitHub, which
+{ lib, stdenv, fetchFromGitHub, which
 , boost, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf
-, glew, zlib, icu, pkgconfig, cairo, libvpx }:
+, glew, zlib, icu, pkg-config, cairo, libvpx }:
 
 stdenv.mkDerivation {
   pname = "anura-engine";
-  version = "unstable-2018-11-28";
+  version = "unstable-2021-05-24";
 
   src = fetchFromGitHub {
     owner = "anura-engine";
     repo = "anura";
-    # trunk branch as of 2018-11-28
-    rev = "8070111467802dc772c0a6c7806ecd16b0bcdaa9";
-    sha256 = "0xbqwfmws69n7iiz17n93h4jiw39cwyf7hxw0qi2c8cccr37b1nr";
+    rev = "ed50bbfa68a4aa09438d95d39103ec39156d438f";
+    sha256 = "0bk0qklk9wwx3jr2kbrmansccn1nj962v5n2vlb5hxsrcv96s3dg";
     fetchSubmodules = true;
   };
 
+  postPatch = ''
+    substituteInPlace src/sys.cpp \
+      --replace mallinfo2 mallinfo
+  '';
+
   nativeBuildInputs = [
-    which pkgconfig
+    which pkg-config
   ];
 
   buildInputs = [
@@ -40,7 +44,7 @@ stdenv.mkDerivation {
     cp -a anura $out/bin/frogatto
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/anura-engine/anura";
     description = "Game engine used by Frogatto";
     license = licenses.zlib;
diff --git a/pkgs/games/frotz/default.nix b/pkgs/games/frotz/default.nix
index 800da177a3d..9b5256fc1c7 100644
--- a/pkgs/games/frotz/default.nix
+++ b/pkgs/games/frotz/default.nix
@@ -5,10 +5,12 @@
 , libsndfile
 , libvorbis
 , ncurses
-, stdenv }:
+, which
+, pkg-config
+, lib, stdenv }:
 
 stdenv.mkDerivation rec {
-  version = "2.52";
+  version = "2.53";
   pname = "frotz";
 
   src = fetchFromGitLab {
@@ -16,9 +18,10 @@ stdenv.mkDerivation rec {
     owner = "DavidGriffith";
     repo = "frotz";
     rev = version;
-    sha256 = "11ca1dz31b7s5vxjqncwjwmbbcr2m5v2rxjn49g4gnvwd6mqw48y";
+    sha256 = "sha256-xVC/iE71W/Wdy5aPGH9DtcVAHWCcg3HkEA3iDV6OYUo=";
   };
 
+  nativeBuildInputs = [ which pkg-config ];
   buildInputs = [ libao libmodplug libsamplerate libsndfile libvorbis ncurses ];
   preBuild = ''
     makeFlagsArray+=(
@@ -29,10 +32,10 @@ stdenv.mkDerivation rec {
   '';
   installFlags = [ "PREFIX=$(out)" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://davidgriffith.gitlab.io/frotz/";
     changelog = "https://gitlab.com/DavidGriffith/frotz/-/raw/${version}/NEWS";
-    description = "A z-machine interpreter for Infocom games and other interactive fiction.";
+    description = "A z-machine interpreter for Infocom games and other interactive fiction";
     platforms = platforms.unix;
     maintainers = with maintainers; [ nicknovitski  ddelabru ];
     license = licenses.gpl2;
diff --git a/pkgs/games/frozen-bubble/default.nix b/pkgs/games/frozen-bubble/default.nix
index 3b562ee44f2..f9dd3fd6159 100644
--- a/pkgs/games/frozen-bubble/default.nix
+++ b/pkgs/games/frozen-bubble/default.nix
@@ -1,5 +1,6 @@
-{ stdenv, fetchurl, perlPackages, pkgconfig, SDL, SDL_mixer, SDL_Pango, glib }:
-
+{ lib, fetchurl, perlPackages, pkg-config, SDL, SDL_mixer, SDL_Pango, glib
+, copyDesktopItems, makeDesktopItem
+}:
 perlPackages.buildPerlModule {
   pname = "frozen-bubble";
   version = "2.212";
@@ -10,16 +11,27 @@ perlPackages.buildPerlModule {
   };
   patches = [ ./fix-compilation.patch ];
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ copyDesktopItems pkg-config ];
 
   buildInputs =  [ glib SDL SDL_mixer SDL_Pango perlPackages.SDL perlPackages.FileSlurp ];
   propagatedBuildInputs = with perlPackages; [ AlienSDL CompressBzip2 FileShareDir FileWhich IPCSystemSimple LocaleMaketextLexicon ];
 
   perlPreHook = "export LD=$CC";
 
+  desktopItems = [
+    (makeDesktopItem {
+      name = "frozen-bubble";
+      exec = "frozen-bubble";
+      desktopName = "Frozen Bubble";
+      genericName = "Frozen Bubble";
+      comment = "Arcade/reflex colour matching game";
+      categories = "Game;";
+    })
+  ];
+
   meta = {
     description = "Puzzle with Bubbles";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [ puckipedia ];
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ puckipedia ];
   };
 }
diff --git a/pkgs/games/fsg/default.nix b/pkgs/games/fsg/default.nix
index b8a0d5ff3c7..3869ad98849 100644
--- a/pkgs/games/fsg/default.nix
+++ b/pkgs/games/fsg/default.nix
@@ -1,18 +1,19 @@
-{ stdenv, fetchurl, gtk2, glib, pkgconfig, libGLU, libGL, wxGTK, libX11, xorgproto
+{ lib, stdenv, fetchurl, gtk2, glib, pkg-config, libGLU, libGL, wxGTK, libX11, xorgproto
 , runtimeShell }:
 
-stdenv.mkDerivation {
-  name = "fsg-4.4";
+stdenv.mkDerivation rec {
+  pname = "fsg";
+  version = "4.4";
 
   src = fetchurl {
-    name = "fsg-src-4.4.tar.gz";
-    url = "https://github.com/ctrlcctrlv/wxsand/blob/master/fsg-src-4.4-ORIGINAL.tar.gz?raw=true";
+    name = "fsg-src-${version}.tar.gz";
+    url = "https://github.com/ctrlcctrlv/wxsand/blob/master/fsg-src-${version}-ORIGINAL.tar.gz?raw=true";
     sha256 = "1756y01rkvd3f1pkj88jqh83fqcfl2fy0c48mcq53pjzln9ycv8c";
   };
 
   hardeningDisable = [ "format" ];
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ gtk2 glib libGLU libGL wxGTK libX11 xorgproto ];
 
   preBuild = ''
@@ -31,7 +32,7 @@ stdenv.mkDerivation {
 
   meta = {
     description = "Cellular automata engine tuned towards the likes of Falling Sand";
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/galaxis/default.nix b/pkgs/games/galaxis/default.nix
index 19df8db78a0..a3847e73c8d 100644
--- a/pkgs/games/galaxis/default.nix
+++ b/pkgs/games/galaxis/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl, ncurses, xmlto }:
+{ lib, stdenv, fetchurl, ncurses, xmlto }:
 
-with stdenv.lib;
+with lib;
 stdenv.mkDerivation rec {
 
   pname = "galaxis";
diff --git a/pkgs/games/gambatte/default.nix b/pkgs/games/gambatte/default.nix
index ac099e21d56..07aad4a5b60 100644
--- a/pkgs/games/gambatte/default.nix
+++ b/pkgs/games/gambatte/default.nix
@@ -1,17 +1,17 @@
-{ stdenv, fetchFromGitHub, scons, qt4 }:
+{ lib, stdenv, fetchFromGitHub, scons, qt4, alsa-lib }:
 
 stdenv.mkDerivation {
   pname = "gambatte";
-  version = "2016-05-03";
+  version = "2020-03-14";
 
   src = fetchFromGitHub {
     owner = "sinamas";
     repo = "gambatte";
-    rev = "f8a810b103c4549f66035dd2be4279c8f0d95e77";
-    sha256 = "1arv4zkh3fhrghsykl4blazc9diw09m44pyff1059z5b98smxy3v";
+    rev = "56e3371151b5ee86dcdcf4868324ebc6de220bc9";
+    sha256 = "0cc6zcvxpvi5hgcssb1zy0fkj9nk7n0d2xm88a4v05kpm5zw7sh2";
   };
 
-  buildInputs = [ scons qt4 ];
+  buildInputs = [ scons qt4 alsa-lib ];
 
   patches = [ ./fix-scons-paths.patch ];
 
@@ -24,7 +24,7 @@ stdenv.mkDerivation {
     cp gambatte_qt/bin/gambatte_qt $out/bin/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Portable, open-source Game Boy Color emulator";
     homepage = "https://github.com/sinamas/gambatte";
     license = licenses.gpl2;
diff --git a/pkgs/games/garden-of-coloured-lights/default.nix b/pkgs/games/garden-of-coloured-lights/default.nix
index fde573cecd8..d38d8936c1a 100644
--- a/pkgs/games/garden-of-coloured-lights/default.nix
+++ b/pkgs/games/garden-of-coloured-lights/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, autoconf, automake, allegro }:
+{ lib, stdenv, fetchurl, autoconf, automake, allegro }:
 
 stdenv.mkDerivation rec {
   pname = "garden-of-coloured-lights";
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
     sha256 = "1qsj4d7r22m5f9f5f6cyvam1y5q5pbqvy5058r7w0k4s48n77y6s";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Old-school vertical shoot-em-up / bullet hell";
     homepage = "http://garden.sourceforge.net/drupal/";
     maintainers = with maintainers; [ Profpatsch ];
diff --git a/pkgs/games/gargoyle/default.nix b/pkgs/games/gargoyle/default.nix
index c4c512be2b8..bd592dbc55d 100644
--- a/pkgs/games/gargoyle/default.nix
+++ b/pkgs/games/gargoyle/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, substituteAll, jam, cctools, pkgconfig
+{ lib, stdenv, fetchFromGitHub, substituteAll, jam, cctools, pkg-config
 , SDL, SDL_mixer, SDL_sound, gtk2, libvorbis, smpeg }:
 
 let
@@ -30,10 +30,10 @@ stdenv.mkDerivation rec {
     sha256 = "0w54avmbp4i4zps2rb4acmpa641s6wvwbrln4vbdhcz97fx48nzz";
   };
 
-  nativeBuildInputs = [ jam pkgconfig ] ++ stdenv.lib.optional stdenv.isDarwin cctools;
+  nativeBuildInputs = [ jam pkg-config ] ++ lib.optional stdenv.isDarwin cctools;
 
   buildInputs = [ SDL SDL_mixer SDL_sound gtk2 ]
-    ++ stdenv.lib.optionals stdenv.isDarwin [ smpeg libvorbis ];
+    ++ lib.optionals stdenv.isDarwin [ smpeg libvorbis ];
 
   buildPhase = jamenv + "jam -j$NIX_BUILD_CORES";
 
@@ -58,7 +58,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://ccxvii.net/gargoyle/";
     license = licenses.gpl2Plus;
     description = "Interactive fiction interpreter GUI";
diff --git a/pkgs/games/gav/default.nix b/pkgs/games/gav/default.nix
index e42afefb830..e94b73d763c 100644
--- a/pkgs/games/gav/default.nix
+++ b/pkgs/games/gav/default.nix
@@ -1,10 +1,11 @@
-{stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net} :
+{lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net} :
 
-stdenv.mkDerivation {
-  name = "gav-0.9.0";
+stdenv.mkDerivation rec {
+  pname = "gav";
+  version = "0.9.0";
 
   src = fetchurl {
-    url = "mirror://sourceforge/gav/gav-0.9.0.tar.gz";
+    url = "mirror://sourceforge/gav/gav-${version}.tar.gz";
     sha256 = "8f0deb8b2cd775b339229054f4f282583a4cfbcba9d27a6213cf910bab944f3e";
   };
 
@@ -20,7 +21,7 @@ stdenv.mkDerivation {
   meta = {
     description = "Remake of AV Arcade Volleyball";
     homepage = "http://gav.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/gcompris/default.nix b/pkgs/games/gcompris/default.nix
index 67d52ac7bcb..a930b1682d4 100644
--- a/pkgs/games/gcompris/default.nix
+++ b/pkgs/games/gcompris/default.nix
@@ -18,11 +18,11 @@
 
 mkDerivation rec {
   pname = "gcompris";
-  version = "0.98";
+  version = "1.1";
 
   src = fetchurl {
     url = "http://gcompris.net/download/qt/src/gcompris-qt-${version}.tar.xz";
-    sha256 = "1jmjykn0lpk0v6hs2flmch8v4da5bgxl891nav7szxw9l7aqnf4y";
+    sha256 = "sha256-8Kj5R/7WwOuew7e9qgx2HWS8mnHX+cv8mhHmgXbm8q4=";
   };
 
   cmakeFlags = [
diff --git a/pkgs/games/gcs/default.nix b/pkgs/games/gcs/default.nix
index 9c0b479304a..9d8d74921e5 100644
--- a/pkgs/games/gcs/default.nix
+++ b/pkgs/games/gcs/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, runCommand
+{ lib, stdenv, fetchFromGitHub, runCommand
 , jdk8, ant
 , jre8, makeWrapper
 }:
@@ -42,7 +42,8 @@ in stdenv.mkDerivation rec {
     cp -r ${library} gcs_library
   '';
 
-  buildInputs = [ jdk8 jre8 ant makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ jdk8 jre8 ant ];
   buildPhase = ''
     cd apple_stubs
     ant
@@ -66,7 +67,7 @@ in stdenv.mkDerivation rec {
       --add-flags "-cp $out/share/java/gcs-${version}.jar com.trollworks.gcs.app.GCS"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A stand-alone, interactive, character sheet editor for the GURPS 4th Edition roleplaying game system";
     homepage = "https://gurpscharactersheet.com/";
     license = licenses.mpl20;
diff --git a/pkgs/games/gemrb/default.nix b/pkgs/games/gemrb/default.nix
index 4f7d1cb3750..947957bc3af 100644
--- a/pkgs/games/gemrb/default.nix
+++ b/pkgs/games/gemrb/default.nix
@@ -1,30 +1,80 @@
-{ stdenv, fetchFromGitHub, cmake
-, freetype, SDL2, SDL2_mixer, openal, zlib, libpng, python, libvorbis
-, libiconv }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, SDL2
+, SDL2_mixer
+, freetype
+, libGL
+, libiconv
+, libpng
+, libvlc
+, libvorbis
+, openal
+, python2 # 0.9.0 crashes after character generation with py3, so stick to py2 for now
+, zlib
+}:
 
+let
+  # the GLES backend on rpi is untested as I don't have the hardware
+  backend =
+    if (stdenv.isx86_32 || stdenv.isx86_64) then "OpenGL" else "GLES";
+
+  withVLC = stdenv.isDarwin;
+
+  inherit (lib) optional optionalString;
+
+in
 stdenv.mkDerivation rec {
   pname = "gemrb";
-  version = "0.8.6";
+  version = "0.9.0";
 
   src = fetchFromGitHub {
-    owner  = "gemrb";
-    repo   = "gemrb";
-    rev    = "v${version}";
-    sha256 = "0vsr3fsqmv9b7s5l0cwhpq2pf7ah2wvgmcn9y8asj6w8hprp17d4";
+    owner = "gemrb";
+    repo = "gemrb";
+    rev = "v${version}";
+    sha256 = "sha256-h/dNPY0QZ2m7aYgRla3r1E8APJqO99ePa2ABhhh3Aoc=";
   };
 
-  # TODO: make libpng, libvorbis, sdl_mixer, freetype, vlc, glew (and other gl reqs) optional
-  buildInputs = [ freetype python openal SDL2 SDL2_mixer zlib libpng libvorbis libiconv ];
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    freetype
+    libGL
+    libiconv
+    libpng
+    libvorbis
+    openal
+    python2
+    zlib
+  ]
+  ++ optional withVLC libvlc;
 
   nativeBuildInputs = [ cmake ];
 
-  enableParallelBuilding = true;
+  # libvlc isn't being detected properly as of 0.9.0, so set it
+  LIBVLC_INCLUDE_PATH = optionalString withVLC "${lib.getDev libvlc}/include";
+  LIBVLC_LIBRARY_PATH = optionalString withVLC "${lib.getLib libvlc}/lib";
 
   cmakeFlags = [
+    "-DDATA_DIR=${placeholder "out"}/share/gemrb"
+    "-DEXAMPLE_CONF_DIR=${placeholder "out"}/share/doc/gemrb/examples"
+    "-DSYSCONF_DIR=/etc"
+    # use the Mesa drivers for video on ARM (harmless on x86)
+    "-DDISABLE_VIDEOCORE=ON"
     "-DLAYOUT=opt"
+    "-DOPENGL_BACKEND=${backend}"
+    "-DOpenGL_GL_PREFERENCE=GLVND"
   ];
 
-  meta = with stdenv.lib; {
+  postInstall = ''
+    for s in 36 48 72 96 144; do
+      install -Dm444 ../artwork/gemrb-logo-glow-''${s}px.png $out/share/icons/hicolor/''${s}x''${s}/gemrb.png
+    done
+    install -Dm444 ../artwork/gemrb-logo.png $out/share/icons/gemrb.png
+  '';
+
+  meta = with lib; {
     description = "A reimplementation of the Infinity Engine, used by games such as Baldur's Gate";
     longDescription = ''
       GemRB (Game engine made with pre-Rendered Background) is a portable
@@ -32,9 +82,8 @@ stdenv.mkDerivation rec {
       support pseudo-3D role playing games based on the Dungeons & Dragons
       ruleset (Baldur's Gate and Icewind Dale series, Planescape: Torment).
     '';
-    homepage = "http://gemrb.org/";
-    license = licenses.gpl2;
+    homepage = "https://gemrb.org/";
+    license = licenses.gpl2Only;
     maintainers = with maintainers; [ peterhoeg ];
-    platforms = platforms.all;
   };
 }
diff --git a/pkgs/games/gimx/default.nix b/pkgs/games/gimx/default.nix
new file mode 100644
index 00000000000..0ae5a791709
--- /dev/null
+++ b/pkgs/games/gimx/default.nix
@@ -0,0 +1,76 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, curl, libusb1, xorg, libxml2
+, ncurses5, bluez, libmhash, gimxAuth ? "" }:
+
+let
+  gimx-config = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX-configurations";
+    rev = "c20300f24d32651d369e2b27614b62f4b856e4a0";
+    sha256 = "02wcjk8da188x7y0jf3p0arjdh9zbb0lla3fxdb28b1xyybfvx5p";
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "gimx";
+  version = "8.0";
+
+  src = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "0265gg6q7ymg76fb4pjrfdwjd280b3zzry96qy92w0h411slph85";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [
+    curl libusb1 bluez libxml2 ncurses5 libmhash
+    xorg.libX11 xorg.libXi xorg.libXext
+  ];
+
+  patches = [ ./env.patch ];
+  prePatch = (if gimxAuth == "afterglow" then (import ./variant.nix).afterglow
+              else "");
+
+  makeFlags = "build-core";
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    substituteInPlace ./core/Makefile --replace "chmod ug+s" "echo"
+
+    export DESTDIR="$out"
+    make install-shared install-core
+    mv $out/usr/lib $out/lib
+    mv $out/usr/bin $out/bin
+    rmdir $out/usr
+
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share
+    cp -r ./loader/firmware $out/share/firmware
+    cp -r ${gimx-config}/Linux $out/share/config
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-with-confs \
+      --set GIMXCONF $out/share/config
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-test-ds4 \
+      --set GIMXCONF $out/share/config \
+      --add-flags "--nograb" --add-flags "--curses" \
+      --add-flags "-p /dev/ttyUSB0" --add-flags "-c Dualshock4.xml"
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-test-xone \
+      --set GIMXCONF $out/share/config \
+      --add-flags "--nograb" --add-flags "--curses" \
+      --add-flags "-p /dev/ttyUSB0" --add-flags "-c XOnePadUsb.xml"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/matlo/GIMX";
+    description = "Game Input Multiplexer";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ bb2020 ];
+  };
+}
diff --git a/pkgs/games/gimx/env.patch b/pkgs/games/gimx/env.patch
new file mode 100644
index 00000000000..e1f8ed8bb6f
--- /dev/null
+++ b/pkgs/games/gimx/env.patch
@@ -0,0 +1,30 @@
+--- a/core/config_reader.c
++++ b/core/config_reader.c
+@@ -1353,8 +1353,10 @@ static int read_file(char* file_path)
+ int read_config_file(const char* file)
+ {
+   char file_path[PATH_MAX];
+-
+-  snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, file);
++  char* e = getenv("GIMXCONF"); if (e) { snprintf(file_path, sizeof(file_path), "%s/%s", e, file); }
++  else {
++    snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, file);
++  }
+ 
+   if(read_file(file_path) == -1)
+   {
+--- a/core/gimx.c
++++ b/core/gimx.c
+@@ -190,8 +190,10 @@ void show_config()
+   }
+ 
+   char file_path[PATH_MAX];
+-
+-  snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, gimx_params.config_file);
++  char* e = getenv("GIMXCONF"); if (e) { snprintf(file_path, sizeof(file_path), "%s/%s", e, gimx_params.config_file); }
++  else {
++    snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, gimx_params.config_file);
++  }
+ 
+   FILE * fp = gfile_fopen(file_path, "r");
+   if (fp == NULL)
diff --git a/pkgs/games/gimx/variant.nix b/pkgs/games/gimx/variant.nix
new file mode 100644
index 00000000000..8396f72b4e7
--- /dev/null
+++ b/pkgs/games/gimx/variant.nix
@@ -0,0 +1,14 @@
+{
+  afterglow = ''
+    substituteInPlace ./shared/gimxcontroller/include/x360.h \
+      --replace "0x045e" "0x0e6f" --replace "0x028e" "0x0213"
+
+    HEX="./loader/firmware/EMU360.hex"
+    sed -i '34s|1B2100|1B2110|' "$HEX"
+    sed -i '38s|092100|092110|' "$HEX"
+    sed -i '40s|5E048E021001|6F0E13020001|' "$HEX"
+    sed -i '34s|1C\r|0C\r|' "$HEX"
+    sed -i '38s|FE\r|EE\r|' "$HEX"
+    sed -i '40s|6D\r|DD\r|' "$HEX"
+  '';
+}
diff --git a/pkgs/games/gl-117/default.nix b/pkgs/games/gl-117/default.nix
index f76f761189c..0acabb4a55f 100644
--- a/pkgs/games/gl-117/default.nix
+++ b/pkgs/games/gl-117/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 , libGLU, libGL, SDL, freeglut, SDL_mixer, autoconf, automake, libtool
 }:
 
@@ -13,7 +13,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ libGLU libGL SDL freeglut SDL_mixer autoconf automake libtool ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An air combat simulator";
     homepage = "https://sourceforge.net/projects/gl-117";
     maintainers = with maintainers; [ raskin ];
diff --git a/pkgs/games/globulation/default.nix b/pkgs/games/globulation/default.nix
index e0e4b876f3e..9150541afd0 100644
--- a/pkgs/games/globulation/default.nix
+++ b/pkgs/games/globulation/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libGLU, libGL, SDL, sconsPackages, SDL_ttf, SDL_image, zlib, SDL_net
+{ lib, stdenv, fetchurl, libGLU, libGL, SDL, sconsPackages, SDL_ttf, SDL_image, zlib, SDL_net
 , speex, libvorbis, libogg, boost, fribidi, bsdiff
 , fetchpatch
 }:
@@ -21,9 +21,9 @@ stdenv.mkDerivation rec {
 
   patches = [ ./header-order.patch ./public-buildproject.patch
     (fetchpatch {
-	  url = "https://bitbucket.org/giszmo/glob2/commits/c9dc715624318e4fea4abb24e04f0ebdd9cd8d2a/raw";
-	  sha256 = "0017xg5agj3dy0hx71ijdcrxb72bjqv7x6aq7c9zxzyyw0mkxj0k";
-	})
+      url = "https://bitbucket.org/giszmo/glob2/commits/c9dc715624318e4fea4abb24e04f0ebdd9cd8d2a/raw";
+      sha256 = "0017xg5agj3dy0hx71ijdcrxb72bjqv7x6aq7c9zxzyyw0mkxj0k";
+    })
   ];
 
   postPatch = ''
@@ -43,7 +43,7 @@ stdenv.mkDerivation rec {
 
   NIX_LDFLAGS = "-lboost_system";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "RTS without micromanagement";
     maintainers = with maintainers; [ raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/gltron/default.nix b/pkgs/games/gltron/default.nix
index f6d74b6e9b7..540170c49b2 100644
--- a/pkgs/games/gltron/default.nix
+++ b/pkgs/games/gltron/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, SDL, libGLU, libGL, zlib, libpng, libvorbis, libmikmod, SDL_sound } :
+{lib, stdenv, fetchurl, SDL, libGLU, libGL, zlib, libpng, libvorbis, libmikmod, SDL_sound } :
 
 stdenv.mkDerivation rec {
-  name = "gltron-0.70";
+  pname = "gltron";
+  version = "0.70";
   src = fetchurl {
-    url = "mirror://sourceforge/gltron/${name}-source.tar.gz";
+    url = "mirror://sourceforge/gltron/gltron-${version}-source.tar.gz";
     sha256 = "e0c8ebb41a18a1f8d7302a9c2cb466f5b1dd63e9a9966c769075e6b6bdad8bb0";
   };
 
@@ -22,8 +23,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://www.gltron.org/";
     description = "Game based on the movie Tron";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/gmad/default.nix b/pkgs/games/gmad/default.nix
index aad53a7915a..8f43c75f06a 100644
--- a/pkgs/games/gmad/default.nix
+++ b/pkgs/games/gmad/default.nix
@@ -1,14 +1,15 @@
-{ stdenv, fetchFromGitHub, premake4, bootil }:
+{ lib, stdenv, fetchFromGitHub, premake4, bootil }:
 
 stdenv.mkDerivation rec {
-  name = "gmad-unstable-2015-04-16";
+  pname = "gmad";
+  version = "unstable-2015-04-16";
 
   meta = {
     description = "Garry's Mod Addon Creator and Extractor";
     homepage = "https://github.com/garrynewman/gmad";
-    license = stdenv.lib.licenses.unfree;
-    maintainers = [ stdenv.lib.maintainers.abigailbuccaneer ];
-    platforms = stdenv.lib.platforms.all;
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.abigailbuccaneer ];
+    platforms = lib.platforms.all;
   };
 
   src = fetchFromGitHub {
diff --git a/pkgs/games/gnome-hexgl/default.nix b/pkgs/games/gnome-hexgl/default.nix
index cfa9a0b81d0..8e2fa41f420 100644
--- a/pkgs/games/gnome-hexgl/default.nix
+++ b/pkgs/games/gnome-hexgl/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , ninja
 , meson
@@ -33,7 +33,7 @@ stdenv.mkDerivation rec {
     gtk3
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Gthree port of HexGL";
     homepage = "https://github.com/alexlarsson/gnome-hexgl";
     license = licenses.mit;
diff --git a/pkgs/games/gnonograms/default.nix b/pkgs/games/gnonograms/default.nix
new file mode 100644
index 00000000000..7a696001a15
--- /dev/null
+++ b/pkgs/games/gnonograms/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, vala
+, meson
+, ninja
+, pkg-config
+, desktop-file-utils
+, appstream
+, python3
+, shared-mime-info
+, wrapGAppsHook
+, gtk3
+, pantheon
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnonograms";
+  version = "1.4.5";
+
+  src = fetchFromGitHub {
+    owner = "jeremypw";
+    repo = "gnonograms";
+    rev = "v${version}";
+    sha256 = "1ly3inp6dvjrixdysz5hdfwlhbs49ks0lf8062z2iq6gaf8ivkb2";
+  };
+
+  postPatch = ''
+    patchShebangs meson/post_install.py
+  '';
+
+  nativeBuildInputs = [
+    vala
+    meson
+    ninja
+    pkg-config
+    desktop-file-utils
+    appstream
+    python3
+    shared-mime-info
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    pantheon.granite
+    libgee
+  ];
+
+  meta = with lib; {
+    description = "Nonograms puzzle game";
+    longDescription = ''
+      An implementation of the Japanese logic puzzle "Nonograms" written in
+      Vala, allowing the user to:
+      * Draw puzzles
+      * Generate random puzzles of chosen difficulty
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fgaz ];
+    homepage = "https://github.com/jeremypw/gnonograms";
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/gnubg/default.nix b/pkgs/games/gnubg/default.nix
index edfde5ea3e9..7402049a9d8 100644
--- a/pkgs/games/gnubg/default.nix
+++ b/pkgs/games/gnubg/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, pkgconfig, glib, python, gtk2, readline }:
+{ lib, stdenv, fetchurl, pkg-config, glib, python3, gtk2, readline }:
 
 let version = "1.06.002"; in
 stdenv.mkDerivation {
@@ -9,12 +9,14 @@ stdenv.mkDerivation {
     sha256 = "11xwhcli1h12k6rnhhyq4jphzrhfik7i8ah3k32pqw803460n6yf";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ python glib gtk2 readline ];
+  nativeBuildInputs = [ pkg-config python3 glib ];
+  buildInputs = [  gtk2 readline ];
+
+  strictDeps = true;
 
   configureFlags = [ "--with-gtk" "--with--board3d" ];
 
-  meta = with stdenv.lib;
+  meta = with lib;
     { description = "World class backgammon application";
       homepage = "http://www.gnubg.org/";
       license = licenses.gpl3;
diff --git a/pkgs/games/gnuchess/default.nix b/pkgs/games/gnuchess/default.nix
index a7b27933496..9f7d1684a5c 100644
--- a/pkgs/games/gnuchess/default.nix
+++ b/pkgs/games/gnuchess/default.nix
@@ -1,12 +1,12 @@
-{stdenv, fetchurl, flex, makeWrapper}:
+{lib, stdenv, fetchurl, flex, makeWrapper}:
 let
   s = # Generated upstream information
   rec {
     baseName="gnuchess";
-    version="6.2.7";
+    version="6.2.8";
     name="${baseName}-${version}";
     url="mirror://gnu/chess/${name}.tar.gz";
-    sha256="0ilq4bfl0lwyzf11q7n2skydjhalfn3bgxhrp5hjxs5bc5d6fdp5";
+    sha256="0irqb0wl30c2i1rs8f6mm1c89l7l9nxxv7533lr408h1m36lc16m";
   };
   buildInputs = [
     flex
@@ -28,8 +28,8 @@ stdenv.mkDerivation {
   meta = {
     inherit (s) version;
     description = "GNU Chess engine";
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.unix;
-    license = stdenv.lib.licenses.gpl3Plus;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl3Plus;
   };
 }
diff --git a/pkgs/games/gnugo/default.nix b/pkgs/games/gnugo/default.nix
index 069d14756e3..e33c27bf9eb 100644
--- a/pkgs/games/gnugo/default.nix
+++ b/pkgs/games/gnugo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "gnugo";
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "GNU Go - A computer go player";
     homepage = "https://www.gnu.org/software/gnugo/";
-    license = stdenv.lib.licenses.gpl3;
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/games/gnujump/default.nix b/pkgs/games/gnujump/default.nix
index 8af7b84db26..6f91b103458 100644
--- a/pkgs/games/gnujump/default.nix
+++ b/pkgs/games/gnujump/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, SDL, SDL_image, SDL_mixer }:
+{ lib, stdenv, makeDesktopItem, copyDesktopItems, fetchurl, SDL, SDL_image, SDL_mixer }:
 
 stdenv.mkDerivation rec {
   pname = "gnujump";
@@ -7,11 +7,26 @@ stdenv.mkDerivation rec {
     url = "mirror://gnu/gnujump/${pname}-${version}.tar.gz";
     sha256 = "05syy9mzbyqcfnm0hrswlmhwlwx54f0l6zhcaq8c1c0f8dgzxhqk";
   };
+
+  nativeBuildInputs = [ copyDesktopItems ];
   buildInputs = [ SDL SDL_image SDL_mixer ];
 
   NIX_LDFLAGS = "-lm";
 
-  meta = with stdenv.lib; {
+  desktopItems = [ (makeDesktopItem {
+    name = "gnujump";
+    exec = "gnujump";
+    icon = "gnujump";
+    desktopName = "GNUjump";
+    comment     = "Jump up the tower to survive";
+    categories  = "Game;ArcadeGame;";
+  }) ];
+
+  postInstall = ''
+    install -Dm644 ${./gnujump.xpm} $out/share/pixmaps/gnujump.xpm
+  '';
+
+  meta = with lib; {
     homepage = "https://jump.gnu.sinusoid.es/index.php?title=Main_Page";
     description = "A clone of the simple yet addictive game Xjump";
     longDescription = ''
diff --git a/pkgs/games/gnujump/gnujump.xpm b/pkgs/games/gnujump/gnujump.xpm
new file mode 100644
index 00000000000..d8b6bcb4c8c
--- /dev/null
+++ b/pkgs/games/gnujump/gnujump.xpm
@@ -0,0 +1,64 @@
+/* XPM */
+static char *gnujump[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 26 1 ",
+"  c black",
+". c #D10000",
+"X c #E80000",
+"o c #E90000",
+"O c #F90000",
+"+ c red",
+"@ c #00C500",
+"# c #00DC00",
+"$ c #00DD00",
+"% c #00EF00",
+"& c #00FA00",
+"* c #00FB00",
+"= c green",
+"- c #FFC882",
+"; c #FFC982",
+": c #FFD298",
+"> c #FFD299",
+", c #FFD399",
+"< c #FFDAAB",
+"1 c #FFDBAB",
+"2 c #FFDBAC",
+"3 c #FFE1BA",
+"4 c #FFE5C3",
+"5 c #FFE5C4",
+"6 c #FFE7C7",
+"7 c None",
+/* pixels */
+"77777777777777777777777777777777",
+"77777777777777777777777777777777",
+"7777777777777     77777777777777",
+"77777777777         777777777777",
+"7777777777           77777777777",
+"777777777             7777777777",
+"777777777       ;;;-- 7777777777",
+"77777777      ::>>,>1: 777777777",
+"77777777     :<1<1:>2: 777777777",
+"77777777    :1331:  :: 7777 7777",
+"77777777   :<3431:  :, 777 o 777",
+"777  777  ->236531>:2: 77 oo 777",
+"77 .o  77 -,145443<1, 77 oOo 777",
+"77 .ooo 7 -:13333312: 7 oOo 7777",
+"777 oOOo   :,11<<<::   oOOo 7777",
+"7777 XOOooo  :::>:  XooO+Oo 7777",
+"77777 oOOOOoo     ooOOO+Oo 77777",
+"777777 oOO+OOoooooOO++OOo 777777",
+"7777777 XoOOOOOOOOOOOOoo 7777777",
+"77777777  oooooooooooo  77777777",
+"7777777777            7777777777",
+"777777777 @@@@@@@@@@@@   7777777",
+"77777777 #######$$##$#### 777777",
+"7777777 #%%%%%%%%%%%%%%%%# 77777",
+"7777777 #%*&*&*%%%%%%*&*%# 77777",
+"777777 #%*=**%%#####$%%&*%# 7777",
+"777777 #%&*%%##      ##%&%# 7777",
+"77777 #%*%%##  777777  #%%# 7777",
+"77777 #%%#$   777777777 #%%# 777",
+"7777 @%##   777777777777 #%# 777",
+"7777 ##  7777777777777777 $# 777",
+"77777  7777777777777777777  7777"
+};
diff --git a/pkgs/games/gnushogi/default.nix b/pkgs/games/gnushogi/default.nix
index 01c08fbf3dc..ef1950aaf40 100644
--- a/pkgs/games/gnushogi/default.nix
+++ b/pkgs/games/gnushogi/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, zlib }:
+{ lib, stdenv, fetchurl, zlib }:
 
 stdenv.mkDerivation rec {
   pname = "gnushogi";
@@ -10,7 +10,7 @@ stdenv.mkDerivation rec {
     sha256 = "0a9bsl2nbnb138lq0h14jfc5xvz7hpb2bcsj4mjn6g1hcsl4ik0y";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "GNU implementation of Shogi, also known as Japanese Chess";
     homepage = "https://www.gnu.org/software/gnushogi/";
     license = licenses.gpl3;
diff --git a/pkgs/games/gogui/default.nix b/pkgs/games/gogui/default.nix
index b13a145ff5e..c7b37b31c35 100644
--- a/pkgs/games/gogui/default.nix
+++ b/pkgs/games/gogui/default.nix
@@ -1,11 +1,11 @@
-{ fetchurl, stdenv, openjdk, unzip, makeWrapper }:
+{ fetchurl, lib, stdenv, openjdk, unzip, makeWrapper }:
 
 let
   version = "1.4.9";
 in stdenv.mkDerivation {
   pname = "gogui";
   inherit version;
-  buildInputs = [ unzip makeWrapper ];
+  nativeBuildInputs = [ makeWrapper unzip ];
   src = fetchurl {
     url = "mirror://sourceforge/project/gogui/gogui/${version}/gogui-${version}.zip";
     sha256 = "0qk6p1bhi1816n638bg11ljyj6zxvm75jdf02aabzdmmd9slns1j";
@@ -20,10 +20,10 @@ in stdenv.mkDerivation {
     done
   '';
   meta = {
-    maintainers = [ stdenv.lib.maintainers.cleverca22 ];
+    maintainers = [ lib.maintainers.cleverca22 ];
     description = "A graphical user interface to programs that play the board game Go and support the Go Text Protocol such as GNU Go";
     homepage = "http://gogui.sourceforge.net/";
-    platforms = stdenv.lib.platforms.unix;
-    license = stdenv.lib.licenses.gpl3;
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl3;
   };
 }
diff --git a/pkgs/games/grapejuice/default.nix b/pkgs/games/grapejuice/default.nix
new file mode 100644
index 00000000000..586d93151e2
--- /dev/null
+++ b/pkgs/games/grapejuice/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, fetchFromGitLab
+, gobject-introspection
+, python3Packages
+, gtk3
+, wrapGAppsHook
+, glib
+, cairo
+, desktop-file-utils
+, xdg-utils
+, xdg-user-dirs
+, wine
+, winetricks
+}:
+
+python3Packages.buildPythonApplication rec  {
+  pname = "grapejuice";
+  version = "3.40.14";
+
+  src = fetchFromGitLab {
+    owner = "BrinkerVII";
+    repo = "grapejuice";
+    rev = "v${version}";
+    sha256 = "1bmkkmi1gx5kc39cjnz5bzwqaicxs0zb6bcv4iny9qccbqf3icrd";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    desktop-file-utils
+    glib
+    gtk3
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    cairo
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    requests
+    pygobject3
+    dbus-python
+    packaging
+    psutil
+    setuptools
+  ];
+
+  dontWrapGApps = true;
+
+  makeWrapperArgs = [
+    "\${gappsWrapperArgs[@]}"
+    "--prefix PATH : ${lib.makeBinPath [ xdg-user-dirs xdg-utils wine (winetricks.override { wine = wine; }) ]}"
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "PyGObject-stubs" ""
+
+    substituteInPlace src/grapejuice_common/assets/desktop/grapejuice.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$GRAPEJUICE_ICON grapejuice
+
+    substituteInPlace src/grapejuice_common/assets/desktop/roblox-player.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$PLAYER_ICON "grapejuice-roblox-player"
+
+    substituteInPlace src/grapejuice_common/assets/desktop/roblox-app.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$PLAYER_ICON "grapejuice-roblox-player"
+
+    substituteInPlace src/grapejuice_common/assets/desktop/roblox-studio.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$STUDIO_ICON "grapejuice-roblox-studio"
+  '';
+
+  postInstall = ''
+    mkdir -p "$out/share/icons" "$out/share/applications" "$out/share/mime/packages"
+    cp -r src/grapejuice_common/assets/desktop/* $out/share/applications/
+    cp -r src/grapejuice_common/assets/icons $out/share/
+    cp src/grapejuice_common/assets/mime_xml/*.xml $out/share/mime/packages/
+  '';
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "grapejuice" ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/brinkervii/grapejuice";
+    description = "Simple Wine+Roblox management tool";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/pkgs/games/gscrabble/default.nix b/pkgs/games/gscrabble/default.nix
index 307c09dfa1b..f0e4121d8f2 100644
--- a/pkgs/games/gscrabble/default.nix
+++ b/pkgs/games/gscrabble/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, buildPythonApplication, fetchFromGitHub
+{ lib, buildPythonApplication, fetchFromGitHub
 , gtk3, wrapGAppsHook, gst_all_1, gobject-introspection
-, python3Packages, gnome3 }:
+, python3Packages, gnome }:
 
 buildPythonApplication {
   pname = "gscrabble";
@@ -19,7 +19,7 @@ buildPythonApplication {
 
   buildInputs = with gst_all_1; [
     gst-plugins-base gst-plugins-good gst-plugins-ugly gst-plugins-bad
-    gnome3.adwaita-icon-theme gtk3 gobject-introspection
+    gnome.adwaita-icon-theme gtk3 gobject-introspection
   ];
 
   propagatedBuildInputs = with python3Packages; [ gst-python pygobject3 ];
@@ -30,11 +30,11 @@ buildPythonApplication {
       )
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Golden Scrabble crossword puzzle game";
     homepage = "https://github.com/RaaH/gscrabble/";
     license = licenses.gpl2Plus;
     platforms = platforms.linux;
-    maintainers = [ maintainers.genesis ];
+    maintainers = [ ];
   };
 }
diff --git a/pkgs/games/gshogi/default.nix b/pkgs/games/gshogi/default.nix
index 9004bd3d042..c3479f6758a 100644
--- a/pkgs/games/gshogi/default.nix
+++ b/pkgs/games/gshogi/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, buildPythonApplication, fetchFromGitHub
+{ lib, buildPythonApplication, fetchFromGitHub
 , gtk3, gobject-introspection
 , wrapGAppsHook, python3Packages }:
 
@@ -27,7 +27,7 @@ buildPythonApplication rec {
     pycairo
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A graphical implementation of the Shogi board game, also known as Japanese Chess";
     homepage = "http://johncheetham.com/projects/gshogi/";
     license = licenses.gpl3;
diff --git a/pkgs/games/gtetrinet/default.nix b/pkgs/games/gtetrinet/default.nix
index 824e7afd734..d34b3775bd1 100644
--- a/pkgs/games/gtetrinet/default.nix
+++ b/pkgs/games/gtetrinet/default.nix
@@ -1,7 +1,8 @@
-{ fetchFromGitHub, stdenv, autoreconfHook, intltool, pkgconfig, libgnome, libgnomeui, GConf }:
+{ fetchFromGitHub, lib, stdenv, autoreconfHook, intltool, pkg-config, libgnome, libgnomeui, GConf }:
 
 stdenv.mkDerivation {
-  name = "gtetrinet-0.7.11";
+  pname = "gtetrinet";
+  version = "0.7.11";
 
   src = fetchFromGitHub {
     owner = "GNOME";
@@ -10,7 +11,7 @@ stdenv.mkDerivation {
     sha256 = "1y05x8lfyxvkjg6c87cfd0xxmb22c88scx8fq3gah7hjy5i42v93";
   };
 
-  nativeBuildInputs = [ autoreconfHook intltool pkgconfig ];
+  nativeBuildInputs = [ autoreconfHook intltool pkg-config ];
 
   buildInputs = [ libgnome libgnomeui ];
 
@@ -31,14 +32,14 @@ stdenv.mkDerivation {
   enableParallelBuilding = true;
 
   meta = {
-    description = "Client for Tetrinet, a multiplayer online Tetris game.";
+    description = "Client for Tetrinet, a multiplayer online Tetris game";
     longDescription = ''
       GTetrinet is a client program for Tetrinet, a multiplayer tetris game
       that is played over the internet.
     '';
     homepage = "http://gtetrinet.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ stdenv.lib.maintainers.chris-martin ];
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.chris-martin ];
   };
 }
diff --git a/pkgs/games/gtypist/default.nix b/pkgs/games/gtypist/default.nix
index ae12c325306..43b95bacefc 100644
--- a/pkgs/games/gtypist/default.nix
+++ b/pkgs/games/gtypist/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, makeWrapper, libiconv, ncurses, perl, fortune}:
+{lib, stdenv, fetchurl, makeWrapper, libiconv, ncurses, perl, fortune}:
 
 stdenv.mkDerivation rec {
   pname = "gtypist";
@@ -9,15 +9,16 @@ stdenv.mkDerivation rec {
     sha256 = "0xzrkkmj0b1dw3yr0m9hml2y634cc4h61im6zwcq57s7285z8fn1";
   };
 
-  buildInputs = [ makeWrapper ncurses perl fortune ]
-   ++ stdenv.lib.optional stdenv.isDarwin libiconv;
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ ncurses perl fortune ]
+   ++ lib.optional stdenv.isDarwin libiconv;
 
   preFixup = ''
      wrapProgram "$out/bin/typefortune" \
        --prefix PATH : "${fortune}/bin" \
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/gtypist";
     description = "Universal typing tutor";
     license = licenses.gpl3Plus;
diff --git a/pkgs/games/gweled/default.nix b/pkgs/games/gweled/default.nix
index d5d4f5c4015..fc187afbe80 100644
--- a/pkgs/games/gweled/default.nix
+++ b/pkgs/games/gweled/default.nix
@@ -1,30 +1,34 @@
-{ stdenv, fetchbzr, intltool
-, gtk2, wrapGAppsHook, autoreconfHook, pkgconfig
+{ lib, stdenv, fetchbzr, gettext
+, gtk2, wrapGAppsHook, autoreconfHook, pkg-config
 , libmikmod, librsvg, libcanberra-gtk2, hicolor-icon-theme }:
 
 stdenv.mkDerivation rec {
   pname = "gweled";
-  version = "unstable-2018-02-15";
+  version = "unstable-2021-02-11";
 
   src = fetchbzr {
     url = "lp:gweled";
-    rev = "94";
-    sha256 = "01c38y4df5a06wqbsmsn8ysxx7hav9yvw6zdwbc9m5m55z7vmdb8";
+    rev = "108";
+    sha256 = "sha256-rM4dgbYfSrVqZwi+xzKuEtmtjK3HVvqeutmni1vleLo=";
   };
 
   doCheck = false;
 
-  nativeBuildInputs = [ wrapGAppsHook intltool autoreconfHook pkgconfig ];
+  postPatch = ''
+    substituteInPlace configure.ac --replace "AM_GNU_GETTEXT_VERSION([0.19.8])" "AM_GNU_GETTEXT_VERSION([${gettext.version}])"
+  '';
+
+  nativeBuildInputs = [ wrapGAppsHook gettext autoreconfHook pkg-config ];
 
   buildInputs = [ gtk2 libmikmod librsvg hicolor-icon-theme libcanberra-gtk2 ];
 
   configureFlags = [ "--disable-setgid" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Bejeweled clone game";
     homepage = "https://gweled.org";
     license = licenses.gpl2;
     platforms = platforms.linux;
-    maintainers = [ maintainers.genesis ];
+    maintainers = [ ];
   };
 }
diff --git a/pkgs/games/gzdoom/default.nix b/pkgs/games/gzdoom/default.nix
index fdbdda2d313..8ab54468c00 100644
--- a/pkgs/games/gzdoom/default.nix
+++ b/pkgs/games/gzdoom/default.nix
@@ -1,21 +1,21 @@
-{ stdenv, fetchFromGitHub, cmake, makeWrapper, openal, fluidsynth_1
+{ lib, stdenv, fetchFromGitHub, cmake, makeWrapper, openal, fluidsynth_1
 , soundfont-fluid, libGL, SDL2, bzip2, zlib, libjpeg, libsndfile, mpg123
-, game-music-emu, pkgconfig }:
+, game-music-emu, pkg-config }:
 
 let
   zmusic-src = fetchFromGitHub {
     owner = "coelckers";
     repo = "zmusic";
-    rev = "2d0ea861174f9e2031400ab29f5bcc8425521cc6";
-    sha256 = "1ac7lhbzwfr0fsyv7n70hvb8imzngxn1qyanmv9j26j0h90hhl8a";
+    rev = "bff02053bea30bd789e45f60b90db3ffc69c8cc8";
+    sha256 = "0vpr79gpdbhslg5qxyd1qxlv5akgli26skm1vb94yd8v69ymdcy2";
   };
   zmusic = stdenv.mkDerivation {
     pname = "zmusic";
-    version = "1.1.0";
+    version = "1.1.3";
 
     src = zmusic-src;
 
-    nativeBuildInputs = [ cmake pkgconfig ];
+    nativeBuildInputs = [ cmake pkg-config ];
 
     preConfigure = ''
       sed -i \
@@ -28,17 +28,17 @@ let
 
   gzdoom = stdenv.mkDerivation rec {
     pname = "gzdoom";
-    version = "4.4.2";
+    version = "4.5.0";
 
     src = fetchFromGitHub {
       owner = "coelckers";
       repo = "gzdoom";
       rev = "g${version}";
-      sha256 = "1xkkmbsdv64wyb9r2fv5mwyqw0bjryk528jghdrh47pndmjs9a38";
+      sha256 = "0kmqnyhdi5psi7zwrx9j3pz0cplypsvhg4cr8w2jbawh6jb71sk9";
       fetchSubmodules = true;
     };
 
-    nativeBuildInputs = [ cmake makeWrapper pkgconfig ];
+    nativeBuildInputs = [ cmake makeWrapper pkg-config ];
     buildInputs = [
       SDL2
       libGL
@@ -53,8 +53,6 @@ let
       zmusic
     ];
 
-    enableParallelBuilding = true;
-
     NIX_CFLAGS_LINK = "-lopenal -lfluidsynth";
 
     installPhase = ''
@@ -72,7 +70,7 @@ let
       makeWrapper $out/lib/gzdoom/gzdoom $out/bin/gzdoom
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       homepage = "https://github.com/coelckers/gzdoom";
       description =
         "A Doom source port based on ZDoom. It features an OpenGL renderer and lots of new features";
diff --git a/pkgs/games/harmonist/default.nix b/pkgs/games/harmonist/default.nix
index fb9e1cf6617..ae7d6644ce7 100644
--- a/pkgs/games/harmonist/default.nix
+++ b/pkgs/games/harmonist/default.nix
@@ -1,22 +1,22 @@
-{stdenv, fetchurl, buildGoPackage}:
+{lib, fetchurl, buildGoPackage}:
 
 buildGoPackage rec {
 
   pname = "harmonist";
-  version = "0.3.0";
+  version = "0.4.1";
 
   goPackagePath = "git.tuxfamily.org/harmonist/harmonist.git";
 
   src = fetchurl {
     url = "https://download.tuxfamily.org/harmonist/releases/${pname}-${version}.tar.gz";
-    sha256 = "16bh4zzq7szwcw19n34bslkf81fz3i0p4zqkd8gdi5ixkbm998lm";
+    sha256 = "19abqmzz9nnlnizkskvlkcpahk8lzrl57mgg6dfxn25l55vfznws";
   };
 
   goDeps = ./deps.nix;
 
   postInstall = "mv $out/bin/harmonist.git $out/bin/harmonist";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A stealth coffee-break roguelike game";
     longDescription = ''
       Harmonist is a stealth coffee-break roguelike game. The game has a heavy
@@ -29,6 +29,6 @@ buildGoPackage rec {
     homepage = "https://harmonist.tuxfamily.org/";
     license = licenses.isc;
     platforms = platforms.unix;
-    maintainers = with maintainers; [freepotion];
+    maintainers = with maintainers; [];
   };
 }
diff --git a/pkgs/games/harmonist/deps.nix b/pkgs/games/harmonist/deps.nix
index 68290823625..8823ada42d4 100644
--- a/pkgs/games/harmonist/deps.nix
+++ b/pkgs/games/harmonist/deps.nix
@@ -1,20 +1,92 @@
 [
   {
-    goPackagePath = "github.com/nsf/termbox-go";
+    goPackagePath = "github.com/mattn/go-runewidth";
     fetch = {
       type = "git";
-      url = "https://github.com/nsf/termbox-go";
-      rev = "93860e16131719fa9722e7c448dbf8c0e3210a0d";
-      sha256 = "03hz060cy8qrl4kgr80pbq6xvr38z4c6ghr3y81i8g854rvp6426";
+      url = "https://github.com/mattn/go-runewidth";
+      rev = "59616a248b91ae20bf3eb93636a24c87d9ce6cea";
+      sha256 = "0jh9552ppqvkdfni7x623n0x5mbiaqqhjhmr0zkh28x56k4ysii4";
     };
   }
   {
-    goPackagePath = "github.com/mattn/go-runewidth";
+    goPackagePath = "github.com/anaseto/gruid";
     fetch = {
       type = "git";
-      url = "https://github.com/mattn/go-runewidth";
-      rev = "18c3d09a134a52720932bbaa92c798a0ab111004";
-      sha256 = "1snr8mk63vz2h44knq26dm81p83887v7kb09iywqmx0nqzngih66";
+      url = "https://github.com/anaseto/gruid";
+      rev = "976b3db42d20169cf44eca1406b3cff104a80979";
+      sha256 = "0rvsavkvg2hziwdh8sjk3n5v92m5mfjb8v9m7ch22maxfwq5kv6y";
+    };
+  }
+  {
+    goPackagePath = "github.com/anaseto/gruid-tcell";
+    fetch = {
+      type = "git";
+      url = "https://github.com/anaseto/gruid-tcell";
+      rev = "4878126bb96fa0e529ec22c700d03b030e5c3bf7";
+      sha256 = "0spm9gqsdan1mvbpypywid00vvl92rii8akhmjdm8l1r9qk7a3i4";
+    };
+  }
+  {
+    goPackagePath = "github.com/gdamore/tcell";
+    fetch = {
+      type = "git";
+      url = "https://github.com/gdamore/tcell";
+      rev = "f4d402906fa3d330545365abbf970c048e677b35";
+      sha256 = "1wcbm5vxrh5s8g4mas32y3n0pjvfmngmc2yrxg1yn4333mh9mgf3";
+    };
+  }
+  {
+    goPackagePath = "github.com/lucasb-eyer/go-colorful";
+    fetch = {
+      type = "git";
+      url = "https://github.com/lucasb-eyer/go-colorful";
+      rev = "4d8f45c41ac988423342507a1fb6050239b5a742";
+      sha256 = "1p2rl5353fi4p3l0bz3dg0lifhxqj8hjyh1b6z1cn286qxwnnnm8";
+    };
+  }
+ {
+    goPackagePath = "github.com/gdamore/encoding";
+    fetch = {
+      type = "git";
+      url = "https://github.com/gdamore/encoding";
+      rev = "6289cdc94c00ac4aa177771c5fce7af2f96b626d";
+      sha256 = "1vmm5zll92i2fm4ajqx0gyx0p9j36496x5nabi3y0x7h0inv0pk9";
+    };
+  }
+  {
+    goPackagePath = "github.com/rivo/uniseg";
+    fetch = {
+      type = "git";
+      url = "https://github.com/rivo/uniseg";
+      rev = "75711fccf6a3e85bc74c241e2dddd06a9bc9e53d";
+      sha256 = "0j7h22vfmjj562vr8gpsyrkrwp1pq9ayh5fylv24skxb467g9f0q";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/term/";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/term";
+      rev = "6a3ed077a48de71621ad530f9078fffa0bc0ce32";
+      sha256 = "0xni8n3q2r9f6fk223b2c1702fvqmgz7vk6738asri3fwby583q5";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/text/";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/text";
+      rev = "e3aa4adf54f644ca0cb35f1f1fb19b239c40ef04";
+      sha256 = "03q5kjmp4sfp5yzwb76lyf8cs9qca26vlwry5qgqf8w03rq700hf";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/sys/";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/sys";
+      rev = "88b6017d06564827ae436c619d52116f470a3611";
+      sha256 = "14n7b6833lhxjzsgvi14c6c8nfiqqb4r71wvv4z5ksyssi95i3r7";
     };
   }
 ]
diff --git a/pkgs/games/hawkthorne/default.nix b/pkgs/games/hawkthorne/default.nix
index 81984530992..3da78349dbb 100644
--- a/pkgs/games/hawkthorne/default.nix
+++ b/pkgs/games/hawkthorne/default.nix
@@ -1,4 +1,4 @@
-{ fetchgit, stdenv, love, curl, zip }:
+{ fetchgit, lib, stdenv, love, curl, zip }:
 
 stdenv.mkDerivation {
   version = "0.12.1";
@@ -32,8 +32,8 @@ stdenv.mkDerivation {
       Hawthorne's inheritance.
     '';
     homepage = "https://www.reddit.com/r/hawkthorne";
-    license = stdenv.lib.licenses.mit;
-    maintainers = with stdenv.lib.maintainers; [ campadrenalin ];
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ campadrenalin ];
     broken = true;
   };
 }
diff --git a/pkgs/games/hedgewars/default.nix b/pkgs/games/hedgewars/default.nix
index 00df6f33821..9062af5be38 100644
--- a/pkgs/games/hedgewars/default.nix
+++ b/pkgs/games/hedgewars/default.nix
@@ -1,7 +1,8 @@
-{ mkDerivation, SDL2_image, SDL2_ttf, SDL2_net, fpc, ghcWithPackages, ffmpeg_3, freeglut
-, lib, fetchurl, cmake, pkgconfig, lua5_1, SDL2, SDL2_mixer
+{ mkDerivation, SDL2_image, SDL2_ttf, SDL2_net, fpc, ghcWithPackages, ffmpeg, freeglut
+, lib, fetchurl, cmake, pkg-config, lua5_1, SDL2, SDL2_mixer
 , zlib, libpng, libGL, libGLU, physfs
 , qtbase, qttools
+, llvm
 , withServer ? true
 }:
 
@@ -22,18 +23,23 @@ mkDerivation rec {
     sha256 = "0nqm9w02m0xkndlsj6ys3wr0ik8zc14zgilq7k6fwjrf3zk385i1";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig qttools ];
+  nativeBuildInputs = [ cmake pkg-config qttools ];
 
   buildInputs = [
     SDL2_ttf SDL2_net SDL2 SDL2_mixer SDL2_image
     fpc lua5_1
-    ffmpeg_3 freeglut physfs
+    llvm # hard-requirement on aarch64, for some reason not strictly necessary on x86-64
+    ffmpeg freeglut physfs
     qtbase
   ] ++ lib.optional withServer ghc;
 
   postPatch = ''
     substituteInPlace gameServer/CMakeLists.txt \
       --replace mask evaluate
+
+    # compile with fpc >= 3.2.0
+    # https://github.com/archlinux/svntogit-community/blob/75a1b3900fb3dd553d5114bbc8474d85fd6abb02/trunk/PKGBUILD#L26
+    sed -i 's/procedure ShiftWorld(Dir: LongInt); inline;/procedure ShiftWorld(Dir: LongInt);/' hedgewars/uWorld.pas
   '';
 
   cmakeFlags = [
@@ -42,7 +48,7 @@ mkDerivation rec {
   ];
 
 
-  # hslogger brings network-3 and network-bsd which conflict with 
+  # hslogger brings network-3 and network-bsd which conflict with
   # network-2.6.3.1
   preConfigure = ''
     substituteInPlace gameServer/CMakeLists.txt \
@@ -96,7 +102,6 @@ mkDerivation rec {
        hedgehog or hedgehogs after a player's or CPU turn is shown only when
        all movement on the battlefield has ceased).'';
     maintainers = with maintainers; [ kragniz fpletz ];
-    inherit (ghc.meta) platforms;
-    hydraPlatforms = [];
+    inherit (fpc.meta) platforms;
   };
 }
diff --git a/pkgs/games/hhexen/default.nix b/pkgs/games/hhexen/default.nix
new file mode 100644
index 00000000000..0306c54ef4e
--- /dev/null
+++ b/pkgs/games/hhexen/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchurl, SDL, stdenv }:
+
+stdenv.mkDerivation rec {
+  name = "hhexen";
+  version = "1.6.3";
+  src = fetchurl {
+    url = "mirror://sourceforge/hhexen/hhexen-${version}-src.tgz";
+    sha256 = "1jwccqawbdn0rjn5p59j21rjy460jdhps7zwn2z0gq9biggw325b";
+  };
+
+  buildInputs = [ SDL ];
+  installPhase = ''
+    install -Dm755 hhexen-gl -t $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Linux port of Raven Game's Hexen";
+    homepage = "http://hhexen.sourceforge.net/hhexen.html";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ djanatyn ];
+  };
+}
diff --git a/pkgs/games/holdingnuts/default.nix b/pkgs/games/holdingnuts/default.nix
index d0cee8d76cf..2bda1820928 100644
--- a/pkgs/games/holdingnuts/default.nix
+++ b/pkgs/games/holdingnuts/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake, SDL, qt4 }:
+{ lib, stdenv, fetchurl, cmake, SDL, qt4 }:
 
 let mirror = "http://download.holdingnuts.net";
 in stdenv.mkDerivation rec {
@@ -25,9 +25,10 @@ in stdenv.mkDerivation rec {
     substituteInPlace src/system/SysAccess.c --replace /usr/share $out/share
   '';
 
-  buildInputs = [ cmake SDL qt4 ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ SDL qt4 ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage    = "http://www.holdingnuts.net/";
     description = "Open Source Poker client and server";
     license     = licenses.gpl3;
diff --git a/pkgs/games/hyperrogue/default.nix b/pkgs/games/hyperrogue/default.nix
index 32882f16894..08427bd2920 100644
--- a/pkgs/games/hyperrogue/default.nix
+++ b/pkgs/games/hyperrogue/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, SDL, SDL_ttf, SDL_gfx, SDL_mixer, autoreconfHook,
+{ lib, stdenv, fetchFromGitHub, SDL, SDL_ttf, SDL_gfx, SDL_mixer, autoreconfHook,
   libpng, glew, makeDesktopItem }:
 
 stdenv.mkDerivation rec {
@@ -45,7 +45,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://www.roguetemple.com/z/hyper/";
     description = "A roguelike game set in hyperbolic geometry";
     maintainers = with maintainers; [ rardiol ];
diff --git a/pkgs/games/icbm3d/default.nix b/pkgs/games/icbm3d/default.nix
index 71ecfacb37e..a166b4f83f2 100644
--- a/pkgs/games/icbm3d/default.nix
+++ b/pkgs/games/icbm3d/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, libX11}:
+{lib, stdenv, fetchurl, libX11}:
 
-stdenv.mkDerivation {
-  name = "icbm3d-0.4";
+stdenv.mkDerivation rec {
+  pname = "icbm3d";
+  version = "0.4";
   src = fetchurl {
-    url = "ftp://ftp.tuxpaint.org/unix/x/icbm3d/icbm3d.0.4.tar.gz";
+    url = "ftp://ftp.tuxpaint.org/unix/x/icbm3d/icbm3d.${version}.tar.gz";
     sha256 = "1z9q01mj0v9qbwby5cajjc9wpvdw2ma5v1r639vraxpl9qairm4s";
   };
 
@@ -17,7 +18,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.newbreedsoftware.com/icbm3d/";
     description = "3D vector-based clone of the atari game Missile Command";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/instead-launcher/default.nix b/pkgs/games/instead-launcher/default.nix
index 84e3474225a..1f03a72390e 100644
--- a/pkgs/games/instead-launcher/default.nix
+++ b/pkgs/games/instead-launcher/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, instead, qmake4Hook, zlib }:
+{ lib, stdenv, fetchFromGitHub, instead, qmake4Hook, zlib }:
 
 stdenv.mkDerivation rec {
   pname = "instead-launcher";
@@ -22,7 +22,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ zlib ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://instead.syscall.ru/wiki/en/instead-launcher";
     description = "Install and play games from INSTEAD repository";
     license = licenses.gpl2;
diff --git a/pkgs/games/instead/default.nix b/pkgs/games/instead/default.nix
index f131b920990..5c35219c19b 100644
--- a/pkgs/games/instead/default.nix
+++ b/pkgs/games/instead/default.nix
@@ -1,9 +1,9 @@
-{ stdenv, fetchurl, SDL2, SDL2_ttf, SDL2_image, SDL2_mixer, pkgconfig, lua, zlib, unzip }:
+{ lib, stdenv, fetchurl, SDL2, SDL2_ttf, SDL2_image, SDL2_mixer, pkg-config, lua, zlib, unzip }:
 
 let
-  version = "3.3.1";
+  version = "3.3.2";
 
-  # I took several games at random from http://instead.syscall.ru/games/
+  # I took several games at random from https://instead.syscall.ru/games/
   games = [
     (fetchurl {
       url = "http://instead-games.googlecode.com/files/instead-apple-day-1.2.zip";
@@ -33,14 +33,19 @@ stdenv.mkDerivation {
 
   src = fetchurl {
     url = "mirror://sourceforge/project/instead/instead/${version}/instead_${version}.tar.gz";
-    sha256 = "10bppcdjnd0all71l5akdvy7fx0c8s8x0za9qxszs8cjmlv9z1q0";
+    sha256 = "u5j2kDKRvMQPsG8iA6uOBScuyE/e1BJIK2+qVL6jqQs=";
   };
 
   NIX_LDFLAGS = "-llua -lgcc_s";
 
-  nativeBuildInputs = [ pkgconfig unzip ];
+  nativeBuildInputs = [ pkg-config unzip ];
   buildInputs = [ SDL2 SDL2_ttf SDL2_image SDL2_mixer lua zlib ];
 
+  postPatch = ''
+    substituteInPlace configure.sh \
+      --replace "/tmp/sdl-test" $(mktemp)
+  '';
+
   configurePhase = ''
     { echo 2; echo $out; } | ./configure.sh
   '';
@@ -57,11 +62,11 @@ stdenv.mkDerivation {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Simple text adventure interpreter for Unix and Windows";
-    homepage = "http://instead.syscall.ru/";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = with stdenv.lib.platforms; linux;
+    homepage = "https://instead.syscall.ru/";
+    license = lib.licenses.gpl2;
+    platforms = with lib.platforms; linux;
     maintainers = with maintainers; [ pSub ];
   };
 }
diff --git a/pkgs/games/iortcw/default.nix b/pkgs/games/iortcw/default.nix
new file mode 100644
index 00000000000..8af3dfe31f6
--- /dev/null
+++ b/pkgs/games/iortcw/default.nix
@@ -0,0 +1,27 @@
+{ buildEnv, callPackage, makeWrapper }:
+
+let
+  sp = callPackage ./sp.nix {};
+  mp = sp.overrideAttrs (oldAttrs: rec {
+    sourceRoot = "source/MP";
+  });
+in buildEnv {
+  name = "iortcw";
+
+  paths = [ sp mp ];
+
+  pathsToLink = [ "/opt" ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  # so we can launch sp from mp game and vice versa
+  postBuild = ''
+    for i in `find -L $out/opt/iortcw -maxdepth 1 -type f -executable`; do
+      makeWrapper $i $out/bin/`basename $i` --run "cd $out/opt/iortcw"
+    done
+  '';
+
+  meta = sp.meta // {
+    description = "Game engine for Return to Castle Wolfenstein";
+  };
+}
diff --git a/pkgs/games/iortcw/sp.nix b/pkgs/games/iortcw/sp.nix
new file mode 100644
index 00000000000..fa6f73a177b
--- /dev/null
+++ b/pkgs/games/iortcw/sp.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchFromGitHub, opusfile, libogg, SDL2, openal, freetype
+, libjpeg, curl, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "iortcw-sp";
+  version = "1.51c";
+
+  src = fetchFromGitHub {
+    owner = "iortcw";
+    repo = "iortcw";
+    rev = version;
+    sha256 = "0g5wgqb1gm34pd05dj2i8nj3qhsz0831p3m7bsgxpjcg9c00jpyw";
+  };
+
+  enableParallelBuilding = true;
+
+  sourceRoot = "source/SP";
+
+  makeFlags = [
+    "USE_INTERNAL_LIBS=0"
+    "COPYDIR=${placeholder "out"}/opt/iortcw"
+    "USE_OPENAL_DLOPEN=0"
+    "USE_CURL_DLOPEN=0"
+  ];
+
+  installTargets = [ "copyfiles" ];
+
+  buildInputs = [
+    opusfile libogg SDL2 freetype libjpeg openal curl
+  ];
+  nativeBuildInputs = [ makeWrapper ];
+
+  NIX_CFLAGS_COMPILE = [
+    "-I${SDL2.dev}/include/SDL2"
+    "-I${opusfile}/include/opus"
+  ];
+  NIX_CFLAGS_LINK = [ "-lSDL2" ];
+
+  postInstall = ''
+    for i in `find $out/opt/iortcw -maxdepth 1 -type f -executable`; do
+      makeWrapper $i $out/bin/`basename $i` --run "cd $out/opt/iortcw"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Single player version of game engine for Return to Castle Wolfenstein";
+    homepage = src.meta.homepage;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/pkgs/games/ivan/default.nix b/pkgs/games/ivan/default.nix
index c5a93939a0f..f16aa752632 100644
--- a/pkgs/games/ivan/default.nix
+++ b/pkgs/games/ivan/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, pkgconfig, SDL2, SDL2_mixer, alsaLib, libpng
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, SDL2, SDL2_mixer, alsa-lib, libpng
 , pcre, makeDesktopItem }:
 
 stdenv.mkDerivation rec {
@@ -13,9 +13,9 @@ stdenv.mkDerivation rec {
     sha256 = "04jzs8wad2b3g9hvnijr4r89iiw6b1i44zdzkg0dy447lrw6l6xc";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
 
-  buildInputs = [ SDL2 SDL2_mixer alsaLib libpng pcre ];
+  buildInputs = [ SDL2 SDL2_mixer alsa-lib libpng pcre ];
 
   hardeningDisable = ["all"];
 
@@ -52,7 +52,7 @@ stdenv.mkDerivation rec {
     cp ${ivanDesktop}/share/applications/* $out/share/applications
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Graphical roguelike game";
     longDescription = ''
       Iter Vehemens ad Necem (IVAN) is a graphical roguelike game, which currently
diff --git a/pkgs/games/ja2-stracciatella/Cargo.lock b/pkgs/games/ja2-stracciatella/Cargo.lock
deleted file mode 100644
index d017e93e4db..00000000000
--- a/pkgs/games/ja2-stracciatella/Cargo.lock
+++ /dev/null
@@ -1,291 +0,0 @@
-[[package]]
-name = "aho-corasick"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "dtoa"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "fuchsia-zircon"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "fuchsia-zircon-sys"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "getopts"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "kernel32-sys"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "libc"
-version = "0.2.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "memchr"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "quote"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "rand"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex"
-version = "0.1.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.70"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_derive"
-version = "1.0.70"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "shell32-sys"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "stracciatella"
-version = "0.1.0"
-dependencies = [
- "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)",
- "shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "tempdir"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "thread-id"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "thread_local"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-width"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unicode-xid"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "user32-sys"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "utf8-ranges"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "winapi-build"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[metadata]
-"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
-"checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789"
-"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd"
-"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
-"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
-"checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797"
-"checksum itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5adb58558dcd1d786b5f0bd15f3226ee23486e24b7b58304b60f64dc68e62606"
-"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1"
-"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
-"checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6"
-"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035"
-"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
-"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
-"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
-"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
-"checksum serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "0c3adf19c07af6d186d91dae8927b83b0553d07ca56cbf7f2f32560455c91920"
-"checksum serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3525a779832b08693031b8ecfb0de81cd71cfd3812088fafe9a7496789572124"
-"checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e"
-"checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c"
-"checksum syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2beff8ebc3658f07512a413866875adddd20f4fd47b2a4e6c9da65cd281baaea"
-"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
-"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
-"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
-"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
-"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
-"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"
-"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
-"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
-"checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd"
-"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
-"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/pkgs/games/ja2-stracciatella/default.nix b/pkgs/games/ja2-stracciatella/default.nix
index 89d75dd837f..3ad5ba20c53 100644
--- a/pkgs/games/ja2-stracciatella/default.nix
+++ b/pkgs/games/ja2-stracciatella/default.nix
@@ -1,47 +1,58 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, boost, fltk, rustPlatform }:
+{ stdenv, lib, fetchurl, fetchFromGitHub, cmake, python, rustPlatform, SDL2, fltk, rapidjson, gtest, Carbon, Cocoa }:
 let
-  version = "0.16.1";
+  version = "0.17.0";
   src = fetchFromGitHub {
     owner = "ja2-stracciatella";
     repo = "ja2-stracciatella";
     rev = "v${version}";
-    sha256 = "1pyn23syg70kiyfbs3pdlq0ixd2bxhncbamnic43rym3dmd52m29";
-  };
-  lockfile = ./Cargo.lock;
-  libstracciatellaSrc = stdenv.mkDerivation {
-    name = "libstracciatella-${version}-src";
-    src = "${src}/rust";
-    installPhase = ''
-      mkdir -p $out
-      cp -R ./* $out/
-      cp ${lockfile} $out/Cargo.lock
-    '';
+    sha256 = "0m6rvgkba29jy3yq5hs1sn26mwrjl6mamqnv4plrid5fqaivhn6j";
   };
   libstracciatella = rustPlatform.buildRustPackage {
     pname = "libstracciatella";
     inherit version;
-    src = libstracciatellaSrc;
-    cargoSha256 = "15djs4xaz4y1hpfyfqxdgdasxr0b5idy9i5a7c8cmh0jkxjv8bqc";
-    doCheck = false;
+    src = "${src}/rust";
+    cargoHash = "sha256-asUt+wUpwwDvSyuNZds6yMC4Ef4D8woMYWamzcJJiy4=";
+
+    preBuild = ''
+      mkdir -p $out/include/stracciatella
+      export HEADER_LOCATION=$out/include/stracciatella/stracciatella.h
+    '';
+  };
+  stringTheoryUrl = "https://github.com/zrax/string_theory/archive/3.1.tar.gz";
+  stringTheory = fetchurl {
+    url = stringTheoryUrl;
+    sha256 = "1flq26kkvx2m1yd38ldcq2k046yqw07jahms8a6614m924bmbv41";
   };
 in
 stdenv.mkDerivation {
   pname = "ja2-stracciatella";
-  inherit src;
-  inherit version;
+  inherit src version;
 
-  buildInputs = [ cmake SDL2 fltk boost ];
+  nativeBuildInputs = [ cmake python ];
+  buildInputs = [ SDL2 fltk rapidjson gtest ] ++ lib.optionals stdenv.isDarwin [ Carbon Cocoa ];
 
   patches = [
     ./remove-rust-buildstep.patch
   ];
 
   preConfigure = ''
-    sed -i -e 's|rust-stracciatella|${libstracciatella}/lib/libstracciatella.so|g' CMakeLists.txt
-    cmakeFlagsArray+=("-DEXTRA_DATA_DIR=$out/share/ja2")
+    # Use rust library built with nix
+    substituteInPlace CMakeLists.txt \
+      --replace lib/libstracciatella_c_api.a ${libstracciatella}/lib/libstracciatella_c_api.a \
+      --replace include/stracciatella ${libstracciatella}/include/stracciatella \
+      --replace bin/ja2-resource-pack ${libstracciatella}/bin/ja2-resource-pack
+
+    # Patch dependencies that are usually loaded by url
+    substituteInPlace dependencies/lib-string_theory/builder/CMakeLists.txt.in \
+      --replace ${stringTheoryUrl} file://${stringTheory}
+
+    cmakeFlagsArray+=("-DLOCAL_RAPIDJSON_LIB=OFF" "-DLOCAL_GTEST_LIB=OFF" "-DEXTRA_DATA_DIR=$out/share/ja2")
   '';
 
-  enableParallelBuilding = true;
+  doInstallCheck = true;
+  installCheckPhase = ''
+    HOME=/tmp $out/bin/ja2 -unittests
+  '';
 
   meta = {
     description = "Jagged Alliance 2, with community fixes";
diff --git a/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch b/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch
index b86589fc671..64e3c11b250 100644
--- a/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch
+++ b/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch
@@ -1,21 +1,73 @@
 diff --git a/CMakeLists.txt b/CMakeLists.txt
-index f354370e0..c9fa23c6d 100644
+index e4e5547af..a3017d197 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
-@@ -159,7 +159,6 @@ add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/externalized")
+@@ -175,13 +175,12 @@ if(BUILD_LAUNCHER)
+ endif()
+ message(STATUS "Fltk Libraries: ${FLTK_LIBRARIES}")
+ 
+-set(JA2_INCLUDES "")
++set(JA2_INCLUDES "include/stracciatella")
+ set(JA2_SOURCES "")
+ add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/externalized")
  add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/game")
  add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/sgp")
- add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/slog")
--add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/rust")
  add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib-smacker")
-
+-add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib-stracciatella")
+ add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib-string_theory")
+ 
  if(BUILD_LAUNCHER)
-@@ -235,8 +234,6 @@ copy_assets_dir_to_ja2_binary_after_build("externalized")
- copy_assets_dir_to_ja2_binary_after_build("unittests")
- copy_assets_dir_to_ja2_binary_after_build("mods")
-
--get_property(STRACCIATELLA_SHARED_LIB TARGET rust-stracciatella PROPERTY IMPORTED_LOCATION)
+@@ -239,14 +238,12 @@ string(LENGTH "${CMAKE_SOURCE_DIR}/src/" SOURCE_PATH_SIZE)
+ add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
+ 
+ add_executable(${JA2_BINARY} ${JA2_SOURCES})
+-target_link_libraries(${JA2_BINARY} ${SDL2_LIBRARY} ${GTEST_LIBRARIES} smacker ${STRACCIATELLA_LIBRARIES} string_theory-internal)
+-add_dependencies(${JA2_BINARY} stracciatella)
++target_link_libraries(${JA2_BINARY} ${SDL2_LIBRARY} ${GTEST_LIBRARIES} smacker lib/libstracciatella_c_api.a dl pthread string_theory-internal)
+ set_property(SOURCE ${CMAKE_SOURCE_DIR}/src/game/GameVersion.cc APPEND PROPERTY COMPILE_DEFINITIONS "GAME_VERSION=v${ja2-stracciatella_VERSION}")
+ 
+ if(BUILD_LAUNCHER)
+     add_executable(${LAUNCHER_BINARY} ${LAUNCHER_SOURCES})
+-    target_link_libraries(${LAUNCHER_BINARY} ${FLTK_LIBRARIES} ${STRACCIATELLA_LIBRARIES} string_theory-internal)
+-    add_dependencies(${LAUNCHER_BINARY} stracciatella)
++    target_link_libraries(${LAUNCHER_BINARY} ${FLTK_LIBRARIES} lib/libstracciatella_c_api.a dl pthread string_theory-internal)
+ endif()
+ 
+ macro(copy_assets_dir_to_ja2_binary_after_build DIR)
+@@ -375,12 +372,12 @@ set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}_${CPACK_PACKAGE_VERSION}_${PACKAGE_
+ 
+ include(CPack)
+ 
+-if (UNIX AND NOT MINGW AND NOT APPLE)
++if (UNIX)
+     install(TARGETS ${JA2_BINARY} RUNTIME DESTINATION bin)
+     if(BUILD_LAUNCHER)
+         install(TARGETS ${LAUNCHER_BINARY} RUNTIME DESTINATION bin)
+     endif()
+-    install(PROGRAMS "${CMAKE_BINARY_DIR}/lib-stracciatella/bin/ja2-resource-pack${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION bin)
++    install(PROGRAMS "bin/ja2-resource-pack" DESTINATION bin)
+     install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets/externalized assets/mods assets/unittests DESTINATION share/ja2)
+     if(WITH_EDITOR_SLF)
+         install(FILES "${EDITORSLF_FILE}" DESTINATION share/ja2)
+@@ -400,7 +397,7 @@ else()
+     if(BUILD_LAUNCHER)
+         install(TARGETS ${LAUNCHER_BINARY} RUNTIME DESTINATION .)
+     endif()
+-    install(PROGRAMS "${CMAKE_BINARY_DIR}/lib-stracciatella/bin/ja2-resource-pack${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION .)
++    install(PROGRAMS "bin/ja2-resource-pack" DESTINATION .)
+     install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets/externalized assets/mods assets/unittests DESTINATION .)
+     if(WITH_EDITOR_SLF)
+         install(FILES "${EDITORSLF_FILE}" DESTINATION .)
+@@ -428,12 +425,6 @@ if (MINGW)
+     install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/install-dlls-mingw.cmake")
+ endif()
+ 
+-if(APPLE)
+-    file(GLOB APPLE_DIST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/assets/distr-files-mac/*.txt")
+-    install(FILES ${APPLE_DIST_FILES} DESTINATION .)
+-    install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib-SDL2-2.0.8-macos/SDL2.framework DESTINATION .)
+-endif()
 -
- if (MSVC OR APPLE)
-     add_custom_command(TARGET ${JA2_BINARY} POST_BUILD
-             COMMAND ${CMAKE_COMMAND} -E copy
+ ## Uninstall
+ 
+ add_custom_templated_target("uninstall")
diff --git a/pkgs/games/julius/default.nix b/pkgs/games/julius/default.nix
index d1dad86e1c5..84e80d7d632 100644
--- a/pkgs/games/julius/default.nix
+++ b/pkgs/games/julius/default.nix
@@ -1,24 +1,25 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, libpng }:
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, libpng }:
 
 stdenv.mkDerivation rec {
   pname = "julius";
-  version = "1.4.1";
+  version = "1.6.0";
 
   src = fetchFromGitHub {
     owner = "bvschaik";
     repo = "julius";
     rev = "v${version}";
-    sha256 = "12hhnhdwgz7hd3hlndbnk15pxggm1375qs0764ija4nl1gbpb110";
+    sha256 = "0nfdn8n6ywhm69ckz9a1chl5xxiqyaj3l337wadsbppnpscjihrc";
   };
 
   nativeBuildInputs = [ cmake ];
   buildInputs = [ SDL2 SDL2_mixer libpng ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An open source re-implementation of Caesar III";
     homepage = "https://github.com/bvschaik/julius";
     license = licenses.agpl3;
     platforms = platforms.all;
+    broken = stdenv.isDarwin;
     maintainers = with maintainers; [ Thra11 ];
   };
 }
diff --git a/pkgs/games/jumpnbump/default.nix b/pkgs/games/jumpnbump/default.nix
new file mode 100644
index 00000000000..b502b4f1396
--- /dev/null
+++ b/pkgs/games/jumpnbump/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, fetchFromGitLab
+, fetchzip
+, SDL2, SDL2_mixer, SDL2_net
+, gtk3, gobject-introspection
+, python3Packages
+, wrapGAppsHook
+}:
+
+let data = fetchzip {
+  url = "https://mirandir.pagesperso-orange.fr/files/additional-levels.tar.xz";
+  sha256 = "167hisscsbldrwrs54gq6446shl8h26qdqigmfg0lq3daynqycg2";
+}; in
+
+stdenv.mkDerivation rec {
+  pname = "jumpnbump";
+  version = "1.70-dev";
+
+  # By targeting the development version, we can omit the patches Arch uses
+  src = fetchFromGitLab {
+    domain = "gitlab.com";
+    owner = "LibreGames";
+    repo = pname;
+    rev = "5744738211ca691444f779aafee3537fb3562516";
+    sha256 = "0f1k26jicmb95bx19wgcdpwsbbl343i7mqqqc2z9lkb8drlsyqcy";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  nativeBuildInputs = [ python3Packages.wrapPython wrapGAppsHook ];
+  buildInputs = [ SDL2 SDL2_mixer SDL2_net gtk3 gobject-introspection ];
+
+  postInstall = ''
+    make -C menu PREFIX=$out all install
+    cp -r ${data}/* $out/share/jumpnbump/
+    rm $out/share/applications/jumpnbump-menu.desktop
+    sed -ie 's+Exec=jumpnbump+Exec=jumpnbump-menu+' $out/share/applications/jumpnbump.desktop
+  '';
+
+  pythonPath = with python3Packages; [ pygobject3 pillow ];
+  preFixup = ''
+    buildPythonPath "$out $pythonPath"
+  '';
+  postFixup = ''
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    description = "cute, true multiplayer platform game with bunnies";
+    homepage    = "https://libregames.gitlab.io/jumpnbump/";
+    license     = licenses.gpl2Plus;
+    maintainers = with maintainers; [ iblech ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/pkgs/games/katago/default.nix b/pkgs/games/katago/default.nix
index 492ccbb63ab..fb08ef44710 100644
--- a/pkgs/games/katago/default.nix
+++ b/pkgs/games/katago/default.nix
@@ -1,49 +1,50 @@
 { stdenv
 , gcc8Stdenv
-, lib
-, libzip
 , boost
 , cmake
-, makeWrapper
+, cudatoolkit
+, cudnn
+, eigen
 , fetchFromGitHub
-, fetchpatch
-, cudnn ? null
-, cudatoolkit ? null
-, libGL_driver ? null
-, opencl-headers ? null
-, ocl-icd ? null
-, gperftools ? null
-, cudaSupport ? false
-, useTcmalloc ? true}:
-
-assert cudaSupport -> (
-  libGL_driver != null &&
-  cudatoolkit != null &&
-  cudnn != null);
-
-assert !cudaSupport -> (
-  opencl-headers != null &&
-  ocl-icd != null);
+, gperftools
+, lib
+, libzip
+, makeWrapper
+, mesa
+, ocl-icd
+, opencl-headers
+, openssl
+, writeShellScriptBin
+, enableAVX2 ? stdenv.hostPlatform.avx2Support
+, enableBigBoards ? false
+, enableCuda ? false
+, enableContrib ? false
+, enableGPU ? true
+, enableTcmalloc ? true
+}:
 
-assert useTcmalloc -> (
-  gperftools != null);
+assert !enableGPU -> (
+  !enableCuda);
 
 let
-  env = if cudaSupport
+  env = if enableCuda
     then gcc8Stdenv
     else stdenv;
 
 in env.mkDerivation rec {
   pname = "katago";
-  version = "1.5.0";
+  version = "1.9.1";
+  githash = "c3220a5a404af835792c476f3f24904e4b799444";
 
   src = fetchFromGitHub {
     owner = "lightvector";
     repo = "katago";
-    rev = "${version}";
-    sha256 = "0ajdjdmlzwh7zwk5v0k9zzjawgkf7w30pzqp5bhcsdqz4svvyll2";
+    rev = "v${version}";
+    sha256 = "sha256-sAtPOqGe6fZ9mAtLdp80fTALXVkP9WdWQU2iTFGXe24=";
   };
 
+  fakegit = writeShellScriptBin "git" "echo ${githash}";
+
   nativeBuildInputs = [
     cmake
     makeWrapper
@@ -52,43 +53,58 @@ in env.mkDerivation rec {
   buildInputs = [
     libzip
     boost
-  ] ++ lib.optionals cudaSupport [
+  ] ++ lib.optionals (!enableGPU) [
+    eigen
+  ] ++ lib.optionals (enableGPU && enableCuda) [
     cudnn
-    libGL_driver
-  ] ++ lib.optionals (!cudaSupport) [
+    mesa.drivers
+  ] ++ lib.optionals (enableGPU && !enableCuda) [
     opencl-headers
     ocl-icd
-  ] ++ lib.optionals useTcmalloc [
+  ] ++ lib.optionals enableContrib [
+    openssl
+  ] ++ lib.optionals enableTcmalloc [
     gperftools
   ];
 
   cmakeFlags = [
     "-DNO_GIT_REVISION=ON"
-  ] ++ lib.optionals cudaSupport [
+  ] ++ lib.optionals (!enableGPU) [
+    "-DUSE_BACKEND=EIGEN"
+  ] ++ lib.optionals enableAVX2 [
+    "-DUSE_AVX2=ON"
+  ] ++ lib.optionals (enableGPU && enableCuda) [
     "-DUSE_BACKEND=CUDA"
-  ] ++ lib.optionals (!cudaSupport) [
+  ] ++ lib.optionals (enableGPU && !enableCuda) [
     "-DUSE_BACKEND=OPENCL"
-  ] ++ lib.optionals useTcmalloc [
+  ] ++ lib.optionals enableContrib [
+    "-DBUILD_DISTRIBUTED=1"
+    "-DNO_GIT_REVISION=OFF"
+    "-DGIT_EXECUTABLE=${fakegit}/bin/git"
+  ] ++ lib.optionals enableTcmalloc [
     "-DUSE_TCMALLOC=ON"
+  ] ++ lib.optionals enableBigBoards [
+    "-DUSE_BIGGER_BOARDS_EXPENSIVE=ON"
   ];
 
   preConfigure = ''
     cd cpp/
-  '' + lib.optionalString cudaSupport ''
+  '' + lib.optionalString enableCuda ''
     export CUDA_PATH="${cudatoolkit}"
     export EXTRA_LDFLAGS="-L/run/opengl-driver/lib"
   '';
 
   installPhase = ''
+    runHook preInstall
     mkdir -p $out/bin; cp katago $out/bin;
-  '' + lib.optionalString cudaSupport ''
+  '' + lib.optionalString enableCuda ''
     wrapProgram $out/bin/katago \
       --prefix LD_LIBRARY_PATH : "/run/opengl-driver/lib"
+  '' + ''
+    runHook postInstall
   '';
 
-  enableParallelBuilding = true;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Go engine modeled after AlphaGo Zero";
     homepage    = "https://github.com/lightvector/katago";
     license     = licenses.mit;
diff --git a/pkgs/games/keen4/builder.sh b/pkgs/games/keen4/builder.sh
index 50d261db865..b5864b8392f 100644
--- a/pkgs/games/keen4/builder.sh
+++ b/pkgs/games/keen4/builder.sh
@@ -28,4 +28,4 @@ for i in *; do
     fi
 done
 EOF
-chmod +x $out/bin/keen4
\ No newline at end of file
+chmod +x $out/bin/keen4
diff --git a/pkgs/games/keen4/default.nix b/pkgs/games/keen4/default.nix
index c91cc486118..59bb30d627f 100644
--- a/pkgs/games/keen4/default.nix
+++ b/pkgs/games/keen4/default.nix
@@ -9,7 +9,7 @@ stdenv.mkDerivation {
     sha256 = "12rnc9ksl7v6l8wsxvr26ylkafzq80dbsa7yafzw9pqc8pafkhx1";
   };
 
-  buildInputs = [unzip];
+  nativeBuildInputs = [ unzip ];
 
   inherit dosbox;
 
diff --git a/pkgs/games/keeperrl/default.nix b/pkgs/games/keeperrl/default.nix
index 68426a4aedf..bd49b821f9e 100644
--- a/pkgs/games/keeperrl/default.nix
+++ b/pkgs/games/keeperrl/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, requireFile
+{ lib, stdenv, fetchFromGitHub, requireFile
 , openal, curl, libogg, libvorbis
 , SDL2, SDL2_image, zlib
 , unfree_assets ? false }:
@@ -33,9 +33,9 @@ stdenv.mkDerivation rec {
 
   sourceRoot = "source";
 
-  srcs = [ free-src ] ++ stdenv.lib.optional unfree_assets assets;
+  srcs = [ free-src ] ++ lib.optional unfree_assets assets;
 
-  postUnpack = stdenv.lib.optionalString unfree_assets ''
+  postUnpack = lib.optionalString unfree_assets ''
     mv data $sourceRoot
   '';
 
@@ -61,10 +61,10 @@ stdenv.mkDerivation rec {
 
     cp -r data_free $out/share
     cp -r data_contrib $out/share
-    ${stdenv.lib.optionalString unfree_assets "cp -r data $out/share"}
+    ${lib.optionalString unfree_assets "cp -r data $out/share"}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A dungeon management rogue-like";
     homepage = "https://keeperrl.com/";
     license = licenses.gpl2;
diff --git a/pkgs/games/klavaro/default.nix b/pkgs/games/klavaro/default.nix
index 557f75580ca..2a8f68ddd2c 100644
--- a/pkgs/games/klavaro/default.nix
+++ b/pkgs/games/klavaro/default.nix
@@ -1,23 +1,23 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
 , makeWrapper
 , curl
 , file
 , gtk3
 , intltool
-, pkgconfig
+, pkg-config
 }:
 
 stdenv.mkDerivation rec {
   pname = "klavaro";
-  version = "3.10";
+  version = "3.11";
 
   src = fetchurl {
     url = "mirror://sourceforge/klavaro/${pname}-${version}.tar.bz2";
-    sha256 = "0jnzdrndiq6m0bwgid977z5ghp4q61clwdlzfpx4fd2ml5x3iq95";
+    sha256 = "1rkxaqb62w4mv86fcnmr32lq6y0h4hh92wmsy5ddb9a8jnzx6r7w";
   };
 
-  nativeBuildInputs = [ intltool makeWrapper pkgconfig ];
+  nativeBuildInputs = [ intltool makeWrapper pkg-config ];
   buildInputs = [ curl gtk3 ];
 
   postInstall = ''
@@ -34,9 +34,10 @@ stdenv.mkDerivation rec {
   # Hack to avoid TMPDIR in RPATHs.
   preFixup = ''rm -rf "$(pwd)" '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Free touch typing tutor program";
     homepage = "http://klavaro.sourceforge.net/";
+    changelog = "https://sourceforge.net/p/klavaro/code/HEAD/tree/trunk/ChangeLog";
     license = licenses.gpl3Plus;
     platforms = platforms.linux;
     maintainers = with maintainers; [ mimame davidak ];
diff --git a/pkgs/games/kobodeluxe/default.nix b/pkgs/games/kobodeluxe/default.nix
index 5620cee185d..9dea9082420 100644
--- a/pkgs/games/kobodeluxe/default.nix
+++ b/pkgs/games/kobodeluxe/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, SDL, SDL_image, libGLU, libGL} :
+{lib, stdenv, fetchurl, SDL, SDL_image, libGLU, libGL} :
 
-stdenv.mkDerivation {
-  name = "kobodeluxe-0.5.1";
+stdenv.mkDerivation rec {
+  pname = "kobodeluxe";
+  version = "0.5.1";
   src = fetchurl {
-    url = "http://olofson.net/kobodl/download/KoboDeluxe-0.5.1.tar.bz2";
+    url = "http://olofson.net/kobodl/download/KoboDeluxe-${version}.tar.bz2";
     sha256 = "0f7b910a399d985437564af8c5d81d6dcf22b96b26b01488d72baa6a6fdb5c2c";
   };
 
@@ -18,7 +19,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://olofson.net/kobodl/";
     description = "Enhanced version of Akira Higuchi's game XKobo  for Un*x systems with X11";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/koboredux/default.nix b/pkgs/games/koboredux/default.nix
new file mode 100644
index 00000000000..622dd2de50e
--- /dev/null
+++ b/pkgs/games/koboredux/default.nix
@@ -0,0 +1,87 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, requireFile
+, cmake
+, pkg-config
+, SDL2
+, SDL2_image
+, audiality2
+, useProprietaryAssets ? true
+}:
+
+with lib;
+stdenv.mkDerivation rec {
+  pname = "koboredux";
+  version = "0.7.5.1";
+
+  src =
+    [(fetchFromGitHub {
+      owner = "olofson";
+      repo = "koboredux";
+      rev = "v${version}";
+      sha256 = "09h9r65z8bar2z89s09j6px0gdq355kjf38rmd85xb2aqwnm6xig";
+    })]
+    ++
+    (optional useProprietaryAssets (requireFile {
+      name = "koboredux-${version}-Linux.tar.bz2";
+      sha256 = "11bmicx9i11m4c3dp19jsql0zy4rjf5a28x4hd2wl8h3bf8cdgav";
+      message = ''
+        Please purchase the game on https://olofson.itch.io/kobo-redux
+        and download the Linux build.
+
+        Once you have downloaded the file, please use the following command
+        and re-run the installation:
+
+        nix-prefetch-url file://\$PWD/koboredux-${version}-Linux.tar.bz2
+
+        Alternatively, install the "koboredux-free" package, which replaces the
+        proprietary assets with a placeholder theme.
+      '';
+    }));
+
+  sourceRoot = "source"; # needed when we have the assets source
+
+  # Fix clang build
+  patches = [(fetchpatch {
+    url = "https://github.com/olofson/koboredux/commit/cf92b8a61d002ccaa9fbcda7a96dab08a681dee4.patch";
+    sha256 = "0dwhvis7ghf3mgzjd2rwn8hk3ndlgfwwcqaq581yc5rwd73v6vw4";
+  })];
+
+  postPatch = optionalString useProprietaryAssets ''
+    cp -r ../koboredux-${version}-Linux/sfx/redux data/sfx/
+    cp -r ../koboredux-${version}-Linux/gfx/redux data/gfx/
+    cp -r ../koboredux-${version}-Linux/gfx/redux_fullscreen data/gfx/
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    audiality2
+  ];
+
+  meta = {
+    description = "A frantic 80's style 2D shooter, similar to XKobo and Kobo Deluxe" +
+      optionalString (!useProprietaryAssets) " (built without proprietary assets)";
+    longDescription = ''
+      Kobo Redux is a frantic 80's style 2D shooter, inspired by the look and
+      feel of 90's arcade cabinets. The gameplay is fast and unforgiving,
+      although with less of the frustrating quirkiness of the actual games
+      of the 80's. A true challenge in the spirit of the arcade era!
+    '' + optionalString (!useProprietaryAssets) ''
+
+      This version replaces the official proprietary assets with placeholders.
+      For the full experience, consider installing "koboredux" instead.
+    '';
+    homepage = "https://olofson.itch.io/kobo-redux";
+    license = with licenses; if useProprietaryAssets then unfree else gpl2;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
+
diff --git a/pkgs/games/lbreakout2/default.nix b/pkgs/games/lbreakout2/default.nix
index ddd7e454efb..818cd31fa59 100644
--- a/pkgs/games/lbreakout2/default.nix
+++ b/pkgs/games/lbreakout2/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, SDL, SDL_mixer, zlib, libpng, libintl }:
+{ lib, stdenv, fetchurl, SDL, SDL_mixer, zlib, libpng, libintl }:
 
 stdenv.mkDerivation rec {
   pname = "lbreakout2";
@@ -10,12 +10,12 @@ stdenv.mkDerivation rec {
     sha256 = "0vwdlyvh7c4y80q5vp7fyfpzbqk9lq3w8pvavi139njkalbxc14i";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Breakout clone from the LGames series";
     homepage = "http://lgames.sourceforge.net/LBreakout2/";
     license = licenses.gpl2;
     maintainers = [ maintainers.ciil ];
     platforms = platforms.unix;
-    hydraPlatforms = stdenv.lib.platforms.linux; # sdl-config times out on darwin
+    hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin
   };
 }
diff --git a/pkgs/games/leela-zero/default.nix b/pkgs/games/leela-zero/default.nix
index 7ade06393bb..13b423832e6 100644
--- a/pkgs/games/leela-zero/default.nix
+++ b/pkgs/games/leela-zero/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, boost
+{ lib, stdenv, fetchFromGitHub, cmake, boost
 , opencl-headers, ocl-icd, qtbase , zlib }:
 
 stdenv.mkDerivation rec {
@@ -17,9 +17,9 @@ stdenv.mkDerivation rec {
 
   nativeBuildInputs = [ cmake ];
 
-  enableParallelBuilding = true;
+  dontWrapQtApps = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Go engine modeled after AlphaGo Zero";
     homepage    = "https://github.com/gcp/leela-zero";
     license     = licenses.gpl3;
diff --git a/pkgs/games/left4gore/default.nix b/pkgs/games/left4gore/default.nix
new file mode 100644
index 00000000000..597f7da2b3d
--- /dev/null
+++ b/pkgs/games/left4gore/default.nix
@@ -0,0 +1,48 @@
+{ stdenvNoCC, lib, fetchurl, buildFHSUserEnv }:
+
+let
+  version = "2.3";
+
+  # Unwrapped package, for putting into the FHS env
+  left4gore-unwrapped = stdenvNoCC.mkDerivation {
+    pname = "left4gore-unwrapped";
+    inherit version;
+
+    src = fetchurl {
+      url = "http://www.left4gore.com/dist/left4gore-${version}-linux.tar.gz";
+      sha256 = "1n57nh32ybn6kirn8djh0nsjx6m84c0jfi1x8r4w2qr0qky3z7p0";
+    };
+
+    installPhase = ''
+      mkdir -p $out/bin
+      cp left4gore $out/bin
+    '';
+  };
+
+  # FHS env, as patchelf will not work
+  env = buildFHSUserEnv {
+    name = "left4gore-env-${version}";
+    targetPkgs = _: [ left4gore-unwrapped ];
+    runScript = "left4gore";
+  };
+
+in stdenvNoCC.mkDerivation {
+  pname = "left4gore";
+  inherit version;
+
+  dontUnpack = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    ln -s ${env}/bin/* $out/bin/left4gore
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.left4gore.com";
+    description = "Memory patcher which adds the gore back into Left 4 Dead 2";
+    license = licenses.unfree; # Probably the best choice
+    maintainers = with maintainers; [ das_j ];
+  };
+}
diff --git a/pkgs/games/legendary-gl/default.nix b/pkgs/games/legendary-gl/default.nix
index 114aa6ab12a..eb2f3f38cea 100644
--- a/pkgs/games/legendary-gl/default.nix
+++ b/pkgs/games/legendary-gl/default.nix
@@ -7,24 +7,28 @@
 
 buildPythonApplication rec {
   pname = "legendary-gl"; # Name in pypi
-  version = "0.0.14";
+  version = "0.20.6";
 
   src = fetchFromGitHub {
     owner = "derrod";
     repo = "legendary";
     rev = version;
-    sha256 = "05r88qi8mmbj07wxcpb3fhbl40qscbq1aqb0mnj9bpmi9gf5zll5";
+    sha256 = "1v6jbnasz2ilcafs6qyl6na4a8cxy2lgwr0hqsja6d846rfqa8ad";
   };
 
   propagatedBuildInputs = [ requests ];
 
   disabled = pythonOlder "3.8";
 
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "legendary" ];
+
   meta = with lib; {
     description = "A free and open-source Epic Games Launcher alternative";
     homepage = "https://github.com/derrod/legendary";
     license = licenses.gpl3;
-    maintainers = with maintainers; [ wchresta ];
+    maintainers = with maintainers; [ equirosa ];
   };
 }
-
diff --git a/pkgs/games/lgogdownloader/default.nix b/pkgs/games/lgogdownloader/default.nix
index 69200bd184f..4cb9d3a6c04 100644
--- a/pkgs/games/lgogdownloader/default.nix
+++ b/pkgs/games/lgogdownloader/default.nix
@@ -1,33 +1,36 @@
-{ stdenv, fetchFromGitHub, cmake, pkgconfig, curl, boost, liboauth, jsoncpp
-, htmlcxx, rhash, tinyxml-2, help2man, fetchpatch }:
+{ lib, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, curl
+, boost
+, liboauth
+, jsoncpp
+, htmlcxx
+, rhash
+, tinyxml-2
+, help2man
+}:
 
 stdenv.mkDerivation rec {
   pname = "lgogdownloader";
-  version = "3.5";
+  version = "3.7";
 
   src = fetchFromGitHub {
     owner = "Sude-";
     repo = "lgogdownloader";
     rev = "v${version}";
-    sha256 = "0a3rrkgqwdqxx3ghzw182jx88gzzw6ldp3jasmgnr4l7gpxkmwws";
+    sha256 = "sha256-3xFlFokqdD1Nstu7TSUCaHUxvSodIb12QNVjmNgn9gs=";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig help2man ];
+  nativeBuildInputs = [ cmake pkg-config help2man ];
 
-  buildInputs = [ curl boost liboauth jsoncpp htmlcxx rhash tinyxml-2 ];
+  buildInputs = [ boost curl htmlcxx jsoncpp liboauth rhash tinyxml-2 ];
 
-  patches = [
-    # Fix find_path for newer jsoncpp. Remove with the next release
-    (fetchpatch {
-      url = "https://github.com/Sude-/lgogdownloader/commit/ff353126ecda61824cf866d3807c9ebada96282e.patch";
-      sha256 = "1xr1lwxlrncrj662s9l1is1x1mhs1jbwlj8qafixz5hw2kx22w19";
-    })
-  ];
-
-  meta = {
-    homepage = "https://github.com/Sude-/lgogdownloader";
+  meta = with lib; {
     description = "Unofficial downloader to GOG.com for Linux users. It uses the same API as the official GOGDownloader";
-    license = stdenv.lib.licenses.wtfpl;
-    platforms = stdenv.lib.platforms.linux;
+    homepage = "https://github.com/Sude-/lgogdownloader";
+    license = licenses.wtfpl;
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/liberal-crime-squad/default.nix b/pkgs/games/liberal-crime-squad/default.nix
index 25d8bf3eae5..d8048b01d21 100644
--- a/pkgs/games/liberal-crime-squad/default.nix
+++ b/pkgs/games/liberal-crime-squad/default.nix
@@ -1,4 +1,4 @@
-{ fetchFromGitHub, stdenv, autoreconfHook, libiconv, ncurses, SDL2, SDL2_mixer }:
+{ fetchFromGitHub, lib, stdenv, autoreconfHook, libiconv, ncurses, SDL2, SDL2_mixer }:
 
 stdenv.mkDerivation {
   version = "2016-07-06";
@@ -16,7 +16,7 @@ stdenv.mkDerivation {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A humorous politically themed ncurses game";
     longDescription = ''
       Welcome to Liberal Crime Squad! The Conservatives have taken the Executive, Legislative, and Judicial branches of government. Over time, the Liberal laws of this nation will erode and turn the country into a BACKWOODS YET CORPORATE NIGHTMARE. To prevent this from happening, the Liberal Crime Squad was established. The mood of the country is shifting, and we need to turn things around. Go out on the streets and indoctrinate Conservative automatons. That is, let them see their True Liberal Nature. Then arm them and send them forth to Stop Evil.
diff --git a/pkgs/games/lincity/default.nix b/pkgs/games/lincity/default.nix
index 574b8ead095..397ca0cfe8e 100644
--- a/pkgs/games/lincity/default.nix
+++ b/pkgs/games/lincity/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchpatch, libX11, libXext, xorgproto, libICE, libSM, libpng12, zlib }:
+{ lib, stdenv, fetchurl, fetchpatch, libX11, libXext, xorgproto, libICE, libSM, libpng12, zlib }:
 
 stdenv.mkDerivation rec {
   pname = "lincity";
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
     })
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "City simulation game";
     license = licenses.gpl2Plus;
     homepage = "https://sourceforge.net/projects/lincity";
diff --git a/pkgs/games/lincity/ng.nix b/pkgs/games/lincity/ng.nix
index 67f15be1ed3..1fe2223886a 100644
--- a/pkgs/games/lincity/ng.nix
+++ b/pkgs/games/lincity/ng.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, jam, pkgconfig
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, jam, pkg-config
 , zlib, libxml2, libxslt, xorgproto, libX11, libGLU, libGL, SDL
 , SDL_mixer, SDL_image, SDL_ttf, SDL_gfx, physfs
 }:
@@ -17,7 +17,7 @@ stdenv.mkDerivation {
   hardeningDisable = [ "format" ];
 
   nativeBuildInputs = [
-    autoreconfHook jam pkgconfig
+    autoreconfHook jam pkg-config
   ];
 
   buildInputs = [
@@ -46,7 +46,7 @@ stdenv.mkDerivation {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "City building game";
     license = licenses.gpl2;
     maintainers = with maintainers; [ raskin ];
diff --git a/pkgs/games/liquidwar/5.nix b/pkgs/games/liquidwar/5.nix
index 5c42b8ecaab..e95371ec5ea 100644
--- a/pkgs/games/liquidwar/5.nix
+++ b/pkgs/games/liquidwar/5.nix
@@ -1,25 +1,24 @@
-{ stdenv, fetchurl, allegro }:
+{ lib, stdenv, fetchurl, allegro }:
 stdenv.mkDerivation rec {
-  version = "5.6.4";
+  version = "5.6.5";
   pname = "liquidwar5";
   src = fetchurl {
-    url = "https://download.savannah.gnu.org/releases/liquidwar/liquidwar-${version}.tar.gz";
-    sha256 = "18wkbfzp07yckg05b5gjy67rw06z9lxp0hzg0zwj7rz8i12jxi9j";
+    url = "http://www.ufoot.org/download/liquidwar/v5/${version}/liquidwar-${version}.tar.gz";
+    sha256 = "2tCqhN1BbK0FVCHtm0DfOe+ueNPfdZwFg8ZMVPfy/18=";
   };
 
   buildInputs = [ allegro ];
 
-  configureFlags = stdenv.lib.optional stdenv.isx86_64 "--disable-asm";
+  configureFlags = lib.optional stdenv.isx86_64 "--disable-asm";
 
   hardeningDisable = [ "format" ];
 
   NIX_CFLAGS_COMPILE = [ "-lm" ];
 
-  meta = with stdenv.lib; {
-    description = ''The classic version of a quick tactics game LiquidWar'';
+  meta = with lib; {
+    description = "The classic version of a quick tactics game LiquidWar";
     maintainers = [ maintainers.raskin ];
     license = licenses.gpl2Plus;
     platforms = platforms.linux;
-    broken = true;
   };
 }
diff --git a/pkgs/games/liquidwar/default.nix b/pkgs/games/liquidwar/default.nix
index 341d077879c..827c7d696c7 100644
--- a/pkgs/games/liquidwar/default.nix
+++ b/pkgs/games/liquidwar/default.nix
@@ -1,9 +1,10 @@
-{ stdenv, fetchurl, xorgproto, libX11, libXrender
+{ lib, stdenv, fetchurl, xorgproto, libX11, libXrender
 , gmp, libjpeg, libpng
 , expat, gettext, perl, guile
 , SDL, SDL_image, SDL_mixer, SDL_ttf
 , curl, sqlite, libtool, readline
-, libogg, libvorbis, libcaca, csound, cunit } :
+, libogg, libvorbis, libcaca, csound, cunit
+, pkg-config }:
 
 stdenv.mkDerivation rec {
   pname = "liquidwar6";
@@ -25,6 +26,8 @@ stdenv.mkDerivation rec {
     libtool readline
   ];
 
+  nativeBuildInputs = [ pkg-config ];
+
   hardeningDisable = [ "format" ];
 
   NIX_CFLAGS_COMPILE =
@@ -36,7 +39,7 @@ stdenv.mkDerivation rec {
   # To avoid problems finding SDL_types.h.
   configureFlags = [ "CFLAGS=-I${SDL.dev}/include/SDL" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Quick tactics game";
     homepage = "https://www.gnu.org/software/liquidwar6/";
     maintainers = [ maintainers.raskin ];
diff --git a/pkgs/games/ltris/default.nix b/pkgs/games/ltris/default.nix
index 0ea4143bc3d..d128f6c6c01 100644
--- a/pkgs/games/ltris/default.nix
+++ b/pkgs/games/ltris/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, SDL, SDL_mixer }:
+{ lib, stdenv, fetchurl, SDL, SDL_mixer }:
 
 stdenv.mkDerivation rec {
   pname = "ltris";
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
 
   patchPhase = "patch -p0 < ${./gcc5_compliance.diff}";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tetris clone from the LGames series";
     homepage = "http://lgames.sourceforge.net/LBreakout2/";
     license = licenses.gpl2;
diff --git a/pkgs/games/lugaru/default.nix b/pkgs/games/lugaru/default.nix
index 6620074418d..9d10691fe49 100644
--- a/pkgs/games/lugaru/default.nix
+++ b/pkgs/games/lugaru/default.nix
@@ -1,7 +1,7 @@
-{ stdenv, fetchFromGitLab, cmake, openal, pkgconfig, libogg,
+{ lib, stdenv, fetchFromGitLab, cmake, openal, pkg-config, libogg,
   libvorbis, SDL2, makeWrapper, libpng, libjpeg_turbo, libGLU }:
 
-with stdenv.lib;
+with lib;
 
 stdenv.mkDerivation rec {
 
@@ -15,17 +15,17 @@ stdenv.mkDerivation rec {
     sha256 = "089rblf8xw3c6dq96vnfla6zl8gxcpcbc1bj5jysfpq63hhdpypz";
   };
 
-  nativeBuildInputs = [ makeWrapper cmake pkgconfig ];
+  nativeBuildInputs = [ makeWrapper cmake pkg-config ];
 
   buildInputs = [ libGLU openal SDL2 libogg libvorbis libpng libjpeg_turbo ];
 
   cmakeFlags = [ "-DSYSTEM_INSTALL=ON" ];
 
   meta = {
-    description = "Lugaru HD: Third person ninja rabbit fighting game";
+    description = "Third person ninja rabbit fighting game";
     homepage = "https://osslugaru.gitlab.io";
-    maintainers = [ maintainers.genesis ];
+    maintainers = [ ];
     platforms = platforms.linux;
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
   };
 }
diff --git a/pkgs/games/lunar-client/default.nix b/pkgs/games/lunar-client/default.nix
new file mode 100644
index 00000000000..df361c69b04
--- /dev/null
+++ b/pkgs/games/lunar-client/default.nix
@@ -0,0 +1,44 @@
+{ appimageTools, lib, fetchurl, makeDesktopItem }:
+
+let
+  name = "lunar-client";
+  version = "2.7.3";
+
+  desktopItem = makeDesktopItem {
+    name = "Lunar Client";
+    exec = "lunar-client";
+    icon = "lunarclient";
+    comment = "Minecraft 1.7, 1.8, 1.12, 1.15, and 1.16 Client";
+    desktopName = "Lunar Client";
+    genericName = "Minecraft Client";
+    categories = "Game;";
+  };
+
+  appimageContents = appimageTools.extract {
+    inherit name src;
+  };
+
+  src = fetchurl {
+    url = "https://launcherupdates.lunarclientcdn.com/Lunar%20Client-${version}.AppImage";
+    name = "lunar-client.AppImage";
+    sha256 = "0ihi937rrj677y9b377b4hhp9wsarbqwrdrd6k3lhzx3jyh2fynf";
+  };
+in appimageTools.wrapType1 rec {
+  inherit name src;
+
+  extraInstallCommands = ''
+    mkdir -p $out/share/applications
+    cp ${desktopItem}/share/applications/* $out/share/applications
+    cp -r ${appimageContents}/usr/share/icons/ $out/share/
+  '';
+
+  extraPkgs = pkgs: [ pkgs.libpulseaudio ];
+
+  meta = with lib; {
+    description = "Minecraft 1.7, 1.8, 1.12, 1.15, and 1.16 Client";
+    homepage = "https://www.lunarclient.com/";
+    license = with licenses; [ unfree ];
+    maintainers = with maintainers; [ zyansheep Technical27 ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/games/macopix/default.nix b/pkgs/games/macopix/default.nix
index f88b763aaf8..8f226f3cef0 100644
--- a/pkgs/games/macopix/default.nix
+++ b/pkgs/games/macopix/default.nix
@@ -1,14 +1,15 @@
-{ stdenv, fetchurl, pkgconfig, gtk, openssl }:
+{ lib, stdenv, fetchurl, pkg-config, gtk, openssl }:
 
 stdenv.mkDerivation rec {
-  name = "macopix-1.7.4";
+  pname = "macopix";
+  version = "1.7.4";
 
   src = fetchurl {
-    url = "http://rosegray.sakura.ne.jp/macopix/${name}.tar.bz2";
+    url = "http://rosegray.sakura.ne.jp/macopix/macopix-${version}.tar.bz2";
     sha256 = "0sgnr0wrw3hglcnsyvipll7icfv69ssmyw584zfhk1rgramlkzyb";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ gtk openssl ];
 
   preConfigure = ''
@@ -23,7 +24,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Mascot Constructive Pilot for X";
     homepage = "http://rosegray.sakura.ne.jp/macopix/index-e.html";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/maelstrom/default.nix b/pkgs/games/maelstrom/default.nix
new file mode 100644
index 00000000000..5f78e34edac
--- /dev/null
+++ b/pkgs/games/maelstrom/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchurl, makeDesktopItem, SDL2, SDL2_net }:
+
+stdenv.mkDerivation rec {
+  pname = "maelstrom";
+  version = "3.0.7";
+
+  src = fetchurl {
+    url = "http://www.libsdl.org/projects/Maelstrom/src/Maelstrom-${version}.tar.gz";
+    sha256 = "0dm0m5wd7amrsa8wnrblkv34sq4v4lglc2wfx8klfkdhyhi06s4k";
+  };
+
+  # this fixes a typedef compilation error with gcc-3.x
+  patches = [ ./fix-compilation.patch ];
+
+  buildInputs = [ SDL2 SDL2_net ];
+
+  postInstall = ''
+    mkdir -p $out/bin
+    ln -s $out/games/Maelstrom/Maelstrom $out/bin/maelstrom
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "maelstrom";
+      exec = "maelstrom";
+      desktopName = "Maelstrom";
+      genericName = "Maelstrom";
+      comment = "An arcade-style game resembling Asteroids";
+      categories = "Game;";
+    })
+  ];
+
+  meta = with lib; {
+    description = "An arcade-style game resembling Asteroids";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ tmountain ];
+  };
+}
diff --git a/pkgs/games/maelstrom/fix-compilation.patch b/pkgs/games/maelstrom/fix-compilation.patch
new file mode 100644
index 00000000000..3fa8980c5ee
--- /dev/null
+++ b/pkgs/games/maelstrom/fix-compilation.patch
@@ -0,0 +1,42 @@
+diff -Naur Maelstrom-3.0.7/buttonlist.h Maelstrom-3.0.7-patched/buttonlist.h
+--- Maelstrom-3.0.7/buttonlist.h	2000-01-25 11:41:32.000000000 -0500
++++ Maelstrom-3.0.7-patched/buttonlist.h	2021-02-22 08:34:01.000000000 -0500
+@@ -16,7 +16,7 @@
+ 
+ 	void Add_Button(Uint16 x, Uint16 y, Uint16 width, Uint16 height, 
+ 						void (*callback)(void)) {
+-		struct button *belem;
++        button *belem;
+ 		
+ 		for ( belem=&button_list; belem->next; belem=belem->next );
+ 		belem->next = new button;
+@@ -30,7 +30,7 @@
+ 	}
+ 
+ 	void Activate_Button(Uint16 x, Uint16 y) {
+-		struct button *belem;
++        button *belem;
+ 
+ 		for ( belem=button_list.next; belem; belem=belem->next ) {
+ 			if ( (x >= belem->x1) && (x <= belem->x2) &&
+@@ -42,7 +42,7 @@
+ 	}
+ 
+ 	void Delete_Buttons(void) {
+-		struct button *belem, *btemp;
++        button *belem, *btemp;
+ 
+ 		for ( belem=button_list.next; belem; ) {
+ 			btemp = belem;
+diff -Naur Maelstrom-3.0.7/main.cpp Maelstrom-3.0.7-patched/main.cpp
+--- Maelstrom-3.0.7/main.cpp	2021-02-04 11:50:27.000000000 -0500
++++ Maelstrom-3.0.7-patched/main.cpp	2021-02-22 08:34:34.000000000 -0500
+@@ -153,7 +153,7 @@
+ 	error("or\n");
+ 	error("Usage: %s <options>\n\n", progname);
+ 	error("Where <options> can be any of:\n\n"
+-"	-fullscreen		# Run Maelstrom in full-screen mode\n"
++"	-windowed		# Run Maelstrom in windowed mode\n"
+ "	-gamma [0-8]		# Set the gamma correction\n"
+ "	-volume [0-8]		# Set the sound volume\n"
+ "	-netscores		# Use the world-wide network score server\n"
diff --git a/pkgs/games/manaplus/default.nix b/pkgs/games/manaplus/default.nix
new file mode 100644
index 00000000000..ff7bfae971a
--- /dev/null
+++ b/pkgs/games/manaplus/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, lib, fetchurl, SDL2, SDL2_image, SDL2_ttf, SDL2_mixer
+, SDL2_net , SDL2_gfx, zlib, physfs, curl, libxml2, libpng, pkg-config
+, libGL, autoreconfHook }:
+stdenv.mkDerivation rec {
+  pname = "manaplus";
+  version = "1.9.3.23";
+
+  src = fetchurl {
+    url = "https://download.evolonline.org/manaplus/download/${version}/manaplus-${version}.tar.xz";
+    sha256 = "1ky182p4svwdqm6cf7jbns85hidkhkhq4s17cs2p381f0klapfjz";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook pkg-config
+  ];
+
+  buildInputs = [
+    SDL2 SDL2_image SDL2_ttf SDL2_mixer SDL2_net SDL2_gfx zlib
+    physfs curl libxml2 libpng libGL
+  ];
+
+  configureFlags = [ "--with-sdl2" "--without-dyecmd" ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    maintainers = [ lib.maintainers.lheckemann ];
+    description = "A free OpenSource 2D MMORPG client";
+    homepage = "https://manaplus.org/";
+    license = lib.licenses.gpl2;
+  };
+}
diff --git a/pkgs/games/mar1d/default.nix b/pkgs/games/mar1d/default.nix
index 9fe99bff2f9..1715a68f5d8 100644
--- a/pkgs/games/mar1d/default.nix
+++ b/pkgs/games/mar1d/default.nix
@@ -1,60 +1,36 @@
 { stdenv
-, fetchFromGitHub
-, cmake
+, lib
+, SDL2
+, SDL2_mixer
 , libGLU
-, xlibsWrapper
-, xorg
-, xinput_calibrator
-, doxygen
-, libpthreadstubs
-, alsaLib
-, alsaOss
-, libao
-, width ? 30
-, mute ? false
-, effects ? false
-, sensitivity ? 5
-, reverseY ? false
+, libconfig
+, meson
+, ninja
+, pkg-config
+, fetchFromGitHub
 }:
 
 stdenv.mkDerivation rec {
   pname = "MAR1D";
-  version = "0.2.0";
-  options = "-w${toString width}"
-          + " -s${toString sensitivity}"
-          + (if mute then " -m" else "")
-          + (if effects then " -f" else "")
-          + (if reverseY then " -r" else "");
+  version = "0.3.0";
 
   src = fetchFromGitHub {
-    sha256 = "152w5dnlxzv60cl24r5cmrj2q5ar0jiimrmxnp87kf4d2dpbnaq7";
+    sha256 = "sha256-/QZH2H0PFCLeweXUE11vimLnJTt86PjnTnHC9vWkKsk=";
     rev = "v${version}";
-    repo = "fp_mario";
-    owner = "olynch";
+    repo = "MAR1D";
+    owner = "Radvendii";
   };
 
-  buildInputs =
-    [
-      alsaLib
-      alsaOss
-      cmake
-      doxygen
-      libao
-      libpthreadstubs
-      libGLU
-      xlibsWrapper
-      xinput_calibrator
-      xorg.libXrandr
-      xorg.libXi
-      xorg.xinput
-      xorg.libXxf86vm
-    ];
+  nativeBuildInputs = [ meson ninja pkg-config ];
 
-  preConfigure = ''
-    cd src
-  '';
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    libconfig
+    libGLU
+  ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "First person Super Mario Bros";
     longDescription = ''
       The original Super Mario Bros as you've never seen it. Step into Mario's
@@ -62,9 +38,9 @@ stdenv.mkDerivation rec {
       original, however, the game still takes place in a two dimensional world.
       You must view the world as mario does, as a one dimensional line.
     '';
-    homepage = "https://github.com/olynch/fp_mario";
+    homepage = "https://mar1d.com";
     license = licenses.agpl3;
     maintainers = with maintainers; [ taeer ];
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/games/mari0/default.nix b/pkgs/games/mari0/default.nix
index b8c4ea281df..cb3349960f0 100644
--- a/pkgs/games/mari0/default.nix
+++ b/pkgs/games/mari0/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, zip, love_11, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchFromGitHub, zip, love_11, lua, makeWrapper, makeDesktopItem }:
 
 let
   pname = "mari0";
@@ -21,7 +21,7 @@ stdenv.mkDerivation {
   src = fetchFromGitHub {
     owner = "Stabyourself";
     repo = pname;
-    rev = "${version}";
+    rev = version;
     sha256 = "1zqaq4w599scsjvy1rsb21fd2r8j3srx9vym4ir9bh666dp36gxa";
   };
 
@@ -40,7 +40,7 @@ stdenv.mkDerivation {
     chmod +x $out/bin/${pname}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Crossover between Super Mario Bros. and Portal";
     platforms = platforms.linux;
     license = licenses.mit;
diff --git a/pkgs/games/mars/default.nix b/pkgs/games/mars/default.nix
index 53ffb4e4b2d..0fa744677d8 100644
--- a/pkgs/games/mars/default.nix
+++ b/pkgs/games/mars/default.nix
@@ -1,14 +1,16 @@
-{ stdenv, fetchgit, cmake, libGLU, libGL, sfml, fribidi, taglib }:
+{ lib, stdenv, fetchFromGitHub, cmake, libGLU, libGL, sfml, fribidi, taglib }:
 stdenv.mkDerivation rec {
-  name = "mars-${version}-${rev}";
+  pname = "mars";
   version = "0.7.5";
-  rev = "c855d04409";
-  src = fetchgit {
-    url = "https://github.com/thelaui/M.A.R.S..git";
-    inherit rev;
+
+  src = fetchFromGitHub {
+    owner = "thelaui";
+    repo = "M.A.R.S.";
+    rev = "c855d044094a1d92317e38935d81ba938946132e";
     sha256 = "1r4c5gap1z2zsv4yjd34qriqkxaq4lb4rykapyzkkdf4g36lc3nh";
   };
-  buildInputs = [ cmake libGLU libGL sfml fribidi taglib ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libGLU libGL sfml fribidi taglib ];
   patches = [
     ./unbind_fix.patch
     ./fix-gluortho2d.patch
@@ -27,7 +29,7 @@ stdenv.mkDerivation rec {
     EOF
     chmod +x "$out/bin/mars"
   '';
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://mars-game.sourceforge.net/";
     description = "A game about fighting with ships in a 2D space setting";
     license = licenses.gpl3Plus;
diff --git a/pkgs/games/megaglest/default.nix b/pkgs/games/megaglest/default.nix
index d5129818cb2..5f79b86956c 100644
--- a/pkgs/games/megaglest/default.nix
+++ b/pkgs/games/megaglest/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, cmake, pkgconfig, git, curl, SDL2, xercesc, openal, lua, vlc
+{ lib, stdenv, cmake, pkg-config, git, curl, SDL2, xercesc, openal, lua, libvlc
 , libjpeg, wxGTK, cppunit, ftgl, glew, libogg, libvorbis, buildEnv, libpng
-, fontconfig, freetype, xorg, makeWrapper, bash, which, gnome3, libGLU, glib
+, fontconfig, freetype, xorg, makeWrapper, bash, which, gnome, libGLU, glib
 , fetchFromGitHub
 }:
 let
@@ -13,7 +13,7 @@ let
   };
   path-env = buildEnv {
     name = "megaglest-path-env";
-    paths = [ bash which gnome3.zenity ];
+    paths = [ bash which gnome.zenity ];
   };
 in
 stdenv.mkDerivation {
@@ -28,17 +28,17 @@ stdenv.mkDerivation {
     sha256 = "0fb58a706nic14ss89zrigphvdiwy5s9dwvhscvvgrfvjpahpcws";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ cmake git curl SDL2 xercesc openal lua libpng libjpeg vlc wxGTK
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ git curl SDL2 xercesc openal lua libpng libjpeg libvlc wxGTK
     glib cppunit fontconfig freetype ftgl glew libogg libvorbis makeWrapper libGLU ];
 
-  configurePhase = ''
-    cmake -DCMAKE_INSTALL_PREFIX=$out \
-          -DBUILD_MEGAGLEST=On \
-          -DBUILD_MEGAGLEST_MAP_EDITOR=On \
-          -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=On \
-          -DBUILD_MEGAGLEST_MODEL_VIEWER=On
-  '';
+  cmakeFlags = [
+    "-DCMAKE_INSTALL_PREFIX=$out"
+    "-DBUILD_MEGAGLEST=On"
+    "-DBUILD_MEGAGLEST_MAP_EDITOR=On"
+    "-DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=On"
+    "-DBUILD_MEGAGLEST_MODEL_VIEWER=On"
+  ];
 
   postInstall =  ''
     for i in $out/bin/*; do
@@ -48,11 +48,11 @@ stdenv.mkDerivation {
     done
   '';
 
-  meta = {
-    description = "MegaGlest is an entertaining free (freeware and free software) and open source cross-platform 3D real-time strategy (RTS) game";
-    license = stdenv.lib.licenses.gpl3;
+  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/";
-    maintainers = [ stdenv.lib.maintainers.matejc ];
-    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ maintainers.matejc ];
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/meritous/default.nix b/pkgs/games/meritous/default.nix
index 2958c6a9210..e7dd1bee70c 100644
--- a/pkgs/games/meritous/default.nix
+++ b/pkgs/games/meritous/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitLab, SDL, SDL_image, SDL_mixer, zlib }:
+{ lib, stdenv, fetchFromGitLab, SDL, SDL_image, SDL_mixer, zlib }:
 
 stdenv.mkDerivation {
   pname = "meritous";
@@ -29,7 +29,7 @@ stdenv.mkDerivation {
 
   hardeningDisable = [ "stackprotector" "fortify" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Action-adventure dungeon crawl game";
     homepage = "http://www.asceai.net/meritous/";
     license = licenses.gpl3;
diff --git a/pkgs/games/methane/default.nix b/pkgs/games/methane/default.nix
new file mode 100644
index 00000000000..071e1a64b54
--- /dev/null
+++ b/pkgs/games/methane/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, fontconfig
+, freealut
+, freeglut
+, gettext
+, libGL
+, libGLU
+, openal
+, quesoglc
+, clanlib
+, libXrender
+, libmikmod
+, alsa-lib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "methane";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    repo = "methane";
+    owner = "rombust";
+    rev = "v${version}";
+    sha256 = "sha256-STS2+wfZ8E1jpr0PYQOBQsztxhJU0Dt3IhWBE3sjdWE=";
+  };
+
+  nativeBuildInputs = [
+    gettext
+    pkg-config
+  ];
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    fontconfig
+    freealut
+    freeglut
+    libGL
+    libGLU
+    openal
+    quesoglc
+    clanlib
+    libXrender
+    libmikmod
+    alsa-lib
+  ];
+
+  installPhase  = ''
+    runHook preInstall
+    mkdir -p $out/bin/ $out/share/methane/ $out/share/docs/
+    cp methane $out/bin
+    cp -r resources/* $out/share/methane/.
+    cp -r docs/* $out/share/docs/.
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/rombust/methane";
+    description = "A clone of Taito's Bubble Bobble arcade game released for Amiga in 1993 by Apache Software";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ nixinator ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch b/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch
new file mode 100644
index 00000000000..d4fe7be1918
--- /dev/null
+++ b/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch
@@ -0,0 +1,33 @@
+From 9dbfa680db6bfd1033772dda753120fe4452e0d9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Milan=20P=C3=A4ssler?= <milan@petabyte.dev>
+Date: Fri, 8 Jan 2021 04:49:14 +0100
+Subject: [PATCH] fix include path for SDL2 on linux
+
+---
+ .../src/main/java/arc/backend/sdl/jni/SDL.java            | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/backends/backend-sdl/src/main/java/arc/backend/sdl/jni/SDL.java b/backends/backend-sdl/src/main/java/arc/backend/sdl/jni/SDL.java
+index 62d9286a..2853119d 100644
+--- a/Arc/backends/backend-sdl/src/main/java/arc/backend/sdl/jni/SDL.java
++++ b/Arc/backends/backend-sdl/src/main/java/arc/backend/sdl/jni/SDL.java
+@@ -8,16 +8,8 @@ import java.nio.*;
+ public class SDL{
+     /*JNI
+ 
+-    #ifdef __APPLE__
+-
+     #include "SDL2/SDL.h"
+ 
+-    #else
+-
+-    #include "SDL.h"
+-
+-    #endif
+-
+     */
+ 
+     static{
+-- 
+2.29.2
+
diff --git a/pkgs/games/mindustry/default.nix b/pkgs/games/mindustry/default.nix
index c0c8663868d..73207923839 100644
--- a/pkgs/games/mindustry/default.nix
+++ b/pkgs/games/mindustry/default.nix
@@ -1,11 +1,19 @@
-{ stdenv
+{ lib, stdenv
 , makeWrapper
 , makeDesktopItem
+, copyDesktopItems
 , fetchFromGitHub
-, gradle_5
+, gradleGen
+, jdk
 , perl
-, jre
-, libpulseaudio
+
+# for arc
+, SDL2
+, pkg-config
+, stb
+, ant
+, alsa-lib
+, glew
 
 # Make the build version easily overridable.
 # Server and client build versions must match, and an empty build version means
@@ -21,16 +29,42 @@ let
   # Note: when raising the version, ensure that all SNAPSHOT versions in
   # build.gradle are replaced by a fixed version
   # (the current one at the time of release) (see postPatch).
-  version = "104.6";
+  version = "126.1";
   buildVersion = makeBuildVersion version;
 
-  src = fetchFromGitHub {
+  Mindustry = fetchFromGitHub {
     owner = "Anuken";
     repo = "Mindustry";
     rev = "v${version}";
-    sha256 = "1crdfiymaz57gnma6bmdcsnbl635nhjdndrjv467c4xfq9vvap2i";
+    sha256 = "cyg4TofSSFLv8pM3zzvc0FxXMiTm+OIchBJF9PDQrkg=";
+  };
+  Arc = fetchFromGitHub {
+    owner = "Anuken";
+    repo = "Arc";
+    rev = "v${version}";
+    sha256 = "uBIm82mt1etBB/HrNY6XGa7mmBfwd1E3RtqN8Rk5qeY=";
+  };
+  soloud = fetchFromGitHub {
+    owner = "Anuken";
+    repo = "soloud";
+    # this is never pinned in upstream, see https://github.com/Anuken/Arc/issues/39
+    rev = "b33dfc5178fcb2613ee68136f4a4869cadc0b06a";
+    sha256 = "1vf68i3pnsixch37285ib7afkwmlrc05v783395jsdjzj9i67lj3";
   };
 
+  patches = [
+    ./0001-fix-include-path-for-SDL2-on-linux.patch
+  ];
+
+  unpackPhase = ''
+    cp -r ${Mindustry} Mindustry
+    cp -r ${Arc} Arc
+    chmod -R u+w -- Mindustry Arc
+    cp ${stb.src}/stb_image.h Arc/arc-core/csrc/
+    cp -r ${soloud} Arc/arc-core/csrc/soloud
+    chmod -R u+w -- Arc
+  '';
+
   desktopItem = makeDesktopItem {
     type = "Application";
     name = "Mindustry";
@@ -39,7 +73,9 @@ let
     icon = "mindustry";
   };
 
-  postPatch = ''
+  cleanupMindustrySrc = ''
+    pushd Mindustry
+
     # Remove unbuildable iOS stuff
     sed -i '/^project(":ios"){/,/^}/d' build.gradle
     sed -i '/robo(vm|VM)/d' build.gradle
@@ -47,20 +83,28 @@ let
 
     # Pin 'SNAPSHOT' versions
     sed -i 's/com.github.anuken:packr:-SNAPSHOT/com.github.anuken:packr:034efe51781d2d8faa90370492133241bfb0283c/' build.gradle
+
+    popd
   '';
 
+  # The default one still uses jdk8 (#89731)
+  gradle_6 = (gradleGen.override (old: { java = jdk; })).gradle_6_8;
+
   # fake build to pre-download deps into fixed-output derivation
   deps = stdenv.mkDerivation {
     pname = "${pname}-deps";
-    inherit version src postPatch;
-    nativeBuildInputs = [ gradle_5 perl ];
-    # Here we build both the server and the client so we only have to specify
-    # one hash for 'deps'. Deps can be garbage collected after the build,
-    # so this is not really an issue.
+    inherit version unpackPhase patches;
+    postPatch = cleanupMindustrySrc;
+
+    nativeBuildInputs = [ gradle_6 perl ];
+    # Here we download dependencies for both the server and the client so
+    # we only have to specify one hash for 'deps'. Deps can be garbage
+    # collected after the build, so this is not really an issue.
     buildPhase = ''
+      pushd Mindustry
       export GRADLE_USER_HOME=$(mktemp -d)
-      gradle --no-daemon desktop:dist -Pbuildversion=${buildVersion}
-      gradle --no-daemon server:dist -Pbuildversion=${buildVersion}
+      gradle --no-daemon resolveDependencies
+      popd
     '';
     # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar)
     installPhase = ''
@@ -70,60 +114,85 @@ let
     '';
     outputHashAlgo = "sha256";
     outputHashMode = "recursive";
-    outputHash = "08yrczz1qn78qy3x67gs7d0xvihbfbb8ggiczq2nj812745zcizw";
+    outputHash = "Mw8LZ1iW6vn4RkBBs8SWHp6mo2Bhj7tMZjLbyuJUqSI=";
   };
 
-  # Separate commands for building and installing the server and the client
-  buildClient = ''
+in
+assert lib.assertMsg (enableClient || enableServer)
+  "mindustry: at least one of 'enableClient' and 'enableServer' must be true";
+stdenv.mkDerivation rec {
+  inherit pname version unpackPhase patches;
+
+  postPatch = ''
+    # ensure the prebuilt shared objects don't accidentally get shipped
+    rm Arc/natives/natives-desktop/libs/libarc*.so
+    rm Arc/backends/backend-sdl/libs/linux64/libsdl-arc*.so
+  '' + cleanupMindustrySrc;
+
+  buildInputs = lib.optionals enableClient [
+    SDL2
+    glew
+    alsa-lib
+  ];
+  nativeBuildInputs = [
+    pkg-config
+    gradle_6
+    makeWrapper
+    jdk
+  ] ++ lib.optionals enableClient [
+    ant
+    copyDesktopItems
+  ];
+
+  desktopItems = lib.optional enableClient desktopItem;
+
+  buildPhase = with lib; ''
+    export GRADLE_USER_HOME=$(mktemp -d)
+
+    # point to offline repo
+    sed -ie "s#mavenLocal()#mavenLocal(); maven { url '${deps}' }#g" Mindustry/build.gradle
+    sed -ie "s#mavenCentral()#mavenCentral(); maven { url '${deps}' }#g" Arc/build.gradle
+
+    pushd Mindustry
+  '' + optionalString enableClient ''
+    gradle --offline --no-daemon jnigenBuild -Pbuildversion=${buildVersion}
+    gradle --offline --no-daemon sdlnatives -Pdynamic -Pbuildversion=${buildVersion}
+    patchelf ../Arc/backends/backend-sdl/libs/linux64/libsdl-arc*.so \
+      --add-needed ${glew.out}/lib/libGLEW.so \
+      --add-needed ${SDL2}/lib/libSDL2.so
     gradle --offline --no-daemon desktop:dist -Pbuildversion=${buildVersion}
-  '';
-  buildServer = ''
+  '' + optionalString enableServer ''
     gradle --offline --no-daemon server:dist -Pbuildversion=${buildVersion}
   '';
-  installClient = ''
+
+  installPhase = with lib; ''
+    runHook preInstall
+  '' + optionalString enableClient ''
     install -Dm644 desktop/build/libs/Mindustry.jar $out/share/mindustry.jar
     mkdir -p $out/bin
-    makeWrapper ${jre}/bin/java $out/bin/mindustry \
-      --prefix LD_LIBRARY_PATH : ${libpulseaudio}/lib \
+    makeWrapper ${jdk}/bin/java $out/bin/mindustry \
       --add-flags "-jar $out/share/mindustry.jar"
     install -Dm644 core/assets/icons/icon_64.png $out/share/icons/hicolor/64x64/apps/mindustry.png
-    install -Dm644 ${desktopItem}/share/applications/Mindustry.desktop $out/share/applications/Mindustry.desktop
-  '';
-  installServer = ''
+  '' + optionalString enableServer ''
     install -Dm644 server/build/libs/server-release.jar $out/share/mindustry-server.jar
     mkdir -p $out/bin
-    makeWrapper ${jre}/bin/java $out/bin/mindustry-server \
+    makeWrapper ${jdk}/bin/java $out/bin/mindustry-server \
       --add-flags "-jar $out/share/mindustry-server.jar"
+  '' + ''
+    runHook postInstall
   '';
 
-in
-assert stdenv.lib.assertMsg (enableClient || enableServer)
-  "mindustry: at least one of 'enableClient' and 'enableServer' must be true";
-stdenv.mkDerivation rec {
-  inherit pname version src postPatch;
-
-  nativeBuildInputs = [ gradle_5 makeWrapper ];
-
-  buildPhase = with stdenv.lib; ''
-    export GRADLE_USER_HOME=$(mktemp -d)
-    # point to offline repo
-    sed -ie "s#mavenLocal()#mavenLocal(); maven { url '${deps}' }#g" build.gradle
-    ${optionalString enableClient buildClient}
-    ${optionalString enableServer buildServer}
-  '';
-
-  installPhase = with stdenv.lib; ''
-    ${optionalString enableClient installClient}
-    ${optionalString enableServer installServer}
-  '';
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://mindustrygame.github.io/";
     downloadPage = "https://github.com/Anuken/Mindustry/releases";
     description = "A sandbox tower defense game";
-    license = licenses.gpl3;
-    maintainers = with maintainers; [ fgaz ];
-    platforms = platforms.all;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fgaz petabyteboy ];
+    platforms = platforms.x86_64;
+    # Hash mismatch on darwin:
+    # https://github.com/NixOS/nixpkgs/pull/105590#issuecomment-737120293
+    broken = stdenv.isDarwin
+    # does not work with any maintained java version (https://github.com/Anuken/Mindustry/issues/5114)
+      || true;
   };
 }
-
diff --git a/pkgs/games/minecraft-server/default.nix b/pkgs/games/minecraft-server/default.nix
index 3c2ab9b3fcd..e67506c10a8 100644
--- a/pkgs/games/minecraft-server/default.nix
+++ b/pkgs/games/minecraft-server/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, jre_headless }:
+{ lib, stdenv, fetchurl, nixosTests, jre_headless }:
 stdenv.mkDerivation {
   pname = "minecraft-server";
-  version = "1.16.2";
+  version = "1.17";
 
   src = fetchurl {
-    url = "https://launcher.mojang.com/v1/objects/c5f6fb23c3876461d46ec380421e42b289789530/server.jar";
+    url = "https://launcher.mojang.com/v1/objects/0a269b5f2c5b93b1712d0f5dc43b6182b9ab254e/server.jar";
     # sha1 because that comes from mojang via api
-    sha1 = "c5f6fb23c3876461d46ec380421e42b289789530";
+    sha1 = "0a269b5f2c5b93b1712d0f5dc43b6182b9ab254e";
   };
 
   preferLocalBuild = true;
@@ -23,11 +23,14 @@ stdenv.mkDerivation {
     chmod +x $out/bin/minecraft-server
   '';
 
-  phases = "installPhase";
+  dontUnpack = true;
 
-  passthru.updateScript = ./update.sh;
+  passthru = {
+    tests = { inherit (nixosTests) minecraft-server; };
+    updateScript = ./update.sh;
+  };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Minecraft Server";
     homepage = "https://minecraft.net";
     license = licenses.unfreeRedistributable;
diff --git a/pkgs/games/minecraft/default.nix b/pkgs/games/minecraft/default.nix
index 9d23515c039..254c01fdf1b 100644
--- a/pkgs/games/minecraft/default.nix
+++ b/pkgs/games/minecraft/default.nix
@@ -1,5 +1,7 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
+, nixosTests
+, copyDesktopItems
 , makeDesktopItem
 , makeWrapper
 , wrapGAppsHook
@@ -10,10 +12,10 @@
 , nss
 , nspr
 , fontconfig
-, gnome2
+, pango
 , cairo
 , expat
-, alsaLib
+, alsa-lib
 , cups
 , dbus
 , atk
@@ -39,17 +41,17 @@ let
     categories = "Game;";
   };
 
-  envLibPath = stdenv.lib.makeLibraryPath [
+  envLibPath = lib.makeLibraryPath [
     curl
     libpulseaudio
     systemd
-    alsaLib # needed for narrator
+    alsa-lib # needed for narrator
     flite # needed for narrator
     libXxf86vm # needed only for versions <1.13
   ];
 
-  libPath = stdenv.lib.makeLibraryPath ([
-    alsaLib
+  libPath = lib.makeLibraryPath ([
+    alsa-lib
     atk
     cairo
     cups
@@ -59,8 +61,7 @@ let
     freetype
     gdk-pixbuf
     glib
-    gnome2.GConf
-    gnome2.pango
+    pango
     gtk3-x11
     gtk2-x11
     nspr
@@ -87,11 +88,11 @@ in
 stdenv.mkDerivation rec {
   pname = "minecraft-launcher";
 
-  version = "2.1.16102";
+  version = "2.2.1441";
 
   src = fetchurl {
     url = "https://launcher.mojang.com/download/linux/x86_64/minecraft-launcher_${version}.tar.gz";
-    sha256 = "17zgxmijk9mq651h7ymkr7h2099cw23kc0r7jyfkdccp60dfd60i";
+    sha256 = "03q579hvxnsh7d00j6lmfh53rixdpf33xb5zlz7659pvb9j5w0cm";
   };
 
   icon = fetchurl {
@@ -99,7 +100,7 @@ stdenv.mkDerivation rec {
     sha256 = "0w8z21ml79kblv20wh5lz037g130pxkgs8ll9s3bi94zn2pbrhim";
   };
 
-  nativeBuildInputs = [ makeWrapper wrapGAppsHook ];
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook copyDesktopItems ];
   buildInputs = [ gobject-introspection ];
 
   sourceRoot = ".";
@@ -109,11 +110,14 @@ stdenv.mkDerivation rec {
   dontBuild = true;
 
   installPhase = ''
+    runHook preInstall
+
     mkdir -p $out/opt
     mv minecraft-launcher $out/opt
 
-    ${desktopItem.buildCommand}
     install -D $icon $out/share/icons/hicolor/symbolic/apps/minecraft-launcher.svg
+
+    runHook postInstall
   '';
 
   preFixup = ''
@@ -133,13 +137,15 @@ stdenv.mkDerivation rec {
     # Do not create `GPUCache` in current directory
     makeWrapper $out/opt/minecraft-launcher/minecraft-launcher $out/bin/minecraft-launcher \
       --prefix LD_LIBRARY_PATH : ${envLibPath} \
-      --prefix PATH : ${stdenv.lib.makeBinPath [ jre ]} \
-      --set JAVA_HOME ${stdenv.lib.makeBinPath [ jre ]} \
+      --prefix PATH : ${lib.makeBinPath [ jre ]} \
+      --set JAVA_HOME ${lib.getBin jre} \
       --run "cd /tmp" \
       "''${gappsWrapperArgs[@]}"
   '';
 
-  meta = with stdenv.lib; {
+  desktopItems = [ desktopItem ];
+
+  meta = with lib; {
     description = "Official launcher for Minecraft, a sandbox-building game";
     homepage = "https://minecraft.net";
     maintainers = with maintainers; [ cpages ryantm infinisil ];
@@ -147,5 +153,8 @@ stdenv.mkDerivation rec {
     platforms = [ "x86_64-linux" ];
   };
 
-  passthru.updateScript = ./update.sh;
+  passthru = {
+    tests = { inherit (nixosTests) minecraft; };
+    updateScript = ./update.sh;
+  };
 }
diff --git a/pkgs/games/minecraft/update.sh b/pkgs/games/minecraft/update.sh
index 02b362e839b..485fb5a560f 100755
--- a/pkgs/games/minecraft/update.sh
+++ b/pkgs/games/minecraft/update.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/env nix-shell
-#!nix-shell -i bash -p curl jq gnugrep common-updater-scripts
+#!nix-shell -i bash -p curl jq common-updater-scripts
 
 set -eu -o pipefail
 
-version=$(curl -s 'https://aur.archlinux.org/rpc/?v=5&type=info&arg[]=minecraft-launcher' | jq '.results[0].Version' | grep -Po '[.\d]*(?=-)')
-update-source-version minecraft "$version"
+version=$(curl -s 'https://launchermeta.mojang.com/v1/products/launcher/6f083b80d5e6fabbc4236f81d0d8f8a350c665a9/linux.json' | jq -r '."launcher-core"[0].version.name')
+update-source-version minecraft "${version}"
diff --git a/pkgs/games/minetest/default.nix b/pkgs/games/minetest/default.nix
index f49ec1f4a82..7ffa361da55 100644
--- a/pkgs/games/minetest/default.nix
+++ b/pkgs/games/minetest/default.nix
@@ -1,10 +1,10 @@
-{ stdenv, fetchFromGitHub, cmake, irrlicht, libpng, bzip2, curl, libogg, jsoncpp
+{ 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
 }:
 
-with stdenv.lib;
+with lib;
 
 let
   boolToCMake = b: if b then "ON" else "OFF";
@@ -60,7 +60,7 @@ let
       cp -rv ${sources.data}/* $out/share/minetest/games/minetest_game/
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       homepage = "http://minetest.net/";
       description = "Infinite-world block sandbox game";
       license = licenses.lgpl21Plus;
@@ -76,9 +76,9 @@ let
   };
 
   v5 = {
-    version = "5.3.0";
-    sha256 = "03ga3j3cg38w4lg4d4qxasmnjdl8n3lbizidrinanvyfdyvznyh6";
-    dataSha256 = "1liciwlh013z5h08ib0psjbwn5wkvlr937ir7kslfk4vly984cjx";
+    version = "5.4.1";
+    sha256 = "062ilb7s377q3hwfhl8q06vvcw2raydz5ljzlzwy2dmyzmdcndb8";
+    dataSha256 = "0i45lbnikvgj9kxdp0yphpjjwjcgp4ibn49xkj78j5ic1s9n8jd4";
   };
 
 in {
diff --git a/pkgs/games/moon-buggy/default.nix b/pkgs/games/moon-buggy/default.nix
index 9de24c1ae9d..b623d7bd539 100644
--- a/pkgs/games/moon-buggy/default.nix
+++ b/pkgs/games/moon-buggy/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, ncurses}:
+{lib, stdenv, fetchurl, ncurses}:
 
 stdenv.mkDerivation rec {
   baseName = "moon-buggy";
@@ -15,10 +15,10 @@ stdenv.mkDerivation rec {
   };
 
   meta = {
-    description = ''A simple character graphics game where you drive some kind of car across the moon's surface'';
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = [stdenv.lib.maintainers.rybern];
-    platforms = stdenv.lib.platforms.linux;
+    description = "A simple character graphics game where you drive some kind of car across the moon's surface";
+    license = lib.licenses.gpl2;
+    maintainers = [lib.maintainers.rybern];
+    platforms = lib.platforms.linux;
     homepage = "https://www.seehuhn.de/pages/moon-buggy";
   };
 }
diff --git a/pkgs/games/mrrescue/default.nix b/pkgs/games/mrrescue/default.nix
index 367a7a5c5e6..ae7519c948b 100644
--- a/pkgs/games/mrrescue/default.nix
+++ b/pkgs/games/mrrescue/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
 
 let
   pname = "mrrescue";
@@ -13,13 +13,13 @@ let
     name = "mrrescue";
     exec = pname;
     icon = icon;
-    comment = "Arcade-style fire fighting game"; 
+    comment = "Arcade-style fire fighting game";
     desktopName = "Mr. Rescue";
     genericName = "mrrescue";
     categories = "Game;";
   };
 
-in 
+in
 
 stdenv.mkDerivation {
   name = "${pname}-${version}";
@@ -29,8 +29,7 @@ stdenv.mkDerivation {
     sha256 = "0kzahxrgpb4vsk9yavy7f8nc34d62d1jqjrpsxslmy9ywax4yfpi";
   };
 
-  nativeBuildInputs = [ lua love ];
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ lua love makeWrapper ];
 
   phases = "installPhase";
 
@@ -48,7 +47,7 @@ stdenv.mkDerivation {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Arcade-style fire fighting game";
     maintainers = with maintainers; [ ];
     platforms = platforms.linux;
diff --git a/pkgs/games/mudlet/default.nix b/pkgs/games/mudlet/default.nix
index b73af4515d3..139baece4a6 100644
--- a/pkgs/games/mudlet/default.nix
+++ b/pkgs/games/mudlet/default.nix
@@ -1,31 +1,29 @@
-{ fetchFromGitHub, fetchpatch, stdenv, wrapQtAppsHook, git, pcre, pugixml, qtbase, libsForQt5, qtmultimedia, qttools, yajl, libzip, hunspell
-, boost, libGLU, lua, cmake,  which, }:
+{ fetchFromGitHub, lib, stdenv, wrapQtAppsHook, git, pcre, pugixml, qtbase, libsForQt5, libsecret, qtmultimedia, qttools, yajl, libzip, hunspell
+, boost, libGLU, lua, cmake,  which, pkg-config, }:
 
 let
   luaEnv = lua.withPackages(ps: with ps; [ luazip luafilesystem lrexlib-pcre luasql-sqlite3 lua-yajl luautf8 ]);
 in
 stdenv.mkDerivation rec {
   pname = "mudlet";
-  version = "4.9.1";
+  version = "4.12.0";
 
   src = fetchFromGitHub {
     owner = "Mudlet";
     repo = "Mudlet";
     rev = "Mudlet-${version}";
     fetchSubmodules = true;
-    sha256 = "0i022qcmlq4xwl2yh4xd5qdc0ag52605qmqqz6bim0h8f3dp8cx1";
+    sha256 = "023plm5mwm15xikmdh1mq3gx1n7y4a0r0kw9fvk3rvm9brm78hzp";
   };
 
-  nativeBuildInputs = [ cmake wrapQtAppsHook git qttools which ];
+  nativeBuildInputs = [ pkg-config cmake wrapQtAppsHook git qttools which ];
   buildInputs = [
-    pcre pugixml qtbase libsForQt5.qtkeychain qtmultimedia luaEnv libzip libGLU yajl boost hunspell
+    pcre pugixml qtbase libsForQt5.qtkeychain qtmultimedia luaEnv libsecret libzip libGLU yajl boost hunspell
   ];
 
   WITH_FONTS = "NO";
   WITH_UPDATER = "NO";
 
-  enableParallelBuilding = true;
-
   installPhase =  ''
     mkdir -pv $out/lib
     cp 3rdparty/edbee-lib/edbee-lib/qslog/lib/libQsLog.so $out/lib
@@ -47,7 +45,7 @@ stdenv.mkDerivation rec {
       --run "cd $out";
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Crossplatform mud client";
     homepage = "http://mudlet.org/";
     maintainers = [ maintainers.wyvie maintainers.pstn ];
diff --git a/pkgs/games/multimc/0001-pick-latest-java-first.patch b/pkgs/games/multimc/0001-pick-latest-java-first.patch
new file mode 100644
index 00000000000..31ab0497f8d
--- /dev/null
+++ b/pkgs/games/multimc/0001-pick-latest-java-first.patch
@@ -0,0 +1,48 @@
+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
+
+---
+ api/logic/java/JavaInstallList.cpp | 4 ++--
+ api/logic/java/JavaUtils.cpp       | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/api/logic/java/JavaInstallList.cpp b/api/logic/java/JavaInstallList.cpp
+index 0bded03c..40898e20 100644
+--- a/api/logic/java/JavaInstallList.cpp
++++ b/api/logic/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/api/logic/java/JavaUtils.cpp b/api/logic/java/JavaUtils.cpp
+index 5f004a10..6d633631 100644
+--- a/api/logic/java/JavaUtils.cpp
++++ b/api/logic/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
index bcdd950de4a..aa32efaa940 100644
--- a/pkgs/games/multimc/default.nix
+++ b/pkgs/games/multimc/default.nix
@@ -1,21 +1,28 @@
-{ stdenv, mkDerivation, fetchFromGitHub, cmake, jdk, zlib, file, makeWrapper, xorg, libpulseaudio, qtbase }:
+{ lib, mkDerivation, fetchFromGitHub, cmake, jdk8, jdk, zlib, file, makeWrapper, xorg, libpulseaudio, qtbase, libGL }:
 
 let
-  libpath = with xorg; stdenv.lib.makeLibraryPath [ libX11 libXext libXcursor libXrandr libXxf86vm libpulseaudio ];
+  libpath = with xorg; lib.makeLibraryPath [ libX11 libXext libXcursor libXrandr libXxf86vm libpulseaudio libGL ];
 in mkDerivation rec {
   pname = "multimc";
-  version = "0.6.11";
+  version = "unstable-2021-06-21";
   src = fetchFromGitHub {
     owner = "MultiMC";
     repo = "MultiMC5";
-    rev = version;
-    sha256 = "1jkbmb4sgfk8d93f5l1vd9pkpvhq9sxacc61w0rvf5xmz0wnszmz";
+    rev = "8179a89103833805d5374399d80a4305be1b8355";
+    sha256 = "lPz6ZM7TjaixfwWMPaXijKZJQKFPrCegBhvbJ8Xg4P8=";
     fetchSubmodules = true;
   };
   nativeBuildInputs = [ cmake file makeWrapper ];
-  buildInputs = [ qtbase jdk zlib ];
+  buildInputs = [ qtbase jdk8 zlib ];
 
-  enableParallelBuilding = true;
+  patches = [ ./0001-pick-latest-java-first.patch ];
+
+  postPatch = ''
+    # hardcode jdk paths
+    substituteInPlace api/logic/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 = [ "-DMultiMC_LAYOUT=lin-system" ];
 
@@ -24,10 +31,12 @@ in mkDerivation rec {
     install -Dm755 ../application/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 --add-flags "-d \$HOME/.multimc/" --set GAME_LIBRARY_PATH /run/opengl-driver/lib:${libpath} --prefix PATH : ${jdk}/bin/:${xorg.xrandr}/bin/
+    wrapProgram $out/bin/multimc \
+      --set GAME_LIBRARY_PATH /run/opengl-driver/lib:${libpath} \
+      --prefix PATH : ${lib.makeBinPath [ xorg.xrandr ]}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://multimc.org/";
     description = "A free, open source launcher for Minecraft";
     longDescription = ''
@@ -35,6 +44,6 @@ in mkDerivation rec {
     '';
     platforms = platforms.linux;
     license = licenses.lgpl21Plus;
-    maintainers = [ maintainers.cleverca22 ];
+    maintainers = with maintainers; [ cleverca22 starcraft66 ];
   };
 }
diff --git a/pkgs/games/n2048/default.nix b/pkgs/games/n2048/default.nix
index f5ff0b4690e..b3d06a51fd3 100644
--- a/pkgs/games/n2048/default.nix
+++ b/pkgs/games/n2048/default.nix
@@ -1,6 +1,6 @@
-{stdenv, fetchurl, ncurses}:
+{lib, stdenv, fetchurl, ncurses}:
 let
-  s = 
+  s =
   rec {
     baseName = "n2048";
     version = "0.1";
@@ -19,17 +19,17 @@ stdenv.mkDerivation {
     inherit (s) url sha256;
   };
   makeFlags = [
-    ''DESTDIR=$(out)''
+    "DESTDIR=$(out)"
   ];
   preInstall = ''
     mkdir -p "$out"/{share/man,bin}
   '';
   meta = {
     inherit (s) version;
-    description = ''Console implementation of 2048 game'';
-    license = stdenv.lib.licenses.bsd2;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    description = "Console implementation of 2048 game";
+    license = lib.licenses.bsd2;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.linux;
     homepage = "http://www.dettus.net/n2048/";
   };
 }
diff --git a/pkgs/games/naev/default.nix b/pkgs/games/naev/default.nix
index c328199b377..f359b8c9d98 100644
--- a/pkgs/games/naev/default.nix
+++ b/pkgs/games/naev/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv, SDL, openal, SDL_mixer, libxml2, pkgconfig, libvorbis
+{ lib, fetchurl, stdenv, SDL, openal, SDL_mixer, libxml2, pkg-config, libvorbis
 , libpng, libGLU, libGL, makeWrapper, zlib, freetype }:
 
 let
@@ -21,7 +21,7 @@ stdenv.mkDerivation {
 
   buildInputs = [ SDL SDL_mixer openal libxml2 libvorbis libpng libGLU libGL zlib freetype ];
 
-  nativeBuildInputs = [ pkgconfig makeWrapper ];
+  nativeBuildInputs = [ pkg-config makeWrapper ];
 
   NIX_CFLAGS_COMPILE="-include ${zlib.dev}/include/zlib.h";
 
@@ -34,9 +34,9 @@ stdenv.mkDerivation {
   meta = {
     description = "2D action/rpg space game";
     homepage = "http://www.naev.org";
-    license = stdenv.lib.licenses.gpl3Plus;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = lib.platforms.linux;
     hydraPlatforms = [];
   };
 }
diff --git a/pkgs/games/nethack/default.nix b/pkgs/games/nethack/default.nix
index 1b082537148..f9939f063c8 100644
--- a/pkgs/games/nethack/default.nix
+++ b/pkgs/games/nethack/default.nix
@@ -1,7 +1,7 @@
 { stdenv, lib, fetchurl, coreutils, ncurses, gzip, flex, bison
 , less
 , buildPackages
-, x11Mode ? false, qtMode ? false, libXaw, libXext, libXpm, bdftopcf, mkfontdir, pkgconfig, qt5
+, x11Mode ? false, qtMode ? false, libXaw, libXext, libXpm, bdftopcf, mkfontdir, pkg-config, qt5
 }:
 
 let
@@ -36,7 +36,7 @@ in stdenv.mkDerivation rec {
   nativeBuildInputs = [ flex bison ]
                       ++ lib.optionals x11Mode [ mkfontdir bdftopcf ]
                       ++ lib.optionals qtMode [
-                           pkgconfig mkfontdir qt5.qtbase.dev
+                           pkg-config mkfontdir qt5.qtbase.dev
                            qt5.qtmultimedia.dev qt5.wrapQtAppsHook
                            bdftopcf
                          ];
@@ -60,7 +60,7 @@ in stdenv.mkDerivation rec {
       -e 's,^WINTTYLIB=.*,WINTTYLIB=-lncurses,' \
       -i sys/unix/hints/linux
     sed \
-      -e 's,^CC=.*$,CC=cc,' \
+      -e 's,^CC=.*$,CC=${stdenv.cc.targetPrefix}cc,' \
       -e 's,^HACKDIR=.*$,HACKDIR=\$(PREFIX)/games/lib/\$(GAME)dir,' \
       -e 's,^SHELLDIR=.*$,SHELLDIR=\$(PREFIX)/games,' \
       -e 's,^CFLAGS=-g,CFLAGS=,' \
@@ -97,7 +97,7 @@ in stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  preFixup = stdenv.lib.optionalString qtMode ''
+  preFixup = lib.optionalString qtMode ''
     wrapQtApp "$out/games/nethack"
   '';
 
@@ -141,7 +141,7 @@ in stdenv.mkDerivation rec {
     ${lib.optionalString (!(x11Mode || qtMode)) "install -Dm 555 util/dlb -t $out/libexec/nethack/"}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Rogue-like game";
     homepage = "http://nethack.org/";
     license = "nethack";
diff --git a/pkgs/games/netris/default.nix b/pkgs/games/netris/default.nix
index 994db4e67f8..ff898128ca0 100644
--- a/pkgs/games/netris/default.nix
+++ b/pkgs/games/netris/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, ncurses }:
+{ lib, stdenv, fetchFromGitHub, ncurses }:
 
 stdenv.mkDerivation {
   pname = "netris";
@@ -23,7 +23,7 @@ stdenv.mkDerivation {
     cp ./netris $out/bin
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free networked version of T*tris";
     license = licenses.gpl2;
     maintainers = with maintainers; [ patryk27 ];
diff --git a/pkgs/games/neverball/default.nix b/pkgs/games/neverball/default.nix
index 99ce818d04d..ba1d403207a 100644
--- a/pkgs/games/neverball/default.nix
+++ b/pkgs/games/neverball/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, SDL2, libGL, libpng, libjpeg, SDL2_ttf, libvorbis, gettext
+{ lib, stdenv, fetchurl, SDL2, libGL, libpng, libjpeg, SDL2_ttf, libvorbis, gettext
 , physfs }:
 
 stdenv.mkDerivation rec {
-  name = "neverball-1.6.0";
+  pname = "neverball";
+  version = "1.6.0";
   src = fetchurl {
-    url = "https://neverball.org/${name}.tar.gz";
+    url = "https://neverball.org/neverball-${version}.tar.gz";
     sha256 = "184gm36c6p6vaa6gwrfzmfh86klhnb03pl40ahsjsvprlk667zkk";
   };
 
@@ -35,7 +36,7 @@ stdenv.mkDerivation rec {
     homepage = "https://neverball.org/";
     description = "Tilt the floor to roll a ball";
     license = "GPL";
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/newtonwars/default.nix b/pkgs/games/newtonwars/default.nix
index 093f071c723..0be3d9bf7a0 100644
--- a/pkgs/games/newtonwars/default.nix
+++ b/pkgs/games/newtonwars/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, makeWrapper, freeglut, libGLU, libGL }:
+{ lib, stdenv, fetchFromGitHub, makeWrapper, freeglut, libGLU, libGL }:
 
 stdenv.mkDerivation {
   pname = "newtonwars";
@@ -11,7 +11,8 @@ stdenv.mkDerivation {
     sha256 = "0g63fwfcdxxlnqlagj1fb8ngm385gmv8f7p8b4r1z5cny2znxdvs";
   };
 
-  buildInputs = [ makeWrapper freeglut libGL libGLU ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ freeglut libGL libGLU ];
 
   patchPhase = ''
     sed -i "s;font24.raw;$out/share/font24.raw;g" display.c
@@ -30,7 +31,7 @@ stdenv.mkDerivation {
       --prefix LD_LIBRARY_PATH ":" ${libGL}/lib
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A space battle game with gravity as the main theme";
     maintainers = with maintainers; [ pSub ];
     platforms = platforms.linux;
diff --git a/pkgs/games/nexuiz/default.nix b/pkgs/games/nexuiz/default.nix
index e055e27d2cd..4082e853aa3 100644
--- a/pkgs/games/nexuiz/default.nix
+++ b/pkgs/games/nexuiz/default.nix
@@ -1,9 +1,9 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 , # required for both
   unzip, zlib, curl, libjpeg, libpng, libvorbis, libtheora
 , libogg, libmodplug
 , # glx
-  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, libXxf86dga, alsaLib
+  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, libXxf86dga, alsa-lib
 , # sdl
   SDL
 }:
@@ -11,7 +11,7 @@
 let
   version = "2.5.2";
 
-  version_short = stdenv.lib.replaceChars [ "." ] [ "" ] version;
+  version_short = lib.replaceChars [ "." ] [ "" ] version;
 in stdenv.mkDerivation {
   pname = "nexuiz";
   inherit version;
@@ -21,11 +21,10 @@ in stdenv.mkDerivation {
     sha256 = "0010jrxc68qqinkvdh1qn2b8z3sa5v1kcd8d1m4llp3pr6y7xqm5";
   };
 
+  nativeBuildInputs = [ unzip ];
   buildInputs = [
-    # required for both
-    unzip
     # glx
-    libX11 libGLU libGL libXpm libXext libXxf86vm libXxf86dga alsaLib
+    libX11 libGLU libGL libXpm libXext libXxf86vm libXxf86dga alsa-lib
     # sdl
     SDL
   ];
@@ -71,7 +70,7 @@ in stdenv.mkDerivation {
   meta = {
     description = "A free fast-paced first-person shooter";
     homepage = "http://www.alientrap.org/games/nexuiz";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/ninvaders/default.nix b/pkgs/games/ninvaders/default.nix
index 26462c1eef5..df4a3ad111b 100644
--- a/pkgs/games/ninvaders/default.nix
+++ b/pkgs/games/ninvaders/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, ncurses }:
+{ lib, stdenv, fetchFromGitHub, cmake, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "ninvaders";
@@ -11,9 +11,10 @@ stdenv.mkDerivation rec {
     sha256 = "1wmwws1zsap4bfc2439p25vnja0hnsf57k293rdxw626gly06whi";
   };
 
-  buildInputs = [ cmake ncurses ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ ncurses ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Space Invaders clone based on ncurses";
     homepage = "http://ninvaders.sourceforge.net/";
     license = licenses.gpl2;
diff --git a/pkgs/games/njam/default.nix b/pkgs/games/njam/default.nix
index 5022a92a7cd..6fbffc37d03 100644
--- a/pkgs/games/njam/default.nix
+++ b/pkgs/games/njam/default.nix
@@ -1,10 +1,11 @@
-{stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net }:
+{lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net }:
 
-stdenv.mkDerivation {
-  name = "njam-1.25";
+stdenv.mkDerivation rec {
+  pname = "njam";
+  version = "1.25";
 
   src = fetchurl {
-    url = "mirror://sourceforge/njam/njam-1.25-src.tar.gz";
+    url = "mirror://sourceforge/njam/njam-${version}-src.tar.gz";
     sha256 = "0ysvqw017xkvddj957pdfmbmji7qi20nyr7f0zxvcvm6c7d3cc7s";
   };
 
@@ -21,7 +22,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://trackballs.sourceforge.net/";
     description = "Cross-platform pacman-like game";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/nottetris2/default.nix b/pkgs/games/nottetris2/default.nix
index dde35e4fe32..42e5a33cad7 100644
--- a/pkgs/games/nottetris2/default.nix
+++ b/pkgs/games/nottetris2/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, zip, love_0_7, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchFromGitHub, zip, love_0_7, makeWrapper, makeDesktopItem }:
 
 let
   pname = "nottetris2";
@@ -25,8 +25,8 @@ stdenv.mkDerivation {
     sha256 = "17iabh6rr8jim70n96rbhif4xq02g2kppscm8l339yqx6mhb64hs";
   };
 
-  nativeBuildInputs = [ zip ];
-  buildInputs = [ love_0_7 makeWrapper ];
+  nativeBuildInputs = [ zip makeWrapper ];
+  buildInputs = [ love_0_7 ];
 
   phases = [ "unpackPhase" "installPhase" ];
 
@@ -40,7 +40,7 @@ stdenv.mkDerivation {
     chmod +x $out/bin/${pname}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "It's like Tetris, but it's not";
     platforms = platforms.linux;
     license = licenses.wtfpl;
diff --git a/pkgs/games/nudoku/default.nix b/pkgs/games/nudoku/default.nix
index b9e521bce36..aaa6d324809 100644
--- a/pkgs/games/nudoku/default.nix
+++ b/pkgs/games/nudoku/default.nix
@@ -1,14 +1,14 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, gettext, ncurses }:
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, gettext, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "nudoku";
-  version = "2.0.0";
+  version = "2.1.0";
 
   src = fetchFromGitHub {
     owner = "jubalh";
     repo = pname;
     rev = version;
-    sha256 = "0rj8ajni7gssj0qbf1jn51699sadxwsr6ca2718w74psv7acda8h";
+    sha256 = "12v00z3p0ymi8f3w4b4bgl4c76irawn3kmd147r0ap6s9ssx2q6m";
   };
 
   # Allow gettext 0.20
@@ -16,15 +16,16 @@ stdenv.mkDerivation rec {
     substituteInPlace configure.ac --replace 0.19 0.20
   '';
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig gettext ];
+  nativeBuildInputs = [ autoreconfHook pkg-config gettext ];
   buildInputs = [ ncurses ];
 
-  configureFlags = stdenv.lib.optional stdenv.hostPlatform.isMusl "--disable-nls";
+  configureFlags = lib.optional stdenv.hostPlatform.isMusl "--disable-nls";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An ncurses based sudoku game";
     homepage = "http://jubalh.github.io/nudoku/";
     license = licenses.gpl3;
+    platforms = platforms.all;
     maintainers = with maintainers; [ dtzWill ];
   };
 }
diff --git a/pkgs/games/nxengine-evo/default.nix b/pkgs/games/nxengine-evo/default.nix
index 909737a6804..e3df235b757 100644
--- a/pkgs/games/nxengine-evo/default.nix
+++ b/pkgs/games/nxengine-evo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchpatch
 , fetchurl
 , cmake
@@ -54,12 +54,12 @@ stdenv.mkDerivation rec {
 
   meta = {
     description = "A complete open-source clone/rewrite of the masterpiece jump-and-run platformer Doukutsu Monogatari (also known as Cave Story)";
-    license = with stdenv.lib.licenses; [
+    license = with lib.licenses; [
       gpl3                   # Game engine
       unfreeRedistributable  # Game assets, freeware
     ];
-    maintainers = [ stdenv.lib.maintainers.scubed2 ];
+    maintainers = [ lib.maintainers.scubed2 ];
     homepage = "https://github.com/nxengine/nxengine-evo";
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/odamex/default.nix b/pkgs/games/odamex/default.nix
index af9bccadeb3..8b58ec67eda 100644
--- a/pkgs/games/odamex/default.nix
+++ b/pkgs/games/odamex/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, cmake, fetchurl, pkgconfig, SDL, SDL_mixer, SDL_net, wxGTK30 }:
+{ lib, stdenv, cmake, fetchurl, pkg-config, SDL, SDL_mixer, SDL_net, wxGTK30 }:
 
 stdenv.mkDerivation rec {
   pname = "odamex";
@@ -9,16 +9,14 @@ stdenv.mkDerivation rec {
     sha256 = "0d4v1l7kghkz1xz92jxlx50x3iy94z7ix1i3209m5j5545qzxrqq";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
   buildInputs = [ SDL SDL_mixer SDL_net wxGTK30 ];
 
-  enableParallelBuilding = true;
-
   meta = {
     homepage = "http://odamex.net/";
     description = "A client/server port for playing old-school Doom online";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = with stdenv.lib.maintainers; [ MP2E ];
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ MP2E ];
   };
 }
diff --git a/pkgs/games/oh-my-git/default.nix b/pkgs/games/oh-my-git/default.nix
new file mode 100644
index 00000000000..542effa6596
--- /dev/null
+++ b/pkgs/games/oh-my-git/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, copyDesktopItems
+, fetchFromGitHub
+, makeDesktopItem
+, stdenv
+, alsa-lib
+, gcc-unwrapped
+, git
+, godot-export-templates
+, godot-headless
+, libGLU
+, libX11
+, libXcursor
+, libXext
+, libXfixes
+, libXi
+, libXinerama
+, libXrandr
+, libXrender
+, libglvnd
+, libpulseaudio
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "oh-my-git";
+  version = "0.6.4";
+
+  src = fetchFromGitHub {
+    owner = "git-learning-game";
+    repo = "oh-my-git";
+    rev = version;
+    sha256 = "sha256-GQLHyBUXF+yqEZ/LYutAn6TBCXFX8ViOaERQEm2J6CY=";
+  };
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    godot-headless
+  ];
+
+  buildInputs = [
+    alsa-lib
+    gcc-unwrapped.lib
+    git
+    libGLU
+    libX11
+    libXcursor
+    libXext
+    libXfixes
+    libXi
+    libXinerama
+    libXrandr
+    libXrender
+    libglvnd
+    libpulseaudio
+    zlib
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "oh-my-git";
+      exec = "oh-my-git";
+      icon = "oh-my-git";
+      desktopName = "oh-my-git";
+      comment = "An interactive Git learning game!";
+      genericName = "An interactive Git learning game!";
+      categories = "Game;";
+    })
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    # Cannot create file '/homeless-shelter/.config/godot/projects/...'
+    export HOME=$TMPDIR
+
+    # Link the export-templates to the expected location. The --export commands
+    # expects the template-file at .../templates/3.2.3.stable/linux_x11_64_release
+    # with 3.2.3 being the version of godot.
+    mkdir -p $HOME/.local/share/godot
+    ln -s ${godot-export-templates}/share/godot/templates $HOME/.local/share/godot
+
+    mkdir -p $out/share/oh-my-git
+    godot-headless --export "Linux" $out/share/oh-my-git/oh-my-git
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    ln -s $out/share/oh-my-git/oh-my-git $out/bin
+
+    # Patch binaries.
+    interpreter=$(cat $NIX_CC/nix-support/dynamic-linker)
+    patchelf \
+      --set-interpreter $interpreter \
+      --set-rpath ${lib.makeLibraryPath buildInputs} \
+      $out/share/oh-my-git/oh-my-git
+
+    mkdir -p $out/share/pixmaps
+    cp images/oh-my-git.png $out/share/pixmaps/oh-my-git.png
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://ohmygit.org/";
+    description = "An interactive Git learning game";
+    license = with licenses; [ blueOak100 ];
+    platforms   = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/pkgs/games/oilrush/default.nix b/pkgs/games/oilrush/default.nix
index 6a05a566524..b78baee725d 100644
--- a/pkgs/games/oilrush/default.nix
+++ b/pkgs/games/oilrush/default.nix
@@ -1,7 +1,7 @@
-{ stdenv, config, fetchurl, libX11, libXext, libXinerama, libXrandr
+{ lib, stdenv, config, fetchurl, libX11, libXext, libXinerama, libXrandr
 , libXrender, fontconfig, freetype, openal, runtimeShell }:
 
-let inherit (stdenv.lib) makeLibraryPath; in
+let inherit (lib) makeLibraryPath; in
 
 stdenv.mkDerivation {
   name = "oilrush";
@@ -69,9 +69,9 @@ stdenv.mkDerivation {
       of Tower Defense.
     '';
     homepage = "http://oilrush-game.com/";
-    license = stdenv.lib.licenses.unfree;
-    #maintainers = with stdenv.lib.maintainers; [ astsmtl ];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.unfree;
+    #maintainers = with lib.maintainers; [ astsmtl ];
+    platforms = lib.platforms.linux;
     hydraPlatforms = [];
   };
 
diff --git a/pkgs/games/onscripter-en/default.nix b/pkgs/games/onscripter-en/default.nix
index ebcf755780d..bcd33eb9892 100644
--- a/pkgs/games/onscripter-en/default.nix
+++ b/pkgs/games/onscripter-en/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 , libpng, libjpeg, libogg, libvorbis, freetype, smpeg
 , SDL, SDL_image, SDL_mixer, SDL_ttf }:
 
@@ -25,7 +25,7 @@ stdenv.mkDerivation {
     sed -i 's/.dll//g' Makefile
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Japanese visual novel scripting engine";
     homepage = "http://unclemion.com/onscripter/";
     license = licenses.gpl2;
diff --git a/pkgs/games/openarena/default.nix b/pkgs/games/openarena/default.nix
index 577eafb6a8c..7b1f793895e 100644
--- a/pkgs/games/openarena/default.nix
+++ b/pkgs/games/openarena/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, makeWrapper, patchelf, pkgs, stdenv, SDL, libglvnd, libogg, libvorbis, curl, openal }:
+{ lib, fetchurl, makeWrapper, patchelf, pkgs, stdenv, SDL, libglvnd, libogg, libvorbis, curl, openal }:
 
 stdenv.mkDerivation {
   pname = "openarena";
@@ -15,7 +15,7 @@ stdenv.mkDerivation {
   installPhase = let
     gameDir = "$out/openarena-$version";
     interpreter = "$(< \"$NIX_CC/nix-support/dynamic-linker\")";
-    libPath = stdenv.lib.makeLibraryPath [ SDL libglvnd libogg libvorbis curl openal ];
+    libPath = lib.makeLibraryPath [ SDL libglvnd libogg libvorbis curl openal ];
     arch = {
       "x86_64-linux" = "x86_64";
       "i386-linux" = "i386";
@@ -36,8 +36,8 @@ stdenv.mkDerivation {
   meta = {
     description = "Crossplatform openarena client";
     homepage = "http://openarena.ws/";
-    maintainers = [ stdenv.lib.maintainers.wyvie ];
+    maintainers = [ lib.maintainers.wyvie ];
     platforms = [ "i386-linux" "x86_64-linux" ];
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
   };
 }
diff --git a/pkgs/games/openclonk/default.nix b/pkgs/games/openclonk/default.nix
index 18147c896bf..9dc267032ae 100644
--- a/pkgs/games/openclonk/default.nix
+++ b/pkgs/games/openclonk/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake, pkgconfig
+{ lib, stdenv, fetchurl, cmake, pkg-config
 , SDL2, libvorbis, libogg, libjpeg, libpng, freetype, glew, tinyxml, openal
 , freealut, readline, gcc-unwrapped
 , enableSoundtrack ? false # Enable the "Open Clonk Soundtrack - Explorers Journey" by David Oerther
@@ -20,13 +20,11 @@ in stdenv.mkDerivation rec {
 
   postInstall = ''
     mv -v $out/games/openclonk $out/bin/
-  '' + stdenv.lib.optionalString enableSoundtrack ''
+  '' + lib.optionalString enableSoundtrack ''
     ln -sv ${soundtrack_src} $out/share/games/openclonk/Music.ocg
   '';
 
-  enableParallelBuilding = true;
-
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
 
   buildInputs = [
     SDL2 libvorbis libogg libjpeg libpng freetype glew tinyxml openal freealut
@@ -37,7 +35,7 @@ in stdenv.mkDerivation rec {
 
   cmakeBuildType = "RelWithDebInfo";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Free multiplayer action game in which you control clonks, small but witty and nimble humanoid beings";
     homepage = "https://www.openclonk.org";
     license = if enableSoundtrack then licenses.unfreeRedistributable else licenses.isc;
diff --git a/pkgs/games/opendune/default.nix b/pkgs/games/opendune/default.nix
index 591bea12297..32e1ef4fca9 100644
--- a/pkgs/games/opendune/default.nix
+++ b/pkgs/games/opendune/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, lib, fetchFromGitHub, pkgconfig
-, alsaLib, libpulseaudio, SDL2, SDL2_image, SDL2_mixer }:
+{ stdenv, lib, fetchFromGitHub, pkg-config
+, alsa-lib, libpulseaudio, SDL2, SDL2_image, SDL2_mixer }:
 
 # - set the opendune configuration at ~/.config/opendune/opendune.ini:
 #     [opendune]
@@ -18,13 +18,13 @@ stdenv.mkDerivation rec {
   };
 
   configureFlags = [
-    "--with-alsa=${lib.getLib alsaLib}/lib/libasound.so"
+    "--with-alsa=${lib.getLib alsa-lib}/lib/libasound.so"
     "--with-pulse=${lib.getLib libpulseaudio}/lib/libpulse.so"
   ];
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
 
-  buildInputs = [ alsaLib libpulseaudio SDL2 SDL2_image SDL2_mixer ];
+  buildInputs = [ alsa-lib libpulseaudio SDL2 SDL2_image SDL2_mixer ];
 
   enableParallelBuilding = true;
 
@@ -37,10 +37,10 @@ stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Dune, Reinvented";
     homepage = "https://github.com/OpenDUNE/OpenDUNE";
     license = licenses.gpl2;
-    maintainers = with maintainers; [ nand0p ];
+    maintainers = with maintainers; [ ];
   };
 }
diff --git a/pkgs/games/opendungeons/default.nix b/pkgs/games/opendungeons/default.nix
index 467c782211f..d18682b8807 100644
--- a/pkgs/games/opendungeons/default.nix
+++ b/pkgs/games/opendungeons/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, ogre, cegui, boost, sfml, openal, cmake, ois, pkgconfig }:
+{ lib, stdenv, fetchFromGitHub, ogre, cegui, boost, sfml, openal, cmake, ois, pkg-config }:
 
 stdenv.mkDerivation rec {
   pname = "opendungeons";
@@ -13,14 +13,14 @@ stdenv.mkDerivation rec {
 
   patches = [ ./cmakepaths.patch ];
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ cmake ogre cegui boost sfml openal ois ];
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ ogre cegui boost sfml openal ois ];
   NIX_LDFLAGS = "-lpthread";
 
-  meta = with stdenv.lib; {
-    description = "An open source, real time strategy game sharing game elements with the Dungeon Keeper series and Evil Genius.";
+  meta = with lib; {
+    description = "An open source, real time strategy game sharing game elements with the Dungeon Keeper series and Evil Genius";
     homepage = "https://opendungeons.github.io";
-    license = [ licenses.gpl3Plus licenses.zlib licenses.mit licenses.cc-by-sa-30 licenses.cc0 licenses.ofl licenses.cc-by-30 ];
+    license = with licenses; [ gpl3Plus zlib mit cc-by-sa-30 cc0 ofl cc-by-30 ];
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/openjk/default.nix b/pkgs/games/openjk/default.nix
index 0fe327b308e..c16b38fc8f1 100644
--- a/pkgs/games/openjk/default.nix
+++ b/pkgs/games/openjk/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, makeDesktopItem, makeWrapper, cmake, libjpeg, zlib, libpng, libGL, SDL2 }:
+{ lib, stdenv, fetchFromGitHub, makeDesktopItem, makeWrapper, cmake, libjpeg, zlib, libpng, libGL, SDL2 }:
 
 let
   jamp = makeDesktopItem rec {
@@ -31,7 +31,6 @@ in stdenv.mkDerivation {
   };
 
   dontAddPrefix = true;
-  enableParallelBuilding = true;
 
   nativeBuildInputs = [ makeWrapper cmake ];
   buildInputs = [ libjpeg zlib libpng libGL SDL2 ];
@@ -54,11 +53,11 @@ in stdenv.mkDerivation {
     ln -s ${jasp}/share/applications/* $out/share/applications
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An open-source engine for Star Wars Jedi Academy game";
     homepage = "https://github.com/JACoders/OpenJK";
     license = licenses.gpl2;
     platforms = platforms.linux;
-    maintainers = with maintainers; [ gnidorah ];
+    maintainers = with maintainers; [ ];
   };
 }
diff --git a/pkgs/games/openlierox/default.nix b/pkgs/games/openlierox/default.nix
index 66c9420591d..12d00f28ffc 100644
--- a/pkgs/games/openlierox/default.nix
+++ b/pkgs/games/openlierox/default.nix
@@ -1,8 +1,9 @@
-{ stdenv, fetchurl, libX11, xorgproto, gd, SDL, SDL_image, SDL_mixer, zlib
-, libxml2, pkgconfig, curl, cmake, libzip }:
+{ lib, stdenv, fetchurl, libX11, xorgproto, gd, SDL, SDL_image, SDL_mixer, zlib
+, libxml2, pkg-config, curl, cmake, libzip }:
 
-stdenv.mkDerivation {
-  name = "openlierox-0.58rc3";
+stdenv.mkDerivation rec {
+  pname = "openlierox";
+  version = "0.58rc3";
 
   src = fetchurl {
     url = "mirror://sourceforge/openlierox/OpenLieroX_0.58_rc3.src.tar.bz2";
@@ -28,13 +29,14 @@ stdenv.mkDerivation {
     cp -R ../share/gamedir/* $out/share/OpenLieroX
   '';
 
+  nativeBuildInputs = [ cmake pkg-config curl ];
   buildInputs = [ libX11 xorgproto gd SDL SDL_image SDL_mixer zlib libxml2
-    pkgconfig curl cmake libzip ];
+    libzip ];
 
   meta = {
     homepage = "http://openlierox.net";
     description = "Real-time game with Worms-like shooting";
-    license = stdenv.lib.licenses.lgpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.lgpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/openmw/default.nix b/pkgs/games/openmw/default.nix
index 22f3ea8d6ad..8e6ed3cdb82 100644
--- a/pkgs/games/openmw/default.nix
+++ b/pkgs/games/openmw/default.nix
@@ -1,16 +1,32 @@
-{ stdenv, mkDerivationWith, fetchFromGitHub, qtbase, openscenegraph, mygui, bullet, ffmpeg_3
-, boost, cmake, SDL2, unshield, openal, libXt, pkgconfig }:
+{ lib
+, mkDerivation
+, fetchFromGitHub
+, cmake
+, pkg-config
+, openscenegraph
+, mygui
+, bullet
+, ffmpeg
+, boost
+, SDL2
+, unshield
+, openal
+, libXt
+}:
 
 let
   openscenegraph_ = openscenegraph.overrideDerivation (self: {
     src = fetchFromGitHub {
       owner = "OpenMW";
       repo = "osg";
+      # commit does not exist on any branch on the target repository
       rev = "1556cd7966ebc1c80b6626988d2b25fb43a744cf";
       sha256 = "0d74hijzmj82nx3jkv5qmr3pkgvplra0b8fbjx1y3vmzxamb0axd";
     };
   });
-in mkDerivationWith stdenv.mkDerivation rec {
+
+in
+mkDerivation rec {
   version = "0.46.0";
   pname = "openmw";
 
@@ -21,20 +37,33 @@ in mkDerivationWith stdenv.mkDerivation rec {
     sha256 = "0rm32zsmxvr6b0jjihfj543skhicbw5kg6shjx312clhlm035w2x";
   };
 
-  enableParallelBuilding = true;
+  nativeBuildInputs = [ cmake pkg-config ];
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ cmake boost ffmpeg_3 bullet mygui openscenegraph_ SDL2 unshield openal libXt qtbase ];
+  buildInputs = [
+    SDL2
+    boost
+    bullet
+    ffmpeg
+    libXt
+    mygui
+    openal
+    openscenegraph_
+    unshield
+  ];
 
   cmakeFlags = [
     "-DDESIRED_QT_VERSION:INT=5"
+    # as of 0.46, openmw is broken with GLVND
+    "-DOpenGL_GL_PREFERENCE=LEGACY"
   ];
 
-  meta = with stdenv.lib; {
+  dontWrapQtApps = true;
+
+  meta = with lib; {
     description = "An unofficial open source engine reimplementation of the game Morrowind";
     homepage = "http://openmw.org";
-    license = licenses.gpl3;
-    platforms = platforms.linux;
+    license = licenses.gpl3Plus;
     maintainers = with maintainers; [ abbradar ];
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/openmw/tes3mp.nix b/pkgs/games/openmw/tes3mp.nix
index df332c0e5bf..72b698ceb73 100644
--- a/pkgs/games/openmw/tes3mp.nix
+++ b/pkgs/games/openmw/tes3mp.nix
@@ -1,94 +1,134 @@
-{ stdenv, cmake, openmw, fetchFromGitHub, luajit, makeWrapper, mygui }:
+{ lib
+, stdenv
+, cmake
+, openmw
+, fetchFromGitHub
+, formats
+, luajit
+, makeWrapper
+, symlinkJoin
+, mygui
+, crudini
+}:
 
 # revisions are taken from https://github.com/GrimKriegor/TES3MP-deploy
 
 let
-  # TES3MP_STABLE_VERSION_FILE
-  compatHash = "292536439eeda58becdb7e441fe2e61ebb74529e";
-  rakNet = fetchFromGitHub {
-    owner = "TES3MP";
-    repo = "CrabNet";
-    # usually fixed:
-    # https://github.com/GrimKriegor/TES3MP-deploy/blob/d2a4a5d3acb64b16d9b8ca85906780aeea8d311b/tes3mp-deploy.sh#L589
-    rev = "4eeeaad2f6c11aeb82070df35169694b4fb7b04b";
-    sha256 = "0p0li9l1i5lcliswm5w9jql0zff9i6fwhiq0bl130m4i7vpr4cr3";
-  };
-  rakNetLibrary = stdenv.mkDerivation {
-    name = "RakNetLibrary";
-    src = rakNet;
+  # raknet could also be split into dev and lib outputs
+  raknet = stdenv.mkDerivation {
+    pname = "raknet";
+    version = "unstable-2018-07-14";
+
+    src = fetchFromGitHub {
+      owner = "TES3MP";
+      repo = "CrabNet";
+      # usually fixed:
+      # https://github.com/GrimKriegor/TES3MP-deploy/blob/d2a4a5d3acb64b16d9b8ca85906780aeea8d311b/tes3mp-deploy.sh#L589
+      rev = "4eeeaad2f6c11aeb82070df35169694b4fb7b04b";
+      sha256 = "0p0li9l1i5lcliswm5w9jql0zff9i6fwhiq0bl130m4i7vpr4cr3";
+    };
+
     nativeBuildInputs = [ cmake ];
+
     installPhase = ''
-      install -Dm755 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a
+      install -Dm555 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a
     '';
   };
-  coreScripts = fetchFromGitHub {
-    owner = "TES3MP";
-    repo = "CoreScripts";
-    # usually latest in stable branch (e.g. 0.7.0)
-    rev = "24aae91d9ddad38cdb3b0e0a13af59f142803e94";
-    sha256 = "1rfmxxr9ircfagdpbdrzl26msdhx1i3g974cblbv69078cradfh3";
+
+  coreScripts = stdenv.mkDerivation {
+    pname = "corescripts";
+    version = "unstable-2020-07-27";
+
+    src = fetchFromGitHub {
+      owner = "TES3MP";
+      repo = "CoreScripts";
+      # usually latest in stable branch (e.g. 0.7.1)
+      rev = "3c2d31595344db586d8585db0ef1fc0da89898a0";
+      sha256 = "sha256-m/pt2Et58HOMc1xqllGf4hjPLXNcc14+X0h84ouZDeg=";
+    };
+
+    buildCommand = ''
+      dir=$out/share/openmw-tes3mp
+      mkdir -p $dir
+      cp -r $src $dir/CoreScripts
+    '';
   };
-  # https://github.com/TES3MP/openmw-tes3mp/issues/555
-  mygui_ = mygui.overrideAttrs (oldAttrs: rec {
-    version = "3.2.2";
+
+  # build an unwrapped version so we don't have to rebuild it all over again in
+  # case the scripts or wrapper scripts change.
+  unwrapped = openmw.overrideAttrs (oldAttrs: rec {
+    pname = "openmw-tes3mp-unwrapped";
+    version = "unstable-2020-08-07";
 
     src = fetchFromGitHub {
-      owner = "MyGUI";
-      repo = "mygui";
-      rev = "MyGUI${version}";
-      sha256 = "1wk7jmwm55rhlqqcyvqsxdmwvl70bysl9azh4kd9n57qlmgk3zmw";
+      owner = "TES3MP";
+      repo = "openmw-tes3mp";
+      # usually latest in stable branch (e.g. 0.7.1)
+      rev = "ce5df6d18546e37aac9746d99c00d27a7f34b00d";
+      sha256 = "sha256-xLslShNA6rVFl9kt6BNGDpSYMpO25jBTCteLJoSTXdg=";
+    };
+
+    nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ makeWrapper ];
+
+    buildInputs = oldAttrs.buildInputs ++ [ luajit ];
+
+    cmakeFlags = oldAttrs.cmakeFlags ++ [
+      "-DBUILD_OPENCS=OFF"
+      "-DRakNet_INCLUDES=${raknet.src}/include"
+      "-DRakNet_LIBRARY_RELEASE=${raknet}/lib/libRakNetLibStatic.a"
+      "-DRakNet_LIBRARY_DEBUG=${raknet}/lib/libRakNetLibStatic.a"
+    ];
+
+    # https://github.com/TES3MP/openmw-tes3mp/issues/552
+    patches = [ ./tes3mp.patch ];
+
+    NIX_CFLAGS_COMPILE = "-fpermissive";
+
+    preConfigure = ''
+      substituteInPlace files/version.in \
+        --subst-var-by OPENMW_VERSION_COMMITHASH ${src.rev}
+    '';
+
+    # move everything that we wrap out of the way
+    postInstall = ''
+      mkdir -p $out/libexec
+      mv $out/bin/tes3mp-* $out/libexec
+    '';
+
+    meta = with lib; {
+      description = "Multiplayer for TES3:Morrowind based on OpenMW";
+      homepage = "https://tes3mp.com/";
+      license = licenses.gpl3Only;
+      maintainers = with maintainers; [ peterhoeg ];
+      platforms = [ "x86_64-linux" "i686-linux" ];
     };
   });
-in openmw.overrideAttrs (oldAttrs: rec {
-  version = "2019-11-19";
-  name = "openmw-tes3mp-${version}";
-
-  src = fetchFromGitHub {
-    owner = "TES3MP";
-    repo = "openmw-tes3mp";
-    # usually latest in stable branch (e.g. 0.7.0)
-    rev = "ad9ee80641a3e22d0780daca051df7f4e90f3615";
-    sha256 = "03a1vldiv5lk7yq6lhicx3qz8hjfxhind2dj0w9lg5839ljyk6jv";
+
+  cfgFile = (formats.ini { }).generate "tes3mp-server.cfg" {
+    Plugins.home = "${coreScripts}/share/openmw-tes3mp/CoreScripts";
   };
 
-  nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ makeWrapper ];
-  buildInputs = [ luajit mygui_ ] ++ oldAttrs.buildInputs;
-
-  cmakeFlags = oldAttrs.cmakeFlags ++ [
-    "-DBUILD_OPENCS=OFF"
-    "-DRakNet_INCLUDES=${rakNet}/include"
-    "-DRakNet_LIBRARY_RELEASE=${rakNetLibrary}/lib/libRakNetLibStatic.a"
-    "-DRakNet_LIBRARY_DEBUG=${rakNetLibrary}/lib/libRakNetLibStatic.a"
-  ];
-
-  # https://github.com/TES3MP/openmw-tes3mp/issues/552
-  patches = [
-    ./tes3mp.patch
-  ];
-  NIX_CFLAGS_COMPILE = "-fpermissive";
-
-  preConfigure = ''
-    substituteInPlace files/version.in \
-      --subst-var-by OPENMW_VERSION_COMMITHASH ${compatHash}
-  '';
+in
+symlinkJoin rec {
+  name = "openmw-tes3mp-${unwrapped.version}";
+  inherit (unwrapped) version meta;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  paths = [ unwrapped ];
+
+  # crudini --merge will create the file if it doesn't exist
+  postBuild = ''
+    mkdir -p $out/bin
 
-  postInstall = ''
-    # components/process/processinvoker.cpp: path.prepend(QLatin1String("./"))
-    wrapProgram $out/bin/tes3mp-browser \
+    dir=\''${XDG_CONFIG_HOME:-\$HOME/.config}/openmw
+
+    makeWrapper ${unwrapped}/libexec/tes3mp-browser $out/bin/tes3mp-browser \
       --run "cd $out/bin"
-    wrapProgram $out/bin/tes3mp-server \
-      --run "mkdir -p ~/.config/openmw" \
-      --run "cd ~/.config/openmw" \
-      --run "[ -d CoreScripts ] || cp --no-preserve=mode -r ${coreScripts} CoreScripts" \
-      --run "[ -f tes3mp-server.cfg ] || echo \"[Plugins] home = \$HOME/.config/openmw/CoreScripts\" > tes3mp-server.cfg" \
+
+    makeWrapper ${unwrapped}/libexec/tes3mp-server $out/bin/tes3mp-server \
+      --run "mkdir -p $dir" \
+      --run "${crudini}/bin/crudini --merge $dir/${cfgFile.name} < ${cfgFile}" \
       --run "cd $out/bin"
   '';
-
-  meta = with stdenv.lib; {
-    description = "Multiplayer for TES3:Morrowind based on OpenMW";
-    homepage = "https://tes3mp.com/";
-    license = licenses.gpl3;
-    platforms = [ "x86_64-linux" "i686-linux" ];
-    maintainers = with maintainers; [ gnidorah ];
-  };
-})
+}
diff --git a/pkgs/games/openra/common.nix b/pkgs/games/openra/common.nix
index 51f94177177..41c903e1011 100644
--- a/pkgs/games/openra/common.nix
+++ b/pkgs/games/openra/common.nix
@@ -1,13 +1,13 @@
 /*  The reusable code, and package attributes, between OpenRA engine packages (engine.nix)
     and out-of-tree mod packages (mod.nix).
 */
-{ stdenv, makeSetupHook, curl, unzip, dos2unix, pkgconfig, makeWrapper
+{ lib, makeSetupHook, curl, unzip, dos2unix, pkg-config, makeWrapper
 , lua, mono, dotnetPackages, python
 , libGL, freetype, openal, SDL2
 , zenity
 }:
 
-with stdenv.lib;
+with lib;
 
 let
   path = makeBinPath ([ mono python ] ++ optional (zenity != null) zenity);
@@ -62,7 +62,7 @@ in {
       curl
       unzip
       dos2unix
-      pkgconfig
+      pkg-config
       makeWrapper
       mkdirp
       mono
diff --git a/pkgs/games/openra/default.nix b/pkgs/games/openra/default.nix
index 2e8533f7816..22d3c6c879e 100644
--- a/pkgs/games/openra/default.nix
+++ b/pkgs/games/openra/default.nix
@@ -25,7 +25,7 @@ let
     lua = pkgs.lua5_1;
     # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure,
     # rather than having to look to the logs why it is not starting.
-    inherit (pkgs.gnome3) zenity;
+    inherit (pkgs.gnome) zenity;
   });
 
   /*  Building a set of engines or mods requires some dependencies as well,
diff --git a/pkgs/games/openra/engine.nix b/pkgs/games/openra/engine.nix
index 7d2d007d075..adc1bf76e00 100644
--- a/pkgs/games/openra/engine.nix
+++ b/pkgs/games/openra/engine.nix
@@ -7,17 +7,16 @@
     This package could be seen as providing a set of in-tree mods,
     while the `mod.nix` pacakges provide a single out-of-tree mod.
 */
-{ stdenv
+{ lib, stdenv
 , packageAttrs
 , patchEngine
 , wrapLaunchGame
 , engine
 }:
 
-with stdenv.lib;
+with lib;
 
 stdenv.mkDerivation (recursiveUpdate packageAttrs rec {
-  name = "${pname}-${version}";
   pname = "openra";
   version = "${engine.name}-${engine.version}";
 
diff --git a/pkgs/games/openra/mod.nix b/pkgs/games/openra/mod.nix
index 8df5922a441..4d0a18e6334 100644
--- a/pkgs/games/openra/mod.nix
+++ b/pkgs/games/openra/mod.nix
@@ -6,7 +6,7 @@
     The engine is relatively small and quick to build, so this is not much of a problem.
     Building a mod will result in a wrapper script that starts the mod inside the specified engine.
 */
-{ stdenv
+{ lib, stdenv
 , packageAttrs
 , patchEngine
 , wrapLaunchGame
@@ -14,7 +14,7 @@
 , engine
 }:
 
-with stdenv.lib;
+with lib;
 
 let
   engineSourceName = engine.src.name or "engine";
diff --git a/pkgs/games/openra/mods.nix b/pkgs/games/openra/mods.nix
index 4a79125dc18..cf8cd433c29 100644
--- a/pkgs/games/openra/mods.nix
+++ b/pkgs/games/openra/mods.nix
@@ -123,6 +123,7 @@ in {
       src = fetchFromGitHub {
         owner = "IceReaper";
         repo = "OpenRA" ;
+        # commit does not exist on any branch on the target repository
         rev = "4e8eab4ca00d1910203c8a103dfd2c002714daa8";
         sha256 = "1yyqparf93x8yzy1f46gsymgkj5jls25v2yc7ighr3f7mi3igdvq";
         name = "engine";
diff --git a/pkgs/games/openra/packages.nix b/pkgs/games/openra/packages.nix
index c09b697771a..2f4c83c7d5a 100644
--- a/pkgs/games/openra/packages.nix
+++ b/pkgs/games/openra/packages.nix
@@ -15,7 +15,7 @@ let
     lua = pkgs.lua5_1;
     # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure,
     # rather than having to look to the logs why it is not starting.
-    inherit (pkgs.gnome3) zenity;
+    inherit (pkgs.gnome) zenity;
   });
 
   /*  Building a set of engines or mods requires some dependencies as well,
diff --git a/pkgs/games/openrct2/default.nix b/pkgs/games/openrct2/default.nix
index 45133be461c..9e79a9005dc 100644
--- a/pkgs/games/openrct2/default.nix
+++ b/pkgs/games/openrct2/default.nix
@@ -1,23 +1,24 @@
-{ stdenv, fetchFromGitHub
+{ lib, stdenv, fetchFromGitHub
 , SDL2, cmake, curl, duktape, fontconfig, freetype, icu, jansson, libGLU
-, libiconv, libpng, libpthreadstubs, libzip, openssl, pkgconfig, speexdsp, zlib
+, libiconv, libpng, libpthreadstubs, libzip, nlohmann_json, openssl, pkg-config
+, speexdsp, zlib
 }:
 
 let
-  version = "0.3.0";
+  version = "0.3.4";
 
   openrct2-src = fetchFromGitHub {
     owner = "OpenRCT2";
     repo = "OpenRCT2";
     rev = "v${version}";
-    sha256 = "0xs8pnn3lq30iy76pv42hywsrabapcrrkl597dhjafwh1xaxxj91";
+    sha256 = "051dm7bw3l8qnppk5b7xvavl29xfadqn8aa18q49qdy5mjy6qgk4";
   };
 
   objects-src = fetchFromGitHub {
     owner = "OpenRCT2";
     repo = "objects";
-    rev = "v1.0.16";
-    sha256 = "1xz50ghiqj9rm0m6d65j09ich6dlhyj36zah6zvmmzr4kg6svnk5";
+    rev = "v1.0.21";
+    sha256 = "0r2vp2y67jc1mpfl4j83sx5khvvaddx7xs26ppkigmr2d1xpxgr7";
   };
 
   title-sequences-src = fetchFromGitHub {
@@ -28,14 +29,14 @@ let
   };
 in
 stdenv.mkDerivation {
-  inherit version;
   pname = "openrct2";
+  inherit version;
 
   src = openrct2-src;
 
   nativeBuildInputs = [
     cmake
-    pkgconfig
+    pkg-config
   ];
 
   buildInputs = [
@@ -51,29 +52,28 @@ stdenv.mkDerivation {
     libpng
     libpthreadstubs
     libzip
+    nlohmann_json
     openssl
     speexdsp
     zlib
   ];
 
-  postUnpack = ''
-    cp -r ${objects-src}         $sourceRoot/data/object
-    cp -r ${title-sequences-src} $sourceRoot/data/sequence
-  '';
-
   cmakeFlags = [
     "-DDOWNLOAD_OBJECTS=OFF"
     "-DDOWNLOAD_TITLE_SEQUENCES=OFF"
   ];
 
-  enableParallelBuilding = true;
+  postUnpack = ''
+    cp -r ${objects-src}         $sourceRoot/data/object
+    cp -r ${title-sequences-src} $sourceRoot/data/sequence
+  '';
 
   preFixup = "ln -s $out/share/openrct2 $out/bin/data";
 
-  meta = with stdenv.lib; {
-    description = "An open source re-implementation of RollerCoaster Tycoon 2 (original game required)";
+  meta = with lib; {
+    description = "Open source re-implementation of RollerCoaster Tycoon 2 (original game required)";
     homepage = "https://openrct2.io/";
-    license = licenses.gpl3;
+    license = licenses.gpl3Only;
     platforms = platforms.linux;
     maintainers = with maintainers; [ oxzi ];
   };
diff --git a/pkgs/games/openrw/default.nix b/pkgs/games/openrw/default.nix
index b53850a8743..4064023fafd 100644
--- a/pkgs/games/openrw/default.nix
+++ b/pkgs/games/openrw/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchgit, cmake, sfml, libGLU, libGL, bullet, glm, libmad, xlibsWrapper, openal
+{ lib, stdenv, fetchgit, cmake, sfml, libGLU, libGL, bullet, glm, libmad, xlibsWrapper, openal
 , SDL2, boost, ffmpeg_3, Cocoa, OpenAL }:
 
 stdenv.mkDerivation {
@@ -16,9 +16,9 @@ stdenv.mkDerivation {
 
   buildInputs = [
     sfml libGLU libGL bullet glm libmad xlibsWrapper openal SDL2 boost ffmpeg_3
-  ] ++ stdenv.lib.optionals stdenv.isDarwin [ OpenAL Cocoa ];
+  ] ++ lib.optionals stdenv.isDarwin [ OpenAL Cocoa ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Unofficial open source recreation of the classic Grand Theft Auto III game executable";
     homepage = "https://github.com/rwengine/openrw";
     license = licenses.gpl3;
diff --git a/pkgs/games/openspades/default.nix b/pkgs/games/openspades/default.nix
index b00524461a4..58ac3f8df79 100644
--- a/pkgs/games/openspades/default.nix
+++ b/pkgs/games/openspades/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchFromGitHub, fetchpatch, cmake, unzip, zip, file
+{ lib, stdenv, fetchurl, fetchFromGitHub, fetchpatch, cmake, unzip, zip, file
 , curl, glew , libGL, SDL2, SDL2_image, zlib, freetype, imagemagick
 , openal , opusfile, libogg
 , Cocoa
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [
     freetype SDL2 SDL2_image libGL zlib curl glew opusfile openal libogg
-  ] ++ stdenv.lib.optionals stdenv.hostPlatform.isDarwin [
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
     Cocoa
   ];
 
@@ -55,11 +55,9 @@ stdenv.mkDerivation rec {
     cp $notoFont $out/share/games/openspades/Resources/
   '';
 
-  enableParallelBuilding = true;
-
   NIX_CFLAGS_LINK = "-lopenal";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A compatible client of Ace of Spades 0.75";
     homepage    = "https://github.com/yvt/openspades/";
     license     = licenses.gpl3;
diff --git a/pkgs/games/openttd/default.nix b/pkgs/games/openttd/default.nix
index bab4e510e7d..5c77e8a2c18 100644
--- a/pkgs/games/openttd/default.nix
+++ b/pkgs/games/openttd/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchzip, pkgconfig, which, SDL2, libpng, zlib, xz, freetype, fontconfig, libxdg_basedir
+{ lib, stdenv, fetchurl, fetchzip, cmake, SDL2, libpng, zlib, xz, freetype, fontconfig
 , withOpenGFX ? true, withOpenSFX ? true, withOpenMSX ? true
 , withFluidSynth ? true, audioDriver ? "alsa", fluidsynth, soundfont-fluid, procps
 , writeScriptBin, makeWrapper, runtimeShell
@@ -6,18 +6,18 @@
 
 let
   opengfx = fetchzip {
-    url = "https://cdn.openttd.org/opengfx-releases/0.6.0/opengfx-0.6.0-all.zip";
-    sha256 = "1zg871j6kv7r0aqwca68d9kdf3smclgzan8hj76vj4fyfkykh173";
+    url = "https://cdn.openttd.org/opengfx-releases/0.6.1/opengfx-0.6.1-all.zip";
+    sha256 = "sha256-DeeIlLcmPeMZ0ju9DwXUInnQp2rWu60besDVto4+lDQ=";
   };
 
   opensfx = fetchzip {
-    url = "https://cdn.openttd.org/opensfx-releases/0.2.3/opensfx-0.2.3-all.zip";
-    sha256 = "1bb167kszdd6dqbcdjrxxwab6b7y7jilhzi3qijdhprpm5gf1lp3";
+    url = "https://cdn.openttd.org/opensfx-releases/1.0.1/opensfx-1.0.1-all.zip";
+    sha256 = "sha256-U1PIKbMZHRJ0Z9Cp2RqqCMhD1xRyudoNHAYIZyotxVk=";
   };
 
   openmsx = fetchzip {
-    url = "https://cdn.openttd.org/openmsx-releases/0.3.1/openmsx-0.3.1-all.zip";
-    sha256 = "0qnmfzz0v8vxrrvxnm7szphrlrlvhkwn3y92b4iy0b4b6yam0yd4";
+    url = "https://cdn.openttd.org/openmsx-releases/0.4.0/openmsx-0.4.0-all.zip";
+    sha256 = "sha256-Ok6W+iqi4SP7cD4HUQERrAysvVibnN7Q4/tkugffDgQ=";
   };
 
   playmidi = writeScriptBin "playmidi" ''
@@ -29,16 +29,16 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "openttd";
-  version = "1.10.3";
+  version = "1.11.2";
 
   src = fetchurl {
     url = "https://cdn.openttd.org/openttd-releases/${version}/${pname}-${version}-source.tar.xz";
-    sha256 = "0fxmfz1mm95a2x0rnzfff9wb8q57w0cvsdd0z7agdcbyakph25n1";
+    sha256 = "sha256-D7qTWiqBX0/ozW3C4q4z9ydpU4cxIo+EimOzpulILm0=";
   };
 
-  nativeBuildInputs = [ pkgconfig which makeWrapper ];
-  buildInputs = [ SDL2 libpng xz zlib freetype fontconfig libxdg_basedir ]
-    ++ stdenv.lib.optionals withFluidSynth [ fluidsynth soundfont-fluid ];
+  nativeBuildInputs = [ cmake makeWrapper ];
+  buildInputs = [ SDL2 libpng xz zlib freetype fontconfig ]
+    ++ lib.optionals withFluidSynth [ fluidsynth soundfont-fluid ];
 
   prefixKey = "--prefix-dir=";
 
@@ -46,35 +46,31 @@ stdenv.mkDerivation rec {
     "--without-liblzo2"
   ];
 
-  makeFlags = [ "INSTALL_PERSONAL_DIR=" ];
-
   postInstall = ''
-    mv $out/games/ $out/bin
-
-    ${stdenv.lib.optionalString withOpenGFX ''
-      cp ${opengfx}/* $out/share/games/openttd/baseset
+    ${lib.optionalString withOpenGFX ''
+      cp ${opengfx}/*.tar $out/share/games/openttd/baseset
     ''}
 
     mkdir -p $out/share/games/openttd/data
 
-    ${stdenv.lib.optionalString withOpenSFX ''
-      cp ${opensfx}/*.{obs,cat} $out/share/games/openttd/data
+    ${lib.optionalString withOpenSFX ''
+      cp ${opensfx}/*.tar $out/share/games/openttd/data
     ''}
 
     mkdir $out/share/games/openttd/baseset/openmsx
 
-    ${stdenv.lib.optionalString withOpenMSX ''
-      cp ${openmsx}/*.{obm,mid} $out/share/games/openttd/baseset/openmsx
+    ${lib.optionalString withOpenMSX ''
+      cp ${openmsx}/*.tar $out/share/games/openttd/baseset/openmsx
     ''}
 
-    ${stdenv.lib.optionalString withFluidSynth ''
+    ${lib.optionalString withFluidSynth ''
       wrapProgram $out/bin/openttd \
         --add-flags -m \
         --add-flags extmidi:cmd=${playmidi}/bin/playmidi
     ''}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = ''Open source clone of the Microprose game "Transport Tycoon Deluxe"'';
     longDescription = ''
       OpenTTD is a transportation economics simulator. In single player mode,
diff --git a/pkgs/games/openttd/grfcodec.nix b/pkgs/games/openttd/grfcodec.nix
new file mode 100644
index 00000000000..544cf4f06c4
--- /dev/null
+++ b/pkgs/games/openttd/grfcodec.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, fetchFromGitHub, boost, cmake, git }:
+
+stdenv.mkDerivation rec {
+  pname = "openttd-grfcodec";
+  version = "unstable-2021-03-10";
+
+  src = fetchFromGitHub {
+    owner = "OpenTTD";
+    repo = "grfcodec";
+    rev = "045774dee7cab1a618a3e0d9b39bff78a12b6efa";
+    sha256 = "0b4xnnkqc01d3r834lhkq744ymar6c8iyxk51wc4c7hvz0vp9vmy";
+  };
+
+  buildInputs = [boost];
+  nativeBuildInputs = [cmake git];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp -a grfcodec grfid grfstrip nforenum $out/bin/
+  '';
+
+  meta = with lib; {
+    description = "Low-level (dis)assembler and linter for OpenTTD GRF files";
+    homepage    = "http://openttd.org/";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/pkgs/games/openttd/jgrpp.nix b/pkgs/games/openttd/jgrpp.nix
index 83a8f927694..3dcb621db4b 100644
--- a/pkgs/games/openttd/jgrpp.nix
+++ b/pkgs/games/openttd/jgrpp.nix
@@ -2,12 +2,12 @@
 
 openttd.overrideAttrs (oldAttrs: rec {
   pname = "openttd-jgrpp";
-  version = "0.34.4";
+  version = "0.41.0";
 
   src = fetchFromGitHub rec {
     owner = "JGRennison";
     repo = "OpenTTD-patches";
     rev = "jgrpp-${version}";
-    sha256 = "125mgia5hgcsn8314xyiip3z8y23rc3kdv7jczbncqlzsc75624v";
+    sha256 = "sha256-DrtxqXyeqA+X4iLTvTSPFDKDoLCyVd458+nJWc+9MF4=";
   };
 })
diff --git a/pkgs/games/openttd/nml.nix b/pkgs/games/openttd/nml.nix
new file mode 100644
index 00000000000..094330faffb
--- /dev/null
+++ b/pkgs/games/openttd/nml.nix
@@ -0,0 +1,22 @@
+{ stdenv, lib, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "openttd-nml";
+  version = "0.5.3";
+
+  src = fetchFromGitHub {
+    owner = "OpenTTD";
+    repo = "nml";
+    rev = version;
+    sha256 = "0kfnkshff3wrxsj1wpfbbw2mmgww2q80v63p5d2pp1f38x8j33w9";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ply pillow];
+
+  meta = with lib; {
+    description = "Compiler for OpenTTD NML files";
+    homepage    = "http://openttdcoop.org/";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/pkgs/games/opentyrian/default.nix b/pkgs/games/opentyrian/default.nix
index 9872a3ee05f..43c8e08c79f 100644
--- a/pkgs/games/opentyrian/default.nix
+++ b/pkgs/games/opentyrian/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, fetchzip, SDL, SDL_net}:
+{ lib, stdenv, fetchurl, fetchzip, SDL, SDL_net }:
 
 stdenv.mkDerivation rec {
   pname = "opentyrian";
@@ -31,6 +31,6 @@ stdenv.mkDerivation rec {
     description = ''Open source port of the game "Tyrian"'';
     homepage = "https://bitbucket.org/opentyrian/opentyrian";
     # This does not account of Tyrian data.
-    # license = stdenv.lib.licenses.gpl2;
+    # license = lib.licenses.gpl2;
   };
 }
diff --git a/pkgs/games/openxcom/default.nix b/pkgs/games/openxcom/default.nix
index 3ec18640054..8c115e9b312 100644
--- a/pkgs/games/openxcom/default.nix
+++ b/pkgs/games/openxcom/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchFromGitHub, cmake, libGLU, libGL, zlib, openssl, libyamlcpp, boost
+{lib, stdenv, fetchFromGitHub, cmake, libGLU, libGL, zlib, openssl, libyamlcpp, boost
 , SDL, SDL_image, SDL_mixer, SDL_gfx }:
 
 let version = "1.0.0.2019.10.18"; in
@@ -19,9 +19,9 @@ stdenv.mkDerivation {
     description = "Open source clone of UFO: Enemy Unknown";
     homepage = "https://openxcom.org";
     repositories.git = "https://github.com/SupSuper/OpenXcom.git";
-    maintainers = [ stdenv.lib.maintainers.cpages ];
-    platforms = stdenv.lib.platforms.linux;
-    license = stdenv.lib.licenses.gpl3;
+    maintainers = [ lib.maintainers.cpages ];
+    platforms = lib.platforms.linux;
+    license = lib.licenses.gpl3;
   };
 
 }
diff --git a/pkgs/games/openxray/default.nix b/pkgs/games/openxray/default.nix
index fe2e978c4cc..58c82aec365 100644
--- a/pkgs/games/openxray/default.nix
+++ b/pkgs/games/openxray/default.nix
@@ -1,16 +1,16 @@
-{ stdenv, fetchFromGitHub, cmake, glew, freeimage,  liblockfile
+{ lib, stdenv, fetchFromGitHub, cmake, glew, freeimage,  liblockfile
 , openal, libtheora, SDL2, lzo, libjpeg, libogg, tbb
-, pcre, makeWrapper }:
+, pcre, makeWrapper, fetchpatch }:
 
 let
-  version = "730-july-preview";
+  version = "822-december-preview";
 
   src = fetchFromGitHub {
     owner = "OpenXRay";
     repo = "xray-16";
     rev = version;
-    sha256 = "1nish3sbpk0hsag7r4nyx8j6pl9mlgx58v8dhzg2vwj2q32isyb2";
     fetchSubmodules = true;
+    sha256 = "06f3zjnib7hipyl3hnc6mwcj9f50kbwn522wzdjydz8qgdg60h3m";
   };
 
   # https://github.com/OpenXRay/xray-16/issues/518
@@ -20,14 +20,14 @@ let
 
     inherit src;
 
-    postUnpack = "sourceRoot+=/Externals/cryptopp";
+    sourceRoot = "source/Externals/cryptopp";
 
     makeFlags = [ "PREFIX=${placeholder "out"}" ];
     enableParallelBuilding = true;
 
     doCheck = true;
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Crypto++, a free C++ class library of cryptographic schemes";
       homepage = "https://cryptopp.com/";
       license = with licenses; [ boost publicDomain ];
@@ -35,18 +35,30 @@ let
     };
   };
 in stdenv.mkDerivation rec {
-  pname = "OpenXRay";
+  pname = "openxray";
   inherit version src;
 
-  hardeningDisable = [ "format" ];
+  # TODO https://github.com/OpenXRay/GameSpy/pull/6, check if merged in version > 822
+  # Fixes format hardening
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/OpenXRay/GameSpy/pull/6/commits/155af876281f5d94f0142886693314d97deb2d4c.patch";
+      sha256 = "1l0vcgvzzx8n56shpblpfdhvpr6c12fcqf35r0mflaiql8q7wn88";
+      stripLen = 1;
+      extraPrefix = "Externals/GameSpy/";
+    })
+  ];
+
   cmakeFlags = [ "-DCMAKE_INCLUDE_PATH=${cryptopp}/include/cryptopp" ];
 
   buildInputs = [
     glew freeimage liblockfile openal cryptopp libtheora SDL2 lzo
     libjpeg libogg tbb pcre
   ];
+
   nativeBuildInputs = [ cmake makeWrapper ];
 
+  # https://github.com/OpenXRay/xray-16/issues/786
   preConfigure = ''
     substituteInPlace src/xrCore/xrCore.cpp \
       --replace /usr/share $out/share
@@ -58,13 +70,13 @@ in stdenv.mkDerivation rec {
       --prefix LD_LIBRARY_PATH : $out/lib
   '';
 
-  meta = with stdenv.lib; {
-    description = "X-Ray Engine 1.6 expansion. Original version was used in S.T.A.L.K.E.R.: Call of Pripyat";
+  meta = with lib; {
+    description = "Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World";
     homepage = src.meta.homepage;
     license = licenses.unfree // {
       url = "https://github.com/OpenXRay/xray-16/blob/xd_dev/License.txt";
     };
-    maintainers = [ maintainers.gnidorah ];
+    maintainers = with maintainers; [ OPNA2608 ];
     platforms = [ "x86_64-linux" "i686-linux" ];
   };
 }
diff --git a/pkgs/games/orthorobot/default.nix b/pkgs/games/orthorobot/default.nix
index a2a66f6838b..c168af81ad6 100644
--- a/pkgs/games/orthorobot/default.nix
+++ b/pkgs/games/orthorobot/default.nix
@@ -1,9 +1,15 @@
-{ stdenv, fetchurl, fetchFromGitHub, zip, love, lua, makeWrapper, makeDesktopItem }:
-
-let
+{ lib, stdenv, fetchurl, fetchFromGitHub, zip, love, lua, makeWrapper, makeDesktopItem }:
+stdenv.mkDerivation rec {
   pname = "orthorobot";
   version = "1.1.1";
 
+  src = fetchFromGitHub {
+    owner = "Stabyourself";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ca6hvd890kxmamsmsfiqzw15ngsvb4lkihjb6kabgmss61a6s5p";
+  };
+
   icon = fetchurl {
     url = "http://stabyourself.net/images/screenshots/orthorobot-5.png";
     sha256 = "13fa4divdqz4vpdij1lcs5kf6w2c4jm3cc9q6bz5h7lkng31jzi6";
@@ -19,25 +25,12 @@ let
     categories = "Game;";
   };
 
-in
-
-stdenv.mkDerivation {
-  name = "${pname}-${version}";
-
-  src = fetchFromGitHub {
-    owner = "Stabyourself";
-    repo = pname;
-    rev = "v${version}";
-    sha256 = "1ca6hvd890kxmamsmsfiqzw15ngsvb4lkihjb6kabgmss61a6s5p";
-  };
-
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = [ lua love zip ];
 
-  phases = [ "unpackPhase" "installPhase" ];
+  dontBuild = true;
 
-  installPhase =
-  ''
+  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
@@ -46,12 +39,11 @@ stdenv.mkDerivation {
     chmod +x $out/bin/${pname}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Recharge the robot";
     maintainers = with maintainers; [ leenaars ];
     platforms = platforms.linux;
     license = licenses.free;
     downloadPage = "http://stabyourself.net/orthorobot/";
   };
-
 }
diff --git a/pkgs/games/osu-lazer/default.nix b/pkgs/games/osu-lazer/default.nix
index 074c24389a1..55f9bfb75c3 100644
--- a/pkgs/games/osu-lazer/default.nix
+++ b/pkgs/games/osu-lazer/default.nix
@@ -1,31 +1,38 @@
 { lib, stdenv, fetchFromGitHub, fetchurl, makeWrapper, makeDesktopItem, linkFarmFromDrvs
-, dotnet-sdk, dotnet-netcore, dotnetPackages
-, ffmpeg_4, alsaLib, SDL2, lttng-ust, numactl, alsaPlugins
+, dotnetCorePackages, dotnetPackages, cacert
+, ffmpeg_4, alsa-lib, SDL2, lttng-ust, numactl, alsa-plugins
 }:
 
 let
   runtimeDeps = [
-    ffmpeg_4 alsaLib SDL2 lttng-ust numactl
+    ffmpeg_4 alsa-lib SDL2 lttng-ust numactl
   ];
 
+  dotnet-sdk = dotnetCorePackages.sdk_5_0;
+  dotnet-net = dotnetCorePackages.net_5_0;
+
   # https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#using-rids
   runtimeId = "linux-x64";
 
 in stdenv.mkDerivation rec {
   pname = "osu-lazer";
-  version = "2020.820.0";
+  version = "2021.720.0";
 
   src = fetchFromGitHub {
     owner = "ppy";
     repo = "osu";
     rev = version;
-    sha256 = "0vszw0f5x0syshn8bnsbskxvknwpgbnm31kxwh1mfdr7pnxvw922";
+    sha256 = "I7UkbyH2i218d5RCq4al9Gr1C0MX339jFOeyKrKQ3b0=";
   };
 
   patches = [ ./bypass-tamper-detection.patch ];
   patchFlags = [ "--binary" "-p1" ];
 
-  nativeBuildInputs = [ dotnet-sdk dotnetPackages.Nuget makeWrapper ];
+  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 = { name, version, sha256 }: fetchurl {
@@ -40,7 +47,7 @@ in stdenv.mkDerivation rec {
 
     export HOME=$(mktemp -d)
     export DOTNET_CLI_TELEMETRY_OPTOUT=1
-    export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+    export DOTNET_NOLOGO=1
 
     nuget sources Add -Name nixos -Source "$PWD/nixos"
     nuget init "$nugetDeps" "$PWD/nixos"
@@ -49,7 +56,7 @@ in stdenv.mkDerivation rec {
     mkdir -p $HOME/.nuget/NuGet
     cp $HOME/.config/NuGet/NuGet.Config $HOME/.nuget/NuGet
 
-    dotnet restore --source nixos osu.Desktop
+    dotnet restore --source "$PWD/nixos" osu.Desktop --runtime ${runtimeId}
 
     runHook postConfigure
   '';
@@ -59,6 +66,7 @@ in stdenv.mkDerivation rec {
     dotnet build osu.Desktop \
       --no-restore \
       --configuration Release \
+      --runtime ${runtimeId} \
       -p:Version=${version}
     runHook postBuild
   '';
@@ -69,13 +77,12 @@ in stdenv.mkDerivation rec {
     dotnet publish osu.Desktop \
       --no-build \
       --configuration Release \
+      --runtime ${runtimeId} \
       --no-self-contained \
       --output $out/lib/osu
-    shopt -s extglob
-    rm -r $out/lib/osu/runtimes/!(${runtimeId})
 
     makeWrapper $out/lib/osu/osu\! $out/bin/osu\! \
-      --set DOTNET_ROOT "${dotnet-netcore}" \
+      --set DOTNET_ROOT "${dotnet-net}" \
       --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
@@ -93,6 +100,13 @@ in stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
+  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;
 
diff --git a/pkgs/games/osu-lazer/deps.nix b/pkgs/games/osu-lazer/deps.nix
index 53f933d143b..d2c19b08d03 100644
--- a/pkgs/games/osu-lazer/deps.nix
+++ b/pkgs/games/osu-lazer/deps.nix
@@ -1,8 +1,8 @@
 { fetchNuGet }: [
   (fetchNuGet {
-    name = "Dapper";
-    version = "2.0.35";
-    sha256 = "0465i2p5kjj0hmadyw0xrpn43zpc4bnbid9mg561739fyjyjwmfm";
+    name = "AutoMapper";
+    version = "10.1.1";
+    sha256 = "1l1p9g7f7finr8laklbm7h2c45k0swl47iq0ik68js5s6pzvd6f8";
   })
   (fetchNuGet {
     name = "DeltaCompressionDotNet";
@@ -11,13 +11,13 @@
   })
   (fetchNuGet {
     name = "DiffPlex";
-    version = "1.6.3";
-    sha256 = "0yi72afddddz0s8phx855rnjrga7n51bcma10dc91l0ffcwf5xwz";
+    version = "1.7.0";
+    sha256 = "09a8hkbx99iwikfl8war629945yv7i8llj9480dbc4kyp6qqlr00";
   })
   (fetchNuGet {
     name = "DiscordRichPresence";
-    version = "1.0.150";
-    sha256 = "0qmbi4sccia3w80q8xfvj3bw62nvz047wq198n2b2aflkf47bq79";
+    version = "1.0.175";
+    sha256 = "180sax976327d70qbinv07f65g3w2zbw80n49hckg8wd4rw209vd";
   })
   (fetchNuGet {
     name = "FFmpeg.AutoGen";
@@ -25,244 +25,274 @@
     sha256 = "0n6x57mnnvcjnrs8zyvy07h5zm4bcfy9gh4n4bvd9fx5ys4pxkvv";
   })
   (fetchNuGet {
+    name = "Fody";
+    version = "6.5.2";
+    sha256 = "0vq97mkfk5ijinwnhpkm212y69ik6cd5x0n61ssyxmz50q1vp84f";
+  })
+  (fetchNuGet {
+    name = "HidSharpCore";
+    version = "1.2.1.1";
+    sha256 = "1zkndglmz0s8rblfhnqcvv90rkq2i7lf4bc380g7z8h1avf2ikll";
+  })
+  (fetchNuGet {
+    name = "HtmlAgilityPack";
+    version = "1.11.34";
+    sha256 = "078dad719hkv806qgj1f0hkn7di5zvvm594awfn5bsgb9afq94a7";
+  })
+  (fetchNuGet {
     name = "Humanizer";
-    version = "2.8.26";
-    sha256 = "11kddzyzqpq9gkz0hmrblq494nh86va6wxx6z89xi6w1f4vj15ak";
+    version = "2.11.10";
+    sha256 = "057pqzvdxsbpnnc5f1xkqg7j3ywp68ggia3w74fgqp0158dm6rdk";
   })
   (fetchNuGet {
     name = "Humanizer.Core";
-    version = "2.2.0";
-    sha256 = "08mzg65y9d3zvq16rsmpapcdan71ggq2mpks6k777h3wlm2sh3p5";
+    version = "2.11.10";
+    sha256 = "0z7kmd5rh1sb6izq0vssk6c2p63n00xglk45s7ga9z18z9aaskxv";
   })
   (fetchNuGet {
     name = "Humanizer.Core";
-    version = "2.8.26";
-    sha256 = "1v8xd12yms4qq1md4vh6faxicmqrvahqdd7sdkyzrphab9v44nsm";
+    version = "2.2.0";
+    sha256 = "08mzg65y9d3zvq16rsmpapcdan71ggq2mpks6k777h3wlm2sh3p5";
   })
   (fetchNuGet {
     name = "Humanizer.Core.af";
-    version = "2.8.26";
-    sha256 = "0znrq4frlkq1qi20301hlzxa6mdc275fa1i1a1i8ldgk9cjq94k9";
+    version = "2.11.10";
+    sha256 = "18fiixfvjwn8m1i8z2cz4aqykzylvfdqmmpwc2zcd8sr1a2xm86z";
   })
   (fetchNuGet {
     name = "Humanizer.Core.ar";
-    version = "2.8.26";
-    sha256 = "1hi7mln48p1nmxlgdq725s4cvla9nlkvbmrsql1rfjjlsy8hn6n7";
+    version = "2.11.10";
+    sha256 = "009fpm4jd325izm82ipipsvlwd31824gvskda68bdwi4yqmycz4p";
   })
   (fetchNuGet {
     name = "Humanizer.Core.az";
-    version = "2.8.26";
-    sha256 = "0av7ycrqwvmikqia3z3qkp9967zilrhayny17zkm0d0mnjq62vs6";
+    version = "2.11.10";
+    sha256 = "144b9diwprabxwgi5a98k5iy95ajq4p7356phdqi2lhzwbz7b6a9";
   })
   (fetchNuGet {
     name = "Humanizer.Core.bg";
-    version = "2.8.26";
-    sha256 = "13j6zk2cmk7a119azxlpjhfwykrzk0vkf5a799fb2fzkvhnj4hkg";
+    version = "2.11.10";
+    sha256 = "1b9y40gvq2kwnj5wa40f8cbywv79jkajcwknagrgr27sykpfadl2";
   })
   (fetchNuGet {
     name = "Humanizer.Core.bn-BD";
-    version = "2.8.26";
-    sha256 = "0h619sksggfi7dnaycz6bj9aiqdgn0d8dpgjgdl73crw52lr70p9";
+    version = "2.11.10";
+    sha256 = "18pn4jcp36ygcx283l3fi9bs5d7q1a384b72a10g5kl0qckn88ay";
   })
   (fetchNuGet {
     name = "Humanizer.Core.cs";
-    version = "2.8.26";
-    sha256 = "11bh3k15388bi5wizaihnwqk7wb4n7q636fqjllwdhjggqrsc3f6";
+    version = "2.11.10";
+    sha256 = "03crw1lnzp32v2kcdmllkrsqh07r4ggw9gyc96qw7cv0nk5ch1h8";
   })
   (fetchNuGet {
     name = "Humanizer.Core.da";
-    version = "2.8.26";
-    sha256 = "09b3x3bw3cgby9qvaccnqz2y6d8gl3497dh7q0dk1iznsxbk4x4m";
+    version = "2.11.10";
+    sha256 = "0glby12zra3y3yiq4cwq1m6wjcjl8f21v8ghi6s20r48glm8vzy9";
   })
   (fetchNuGet {
     name = "Humanizer.Core.de";
-    version = "2.8.26";
-    sha256 = "1pyp2a9my20wlwjjzv563kshl9fpjb2kd4cw41l4wvsz1bsq3l22";
+    version = "2.11.10";
+    sha256 = "0a35xrm1f9p74x0fkr52bw9sd54vdy9d5rnvf565yh8ww43xfk7b";
   })
   (fetchNuGet {
     name = "Humanizer.Core.el";
-    version = "2.8.26";
-    sha256 = "0v3sdcxca4dam1y5yjh9n6v711ys0zdv38hr4kij35s6277ls6lb";
+    version = "2.11.10";
+    sha256 = "0bhwwdx5vc48zikdsbrkghdhwahxxc2lkff0yaa5nxhbhasl84h8";
   })
   (fetchNuGet {
     name = "Humanizer.Core.es";
-    version = "2.8.26";
-    sha256 = "0wh9qvqf80cngwsz2jnrsjpmaax4xa2xp8bbk5xs480kp071z37q";
+    version = "2.11.10";
+    sha256 = "07bw07qy8nyzlgxl7l2lxv9f78qmkfppgzx7iyq5ikrcnpvc7i9q";
   })
   (fetchNuGet {
     name = "Humanizer.Core.fa";
-    version = "2.8.26";
-    sha256 = "00v56ddjfv6sr6w5246gn5z0padwswvnngp8mdl7gjfg5ycmbkl1";
+    version = "2.11.10";
+    sha256 = "00d4hc1pfmhfkc5wmx9p7i00lgi4r0k6wfcns9kl1syjxv3bs5f2";
   })
   (fetchNuGet {
     name = "Humanizer.Core.fi-FI";
-    version = "2.8.26";
-    sha256 = "1pgs0j5ri50a6vhljplhrlc8jj1hrd9ggxkj60d9v5kk9xibzzyd";
+    version = "2.11.10";
+    sha256 = "0z4is7pl5jpi4pfdvd2zvx5mp00bj26d9l9ksqyc0liax8nfzyik";
   })
   (fetchNuGet {
     name = "Humanizer.Core.fr";
-    version = "2.8.26";
-    sha256 = "0kkhgy3yn8vfqlx3dhb9m3cazkgfxarknam4macng9y17l7wj83m";
+    version = "2.11.10";
+    sha256 = "0sybpg6kbbhrnk7gxcdk7ppan89lsfqsdssrg4i1dm8w48wgicap";
   })
   (fetchNuGet {
     name = "Humanizer.Core.fr-BE";
-    version = "2.8.26";
-    sha256 = "13spcx07hph366qk073pz63s56nadaac7l4mr4a66gbpqd3814kb";
+    version = "2.11.10";
+    sha256 = "1s25c86nl9wpsn6fydzwv4rfmdx5sm0vgyd7xhw5344k20gazvhv";
   })
   (fetchNuGet {
     name = "Humanizer.Core.he";
-    version = "2.8.26";
-    sha256 = "1ccn82aj3rhrhsa3kvkrmjw0p687icxlfja8ngbh7sby4cszx9bk";
+    version = "2.11.10";
+    sha256 = "1nx61qkjd6p9r36dmnm4942khyv35fpdqmb2w69gz6463g4d7z29";
   })
   (fetchNuGet {
     name = "Humanizer.Core.hr";
-    version = "2.8.26";
-    sha256 = "12ii79bhai3kv7zr3k9k9dh569r6p3m4l4gj25cln2isr4wdi5r9";
+    version = "2.11.10";
+    sha256 = "02jhcyj72prkqsjxyilv04drm0bknqjh2r893jlbsfi9vjg2zay3";
   })
   (fetchNuGet {
     name = "Humanizer.Core.hu";
-    version = "2.8.26";
-    sha256 = "0cibbdxiqhwrjmxlr805mg3l9v0fl2ydx4m50608rkysjq6vxx7y";
+    version = "2.11.10";
+    sha256 = "0yb6ly4s1wdyaf96h2dvifqyb575aid6irwl3qx8gcvrs0xpcxdp";
   })
   (fetchNuGet {
     name = "Humanizer.Core.hy";
-    version = "2.8.26";
-    sha256 = "15aikm04f74abm4ak8rvnnkrlcz155gibn1y81pbgsyn7yrh84v3";
+    version = "2.11.10";
+    sha256 = "0b7vaqldn7ca3xi4gkvkhjk900kw2zwb0m0d20bg45a83zdlx79c";
   })
   (fetchNuGet {
     name = "Humanizer.Core.id";
-    version = "2.8.26";
-    sha256 = "1i9gpzdfhmbvrqg858kqz5461sp3sh60g16dmcmyi1ik0qlspijn";
+    version = "2.11.10";
+    sha256 = "1yqxirknwga4j18k7ixwgqxlv20479afanhariy3c5mkwvglsr9b";
   })
   (fetchNuGet {
     name = "Humanizer.Core.it";
-    version = "2.8.26";
-    sha256 = "01j7qskmqcxsakbx3bkxcjyzrh6nxi2v6kfzsfb0vf980qqq331l";
+    version = "2.11.10";
+    sha256 = "1skwgj5a6kkx3pm9w4f29psch69h1knmwbkdydlmx13h452p1w4l";
   })
   (fetchNuGet {
     name = "Humanizer.Core.ja";
-    version = "2.8.26";
-    sha256 = "07d19ns4a4pa2k4vdc1af7wj10gaflq1ny4mx6y574afkdi8v6d5";
+    version = "2.11.10";
+    sha256 = "1wpc3yz9v611dqbw8j5yimk8dpz0rvpnls4rmlnp1m47gavpj8x4";
+  })
+  (fetchNuGet {
+    name = "Humanizer.Core.ko-KR";
+    version = "2.11.10";
+    sha256 = "1df0kd7vwdc3inxfkb3wsl1aw3d6vbab99dzh08p4m04g7i2c1a9";
+  })
+  (fetchNuGet {
+    name = "Humanizer.Core.ku";
+    version = "2.11.10";
+    sha256 = "17b66xfgwjr0sffx0hw4c6l90h43z7ffylrs26hgav0n110q2nwg";
   })
   (fetchNuGet {
     name = "Humanizer.Core.lv";
-    version = "2.8.26";
-    sha256 = "1pm64sj65nmngyfa3hjcw67icfmlzr232hmgpnw7306sb7dxmnfv";
+    version = "2.11.10";
+    sha256 = "0czxx4b9g0w7agykdl82wds09zasa9y58dmgjm925amlfz4wkyzs";
   })
   (fetchNuGet {
     name = "Humanizer.Core.ms-MY";
-    version = "2.8.26";
-    sha256 = "1yx4cc023kc4k14abk2ycmjy6y2xaknaz4zria7xsadf0fabd1jc";
+    version = "2.11.10";
+    sha256 = "0kix95nbw94fx0dziyz80y59i7ii7d21b63f7f94niarljjq36i3";
   })
   (fetchNuGet {
     name = "Humanizer.Core.mt";
-    version = "2.8.26";
-    sha256 = "0iai35pzka9g6c3sgswki06fk6gdnq8kc88wyb4pcciivazz31px";
+    version = "2.11.10";
+    sha256 = "1rwy6m22pq65gxn86xlr9lv818fp5kb0wz98zxxfljc2iviw1f4p";
   })
   (fetchNuGet {
     name = "Humanizer.Core.nb";
-    version = "2.8.26";
-    sha256 = "0xprhiyjyq6mpha2lrav59n1f48508ddvm9nmdk5sm5k26ff3l90";
+    version = "2.11.10";
+    sha256 = "0ra2cl0avvv4sylha7z76jxnb4pdiqfbpr5m477snr04dsjxd9q9";
   })
   (fetchNuGet {
     name = "Humanizer.Core.nb-NO";
-    version = "2.8.26";
-    sha256 = "160c98wfh7d2xlvlra4x5rdj4klgcjwcy3gkb4ipg655byn2m1j2";
+    version = "2.11.10";
+    sha256 = "1qszib03pvmjkrg8za7jjd2vzrs9p4fn2rmy82abnzldkhvifipq";
   })
   (fetchNuGet {
     name = "Humanizer.Core.nl";
-    version = "2.8.26";
-    sha256 = "067pqm4i1mk83fqqr0bvzrchrvxwdnff18z3djgagclh1i4xqlvk";
+    version = "2.11.10";
+    sha256 = "1i9bvy0i2yyasl9mgxiiwrkmfpm2c53d3wwdp9270r6120sxyy63";
   })
   (fetchNuGet {
     name = "Humanizer.Core.pl";
-    version = "2.8.26";
-    sha256 = "1r1bbqb990war1hiag5f88yxw0k9jiid1ihb4s5bc1lzs3vfsb6x";
+    version = "2.11.10";
+    sha256 = "0kggh4wgcic7wzgxy548n6w61schss2ccf9kz8alqshfi42xifby";
   })
   (fetchNuGet {
     name = "Humanizer.Core.pt";
-    version = "2.8.26";
-    sha256 = "1bik0vjjdzw51yl11ng9gsi3ihz50ibwh1gdhh2vd13jxjzb512p";
+    version = "2.11.10";
+    sha256 = "09j90s8x1lpvhfiy3syfnj8slkgcacf3xjy3pnkgxa6g4mi4f4bd";
   })
   (fetchNuGet {
     name = "Humanizer.Core.ro";
-    version = "2.8.26";
-    sha256 = "12f2hry6x1p1mgx6g4kpig2jpybx52ibghvhdhjbbfhy32gv8dr0";
+    version = "2.11.10";
+    sha256 = "1jgidmqfly91v1k22gn687mfql5bz7gjzp1aapi93vq5x635qssy";
   })
   (fetchNuGet {
     name = "Humanizer.Core.ru";
-    version = "2.8.26";
-    sha256 = "1hri12kwymzvdqcr66l8yiqiw3pmf9fk492z10yqljm576kyshgg";
+    version = "2.11.10";
+    sha256 = "13mmlh0ibxfyc85xrz3vx4mcg56mkzqql184iwdryq94p0g5ahil";
   })
   (fetchNuGet {
     name = "Humanizer.Core.sk";
-    version = "2.8.26";
-    sha256 = "07jfgk67axw97b85dn4bwpjwf3swd74j9hdd870qps12xfp98i9j";
+    version = "2.11.10";
+    sha256 = "04ja06y5jaz1jwkwn117wx9cib04gpbi0vysn58a8sd5jrxmxai5";
   })
   (fetchNuGet {
     name = "Humanizer.Core.sl";
-    version = "2.8.26";
-    sha256 = "060xbzwb7p9ypbqfklih2zal2rh6h55gq4hv3i6alvlbd3vsx29n";
+    version = "2.11.10";
+    sha256 = "05hxk9v3a7fn7s4g9jp5zxk2z6a33b9fkavyb1hjqnl2i37q2wja";
   })
   (fetchNuGet {
     name = "Humanizer.Core.sr";
-    version = "2.8.26";
-    sha256 = "0i2c24qmqnhp85b088qlbagxd48hcl0v1ly4m7hfbvx5s7fg8riv";
+    version = "2.11.10";
+    sha256 = "0x6l2msimrx72iywa1g0rqklgy209sdwg0r77i2lz0s1rvk5klm5";
   })
   (fetchNuGet {
     name = "Humanizer.Core.sr-Latn";
-    version = "2.8.26";
-    sha256 = "1911a69sqssh9f007vmxbgyj4ym2ym4423xvw6cmbfhjcrhkfpbi";
+    version = "2.11.10";
+    sha256 = "01hdyn7mmbyy7f3aglawgnsj3nblcdpqjgzdcvniy73l536mira0";
   })
   (fetchNuGet {
     name = "Humanizer.Core.sv";
-    version = "2.8.26";
-    sha256 = "056h8n9i18yl78f9ppzn2kkrz2cs46aqv0j5y8xq360zarggh0nm";
+    version = "2.11.10";
+    sha256 = "0cbgchivw3d5ndib1zmgzmnymhyvfh9g9f0hijc860g5vaa9fkvh";
+  })
+  (fetchNuGet {
+    name = "Humanizer.Core.th-TH";
+    version = "2.11.10";
+    sha256 = "1v7f9x3b04iwhz9lb3ir8az8128nvcw1gi4park5zh3fg0f3mni0";
   })
   (fetchNuGet {
     name = "Humanizer.Core.tr";
-    version = "2.8.26";
-    sha256 = "0dk8ga3fpxifxxkz0n68654h65cvrx00hy7q00m5vgvmcp70gxxn";
+    version = "2.11.10";
+    sha256 = "02c4ky0dskxkdrkc7vy8yzmvwjr1wqll1kzx0k21afhlx8xynjd4";
   })
   (fetchNuGet {
     name = "Humanizer.Core.uk";
-    version = "2.8.26";
-    sha256 = "0bnj5xqlcqp4n8i04ra78dax4854zbf2jsygvb4lpiayyyaj2bxw";
+    version = "2.11.10";
+    sha256 = "0900ilhwj8yvhyzpg1pjr7f5vrl62wp8dsnhk4c2igs20qvnv079";
   })
   (fetchNuGet {
     name = "Humanizer.Core.uz-Cyrl-UZ";
-    version = "2.8.26";
-    sha256 = "1bbf6mxas6brjw7rjljq5saz6v3ic6zbvm1b3c1jbk0hc0qkd7c8";
+    version = "2.11.10";
+    sha256 = "09b7p2m8y49j49ckrmx2difgyj6y7fm2mwca093j8psxclsykcyr";
   })
   (fetchNuGet {
     name = "Humanizer.Core.uz-Latn-UZ";
-    version = "2.8.26";
-    sha256 = "1bfgfihpynax30g9kq8kra7c4jxps2ccxsxrs9gls47xbs35cw2f";
+    version = "2.11.10";
+    sha256 = "029kvkawqhlln52vpjpvr52dhr18ylk01cgsj2z8lxnqaka0q9hk";
   })
   (fetchNuGet {
     name = "Humanizer.Core.vi";
-    version = "2.8.26";
-    sha256 = "1vm765nvkp6wyfwlcgppimjrk04lkg8lscch3n1i1i5hlqxrs9ch";
+    version = "2.11.10";
+    sha256 = "0q4d47plsj956ivn82qwyidfxppjr9dp13m8c66aamrvhy4q8ny5";
   })
   (fetchNuGet {
     name = "Humanizer.Core.zh-CN";
-    version = "2.8.26";
-    sha256 = "1qyl12rdh4iv1k1qcivcmxxnh8y93ainf22pmch8vvw9yjhs1y7s";
+    version = "2.11.10";
+    sha256 = "01dy5kf6ai8id77px92ji4kcxjc8haj39ivv55xy1afcg3qiy7mh";
   })
   (fetchNuGet {
     name = "Humanizer.Core.zh-Hans";
-    version = "2.8.26";
-    sha256 = "1gqv3dyk236wlp5wb7kd4qnyrmp3cy36ycykl7zr91s25cdls5vy";
+    version = "2.11.10";
+    sha256 = "16gcxgw2g6gck3nc2hxzlkbsg7wkfaqsjl87kasibxxh47zdqqv2";
   })
   (fetchNuGet {
     name = "Humanizer.Core.zh-Hant";
-    version = "2.8.26";
-    sha256 = "1rhzbiqbx04l3kvzjklix90fxyc6vvmmw0p564ajdiximivs0pbh";
+    version = "2.11.10";
+    sha256 = "1rjg2xvkwjjw3c7z9mdjjvbnl9lcvvhh4fr7l61rla2ynzdk46cj";
   })
   (fetchNuGet {
     name = "JetBrains.Annotations";
-    version = "2020.1.0";
-    sha256 = "13fqcr6bs4x9rn0mpx110xl5apwh8ds1h0lx208znrm178ywqm8y";
+    version = "2021.1.0";
+    sha256 = "07pnhxxlgx8spmwmakz37nmbvgyb6yjrbrhad5rrn6y767z5r1gb";
   })
   (fetchNuGet {
     name = "ManagedBass";
@@ -281,8 +311,78 @@
   })
   (fetchNuGet {
     name = "Markdig";
-    version = "0.21.1";
-    sha256 = "119v22rvg51ifg54r1ndf2bw7hv1lf5wn3cd04ccg8d7r8c0yhbk";
+    version = "0.25.0";
+    sha256 = "1f7iqkaphfyf6szjrp0633rj44wynqgiqyivbja5djyxjy4csfyy";
+  })
+  (fetchNuGet {
+    name = "MessagePack";
+    version = "2.2.85";
+    sha256 = "1y0h8bd0drnlsqf1bvrdiv9j1892zqf1rmyclfjzs49klpf0xphk";
+  })
+  (fetchNuGet {
+    name = "MessagePack.Annotations";
+    version = "2.2.85";
+    sha256 = "00wajml6iy3wid8mixh3jmm6dapfjbccwq95m8qciika4pyd4lq9";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.App.Runtime.linux-x64";
+    version = "5.0.5";
+    sha256 = "026m19pddhkx5idwpi6mp1yl9yfcfgm2qjp1jh54mdja1d7ng0vk";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.Connections.Abstractions";
+    version = "5.0.7";
+    sha256 = "119wk2aqnas2sfyawv0wkg20ygk1cr15lycvvnw2x42kwgcimmks";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.Http.Connections.Client";
+    version = "5.0.7";
+    sha256 = "0jdpqmjv9w29ih13nprzvf2m6cjrg69x0kwyi3d7b371rvz7m66l";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.Http.Connections.Common";
+    version = "5.0.7";
+    sha256 = "1h6bw9hs92xp505c9x0jn1mx1i86r3s6xs7yyycx905grwisga39";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.Http.Features";
+    version = "5.0.7";
+    sha256 = "1v89zxk15c7gswq10cbsf2yr974inpbk5npw2v6qj8vcs66qqwq3";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Client";
+    version = "5.0.7";
+    sha256 = "13mqsa5nks9fcxv6kxm9j75mxafs3h5pikv35a56h7d9z8wdazsr";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Client.Core";
+    version = "5.0.7";
+    sha256 = "033q9ijbbkh3crby96c62azyi61m0c7byiz89xbrdvagpj6ydqn5";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Common";
+    version = "5.0.7";
+    sha256 = "0s04flgfrljv3r8kxplc569mp3gsqd4nwda0h3yly3rqzwmbrnwp";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Protocols.Json";
+    version = "5.0.7";
+    sha256 = "0nb3v6hhhlndagczac255v2iyjs40jfi9gnb0933zh01wqrgkrv7";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Protocols.MessagePack";
+    version = "5.0.7";
+    sha256 = "06clfalw2xn7rfw53y8kiwcf2j3902iz0pl9fn2q4czhfwfp23ld";
+  })
+  (fetchNuGet {
+    name = "Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson";
+    version = "5.0.7";
+    sha256 = "1m2likbhq8mxv33yw5zl2ybgc11ksjzqi7nhjrnx1bc12amb3nw4";
+  })
+  (fetchNuGet {
+    name = "Microsoft.Bcl.AsyncInterfaces";
+    version = "1.0.0";
+    sha256 = "00dx5armvkqjxvkldz3invdlck9nj7w21dlsr2aqp1rqbyrbsbbh";
   })
   (fetchNuGet {
     name = "Microsoft.Bcl.AsyncInterfaces";
@@ -290,64 +390,59 @@
     sha256 = "1dq5yw7cy6s42193yl4iqscfw5vzkjkgv0zyy32scr4jza6ni1a1";
   })
   (fetchNuGet {
+    name = "Microsoft.Bcl.AsyncInterfaces";
+    version = "5.0.0";
+    sha256 = "0cp5jbax2mf6xr3dqiljzlwi05fv6n9a35z337s92jcljiq674kf";
+  })
+  (fetchNuGet {
     name = "Microsoft.Build.Framework";
-    version = "15.3.409";
-    sha256 = "1dhanwb9ihbfay85xj7cwn0byzmmdz94hqfi3q6r1ncwdjd8y1s2";
+    version = "16.5.0";
+    sha256 = "1xgr02r7s9i6s70n237hss4yi9zicssia3zd2ny6s8vyxb7jpdyb";
   })
   (fetchNuGet {
     name = "Microsoft.Build.Locator";
-    version = "1.2.6";
-    sha256 = "1rnfd7wq2bkynqj767xmq9ha38mz010fmqvvvrgb4v86gd537737";
+    version = "1.4.1";
+    sha256 = "0j119rri7a401rca67cxdyrn3rprzdl1b2wrblqc23xsff1xvlrx";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.Analyzers";
-    version = "3.0.0";
-    sha256 = "0bbl0jpqywqmzz2gagld1p2gvdfldjfjmm25hil9wj2nq1zc4di8";
+    version = "3.3.2";
+    sha256 = "162vb5894zxps0cf5n9gc08an7gwybzz87allx3lsszvllr9ldx4";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.BannedApiAnalyzers";
-    version = "3.3.0";
-    sha256 = "04z03ir9sal5h9ha97isbh660jijslb8zfiaa48w2r2l6pabz5kd";
+    version = "3.3.2";
+    sha256 = "1r8mfbpfy8jdinhfviwhv2vjsz950wn2vwz17lfw5kya1n13nj56";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.Common";
-    version = "3.7.0";
-    sha256 = "0882492nx6x68b0pkh3q5xaawz0b2l5x35r40722ignyjnvjydph";
+    version = "3.10.0";
+    sha256 = "12a7wq45liw89ylnf2b7v374s3m0lbknkx7kazk3bf6nd1b8ny81";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.CSharp";
-    version = "3.7.0";
-    sha256 = "0adw6rcag8wxydzyiyhls2mxaqkay5qlz25z1fxrlv5qnchqn0n5";
+    version = "3.10.0";
+    sha256 = "0plpvimh9drip1fvic3zfg1gmiw3q8xb85nqjqy1hq140p4him6k";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.CSharp.Workspaces";
-    version = "3.7.0";
-    sha256 = "15rlz65wbky0yq7b9s8xwk68dgrhgsk4rj88q9pyjxbm5938vrav";
+    version = "3.10.0";
+    sha256 = "0g12hg6r8h2s99p8a0rx8h71rlmj9aff2hr26fkw7i734n39p070";
   })
   (fetchNuGet {
-    name = "Microsoft.CodeAnalysis.FxCopAnalyzers";
-    version = "3.0.0";
-    sha256 = "0a17vb6jnj6kch70d7vki84728hlc3zpffsbv533yji6kf6x6d24";
-  })
-  (fetchNuGet {
-    name = "Microsoft.CodeAnalysis.VersionCheckAnalyzer";
-    version = "3.0.0";
-    sha256 = "11g3hj3p885zj7bn99qzh68m1xifbwzrgmx1pkvpi10rmgkpyh8j";
+    name = "Microsoft.CodeAnalysis.NetAnalyzers";
+    version = "5.0.3";
+    sha256 = "1l0zg9wl8yapjq9g2d979zhsmdkr8kfybmxnl7kvgkgldf114fbg";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.Workspaces.Common";
-    version = "3.7.0";
-    sha256 = "00nm453w4n6kjsicmz5izvkf1ki9rp3xnc9n3y7a9b1g5sxg36fs";
+    version = "3.10.0";
+    sha256 = "1hr3ndhb7sw0l63blgp2y0a6d1pgkxah0ls1v7kdxmkdazv35svc";
   })
   (fetchNuGet {
     name = "Microsoft.CodeAnalysis.Workspaces.MSBuild";
-    version = "3.7.0";
-    sha256 = "1sh8s7b16j06p3gmzsgwd8690vagah4908bpa3gyz2fxgfnj46ax";
-  })
-  (fetchNuGet {
-    name = "Microsoft.CodeQuality.Analyzers";
-    version = "3.0.0";
-    sha256 = "1x3yf21m41w2iv9nlwp03q6byqgivd48h2dlm5vgv5bd53xjfz77";
+    version = "3.10.0";
+    sha256 = "13h0wza8anac6snkry9fvzd188vnykifzy43ms8x07d40zmqnicd";
   })
   (fetchNuGet {
     name = "Microsoft.CSharp";
@@ -360,19 +455,24 @@
     sha256 = "01i28nvzccxbqmiz217fxs6hnjwmd5fafs37rd49a6qp53y6623l";
   })
   (fetchNuGet {
+    name = "Microsoft.CSharp";
+    version = "4.7.0";
+    sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j";
+  })
+  (fetchNuGet {
     name = "Microsoft.Data.Sqlite.Core";
     version = "2.2.6";
     sha256 = "0fx8698k71vzr8pdc6q8bsbzg6r8a42s4hkzmiyv13ibmyb5q68k";
   })
   (fetchNuGet {
     name = "Microsoft.Diagnostics.NETCore.Client";
-    version = "0.2.61701";
-    sha256 = "1ic1607jj4ln8dbibf1fz5v9svk9x2kqlgvhndc6ijaqnbc4wcr1";
+    version = "0.2.221401";
+    sha256 = "1k55l60bg8lj5ayl3kixbzvx2684xd7a9nzha5fiqjgp85cimb3r";
   })
   (fetchNuGet {
     name = "Microsoft.Diagnostics.Runtime";
-    version = "2.0.137201";
-    sha256 = "0cfsd8nn6y30bqzx1pf9xi29jnxap1fgk720zdpz93kqzqv8r0vc";
+    version = "2.0.226801";
+    sha256 = "1w8ahqkv8nbq2ch17aa9axhqqnybmc9bsxpdhpiy52ix70mr72w1";
   })
   (fetchNuGet {
     name = "Microsoft.DotNet.PlatformAbstractions";
@@ -435,6 +535,11 @@
     sha256 = "1fv5277hyhfqmc0gqszyqb1ilwnijm8kc9606yia6hwr8pxyg674";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.Configuration.Abstractions";
+    version = "5.0.0";
+    sha256 = "0fqxkc9pjxkqylsdf26s9q21ciyk56h1w33pz3v1v4wcv8yv1v6k";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.Configuration.Binder";
     version = "2.2.0";
     sha256 = "10qyjdkymdmag3r807kvbnwag4j3nz65i4cwikbd77jjvz92ya3j";
@@ -445,11 +550,21 @@
     sha256 = "0lvv45rvq1xbf47lz818rjydc776zk8mf7svpzh1dml4qwlx9zck";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.DependencyInjection";
+    version = "5.0.1";
+    sha256 = "06xig49mwyp3b2dvdx98j079ncg6p4c9x8yj4pzs6ppmi3jgaaqk";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.DependencyInjection.Abstractions";
     version = "2.2.0";
     sha256 = "1jyzfdr9651h3x6pxwhpfbb9mysfh8f8z1jvy4g117h9790r9zx5";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.DependencyInjection.Abstractions";
+    version = "5.0.0";
+    sha256 = "17cz6s80va0ch0a6nqa1wbbbp3p8sqxb96lj4qcw67ivkp2yxiyj";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.DependencyModel";
     version = "2.1.0";
     sha256 = "0dl4qhjgifm6v3jsfzvzkvddyic77ggp9fq49ah661v45gk6ilgd";
@@ -460,14 +575,24 @@
     sha256 = "0bx3ljyvvcbikradq2h583rl72h8bxdz33aghk026cxzpv2mm3wm";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.Logging";
+    version = "5.0.0";
+    sha256 = "1qa1l18q2jh9azya8gv1p8anzcdirjzd9dxxisb4911i9m1648i3";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.Logging.Abstractions";
     version = "2.2.0";
     sha256 = "02w7hp6jicr7cl5p456k2cmrjvvhm6spg5kxnlncw3b72358m5wl";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.Logging.Abstractions";
+    version = "5.0.0";
+    sha256 = "1yza38675dbv1qqnnhqm23alv2bbaqxp0pb7zinjmw8j2mr5r6wc";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.ObjectPool";
-    version = "3.0.3";
-    sha256 = "0zxsdwh9mhy3wsbjyfr4k0r10s1h06dzw8hcck9aknv155q26zqk";
+    version = "5.0.7";
+    sha256 = "047wv490fjizknyhbmxwbbh9fns13pq2inpc9idxq42n2zj3zbij";
   })
   (fetchNuGet {
     name = "Microsoft.Extensions.Options";
@@ -475,19 +600,29 @@
     sha256 = "1b20yh03fg4nmmi3vlf6gf13vrdkmklshfzl3ijygcs4c2hly6v0";
   })
   (fetchNuGet {
+    name = "Microsoft.Extensions.Options";
+    version = "5.0.0";
+    sha256 = "1rdmgpg770x8qwaaa6ryc27zh93p697fcyvn5vkxp0wimlhqkbay";
+  })
+  (fetchNuGet {
     name = "Microsoft.Extensions.Primitives";
     version = "2.2.0";
     sha256 = "0znah6arbcqari49ymigg3wiy2hgdifz8zsq8vdc3ynnf45r7h0c";
   })
   (fetchNuGet {
-    name = "Microsoft.Net.Compilers.Toolset";
-    version = "3.1.0";
-    sha256 = "1csf8hgwvyxjlxdygacrk3pp0xkzydc1kvsv68cxy8h7gd62k0w0";
+    name = "Microsoft.Extensions.Primitives";
+    version = "5.0.0";
+    sha256 = "0swqcknyh87ns82w539z1mvy804pfwhgzs97cr3nwqk6g5s42gd6";
+  })
+  (fetchNuGet {
+    name = "Microsoft.Extensions.Primitives";
+    version = "5.0.1";
+    sha256 = "01ar5ba2sal9wnpa1xnnikhgb37vzhg2cspz45wf760jflpai2vv";
   })
   (fetchNuGet {
-    name = "Microsoft.NetCore.Analyzers";
-    version = "3.0.0";
-    sha256 = "0b8biyw7nymqfbg08g2vmpf1xm6g1mm6hz4gjxc5f3g72kd2nswj";
+    name = "Microsoft.NETCore.App.Runtime.linux-x64";
+    version = "5.0.5";
+    sha256 = "1h5yry6k9bpqqis2fb1901csb8kipm7anm174fjj41r317vzfjfa";
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Platforms";
@@ -501,33 +636,28 @@
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Platforms";
-    version = "2.1.2";
-    sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141";
+    version = "2.0.0";
+    sha256 = "1fk2fk2639i7nzy58m9dvpdnzql4vb8yl8vr19r2fp8lmj9w2jr0";
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Platforms";
-    version = "3.1.0";
-    sha256 = "1gc1x8f95wk8yhgznkwsg80adk1lc65v9n5rx4yaa4bc5dva0z3j";
+    version = "2.1.2";
+    sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141";
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Platforms";
-    version = "3.1.1";
-    sha256 = "05hmaygd5131rnqi6ipv7agsbpi7ka18779vw45iw6b385l7n987";
+    version = "5.0.0";
+    sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc";
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Targets";
-    version = "1.0.1";
-    sha256 = "0ppdkwy6s9p7x9jix3v4402wb171cdiibq7js7i13nxpdky7074p";
+    version = "3.1.0";
+    sha256 = "04cc2wl90p7g9zscnxgyj55vzl7srrrjwadl2dxgicfb2x2499ca";
   })
   (fetchNuGet {
     name = "Microsoft.NETCore.Targets";
-    version = "1.1.0";
-    sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh";
-  })
-  (fetchNuGet {
-    name = "Microsoft.NetFramework.Analyzers";
-    version = "3.0.0";
-    sha256 = "09dqizym3bca4281714yxrhhgryxpjhjfjnyfswlhyh42qi3ix2k";
+    version = "5.0.0";
+    sha256 = "0z3qyv7qal5irvabc8lmkh58zsl42mrzd1i0sssvzhv4q4kl3cg6";
   })
   (fetchNuGet {
     name = "Microsoft.Win32.Primitives";
@@ -541,8 +671,13 @@
   })
   (fetchNuGet {
     name = "Microsoft.Win32.Registry";
-    version = "4.7.0";
-    sha256 = "0bx21jjbs7l5ydyw4p6cn07chryxpmchq2nl5pirzz4l3b0q4dgs";
+    version = "5.0.0";
+    sha256 = "102hvhq2gmlcbq8y2cb7hdr2dnmjzfp2k3asr1ycwrfacwyaak7n";
+  })
+  (fetchNuGet {
+    name = "MongoDB.Bson";
+    version = "2.11.3";
+    sha256 = "0fn900i51rwgk3ywpcp4dsf7c9v5glch7hia9l9w8aj8s10qjf1r";
   })
   (fetchNuGet {
     name = "Mono.Cecil";
@@ -550,6 +685,11 @@
     sha256 = "1fr7969h5q611l5227xw6nvv5rzap76vbpk0wg9hxbcxk3hn7szf";
   })
   (fetchNuGet {
+    name = "Mono.Posix.NETStandard";
+    version = "1.0.0";
+    sha256 = "0xlja36hwpjm837haq15mjh2prcf68lyrmn72nvgpz8qnf9vappw";
+  })
+  (fetchNuGet {
     name = "NETStandard.Library";
     version = "1.6.0";
     sha256 = "0nmmv4yw7gw04ik8ialj3ak0j6pxa9spih67hnn1h2c38ba8h58k";
@@ -571,8 +711,8 @@
   })
   (fetchNuGet {
     name = "Newtonsoft.Json";
-    version = "12.0.3";
-    sha256 = "17dzl305d835mzign8r15vkmav2hq8l6g7942dfjpnzr17wwl89x";
+    version = "13.0.1";
+    sha256 = "0fijg0w6iwap8gvzyjnndds0q4b8anwxxvik7y8vgq97dram4srb";
   })
   (fetchNuGet {
     name = "Newtonsoft.Json";
@@ -580,39 +720,109 @@
     sha256 = "0mcy0i7pnfpqm4pcaiyzzji4g0c8i3a5gjz28rrr28110np8304r";
   })
   (fetchNuGet {
+    name = "NuGet.Common";
+    version = "5.10.0";
+    sha256 = "0qy6blgppgvxpfcricmvva3qzddk18dza5vy851jrbqshvf9g7kx";
+  })
+  (fetchNuGet {
+    name = "NuGet.Configuration";
+    version = "5.10.0";
+    sha256 = "0xb1n94lrwa6k83i9xcsq68202086p2gj74gzlbhlvb8c2pw6lbb";
+  })
+  (fetchNuGet {
+    name = "NuGet.DependencyResolver.Core";
+    version = "5.10.0";
+    sha256 = "0dhhclm281ihpfsjzxw34l6zlw49nwzyjiynkmsbcj9icfkp3y4r";
+  })
+  (fetchNuGet {
+    name = "NuGet.Frameworks";
+    version = "5.10.0";
+    sha256 = "0gb6n8rg2jpjp52icgpb3wjdfs3qllh5vbcz8hbcix3l7dncy3v2";
+  })
+  (fetchNuGet {
+    name = "NuGet.LibraryModel";
+    version = "5.10.0";
+    sha256 = "0b6mmq2mqfr06ypc772dmcd8bz55gkyfrgn0j3nrgkcdww4fzf9q";
+  })
+  (fetchNuGet {
+    name = "NuGet.Packaging";
+    version = "5.10.0";
+    sha256 = "11g0v061axhp0nisclq5cm2mc92d69z92giz9l40ih478c5nishw";
+  })
+  (fetchNuGet {
+    name = "NuGet.ProjectModel";
+    version = "5.10.0";
+    sha256 = "1cqg319n986wciskrqsfawfhqp1d7a7i2qjd0qplpckyw8msng2i";
+  })
+  (fetchNuGet {
+    name = "NuGet.Protocol";
+    version = "5.10.0";
+    sha256 = "0cs9qp169zx6g2w5bzrlhxv0q1i8mb8dxlb2nkiq7pkvah86rxkc";
+  })
+  (fetchNuGet {
+    name = "NuGet.Versioning";
+    version = "5.10.0";
+    sha256 = "10vvw6vjpx0c26rlxh7dnpyp4prahn25717ccd8bzkjmyzhm90cs";
+  })
+  (fetchNuGet {
     name = "NUnit";
-    version = "3.12.0";
-    sha256 = "1880j2xwavi8f28vxan3hyvdnph4nlh5sbmh285s4lc9l0b7bdk2";
+    version = "3.13.2";
+    sha256 = "00bkjgarkwbj497da9d7lajala1ns67h1kx53w4bapwkf32jlcvn";
+  })
+  (fetchNuGet {
+    name = "OpenTabletDriver";
+    version = "0.5.3.1";
+    sha256 = "16xw8w943x9gvnnpbryahff5azzy8n26j2igyqgv88m352jd9rb8";
+  })
+  (fetchNuGet {
+    name = "OpenTabletDriver.Plugin";
+    version = "0.5.3.1";
+    sha256 = "17dxsvcz9g8kzydk5xlfz9kfxl62x9wi20609rh76wjd881bg1br";
+  })
+  (fetchNuGet {
+    name = "ppy.LocalisationAnalyser";
+    version = "2021.716.0";
+    sha256 = "0w45af0mlh4bkjxxhk5p4kb6z0na8fmm6xz10dfzs3b4i61h5x3z";
   })
   (fetchNuGet {
     name = "ppy.osu.Framework";
-    version = "2020.819.0";
-    sha256 = "1ghbbwpjjl0dp6gs1638v880hr7wwrn2jklqwbbckpx8g57bnq2m";
+    version = "2021.714.0";
+    sha256 = "175i0hcbl01xy633zvij8185nj4g7ja1rsv2lmfz8qdykqj6g9kl";
   })
   (fetchNuGet {
     name = "ppy.osu.Framework.NativeLibs";
-    version = "2020.213.0";
-    sha256 = "1yzrx7bji2163dzvyqri42byc7lgxlm59xbwgi312dw5714snmxy";
+    version = "2021.115.0";
+    sha256 = "00cxrnc78wb8l7d4x7m39g73y85kbgnsnx3qdvv0a9p77lf7lx7z";
   })
   (fetchNuGet {
     name = "ppy.osu.Game.Resources";
-    version = "2020.812.0";
-    sha256 = "0fsg47bsffvk16clwwwav4yly1ykn09pyap46dvdmsxhjrzkvzb7";
+    version = "2021.706.0";
+    sha256 = "1yacqy8h93vph3faf4y0iwhlnlmbny3zj57cm2bh04z2gk0l17am";
   })
   (fetchNuGet {
     name = "ppy.osuTK.NS20";
-    version = "1.0.161";
-    sha256 = "0li5vcpki1ih605c8h1hjf15m9wawkdaizcxib6v3mfjf860ma3s";
+    version = "1.0.173";
+    sha256 = "11rrxakrgq5lriv09qlz26189nyc9lh0fjidn5h70labyp2gpa4y";
   })
   (fetchNuGet {
     name = "ppy.SDL2-CS";
-    version = "1.0.15";
-    sha256 = "0qld7sp7y7hwwxsdxc8m17nyb2zwfxym63j50icvf0rlawmrl7ca";
+    version = "1.0.238-alpha";
+    sha256 = "1n7pa7gy1hcgsfm3jix334qr6v229n1yymq58njj802l3k5g7980";
   })
   (fetchNuGet {
     name = "ppy.squirrel.windows";
-    version = "1.9.0.4";
-    sha256 = "1m8shcmgs0fs225qd0navr1qr6csqjin9sg2x0d7xpfk04nd2hi7";
+    version = "1.9.0.5";
+    sha256 = "0nmhrg3q6izapfpwdslq80fqkvjj12ad9r94pd0nr2xx1zw0x1zl";
+  })
+  (fetchNuGet {
+    name = "Realm";
+    version = "10.3.0";
+    sha256 = "12zmp43cf2kilzq1yi9x2hy1jdh51c0kbnddw5s960k1kvyx2s2v";
+  })
+  (fetchNuGet {
+    name = "Realm.Fody";
+    version = "10.3.0";
+    sha256 = "0mhjkahi2ldxcizv08i70mrpwgrvljxdjlr81x3dmwgpxxfji18d";
   })
   (fetchNuGet {
     name = "Remotion.Linq";
@@ -721,18 +931,8 @@
   })
   (fetchNuGet {
     name = "Sentry";
-    version = "2.1.5";
-    sha256 = "094rhsn5rfk7f2ygk6jgv3cq01gv3a8lnqa85l593ys3957j0qhs";
-  })
-  (fetchNuGet {
-    name = "Sentry.PlatformAbstractions";
-    version = "1.1.1";
-    sha256 = "10mxyxmyjpr0y1ik2j55pp7ifn101sw319cbpf28i2xbfp0cvcaj";
-  })
-  (fetchNuGet {
-    name = "Sentry.Protocol";
-    version = "2.1.5";
-    sha256 = "1yjgn6na14rr6crmm886x597h9gdjyasgxx3n9m3zn7ig8726mpg";
+    version = "3.6.0";
+    sha256 = "1yjz3m8chg796izrdd9vlxvka60rmv6cmsxpnrv9llmsss2mqssz";
   })
   (fetchNuGet {
     name = "SharpCompress";
@@ -741,8 +941,8 @@
   })
   (fetchNuGet {
     name = "SharpCompress";
-    version = "0.26.0";
-    sha256 = "03cygf8p44j1bfn6z9cn2xrw6zhvhq17xac1sph5rgq7vq2m5iq5";
+    version = "0.28.3";
+    sha256 = "1svymm2vyg3815p3sbwjdk563mz0a4ag1sr30pm0ki01brqpaaas";
   })
   (fetchNuGet {
     name = "SharpFNT";
@@ -750,14 +950,9 @@
     sha256 = "1bgacgh9hbck0qvji6frbb50sdiqfdng2fvvfgfw8b9qaql91mx0";
   })
   (fetchNuGet {
-    name = "SixLabors.Core";
-    version = "1.0.0-beta0008";
-    sha256 = "1yqcv5d2igsrmi9hf8xzikn0fms47skqpr552yzbj4z4wnraahaw";
-  })
-  (fetchNuGet {
     name = "SixLabors.ImageSharp";
-    version = "1.0.0-beta0007";
-    sha256 = "1k3hrp26imyqjarkrcsrhvamlmynzv6cakzq68yx69c0h8lmscaf";
+    version = "1.0.3";
+    sha256 = "1y43zvhjgi9rhylc8451784hhdi5b551hf7fsa6187b83wgxc47g";
   })
   (fetchNuGet {
     name = "Splat";
@@ -796,8 +991,8 @@
   })
   (fetchNuGet {
     name = "StbiSharp";
-    version = "1.0.12";
-    sha256 = "044lyc6522s8q4kgvly0rsxghkiv4dwzycl2ibxf7q5dvws02qvp";
+    version = "1.0.13";
+    sha256 = "0yaspwlh4x93d7xnqj5w5pxlwzlv9lixvksyvdh176krfa4mjw3q";
   })
   (fetchNuGet {
     name = "System.AppContext";
@@ -826,15 +1021,15 @@
   })
   (fetchNuGet {
     name = "System.Buffers";
-    version = "4.5.0";
-    sha256 = "1ywfqn4md6g3iilpxjn5dsr0f5lx6z0yvhqp4pgjcamygg73cz2c";
-  })
-  (fetchNuGet {
-    name = "System.Buffers";
     version = "4.5.1";
     sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3";
   })
   (fetchNuGet {
+    name = "System.CodeDom";
+    version = "4.5.0";
+    sha256 = "1js3h3ig0zwyynl1q88siynp8ra0gz0pfq1wmvls6ji83jrxsami";
+  })
+  (fetchNuGet {
     name = "System.Collections";
     version = "4.0.11";
     sha256 = "1ga40f5lrwldiyw6vy67d0sg7jd7ww6kgwbksm19wrvq9hr0bsm6";
@@ -861,8 +1056,8 @@
   })
   (fetchNuGet {
     name = "System.Collections.Immutable";
-    version = "1.7.1";
-    sha256 = "1nh4nlxfc7lbnbl86wwk1a3jwl6myz5j6hvgh5sp4krim9901hsq";
+    version = "5.0.0";
+    sha256 = "1kvcllagxz2q92g81zkz81djkn2lid25ayjfgjalncyc68i15p0r";
   })
   (fetchNuGet {
     name = "System.ComponentModel.Annotations";
@@ -871,8 +1066,8 @@
   })
   (fetchNuGet {
     name = "System.ComponentModel.Annotations";
-    version = "4.7.0";
-    sha256 = "06x1m46ddxj0ng28d7gry9gjkqdg2kp89jyf480g5gznyybbs49z";
+    version = "5.0.0";
+    sha256 = "021h7x98lblq9avm1bgpa4i31c2kgsa7zn4sqhxf39g087ar756j";
   })
   (fetchNuGet {
     name = "System.Composition";
@@ -940,6 +1135,11 @@
     sha256 = "1y8m0p3127nak5yspapfnz25qc9x53gqpvwr3hdpsvrcd2r1pgyj";
   })
   (fetchNuGet {
+    name = "System.Diagnostics.DiagnosticSource";
+    version = "5.0.0";
+    sha256 = "0phd2qizshjvglhzws1jd0cq4m54gscz4ychzr3x6wbgl4vvfrga";
+  })
+  (fetchNuGet {
     name = "System.Diagnostics.Tools";
     version = "4.0.1";
     sha256 = "19cknvg07yhakcvpxg3cxa0bwadplin6kyxd8mpjjpwnp56nl85x";
@@ -965,6 +1165,16 @@
     sha256 = "1pla2dx8gkidf7xkciig6nifdsb494axjvzvann8g2lp3dbqasm9";
   })
   (fetchNuGet {
+    name = "System.Dynamic.Runtime";
+    version = "4.3.0";
+    sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk";
+  })
+  (fetchNuGet {
+    name = "System.Formats.Asn1";
+    version = "5.0.0";
+    sha256 = "1axc8z0839yvqi2cb63l73l6d9j6wd20lsbdymwddz9hvrsgfwpn";
+  })
+  (fetchNuGet {
     name = "System.Globalization";
     version = "4.0.11";
     sha256 = "070c5jbas2v7smm660zaf1gh0489xanjqymkvafcs4f8cdrs1d5d";
@@ -1051,8 +1261,13 @@
   })
   (fetchNuGet {
     name = "System.IO.Packaging";
-    version = "4.7.0";
-    sha256 = "1vivvf158ilcpp6bq70zyafimi0lng546b34csmjb09k19wgxpiv";
+    version = "5.0.0";
+    sha256 = "08l85pi8jy65las973szqdnir2awxp0r16h21c0bgrz19gxhs11n";
+  })
+  (fetchNuGet {
+    name = "System.IO.Pipelines";
+    version = "5.0.1";
+    sha256 = "1zvfcd2l1d5qxifsqd0cjyv57nr61a9ac2ca5jinyqmj32wgjd6v";
   })
   (fetchNuGet {
     name = "System.Linq";
@@ -1080,6 +1295,11 @@
     sha256 = "11jn9k34g245yyf260gr3ldzvaqa9477w2c5nhb1p8vjx4xm3qaw";
   })
   (fetchNuGet {
+    name = "System.Management";
+    version = "4.5.0";
+    sha256 = "19z5x23n21xi94bgl531l9hrm64nyw9d5fpd7klfvr5xfsbh9jwr";
+  })
+  (fetchNuGet {
     name = "System.Memory";
     version = "4.5.1";
     sha256 = "0f07d7hny38lq9w69wx4lxkn4wszrqf9m9js6fh9is645csm167c";
@@ -1165,6 +1385,16 @@
     sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74";
   })
   (fetchNuGet {
+    name = "System.Reflection.Emit";
+    version = "4.6.0";
+    sha256 = "18h375q5bn9h7swxnk4krrxym1dxmi9bm26p89xps9ygrj4q6zqw";
+  })
+  (fetchNuGet {
+    name = "System.Reflection.Emit";
+    version = "4.7.0";
+    sha256 = "121l1z2ypwg02yz84dy6gr82phpys0njk7yask3sihgy214w43qp";
+  })
+  (fetchNuGet {
     name = "System.Reflection.Emit.ILGeneration";
     version = "4.0.1";
     sha256 = "1pcd2ig6bg144y10w7yxgc9d22r7c7ww7qn1frdfwgxr24j9wvv0";
@@ -1186,8 +1416,8 @@
   })
   (fetchNuGet {
     name = "System.Reflection.Emit.Lightweight";
-    version = "4.7.0";
-    sha256 = "0mbjfajmafkca47zr8v36brvknzks5a7pgb49kfq2d188pyv6iap";
+    version = "4.6.0";
+    sha256 = "0hry2k6b7kicg4zxnq0hhn0ys52711pxy7l9v5sp7gvp9cicwpgp";
   })
   (fetchNuGet {
     name = "System.Reflection.Extensions";
@@ -1201,13 +1431,8 @@
   })
   (fetchNuGet {
     name = "System.Reflection.Metadata";
-    version = "1.6.0";
-    sha256 = "1wdbavrrkajy7qbdblpbpbalbdl48q3h34cchz24gvdgyrlf15r4";
-  })
-  (fetchNuGet {
-    name = "System.Reflection.Metadata";
-    version = "1.8.1";
-    sha256 = "17xxl3m99wa4hcpqy42vl8qb1jk2jfq32rj3sfjc1a46hi2si5jj";
+    version = "5.0.0";
+    sha256 = "17qsl5nanlqk9iz0l5wijdn6ka632fs1m1fvx18dfgswm258r3ss";
   })
   (fetchNuGet {
     name = "System.Reflection.Primitives";
@@ -1261,13 +1486,13 @@
   })
   (fetchNuGet {
     name = "System.Runtime.CompilerServices.Unsafe";
-    version = "4.7.0";
-    sha256 = "16r6sn4czfjk8qhnz7bnqlyiaaszr0ihinb7mq9zzr1wba257r54";
+    version = "4.5.3";
+    sha256 = "1afi6s2r1mh1kygbjmfba6l4f87pi5sg13p4a48idqafli94qxln";
   })
   (fetchNuGet {
     name = "System.Runtime.CompilerServices.Unsafe";
-    version = "4.7.1";
-    sha256 = "119br3pd85lq8zcgh4f60jzmv1g976q1kdgi3hvqdlhfbw6siz2j";
+    version = "5.0.0";
+    sha256 = "02k25ivn50dmqx5jn8hawwmz24yf0454fjd823qk6lygj9513q4x";
   })
   (fetchNuGet {
     name = "System.Runtime.Extensions";
@@ -1326,8 +1551,8 @@
   })
   (fetchNuGet {
     name = "System.Security.AccessControl";
-    version = "4.7.0";
-    sha256 = "0n0k0w44flkd8j0xw7g3g3vhw7dijfm51f75xkm1qxnbh4y45mpz";
+    version = "5.0.0";
+    sha256 = "17n3lrrl6vahkqmhlpn3w20afgz09n7i6rv0r3qypngwi7wqdr5r";
   })
   (fetchNuGet {
     name = "System.Security.Cryptography.Algorithms";
@@ -1350,6 +1575,11 @@
     sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv";
   })
   (fetchNuGet {
+    name = "System.Security.Cryptography.Cng";
+    version = "5.0.0";
+    sha256 = "06hkx2za8jifpslkh491dfwzm5dxrsyxzj5lsc0achb6yzg4zqlw";
+  })
+  (fetchNuGet {
     name = "System.Security.Cryptography.Csp";
     version = "4.0.0";
     sha256 = "1cwv8lqj8r15q81d2pz2jwzzbaji0l28xfrpw29kdpsaypm92z2q";
@@ -1380,6 +1610,11 @@
     sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc";
   })
   (fetchNuGet {
+    name = "System.Security.Cryptography.Pkcs";
+    version = "5.0.0";
+    sha256 = "0hb2mndac3xrw3786bsjxjfh19bwnr991qib54k6wsqjhjyyvbwj";
+  })
+  (fetchNuGet {
     name = "System.Security.Cryptography.Primitives";
     version = "4.0.0";
     sha256 = "0i7cfnwph9a10bm26m538h5xcr8b36jscp9sy1zhgifksxz4yixh";
@@ -1390,6 +1625,11 @@
     sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby";
   })
   (fetchNuGet {
+    name = "System.Security.Cryptography.ProtectedData";
+    version = "4.4.0";
+    sha256 = "1q8ljvqhasyynp94a1d7jknk946m20lkwy2c3wa8zw2pc517fbj6";
+  })
+  (fetchNuGet {
     name = "System.Security.Cryptography.X509Certificates";
     version = "4.1.0";
     sha256 = "0clg1bv55mfv5dq00m19cp634zx6inm31kf8ppbq1jgyjf2185dh";
@@ -1401,8 +1641,8 @@
   })
   (fetchNuGet {
     name = "System.Security.Principal.Windows";
-    version = "4.7.0";
-    sha256 = "1a56ls5a9sr3ya0nr086sdpa9qv0abv31dd6fp27maqa9zclqq5d";
+    version = "5.0.0";
+    sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8";
   })
   (fetchNuGet {
     name = "System.Text.Encoding";
@@ -1421,8 +1661,8 @@
   })
   (fetchNuGet {
     name = "System.Text.Encoding.CodePages";
-    version = "4.7.1";
-    sha256 = "1y1hdap9qbl7vp74j8s9zcbh3v1rnrrvcc55wj1hl6has2v3qh1r";
+    version = "5.0.0";
+    sha256 = "1bn2pzaaq4wx9ixirr8151vm5hynn3lmrljcgjx9yghmm4k677k0";
   })
   (fetchNuGet {
     name = "System.Text.Encoding.Extensions";
@@ -1435,6 +1675,21 @@
     sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy";
   })
   (fetchNuGet {
+    name = "System.Text.Encodings.Web";
+    version = "5.0.1";
+    sha256 = "00yg63qnp94q2qryxxggzigi276bibb8b3b96gcvsyrxy7b703n9";
+  })
+  (fetchNuGet {
+    name = "System.Text.Json";
+    version = "4.7.0";
+    sha256 = "0fp3xrysccm5dkaac4yb51d793vywxks978kkl5x4db9gw29rfdr";
+  })
+  (fetchNuGet {
+    name = "System.Text.Json";
+    version = "5.0.2";
+    sha256 = "0vd0wd29cdhgcjngl9sw391sn2s8xm974y15zvym0whsdgjwiqfx";
+  })
+  (fetchNuGet {
     name = "System.Text.RegularExpressions";
     version = "4.1.0";
     sha256 = "1mw7vfkkyd04yn2fbhm38msk7dz2xwvib14ygjsb8dq2lcvr18y7";
@@ -1455,6 +1710,11 @@
     sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34";
   })
   (fetchNuGet {
+    name = "System.Threading.Channels";
+    version = "5.0.0";
+    sha256 = "11z28x3cawry60l5phkqrvavm0mshz84n4c79hrz0p65lq8jpxgs";
+  })
+  (fetchNuGet {
     name = "System.Threading.Tasks";
     version = "4.0.11";
     sha256 = "0nr1r41rak82qfa5m0lhk9mp0k93bvfd7bbd9sdzwx9mb36g28p5";
@@ -1476,10 +1736,20 @@
   })
   (fetchNuGet {
     name = "System.Threading.Tasks.Extensions";
+    version = "4.5.2";
+    sha256 = "1sh63dz0dymqcwmprp0nadm77b83vmm7lyllpv578c397bslb8hj";
+  })
+  (fetchNuGet {
+    name = "System.Threading.Tasks.Extensions";
     version = "4.5.3";
     sha256 = "0g7r6hm572ax8v28axrdxz1gnsblg6kszq17g51pj14a5rn2af7i";
   })
   (fetchNuGet {
+    name = "System.Threading.Tasks.Extensions";
+    version = "4.5.4";
+    sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153";
+  })
+  (fetchNuGet {
     name = "System.Threading.Thread";
     version = "4.0.0";
     sha256 = "1gxxm5fl36pjjpnx1k688dcw8m9l7nmf802nxis6swdaw8k54jzc";
diff --git a/pkgs/games/osu-lazer/osu.runtimeconfig.json b/pkgs/games/osu-lazer/osu.runtimeconfig.json
new file mode 100644
index 00000000000..a1a197b1b67
--- /dev/null
+++ b/pkgs/games/osu-lazer/osu.runtimeconfig.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "tfm": "net5.0",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "5.0.0"
+    }
+  }
+}
diff --git a/pkgs/games/osu-lazer/update.sh b/pkgs/games/osu-lazer/update.sh
index be8fa3fe716..b5c8208fe41 100755
--- a/pkgs/games/osu-lazer/update.sh
+++ b/pkgs/games/osu-lazer/update.sh
@@ -1,11 +1,11 @@
 #!/usr/bin/env nix-shell
-#!nix-shell -i bash -p curl jq common-updater-scripts dotnet-sdk_3
+#!nix-shell -i bash -p curl jq common-updater-scripts dotnet-sdk_5
 set -eo pipefail
 cd "$(dirname "${BASH_SOURCE[0]}")"
 
 deps_file="$(realpath "./deps.nix")"
 
-new_version="$(curl -s "https://api.github.com/repos/ppy/osu/releases" | jq -r '.[0].name')"
+new_version="$(curl -s "https://api.github.com/repos/ppy/osu/releases?per_page=1" | jq -r '.[0].name')"
 old_version="$(sed -nE 's/\s*version = "(.*)".*/\1/p' ./default.nix)"
 if [[ "$new_version" == "$old_version" ]]; then
   echo "Up to date"
@@ -22,21 +22,8 @@ chmod -R +w "$src"
 
 pushd "$src"
 
-# Setup empty nuget package folder to force reinstall.
 mkdir ./nuget_tmp.packages
-cat >./nuget_tmp.config <<EOF
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <packageSources>
-    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
-  </packageSources>
-  <config>
-    <add key="globalPackagesFolder" value="$(realpath ./nuget_tmp.packages)" />
-  </config>
-</configuration>
-EOF
-
-dotnet restore osu.Desktop --configfile ./nuget_tmp.config
+dotnet restore osu.Desktop --packages ./nuget_tmp.packages --runtime linux-x64
 
 echo "{ fetchNuGet }: [" >"$deps_file"
 while read pkg_spec; do
diff --git a/pkgs/games/pacvim/default.nix b/pkgs/games/pacvim/default.nix
index d7805ad66fb..dc2c216b1bf 100644
--- a/pkgs/games/pacvim/default.nix
+++ b/pkgs/games/pacvim/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, ncurses }:
+{ lib, stdenv, fetchFromGitHub, ncurses }:
 
 stdenv.mkDerivation {
   pname = "pacvim";
@@ -13,9 +13,9 @@ stdenv.mkDerivation {
   buildInputs = [ ncurses ];
   makeFlags = [ "PREFIX=$(out)" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/jmoon018/PacVim";
-    description = "PacVim is a game that teaches you vim commands.";
+    description = "A game that teaches you vim commands";
     maintainers = with maintainers; [ infinisil ];
     license = licenses.lgpl3;
     platforms = platforms.unix;
diff --git a/pkgs/games/papermc/default.nix b/pkgs/games/papermc/default.nix
index c0446c4fa5b..6740b51cfd9 100644
--- a/pkgs/games/papermc/default.nix
+++ b/pkgs/games/papermc/default.nix
@@ -1,10 +1,10 @@
-{ stdenv, fetchurl, jre }:
+{ lib, stdenv, fetchurl, bash, jre }:
 let
-  mcVersion = "1.16.2";
-  buildNum = "141";
+  mcVersion = "1.17.1";
+  buildNum = "97";
   jar = fetchurl {
     url = "https://papermc.io/api/v1/paper/${mcVersion}/${buildNum}/download";
-    sha256 = "1qhhnaysw9r73fpvj9qcmjah722a6a4s6g4cblna56n1hpz4lw1s";
+    sha256 = "sha256:0d7q6v5w872phcgkha7j5sxniqq9wqbh1jxdvyvy6d2jl74g1gzw";
   };
 in stdenv.mkDerivation {
   pname = "papermc";
@@ -13,23 +13,24 @@ in stdenv.mkDerivation {
   preferLocalBuild = true;
 
   dontUnpack = true;
-  installPhase = ''
-    mkdir -p $out/bin
-    cp ${jar} $out/papermc.jar
-    cat > $out/bin/minecraft-server << EOF
-    #!/bin/sh
-    exec ${jre}/bin/java \$@ -jar $out/papermc.jar nogui
-    EOF
-    chmod +x $out/bin/minecraft-server
+  dontConfigure = true;
+
+  buildPhase = ''
+    cat > minecraft-server << EOF
+    #!${bash}/bin/sh
+    exec ${jre}/bin/java \$@ -jar $out/share/papermc/papermc.jar nogui
   '';
 
-  phases = "installPhase";
+  installPhase = ''
+    install -Dm444 ${jar} $out/share/papermc/papermc.jar
+    install -Dm555 -t $out/bin minecraft-server
+  '';
 
   meta = {
     description = "High-performance Minecraft Server";
     homepage    = "https://papermc.io/";
-    license     = stdenv.lib.licenses.gpl3;
-    platforms   = stdenv.lib.platforms.unix;
-    maintainers = with stdenv.lib.maintainers; [ aaronjanse ];
+    license     = lib.licenses.gpl3Only;
+    platforms   = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ aaronjanse neonfuz ];
   };
 }
diff --git a/pkgs/games/pentobi/default.nix b/pkgs/games/pentobi/default.nix
index 2b5a86ad52c..deb59eb2377 100644
--- a/pkgs/games/pentobi/default.nix
+++ b/pkgs/games/pentobi/default.nix
@@ -1,20 +1,20 @@
-{ stdenv, appstream, fetchurl, cmake, gettext, libxslt, librsvg, itstool
-  , qtbase, qtquickcontrols2, qtsvg, qttools, qtwebview, docbook_xsl
-  , wrapQtAppsHook
+{ lib, mkDerivation, appstream, fetchFromGitHub, cmake, gettext, libxslt, librsvg, itstool
+, qtbase, qtquickcontrols2, qtsvg, qttools, qtwebview, docbook_xsl
 }:
 
-with stdenv.lib;
-stdenv.mkDerivation rec {
-  version = "18.1";
+mkDerivation rec {
+  version = "18.5";
   pname = "pentobi";
 
-  src = fetchurl {
-    url = "mirror://sourceforge/pentobi/${pname}-${version}.tar.xz";
-    sha256 = "1vfw61lk9z7dngncmx3fggy5ld7ksdk48dpwnsq2vl5fh3f71qbq";
+  src = fetchFromGitHub {
+    owner = "enz";
+    repo = "pentobi";
+    rev = "v${version}";
+    sha256 = "sha256-iVgG2Ee1nJWpuquX2ntFHAJrPA0u9YnutmOC+cMrgZg=";
   };
 
-  nativeBuildInputs = [ cmake docbook_xsl wrapQtAppsHook ];
-  buildInputs = [ appstream qtbase qtsvg qtquickcontrols2 qttools qtwebview itstool librsvg ];
+  nativeBuildInputs = [ cmake docbook_xsl qttools ];
+  buildInputs = [ appstream qtbase qtsvg qtquickcontrols2 qtwebview itstool librsvg ];
 
   patchPhase = ''
     substituteInPlace pentobi_thumbnailer/CMakeLists.txt --replace "/manpages" "/share/xml/docbook-xsl/manpages/"
@@ -28,11 +28,11 @@ stdenv.mkDerivation rec {
     "-DMETAINFO_ITS=${appstream}/share/gettext/its/metainfo.its"
   ];
 
-  meta = {
+  meta = with lib; {
     description = "A computer opponent for the board game Blokus";
     homepage = "https://pentobi.sourceforge.io";
     license = licenses.gpl3;
-    maintainers = [ maintainers.genesis ];
+    maintainers = [ ];
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/performous/default.nix b/pkgs/games/performous/default.nix
index 96b07e9787e..dce771faec1 100644
--- a/pkgs/games/performous/default.nix
+++ b/pkgs/games/performous/default.nix
@@ -1,13 +1,13 @@
-{ stdenv, fetchFromGitHub, cmake, pkgconfig, gettext
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, gettext
 , glibmm, libxmlxx, pango, librsvg
-, SDL2, glew, boost, libav, portaudio, epoxy
+, SDL2, glew, boost, ffmpeg, portaudio, epoxy
 }:
 
 stdenv.mkDerivation rec {
   pname = "performous";
   version = "1.1";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Karaoke, band and dancing game";
     homepage    = "http://performous.org/";
     license     = licenses.gpl2Plus;
@@ -23,10 +23,10 @@ stdenv.mkDerivation rec {
 
   patches = [ ./performous-cmake.patch ];
 
-  nativeBuildInputs = [ cmake pkgconfig gettext ];
+  nativeBuildInputs = [ cmake pkg-config gettext ];
 
   buildInputs = [
     glibmm libxmlxx pango librsvg
-    SDL2 glew boost libav portaudio epoxy
+    SDL2 glew boost ffmpeg portaudio epoxy
   ];
 }
diff --git a/pkgs/games/pinball/default.nix b/pkgs/games/pinball/default.nix
new file mode 100644
index 00000000000..b7abf1dac8c
--- /dev/null
+++ b/pkgs/games/pinball/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl, autoreconfHook, pkg-config
+, libglvnd, SDL, SDL_image, SDL_mixer, xorg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pinball";
+  version = "0.3.20201218";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/pinball/pinball-${version}.tar.gz";
+    sha256 = "0vacypp3ksq1hs6hxpypx7nrfkprbl4ksfywcncckwrh4qcir631";
+  };
+
+  postPatch = ''
+    sed -i 's/^AUTOMAKE_OPTIONS = gnu$/AUTOMAKE_OPTIONS = foreign/' Makefile.am
+  '';
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ libglvnd SDL SDL_image SDL_mixer xorg.libSM ];
+  strictDeps = true;
+
+  configureFlags = [
+    "--with-sdl-prefix=${lib.getDev SDL}"
+  ];
+
+  NIX_CFLAGS_COMPILE = [
+    "-I${lib.getDev SDL_image}/include/SDL"
+    "-I${lib.getDev SDL_mixer}/include/SDL"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://purl.org/rzr/pinball";
+    description = "Emilia Pinball simulator";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ qyliss ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/pingus/default.nix b/pkgs/games/pingus/default.nix
index 81e22b90e97..fd0ebddfc32 100644
--- a/pkgs/games/pingus/default.nix
+++ b/pkgs/games/pingus/default.nix
@@ -1,10 +1,10 @@
-{stdenv, fetchgit, cmake, SDL2, SDL2_image, boost, libpng, SDL2_mixer
-, pkgconfig, libGLU, libGL, git, jsoncpp }:
+{lib, stdenv, fetchgit, cmake, SDL2, SDL2_image, boost, libpng, SDL2_mixer
+, pkg-config, libGLU, libGL, git, jsoncpp }:
 stdenv.mkDerivation rec {
   pname = "pingus";
   version = "unstable-0.7.6.0.20191104";
 
-  nativeBuildInputs = [ cmake pkgconfig git ];
+  nativeBuildInputs = [ cmake pkg-config git ];
   buildInputs = [ SDL2 SDL2_image boost libpng SDL2_mixer libGLU libGL jsoncpp ];
   src = fetchgit {
     url = "https://gitlab.com/pingus/pingus/";
@@ -14,9 +14,9 @@ stdenv.mkDerivation rec {
   };
 
   meta = {
-    description = ''A puzzle game with mechanics similar to Lemmings'';
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    license = stdenv.lib.licenses.gpl3;
+    description = "A puzzle game with mechanics similar to Lemmings";
+    platforms = lib.platforms.linux;
+    maintainers = [lib.maintainers.raskin];
+    license = lib.licenses.gpl3;
   };
 }
diff --git a/pkgs/games/pioneer/default.nix b/pkgs/games/pioneer/default.nix
index 3f3a2dd363d..51eda72bdef 100644
--- a/pkgs/games/pioneer/default.nix
+++ b/pkgs/games/pioneer/default.nix
@@ -1,20 +1,20 @@
-{ fetchFromGitHub, stdenv, cmake, pkgconfig, curl, libsigcxx, SDL2
+{ fetchFromGitHub, lib, stdenv, cmake, pkg-config, curl, libsigcxx, SDL2
 , SDL2_image, freetype, libvorbis, libpng, assimp, libGLU, libGL
 , glew
 }:
 
 stdenv.mkDerivation rec {
   pname = "pioneer";
-  version = "20200203";
+  version = "20210203";
 
   src = fetchFromGitHub{
     owner = "pioneerspacesim";
     repo = "pioneer";
     rev = version;
-    sha256 = "1011xsi94jhw98mhm8kryq8ajig0qfbrdx5xdasi92bd4nk7lcp8";
+    sha256 = "sha256-51HXbX15uB1Xf9Re7Qi41BnJ9OW+GeXQhylJ+HwP0f8=";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
 
   buildInputs = [
     curl libsigcxx SDL2 SDL2_image freetype libvorbis libpng
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
     export PIONEER_DATA_DIR="$out/share/pioneer/data";
   '';
 
-  meta = with stdenv.lib; {
+  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; [
diff --git a/pkgs/games/pioneers/default.nix b/pkgs/games/pioneers/default.nix
index a3a80d896c1..9e292da8c98 100644
--- a/pkgs/games/pioneers/default.nix
+++ b/pkgs/games/pioneers/default.nix
@@ -1,20 +1,30 @@
-{stdenv, fetchurl, gtk3, pkgconfig, intltool } :
+{ lib, stdenv
+, fetchurl
+, pkg-config
+, intltool
+, itstool
+, gtk3
+, libxml2
+}:
 
 stdenv.mkDerivation rec {
-  name = "pioneers-15.4";
+  pname = "pioneers";
+  version = "15.6";
+
   src = fetchurl {
-    url = "mirror://sourceforge/pio/${name}.tar.gz";
-    sha256 = "1p1d18hrfmqcnghip3shkzcs5qkz6j99jvkdkqfi7pqdvjc323cs";
+    url = "mirror://sourceforge/pio/${pname}-${version}.tar.gz";
+    sha256 = "07b3xdd81n8ybsb4fzc5lx0813y9crzp1hj69khncf4faj48sdcs";
   };
 
-  nativeBuildInputs = [ pkgconfig intltool ];
-  buildInputs = [ gtk3 ];
+  nativeBuildInputs = [ pkg-config intltool itstool ];
+
+  buildInputs = [ gtk3 libxml2 ];
 
-  meta = {
-    homepage = "http://pio.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2Plus;
+  meta = with lib; {
     description = "Addicting game based on The Settlers of Catan";
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    homepage = "http://pio.sourceforge.net/";  # https does not work
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ viric ];
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/planetaryannihilation/default.nix b/pkgs/games/planetaryannihilation/default.nix
index a42eb672e62..c29af6d810f 100644
--- a/pkgs/games/planetaryannihilation/default.nix
+++ b/pkgs/games/planetaryannihilation/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, config, fetchurl, patchelf, makeWrapper, gtk2, glib, udev, alsaLib, atk
+{ lib, stdenv, config, fetchurl, patchelf, makeWrapper, gtk2, glib, udev, alsa-lib, atk
 , nspr, fontconfig, cairo, pango, nss, freetype, gnome2, gdk-pixbuf, curl, systemd, xorg }:
 
 # TODO: use dynamic attributes once Nix 1.7 is out
@@ -34,19 +34,19 @@ stdenv.mkDerivation {
     ln -s ${systemd}/lib/libudev.so.1 $out/lib/libudev.so.0
 
     patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/PA"
-    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" --set-rpath "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc.lib xorg.libXdamage xorg.libXfixes gtk2 glib stdenv.glibc.out "$out" xorg.libXext pango udev xorg.libX11 xorg.libXcomposite alsaLib atk nspr fontconfig cairo pango nss freetype gnome2.GConf gdk-pixbuf xorg.libXrender ]}:{stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" "$out/host/CoherentUI_Host"
+    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" --set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc.lib xorg.libXdamage xorg.libXfixes gtk2 glib stdenv.glibc.out "$out" xorg.libXext pango udev xorg.libX11 xorg.libXcomposite alsa-lib atk nspr fontconfig cairo pango nss freetype gnome2.GConf gdk-pixbuf xorg.libXrender ]}:{stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" "$out/host/CoherentUI_Host"
 
-    wrapProgram $out/PA --prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc.lib stdenv.glibc.out xorg.libX11 xorg.libXcursor gtk2 glib curl "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64"
+    wrapProgram $out/PA --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ stdenv.cc.cc.lib stdenv.glibc.out xorg.libX11 xorg.libXcursor gtk2 glib curl "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64"
 
     for f in $out/lib/*; do
-      patchelf --set-rpath "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc.lib curl xorg.libX11 stdenv.glibc.out xorg.libXcursor "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" $f
+      patchelf --set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc.lib curl xorg.libX11 stdenv.glibc.out xorg.libXcursor "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" $f
     done
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://www.uberent.com/pa/";
     description = "Next-generation RTS that takes the genre to a planetary scale";
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
     platforms = platforms.linux;
     maintainers = [ maintainers.domenkozar ];
   };
diff --git a/pkgs/games/pokerth/default.nix b/pkgs/games/pokerth/default.nix
index 00b1f68e137..349dd5d85cb 100644
--- a/pkgs/games/pokerth/default.nix
+++ b/pkgs/games/pokerth/default.nix
@@ -1,10 +1,8 @@
-{ mkDerivation, stdenv, fetchFromGitHub, runCommand, fetchpatch, patchutils, qmake, qtbase
+{ lib, mkDerivation, fetchFromGitHub, runCommand, fetchpatch, patchutils, qmake, qtbase
 , SDL, SDL_mixer, boost, curl, gsasl, libgcrypt, libircclient, protobuf, sqlite
 , wrapQtAppsHook
 , tinyxml2, target ? "client" }:
 
-with stdenv.lib;
-
 let
   hiDPI = fetchpatch {
     url = "https://github.com/pokerth/pokerth/commit/ad8c9cabfb85d8293720d0f14840278d38b5feeb.patch";
@@ -17,7 +15,7 @@ let
 in
 
 mkDerivation rec {
-  name = "pokerth-${target}-${version}";
+  pname = "pokerth-${target}";
   version = "1.1.2";
 
   src = fetchFromGitHub {
@@ -65,7 +63,7 @@ mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = {
+  meta = with lib; {
     homepage = "https://www.pokerth.net";
     description = "Poker game ${target}";
     license = licenses.gpl3;
diff --git a/pkgs/games/pong3d/default.nix b/pkgs/games/pong3d/default.nix
index c7817041f7a..9e965c95482 100644
--- a/pkgs/games/pong3d/default.nix
+++ b/pkgs/games/pong3d/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, libX11}:
+{lib, stdenv, fetchurl, libX11}:
 
-stdenv.mkDerivation {
-  name = "3dpong-0.5";
+stdenv.mkDerivation rec {
+  pname = "3dpong";
+  version = "0.5";
   src = fetchurl {
-    url = "ftp://ftp.tuxpaint.org/unix/x/3dpong/src/3dpong-0.5.tar.gz";
+    url = "ftp://ftp.tuxpaint.org/unix/x/3dpong/src/3dpong-${version}.tar.gz";
     sha256 = "1ibb79sbzlbn4ra3n0qk22gqr6fg7q0jy6cm0wg2qj4z64c7hmdi";
   };
 
@@ -17,7 +18,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.newbreedsoftware.com/3dpong/";
     description = "One or two player 3d sports game based on Pong from Atari";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/portmod/default.nix b/pkgs/games/portmod/default.nix
new file mode 100644
index 00000000000..9db57d3e0a9
--- /dev/null
+++ b/pkgs/games/portmod/default.nix
@@ -0,0 +1,98 @@
+{ lib, callPackage, python3Packages, fetchFromGitLab, cacert,
+  rustPlatform, bubblewrap, git, perlPackages, imagemagick, fetchurl, fetchzip,
+  jre, makeWrapper, tr-patcher, tes3cmd }:
+
+let
+  version = "2.0_beta9";
+
+  src = fetchFromGitLab {
+    owner = "portmod";
+    repo = "Portmod";
+    rev = "v${version}";
+    sha256 = "0a598rb0z6gsdyr4n0lc0yc583njjii07p6vxw75xsh7292vxksc";
+  };
+
+  portmod-rust = rustPlatform.buildRustPackage rec {
+    inherit src version;
+    pname = "portmod-rust";
+
+    cargoHash = "sha256-7Ce+EIbZuOur7iGOUXNWiXReuZO54LQJu+sJPw1CJGg=";
+
+    nativeBuildInputs = [ python3Packages.python ];
+
+    doCheck = false;
+  };
+
+  bin-programs = [
+    bubblewrap
+    git
+    python3Packages.virtualenv
+    tr-patcher
+    tes3cmd
+    imagemagick
+  ];
+
+in
+python3Packages.buildPythonApplication rec {
+  inherit src version;
+
+  pname = "portmod";
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # build the rust library independantly
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "from setuptools_rust import Binding, RustExtension" "" \
+      --replace "RustExtension(\"portmod.portmod\", binding=Binding.PyO3, strip=True)" ""
+  '';
+
+  propagatedBuildInputs = with python3Packages; [
+    setuptools-scm
+    setuptools
+    requests
+    chardet
+    colorama
+    restrictedpython
+    appdirs
+    GitPython
+    progressbar2
+    python-sat
+    redbaron
+    patool
+    packaging
+  ];
+
+  checkInputs = with python3Packages; [
+    pytestCheckHook
+  ] ++ bin-programs;
+
+  preCheck = ''
+    cp ${portmod-rust}/lib/libportmod.so portmod/portmod.so
+    export HOME=$(mktemp -d)
+  '';
+
+  # some test require network access
+  disabledTests = [
+    "test_masters_esp"
+    "test_logging"
+    "test_execute_network_permissions"
+    "test_execute_permissions_bleed"
+    "test_git"
+  ];
+
+  # for some reason, installPhase doesn't copy the compiled binary
+  postInstall = ''
+    cp ${portmod-rust}/lib/libportmod.so $out/${python3Packages.python.sitePackages}/portmod/portmod.so
+
+    makeWrapperArgs+=("--prefix" "GIT_SSL_CAINFO" ":" "${cacert}/etc/ssl/certs/ca-bundle.crt" \
+      "--prefix" "PATH" ":" "${lib.makeBinPath bin-programs }")
+  '';
+
+  meta = {
+    description = "mod manager for openMW based on portage";
+    homepage = "https://gitlab.com/portmod/portmod";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ marius851000 ];
+  };
+}
diff --git a/pkgs/games/powermanga/default.nix b/pkgs/games/powermanga/default.nix
new file mode 100644
index 00000000000..ce3f5b9bf55
--- /dev/null
+++ b/pkgs/games/powermanga/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, fetchurl
+, autoconf
+, automake
+, SDL
+, SDL_mixer
+, libpng
+}:
+
+stdenv.mkDerivation rec {
+  pname = "powermanga";
+  version = "0.93.1";
+
+  src = fetchurl {
+    url = "https://linux.tlk.fr/games/Powermanga/download/powermanga-${version}.tgz";
+    sha256 = "sha256-2nU/zoOQWm2z/Y6mXHDFfWYjYshsQp1saVRBcUT5Q+g=";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    automake
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    libpng
+  ];
+
+  preConfigure = ''
+    ./bootstrap
+  '';
+
+  installFlags = [
+    # Default is $(out)/games
+    "gamesdir=$(out)/bin"
+    # We set the scoredir to $TMPDIR.
+    # Otherwise it will try to write in /var/games at install time
+    "scoredir=$(TMPDIR)"
+  ];
+
+  meta = with lib; {
+    homepage = "https://linux.tlk.fr/games/Powermanga/";
+    downloadPage = "https://linux.tlk.fr/games/Powermanga/download/";
+    description = "An arcade 2D shoot-em-up game";
+    longDescription = ''
+      Powermanga is an arcade 2D shoot-em-up game with 41 levels and more than
+      200 sprites. It runs in 320x200 or 640x400 pixels, with Window mode or
+      full screen and support for 8, 15, 16, 24, and 32 bpp. As you go through
+      the levels, you will destroy enemy spaceships and bosses, collect gems to
+      power up your ship and get special powers, helpers and weapons.
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/prboom/default.nix b/pkgs/games/prboom/default.nix
index 278aa8a93ea..8adc9645b7a 100644
--- a/pkgs/games/prboom/default.nix
+++ b/pkgs/games/prboom/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, SDL, SDL_mixer, SDL_net
+{ lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_net
 , libGLU ? null
 , libGL ? null
 , useOpenGL ? stdenv.hostPlatform == stdenv.buildPlatform
@@ -7,28 +7,29 @@
 assert useOpenGL -> libGL != null && libGLU != null;
 
 stdenv.mkDerivation rec {
-  name = "prboom-2.5.0";
+  pname = "prboom";
+  version = "2.5.0";
   src = fetchurl {
-    url = "mirror://sourceforge/prboom/prboom-2.5.0.tar.gz";
+    url = "mirror://sourceforge/prboom/prboom-${version}.tar.gz";
     sha256 = "1bjb04q8dk232956k30qlpq6q0hxb904yh1nflr87jcc1x3iqv12";
   };
 
   buildInputs = [ SDL SDL_mixer SDL_net ]
-    ++ stdenv.lib.optionals useOpenGL [ libGL libGLU ];
+    ++ lib.optionals useOpenGL [ libGL libGLU ];
 
   doCheck = stdenv.hostPlatform == stdenv.buildPlatform;
 
   configureFlags = [
-    (stdenv.lib.enableFeature useOpenGL "gl")
-    (stdenv.lib.enableFeature doCheck "sdltest")
-  ] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    (lib.enableFeature useOpenGL "gl")
+    (lib.enableFeature doCheck "sdltest")
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
     "--disable-cpu-opt"
     "--without-x"
     "ac_cv_type_uid_t=yes"
     "ac_cv_type_gid_t=yes"
   ];
 
-  postInstall = stdenv.lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+  postInstall = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
     mv $out/games/ $out/bin
   '';
 }
diff --git a/pkgs/games/privateer/0001-fix-VSFile-constructor.patch b/pkgs/games/privateer/0001-fix-VSFile-constructor.patch
deleted file mode 100644
index 05b02fe5d73..00000000000
--- a/pkgs/games/privateer/0001-fix-VSFile-constructor.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From e779a2b8d53e7e4721ce5ddb8e8b1caa753b66dd Mon Sep 17 00:00:00 2001
-From: Florian Friesdorf <flo@chaoflow.net>
-Date: Wed, 4 Jan 2012 23:32:19 +0100
-Subject: [PATCH] fix VSFile constructor
-
----
- src/vsfilesystem.h |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/src/vsfilesystem.h b/src/vsfilesystem.h
-index 4bb7a66..71bf9b9 100644
---- a/src/vsfilesystem.h
-+++ b/src/vsfilesystem.h
-@@ -291,7 +291,7 @@ namespace VSFileSystem
- 			VSFile();
- 			VSFile( const char * buffer, long size, VSFileType type=ZoneBuffer, VSFileMode=ReadOnly);
- 			VSFile( const char * filename, VSFileType type=UnknownFile, VSFileMode=ReadOnly);
--			VSFile( const string &filename, VSFileType type=UnknownFile) { VSFile::VSFile( filename.c_str(), type); }
-+			VSFile( const string &filename, VSFileType type=UnknownFile) { VSFile( filename.c_str(), type); }
-   			~VSFile();
- 
- 			FILE *	GetFP() { return this->fp; } // This is still needed for special cases (when loading PNG files)
--- 
-1.7.8
-
diff --git a/pkgs/games/privateer/default.nix b/pkgs/games/privateer/default.nix
deleted file mode 100644
index 16d0036b658..00000000000
--- a/pkgs/games/privateer/default.nix
+++ /dev/null
@@ -1,43 +0,0 @@
-{ stdenv, fetchsvn, boost, cmake, ffmpeg_3, freeglut, glib,
-  gtk2, libjpeg, libpng, libpthreadstubs, libvorbis, libXau, libXdmcp,
-  libXmu, libGLU, libGL, openal, pixman, pkgconfig, python27, SDL }:
-
-stdenv.mkDerivation {
-  name = "privateer-1.03";
-
-  src = fetchsvn {
-    #url = "mirror://sourceforge/project/privateer/Wing%20Commander%20Privateer/Privateer%20Gemini%20Gold%201.03/PrivateerGold1.03.bz2.bin";
-    url = "https://privateer.svn.sourceforge.net/svnroot/privateer/privgold/trunk/engine";
-    rev = "294";
-    sha256 = "e1759087d4565d3fc95e5c87d0f6ddf36b2cd5befec5695ec56ed5f3cd144c63";
-  };
-
-  buildInputs =
-    [ boost cmake ffmpeg_3 freeglut glib gtk2 libjpeg libpng
-      libpthreadstubs libvorbis libXau libXdmcp libXmu libGLU libGL openal
-      pixman pkgconfig python27 SDL ];
-
-  patches = [ ./0001-fix-VSFile-constructor.patch ];
-
-  preConfigure = ''
-    NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(pkg-config --cflags gtk+-2.0)"
-  '';
-
-  installPhase = ''
-    mkdir -p $out/bin
-    cp vegastrike $out/bin
-    cp vegaserver $out/bin
-  '';
-
-  meta = with stdenv.lib; {
-    homepage = "http://privateer.sourceforge.net/";
-    description = "Adventure space flight simulation computer game";
-    license = licenses.gpl2Plus; # and a special license for art data
-    # https://sourceforge.net/p/privateer/code/HEAD/tree/privgold/trunk/data/art-license.txt
-
-    maintainers = with maintainers; [ ];
-    platforms = with platforms; linux ++ darwin;
-    hydraPlatforms = [];
-    broken = true; # it won't build
-  };
-}
diff --git a/pkgs/games/pro-office-calculator/default.nix b/pkgs/games/pro-office-calculator/default.nix
index 7a0e3bec78d..381a6e8742b 100644
--- a/pkgs/games/pro-office-calculator/default.nix
+++ b/pkgs/games/pro-office-calculator/default.nix
@@ -1,4 +1,4 @@
-{ mkDerivation, stdenv, fetchFromGitHub, tinyxml-2, cmake, qtbase, qtmultimedia }:
+{ mkDerivation, lib, fetchFromGitHub, tinyxml-2, cmake, qtbase, qtmultimedia }:
 mkDerivation rec {
   version = "1.0.13";
   pname = "pro-office-calculator";
@@ -14,8 +14,8 @@ mkDerivation rec {
 
   nativeBuildInputs = [ cmake ];
 
-  meta = with stdenv.lib; {
-    description = "Just an ordinary calculator. Nothing to see here...";
+  meta = with lib; {
+    description = "A completely normal office calculator";
     homepage = "https://proofficecalculator.com/";
     maintainers = [ maintainers.pmiddend ];
     platforms = platforms.linux;
diff --git a/pkgs/games/pysolfc/default.nix b/pkgs/games/pysolfc/default.nix
index 5689edf4f4c..925532bbbf5 100644
--- a/pkgs/games/pysolfc/default.nix
+++ b/pkgs/games/pysolfc/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchzip, buildPythonApplication, python3Packages
+{ lib, fetchzip, buildPythonApplication, python3Packages
   , desktop-file-utils, freecell-solver }:
 
 buildPythonApplication rec {
@@ -39,10 +39,10 @@ buildPythonApplication rec {
   # No tests in archive
   doCheck = false;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A collection of more than 1000 solitaire card games";
     homepage = "https://pysolfc.sourceforge.io";
     license = licenses.gpl3;
-    maintainers = with maintainers; [ kierdavis genesis ];
+    maintainers = with maintainers; [ kierdavis ];
   };
 }
diff --git a/pkgs/games/qqwing/default.nix b/pkgs/games/qqwing/default.nix
index 43fa45ca432..3fadd73ce18 100644
--- a/pkgs/games/qqwing/default.nix
+++ b/pkgs/games/qqwing/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, perl, autoconf, automake, libtool }:
+{ lib, stdenv, fetchFromGitHub, perl, autoconf, automake, libtool }:
 
 stdenv.mkDerivation rec {
   pname = "qqwing";
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
 
   makeFlags = [ "prefix=$(out)" "tgz" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://qqwing.com";
     description = "Sudoku generating and solving software";
     license = licenses.gpl2;
diff --git a/pkgs/games/qtads/default.nix b/pkgs/games/qtads/default.nix
index 140cba2e9ae..f966798ce4e 100644
--- a/pkgs/games/qtads/default.nix
+++ b/pkgs/games/qtads/default.nix
@@ -1,4 +1,4 @@
-{ lib, mkDerivation, fetchFromGitHub, fetchpatch, pkgconfig, qmake
+{ lib, mkDerivation, fetchFromGitHub, fetchpatch, pkg-config, qmake
 , SDL2, fluidsynth, libsndfile, libvorbis, mpg123, qtbase
 }:
 
@@ -13,7 +13,7 @@ mkDerivation rec {
     sha256 = "02kk2hs20h9ffhylwms9f8zikmmlrz1nvbrm97gis9iljkyx035c";
   };
 
-  nativeBuildInputs = [ pkgconfig qmake ];
+  nativeBuildInputs = [ pkg-config qmake ];
 
   buildInputs = [ SDL2 fluidsynth libsndfile libvorbis mpg123 qtbase ];
 
diff --git a/pkgs/games/quake2/yquake2/default.nix b/pkgs/games/quake2/yquake2/default.nix
index 3af692d5bf9..57405d9abd3 100644
--- a/pkgs/games/quake2/yquake2/default.nix
+++ b/pkgs/games/quake2/yquake2/default.nix
@@ -24,8 +24,6 @@ let
       sha256 = "1dszbvxlh1npq4nv9s4wv4lcyfgb01k92ncxrrczsxy1dddg86pp";
     };
 
-    enableParallelBuilding = true;
-
     nativeBuildInputs = [ cmake ];
 
     buildInputs = [ SDL2 libGL curl ]
@@ -57,7 +55,7 @@ let
       cp $src/stuff/yq2.cfg $out/share/games/quake2
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Yamagi Quake II client";
       homepage = "https://www.yamagi.org/quake2/";
       license = licenses.gpl2;
diff --git a/pkgs/games/quake2/yquake2/games.nix b/pkgs/games/quake2/yquake2/games.nix
index 98354a46d4a..0c9b24963ba 100644
--- a/pkgs/games/quake2/yquake2/games.nix
+++ b/pkgs/games/quake2/yquake2/games.nix
@@ -28,7 +28,7 @@ let
     inherit (data) id version description sha256;
     inherit title;
 
-    name = "yquake2-${title}-${version}";
+    pname = "yquake2-${title}";
 
     src = fetchFromGitHub {
       inherit sha256;
@@ -37,8 +37,6 @@ let
       rev = "${lib.toUpper id}_${builtins.replaceStrings ["."] ["_"] version}";
     };
 
-    enableParallelBuilding = true;
-
     nativeBuildInputs = [ cmake ];
 
     installPhase = ''
@@ -46,7 +44,7 @@ let
       cp Release/* $out/lib/yquake2/${id}
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       inherit (data) description;
       homepage = "https://www.yamagi.org/quake2/";
       license = licenses.unfree;
diff --git a/pkgs/games/quake2/yquake2/wrapper.nix b/pkgs/games/quake2/yquake2/wrapper.nix
index 9ab086f96a2..4850dff99dc 100644
--- a/pkgs/games/quake2/yquake2/wrapper.nix
+++ b/pkgs/games/quake2/yquake2/wrapper.nix
@@ -12,7 +12,7 @@ let
   };
 
 in stdenv.mkDerivation {
-  name = "${name}-${stdenv.lib.getVersion yquake2}";
+  name = "${name}-${lib.getVersion yquake2}";
 
   nativeBuildInputs = [ makeWrapper ];
 
diff --git a/pkgs/games/quake3/content/demo.nix b/pkgs/games/quake3/content/demo.nix
index 0d8a64f14cd..36d0396ec79 100644
--- a/pkgs/games/quake3/content/demo.nix
+++ b/pkgs/games/quake3/content/demo.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 let
   version = "1.11-6";
@@ -20,7 +20,7 @@ in stdenv.mkDerivation {
 
   preferLocalBuild = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Quake 3 Arena demo content";
     license = licenses.unfreeRedistributable;
     platforms = platforms.all;
diff --git a/pkgs/games/quake3/content/hires.nix b/pkgs/games/quake3/content/hires.nix
new file mode 100644
index 00000000000..7314028d540
--- /dev/null
+++ b/pkgs/games/quake3/content/hires.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, fetchzip }:
+
+stdenv.mkDerivation {
+  pname = "quake3hires";
+  version = "2020-01-20"; # Unknown version, used the date of web.archive.org capture.
+
+  src = fetchzip {
+    url = "https://web.archive.org/web/20200120024216/http://ioquake3.org/files/xcsv_hires.zip";
+    sha256 = "09vhrray8mh1ic2qgcwv0zlmsnz789y32dkkvrz1vdki4yqkf717";
+    stripRoot = false;
+  };
+
+  buildCommand = ''
+    mkdir -p $out/baseq3
+    install -Dm444 $src/xcsv_bq3hi-res.pk3 $out/baseq3/xcsv_bq3hi-res.pk3
+  '';
+
+  preferLocalBuild = true;
+
+  meta = with lib; {
+    description = "Quake 3 high-resolution textures";
+    license = licenses.cc0;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ rvolosatovs ];
+  };
+}
diff --git a/pkgs/games/quake3/content/pointrelease.nix b/pkgs/games/quake3/content/pointrelease.nix
index e34064d93b0..d9c9a55ddce 100644
--- a/pkgs/games/quake3/content/pointrelease.nix
+++ b/pkgs/games/quake3/content/pointrelease.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 let
   version = "1.32b-3";
@@ -20,7 +20,7 @@ in stdenv.mkDerivation {
 
   preferLocalBuild = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Quake 3 Arena point release";
     license = licenses.unfreeRedistributable;
     platforms = platforms.all;
diff --git a/pkgs/games/quake3/ioquake/default.nix b/pkgs/games/quake3/ioquake/default.nix
index 285fb7e6884..e006507a633 100644
--- a/pkgs/games/quake3/ioquake/default.nix
+++ b/pkgs/games/quake3/ioquake/default.nix
@@ -1,19 +1,19 @@
-{ stdenv, fetchFromGitHub, which, pkgconfig, SDL2, libGL, openalSoft
+{ lib, stdenv, fetchFromGitHub, which, pkg-config, SDL2, libGL, openalSoft
 , curl, speex, opusfile, libogg, libvorbis, libopus, libjpeg, mumble, freetype
 }:
 
 stdenv.mkDerivation {
   pname = "ioquake3-git";
-  version = "2019-05-29";
+  version = "2020-12-26";
 
   src = fetchFromGitHub {
     owner = "ioquake";
     repo = "ioq3";
-    rev = "350b8f9c7c88c002dccea4f0350f1919b86d3b4e";
-    sha256 = "17qkqi22f2fyh6bnfcf1zz2lycgv08d6aw52sf0hqw7r3qq86d08";
+    rev = "05180e32dcfb9a4552e1b9652b56127248a9950c";
+    sha256 = "0hcxxa1ambpdwhg7nb5hvb32g49rl5p9dcflpzcv5cax9drn166i";
   };
 
-  nativeBuildInputs = [ which pkgconfig ];
+  nativeBuildInputs = [ which pkg-config ];
   buildInputs = [
     SDL2 libGL openalSoft curl speex opusfile libogg libvorbis libopus libjpeg
     freetype mumble
@@ -31,10 +31,10 @@ stdenv.mkDerivation {
     mkdir -p $out/baseq3
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://ioquake3.org/";
     description = "First person shooter engine based on the Quake 3: Arena and Quake 3: Team Arena";
-    license = licenses.gpl2;
+    license = licenses.gpl2Only;
     platforms = platforms.linux;
     maintainers = with maintainers; [ rvolosatovs eelco abbradar ];
   };
diff --git a/pkgs/games/quake3/quake3e/default.nix b/pkgs/games/quake3/quake3e/default.nix
index 0e3e74ae7a7..25c6b4ddec0 100644
--- a/pkgs/games/quake3/quake3e/default.nix
+++ b/pkgs/games/quake3/quake3e/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, curl, libGL, libX11, libXxf86dga, alsaLib, libXrandr, libXxf86vm, libXext, fetchFromGitHub }:
+{ lib, stdenv, curl, libGL, libX11, libXxf86dga, alsa-lib, libXrandr, libXxf86vm, libXext, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
   pname = "Quake3e";
@@ -11,12 +11,12 @@ stdenv.mkDerivation rec {
     sha256 = "1jvk8qd0mi0x8lslknhkfd8h6ridwca34c6qahsbmmpcgsvdv16s";
   };
 
-  buildInputs = [ curl libGL libX11 libXxf86dga alsaLib libXrandr libXxf86vm libXext ];
+  buildInputs = [ curl libGL libX11 libXxf86dga alsa-lib libXrandr libXxf86vm libXext ];
   enableParallelBuilding = true;
 
   postPatch = ''
     sed -i -e 's#OpenGLLib = dlopen( dllname#OpenGLLib = dlopen( "${libGL}/lib/libGL.so"#' code/unix/linux_qgl.c
-    sed -i -e 's#Sys_LoadLibrary( "libasound.so.2" )#Sys_LoadLibrary( "${alsaLib}/lib/libasound.so.2" )#' code/unix/linux_snd.c
+    sed -i -e 's#Sys_LoadLibrary( "libasound.so.2" )#Sys_LoadLibrary( "${alsa-lib}/lib/libasound.so.2" )#' code/unix/linux_snd.c
     sed -i -e 's#Sys_LoadLibrary( "libXrandr.so.2" )#Sys_LoadLibrary( "${libXrandr}/lib/libXrandr.so.2" )#' code/unix/x11_randr.c
     sed -i -e 's#Sys_LoadLibrary( "libXxf86vm.so.1" )#Sys_LoadLibrary( "${libXxf86vm}/lib/libXxf86vm.so.1" )#' code/unix/x11_randr.c
     sed -i -e 's#Sys_LoadLibrary( "libXxf86dga.so.1" )#Sys_LoadLibrary( "${libXxf86dga}/lib/libXxf86dga.so.1" )#' code/unix/x11_dga.c
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
     cp build/*/*x64 $out/bin
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/ec-/Quake3e";
     description = "Improved Quake III Arena engine";
     license = licenses.gpl2;
diff --git a/pkgs/games/quake3/wrapper/default.nix b/pkgs/games/quake3/wrapper/default.nix
index 4ab53d67732..3cb64641153 100644
--- a/pkgs/games/quake3/wrapper/default.nix
+++ b/pkgs/games/quake3/wrapper/default.nix
@@ -1,6 +1,6 @@
 { stdenv, buildEnv, lib, libGL, ioquake3, makeWrapper }:
 
-{ paks, name ? (stdenv.lib.head paks).name, description ? "" }:
+{ paks, name ? (lib.head paks).name, description ? "" }:
 
 let
   libPath = lib.makeLibraryPath [ libGL stdenv.cc.cc ];
diff --git a/pkgs/games/quakespasm/default.nix b/pkgs/games/quakespasm/default.nix
index 1e8de1a18f0..41589caed6d 100644
--- a/pkgs/games/quakespasm/default.nix
+++ b/pkgs/games/quakespasm/default.nix
@@ -1,12 +1,13 @@
-{ stdenv, SDL, fetchurl, gzip, libvorbis, libmad }:
+{ lib, stdenv, SDL, fetchurl, gzip, libvorbis, libmad }:
+
 stdenv.mkDerivation rec {
   pname = "quakespasm";
   majorVersion = "0.93";
-  version = "${majorVersion}.1";
+  version = "${majorVersion}.2";
 
   src = fetchurl {
     url = "mirror://sourceforge/quakespasm/quakespasm-${version}.tgz";
-    sha256 = "1bimv18f6rzhyjz78yvw2vqr5n0kdqbcqmq7cb3m951xgsxfcgpd";
+    sha256 = "0qm0j5drybvvq8xadfyppkpk3rxqsxbywzm6iwsjwdf0iia3gss5";
   };
 
   sourceRoot = "${pname}-${version}/Quake";
@@ -24,7 +25,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = {
+  meta = with lib; {
     description = "An engine for iD software's Quake";
     homepage = "http://quakespasm.sourceforge.net/";
     longDescription = ''
@@ -36,7 +37,7 @@ stdenv.mkDerivation rec {
       and smoother mouse input - though no CD support.
     '';
 
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = [ stdenv.lib.maintainers.m3tti ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ m3tti ];
   };
 }
diff --git a/pkgs/games/quakespasm/vulkan.nix b/pkgs/games/quakespasm/vulkan.nix
index deca3bec9cc..0d0b03f514b 100644
--- a/pkgs/games/quakespasm/vulkan.nix
+++ b/pkgs/games/quakespasm/vulkan.nix
@@ -1,24 +1,29 @@
-{ stdenv, SDL2, fetchFromGitHub, makeWrapper, gzip, libvorbis, libmad, vulkan-headers, vulkan-loader }:
+{ lib, stdenv, fetchFromGitHub, makeWrapper, SDL2, gzip, libvorbis, libmad, vulkan-headers, vulkan-loader }:
 
 stdenv.mkDerivation rec {
   pname = "vkquake";
-  version = "1.04.1";
+  version = "1.05.2";
 
   src = fetchFromGitHub {
     owner = "Novum";
     repo = "vkQuake";
     rev = version;
-    sha256 = "1ry861pk3z02hy7i0yi3xwmd1zma802qzcnlm09w6pslayd9rwbf";
+    sha256 = "sha256-h4TpeOwCK3Ynd+XZKo7wHncWS1OI6+b9SReD5xMK9zk=";
   };
 
   sourceRoot = "source/Quake";
 
   nativeBuildInputs = [
-    makeWrapper vulkan-headers
+    makeWrapper
+    vulkan-headers
   ];
 
   buildInputs = [
-    gzip SDL2 libvorbis libmad vulkan-loader
+    gzip
+    SDL2
+    libvorbis
+    libmad
+    vulkan-loader
   ];
 
   buildFlags = [ "DO_USERDIRS=1" ];
@@ -30,12 +35,13 @@ stdenv.mkDerivation rec {
   makeFlags = [ "prefix=$(out) bindir=$(out)/bin" ];
 
   postFixup = ''
-    wrapProgram $out/bin/vkquake --prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib
+    wrapProgram $out/bin/vkquake \
+      --prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib
   '';
 
   enableParallelBuilding = true;
 
-  meta = {
+  meta = with lib; {
     description = "Vulkan Quake port based on QuakeSpasm";
     homepage = src.meta.homepage;
     longDescription = ''
@@ -47,7 +53,7 @@ stdenv.mkDerivation rec {
       specialization constants, CPU/GPU parallelism and memory pooling.
     '';
 
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = [ stdenv.lib.maintainers.gnidorah ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
   };
 }
diff --git a/pkgs/games/quantumminigolf/default.nix b/pkgs/games/quantumminigolf/default.nix
index 1a8cbbea5f9..61e2e1c4eb3 100644
--- a/pkgs/games/quantumminigolf/default.nix
+++ b/pkgs/games/quantumminigolf/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, fftwSinglePrec, freetype, SDL, SDL_ttf}:
+{lib, stdenv, fetchurl, fftwSinglePrec, freetype, SDL, SDL_ttf}:
 let
   s = # Generated upstream information
   rec {
@@ -32,9 +32,9 @@ stdenv.mkDerivation {
   '';
   meta = {
     inherit (s) version;
-    description = ''Quantum mechanics-based minigolf-like game'';
-    license = stdenv.lib.licenses.gpl2 ;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    description = "Quantum mechanics-based minigolf-like game";
+    license = lib.licenses.gpl2 ;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/r2mod_cli/default.nix b/pkgs/games/r2mod_cli/default.nix
new file mode 100644
index 00000000000..169385576ac
--- /dev/null
+++ b/pkgs/games/r2mod_cli/default.nix
@@ -0,0 +1,37 @@
+{ fetchFromGitHub
+, bashInteractive
+, jq
+, makeWrapper
+, p7zip
+, lib, stdenv
+}:
+
+stdenv.mkDerivation rec {
+  pname = "r2mod_cli";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "Foldex";
+    repo = "r2mod_cli";
+    rev = "v${version}";
+    sha256 = "sha256-VNqdVDBR6+eNOeUthPXLfz+0VoaNfSj4f04HLvjg6/0=";
+  };
+
+  buildInputs = [ bashInteractive ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postInstall = ''
+    wrapProgram $out/bin/r2mod --prefix PATH : "${lib.makeBinPath [ jq p7zip ]}";
+  '';
+
+  meta = with lib; {
+    description = "A Risk of Rain 2 Mod Manager in Bash";
+    homepage = "https://github.com/foldex/r2mod_cli";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.reedrw ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/games/racer/default.nix b/pkgs/games/racer/default.nix
index a5d9a911afa..bdb56c85dbf 100644
--- a/pkgs/games/racer/default.nix
+++ b/pkgs/games/racer/default.nix
@@ -1,19 +1,20 @@
-{ fetchurl, stdenv, allegro, libjpeg, makeWrapper }:
+{ fetchurl, lib, stdenv, allegro, libjpeg, makeWrapper }:
 
-stdenv.mkDerivation {
-  name = "racer-1.1";
+stdenv.mkDerivation rec {
+  pname = "racer";
+  version = "1.1";
 
   src = if stdenv.hostPlatform.system == "i686-linux" then fetchurl {
-    url = "http://hippo.nipax.cz/src/racer-1.1.tar.gz";
+    url = "http://hippo.nipax.cz/src/racer-${version}.tar.gz";
     sha256 = "0fll1qkqfcjq87k0jzsilcw701z92lfxn2y5ga1n038772lymxl9";
   } else if stdenv.hostPlatform.system == "x86_64-linux" then fetchurl {
-    url = "https://hippo.nipax.cz/src/racer-1.1.64.tar.gz";
+    url = "https://hippo.nipax.cz/src/racer-${version}.64.tar.gz";
     sha256 = "0rjy3gmlhwfkb9zs58j0mc0dar0livwpbc19r6zw5r2k6r7xdan0";
   } else
     throw "System not supported";
 
-
-  buildInputs = [ allegro libjpeg makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ allegro libjpeg ];
 
   prePatch = ''
     sed -i s,/usr/local,$out, Makefile src/HGFX.cpp src/STDH.cpp
@@ -25,7 +26,7 @@ stdenv.mkDerivation {
   meta = {
     description = "Car racing game";
     homepage = "http://hippo.nipax.cz/download.en.php";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/redeclipse/default.nix b/pkgs/games/redeclipse/default.nix
index fc6f50ef97e..07c2b9e33ad 100644
--- a/pkgs/games/redeclipse/default.nix
+++ b/pkgs/games/redeclipse/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchFromGitHub, fetchurl, fetchpatch
-, curl, ed, pkgconfig, freetype, zlib, libX11
+{ lib, stdenv, fetchFromGitHub, fetchurl, fetchpatch
+, curl, ed, pkg-config, freetype, zlib, libX11
 , SDL2, SDL2_image, SDL2_mixer
 }:
 
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
   ];
 
   nativeBuildInputs = [
-    curl ed pkgconfig
+    curl ed pkg-config
   ];
 
   makeFlags = [ "-C" "src/" "prefix=$(out)" ];
@@ -31,8 +31,8 @@ stdenv.mkDerivation rec {
       cp -R -t $out/share/redeclipse/data/ data/*
   '';
 
-  meta = with stdenv.lib; {
-    description = "A first person arena shooter, featuring parkour, impulse boosts, and more.";
+  meta = with lib; {
+    description = "A first person arena shooter, featuring parkour, impulse boosts, and more";
     longDescription = ''
       Red Eclipse is a fun-filled new take on the first person arena shooter,
       featuring parkour, impulse boosts, and more. The development is geared
diff --git a/pkgs/games/residualvm/default.nix b/pkgs/games/residualvm/default.nix
index da003c3190f..9a836c59508 100644
--- a/pkgs/games/residualvm/default.nix
+++ b/pkgs/games/residualvm/default.nix
@@ -1,12 +1,10 @@
-{ stdenv, fetchurl, SDL, zlib, libmpeg2, libmad, libogg, libvorbis, flac, alsaLib
-, libGLSupported ? stdenv.lib.elem stdenv.hostPlatform.system stdenv.lib.platforms.mesaPlatforms
+{ lib, stdenv, fetchurl, SDL, zlib, libmpeg2, libmad, libogg, libvorbis, flac, alsa-lib
+, libGLSupported ? lib.elem stdenv.hostPlatform.system lib.platforms.mesaPlatforms
 , openglSupport ? libGLSupported, libGLU, libGL ? null
 }:
 
 assert openglSupport -> libGL != null && libGLU != null;
 
-with stdenv.lib;
-
 stdenv.mkDerivation rec {
   version = "0.1.1";
   pname = "residualvm";
@@ -16,16 +14,16 @@ stdenv.mkDerivation rec {
     sha256 = "99c419b13885a49bdfc10a50a3a6000fd1ba9504f6aae04c74b840ec6f57a963";
   };
 
-  buildInputs = [ stdenv SDL zlib libmpeg2 libmad libogg libvorbis flac alsaLib ]
-    ++ optionals openglSupport [ libGL libGLU ];
+  buildInputs = [ stdenv SDL zlib libmpeg2 libmad libogg libvorbis flac alsa-lib ]
+    ++ lib.optionals openglSupport [ libGL libGLU ];
 
   configureFlags = [ "--enable-all-engines" ];
 
-  meta = {
+  meta = with lib; {
     description = "Interpreter for LucasArts' Lua-based 3D adventure games";
     homepage = "http://residualvm.org/";
     repositories.git = "https://github.com/residualvm/residualvm.git";
     license = licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/rftg/default.nix b/pkgs/games/rftg/default.nix
index 966f903888b..1dfeaf3c3a8 100644
--- a/pkgs/games/rftg/default.nix
+++ b/pkgs/games/rftg/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, gtk2, pkgconfig }:
+{ lib, stdenv, fetchurl, gtk2, pkg-config }:
 
 stdenv.mkDerivation rec {
 
@@ -10,14 +10,14 @@ stdenv.mkDerivation rec {
     sha256 = "0j2y6ggpwdlvyqhirp010aix2g6aacj3kvggvpwzxhig30x9vgq8";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ gtk2.dev ];
 
   meta = {
     homepage = "http://keldon.net/rftg/";
     description = "Implementation of the card game Race for the Galaxy, including an AI";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = [ stdenv.lib.maintainers.falsifian ];
+    license = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.falsifian ];
   };
 
 }
diff --git a/pkgs/games/rigsofrods/default.nix b/pkgs/games/rigsofrods/default.nix
index 9aa51bf344e..72c8a49939d 100644
--- a/pkgs/games/rigsofrods/default.nix
+++ b/pkgs/games/rigsofrods/default.nix
@@ -1,5 +1,5 @@
-{ fetchFromGitHub, stdenv, wxGTK30, freeimage, cmake, zziplib, libGLU, libGL, boost,
-  pkgconfig, libuuid, openal, ogre, ois, curl, gtk2, mygui, unzip,
+{ fetchFromGitHub, lib, stdenv, wxGTK30, freeimage, cmake, zziplib, libGLU, libGL, boost,
+  pkg-config, libuuid, openal, ogre, ois, curl, gtk2, mygui, unzip,
   angelscript, ogrepaged, mysocketw, libxcb
   }:
 
@@ -14,8 +14,6 @@ stdenv.mkDerivation rec {
     sha256 = "0cb1il7qm45kfhh6h6jwfpxvjlh2dmg8z1yz9kj4d6098myf2lg4";
   };
 
-  enableParallelBuilding = true;
-
   installPhase = ''
     sed -e "s@/usr/local/lib/OGRE@${ogre}/lib/OGRE@" -i ../tools/linux/binaries/plugins.cfg
     mkdir -p $out/share/rigsofrods
@@ -25,17 +23,17 @@ stdenv.mkDerivation rec {
     ln -s $out/share/rigsofrods/{RoR,RoRConfig} $out/bin
   '';
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ wxGTK30 freeimage cmake zziplib libGLU libGL boost
-    libuuid openal ogre ois curl gtk2 mygui unzip angelscript
+  nativeBuildInputs = [ cmake pkg-config unzip ];
+  buildInputs = [ wxGTK30 freeimage zziplib libGLU libGL boost
+    libuuid openal ogre ois curl gtk2 mygui angelscript
     ogrepaged mysocketw libxcb ];
 
-  meta = {
+  meta = with lib; {
     description = "3D simulator game where you can drive, fly and sail various vehicles";
     homepage = "http://rigsofrods.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl3;
-    maintainers = with stdenv.lib.maintainers; [raskin];
-    platforms = stdenv.lib.platforms.linux;
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
     hydraPlatforms = [];
   };
 }
diff --git a/pkgs/games/riko4/default.nix b/pkgs/games/riko4/default.nix
index 5ea9b8f5416..7014bf9ca21 100644
--- a/pkgs/games/riko4/default.nix
+++ b/pkgs/games/riko4/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, libGLU, luajit, curl, curlpp }:
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, libGLU, luajit, curl, curlpp }:
 
 let
   # Newer versions of sdl-gpu don't work with Riko4 (corrupted graphics),
@@ -15,9 +15,8 @@ let
     };
     buildInputs = [ SDL2 libGLU ];
     nativeBuildInputs = [ cmake ];
-    enableParallelBuilding = true;
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       homepage = "https://github.com/grimfang4/sdl-gpu";
       description = "A library for high-performance, modern 2D graphics with SDL written in C";
       license = licenses.mit;
@@ -57,9 +56,7 @@ stdenv.mkDerivation rec {
     chmod +x $out/bin/riko4
   '';
 
-  enableParallelBuilding = true;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/incinirate/Riko4";
     description = "Fantasy console for pixel art game development";
     license = licenses.mit;
diff --git a/pkgs/games/rili/default.nix b/pkgs/games/rili/default.nix
index 0b7fa118f80..a0082d28d50 100644
--- a/pkgs/games/rili/default.nix
+++ b/pkgs/games/rili/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, SDL_mixer, SDL, autoreconfHook }:
+{ lib, stdenv, fetchurl, SDL_mixer, SDL, autoreconfHook }:
 
-stdenv.mkDerivation {
-  name = "ri_li-2.0.1";
+stdenv.mkDerivation rec {
+  pname = "ri_li";
+  version = "2.0.1";
 
   src = fetchurl {
-    url = "mirror://sourceforge/ri-li/Ri-li-2.0.1.tar.bz2";
+    url = "mirror://sourceforge/ri-li/Ri-li-${version}.tar.bz2";
     sha256 = "f71ccc20c37c601358d963e087ac0d524de8c68e96df09c3aac1ae65edd38dbd";
   };
 
@@ -17,14 +18,14 @@ stdenv.mkDerivation {
 
   meta = {
     homepage = "http://ri-li.sourceforge.net";
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     description = "A children's train game";
     longDescription = ''
      Ri-li is an arcade game licensed under the GPL (General Public License).
 You drive a toy wood engine in many levels and you must collect all the coaches
 to win.
     '';
-    maintainers = with stdenv.lib.maintainers; [ jcumming ];
-    platforms = with stdenv.lib.platforms; linux;
+    maintainers = with lib.maintainers; [ jcumming ];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/rimshot/default.nix b/pkgs/games/rimshot/default.nix
index 2e5087319f0..1f4efa5097b 100644
--- a/pkgs/games/rimshot/default.nix
+++ b/pkgs/games/rimshot/default.nix
@@ -1,9 +1,14 @@
-{ stdenv, fetchurl, unzip, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, unzip, love, lua, makeWrapper, makeDesktopItem }:
 
-let
+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";
@@ -19,16 +24,6 @@ let
     categories = "Audio;AudioVideo;Music";
   };
 
-in
-
-stdenv.mkDerivation {
-  name = "${pname}-${version}";
-
-  src = fetchurl {
-    url = "http://stabyourself.net/dl.php?file=${pname}/${pname}-source.zip";
-    sha256 = "08pdkyvki92549605m9bqnr24ipkbwkp5nkr5aagdqnr8ai4rgmi";
-  };
-
   nativeBuildInputs = [ makeWrapper unzip ];
   buildInputs = [ lua love ];
 
@@ -36,7 +31,7 @@ stdenv.mkDerivation {
 
   unpackPhase = ''
     unzip -j $src
-  '';  
+  '';
 
   installPhase =
   ''
@@ -51,7 +46,7 @@ stdenv.mkDerivation {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Create your own music";
     maintainers = with maintainers; [ leenaars ];
     platforms = platforms.linux;
diff --git a/pkgs/games/robotfindskitten/default.nix b/pkgs/games/robotfindskitten/default.nix
index 73beba2e34f..382c2ef71ae 100644
--- a/pkgs/games/robotfindskitten/default.nix
+++ b/pkgs/games/robotfindskitten/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl, pkgconfig, ncurses }:
+{ lib, stdenv, fetchurl, pkg-config, ncurses }:
 
-with stdenv.lib;
+with lib;
 stdenv.mkDerivation rec {
 
   pname = "robotfindskitten";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "1bwrkxm83r9ajpkd6x03nqvmdfpf5vz6yfy0c97pq3v3ykj74082";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ ncurses ];
 
   makeFlags = [ "execgamesdir=$(out)/bin" ];
diff --git a/pkgs/games/rocksndiamonds/default.nix b/pkgs/games/rocksndiamonds/default.nix
index ebced6467d2..fd570e4d7c6 100644
--- a/pkgs/games/rocksndiamonds/default.nix
+++ b/pkgs/games/rocksndiamonds/default.nix
@@ -1,12 +1,11 @@
-{ stdenv, fetchurl, makeDesktopItem, SDL2, SDL2_image, SDL2_mixer, SDL2_net }:
+{ lib, stdenv, fetchurl, makeDesktopItem, SDL2, SDL2_image, SDL2_mixer, SDL2_net }:
 
 stdenv.mkDerivation rec {
-  name = "${project}-${version}";
-  project = "rocksndiamonds";
+  pname = "rocksndiamonds";
   version = "4.1.1.0";
 
   src = fetchurl {
-    url = "https://www.artsoft.org/RELEASES/unix/${project}/${name}.tar.gz";
+    url = "https://www.artsoft.org/RELEASES/unix/${pname}/rocksndiamonds-${version}.tar.gz";
     sha256 = "1k0m6l5g886d9mwwh6q0gw75qsb85mpf8i0rglh047app56nsk72";
   };
 
@@ -39,7 +38,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Scrolling tile-based arcade style puzzle game";
     homepage = "https://www.artsoft.org/rocksndiamonds/";
     license = licenses.gpl2;
diff --git a/pkgs/games/rogue/default.nix b/pkgs/games/rogue/default.nix
index 592f897f20f..127d65ff362 100644
--- a/pkgs/games/rogue/default.nix
+++ b/pkgs/games/rogue/default.nix
@@ -1,13 +1,14 @@
-{stdenv, fetchurl, ncurses}:
+{lib, stdenv, fetchurl, ncurses}:
 
-stdenv.mkDerivation {
-  name = "rogue-5.4.4";
+stdenv.mkDerivation rec {
+  pname = "rogue";
+  version = "5.4.4";
 
   src = fetchurl {
     urls = [
-      "https://src.fedoraproject.org/repo/pkgs/rogue/rogue5.4.4-src.tar.gz/033288f46444b06814c81ea69d96e075/rogue5.4.4-src.tar.gz"
-      "http://ftp.vim.org/ftp/pub/ftp/os/Linux/distr/slitaz/sources/packages-cooking/r/rogue5.4.4-src.tar.gz"
-      "http://rogue.rogueforge.net/files/rogue5.4/rogue5.4.4-src.tar.gz"
+      "https://src.fedoraproject.org/repo/pkgs/rogue/rogue${version}-src.tar.gz/033288f46444b06814c81ea69d96e075/rogue${version}-src.tar.gz"
+      "http://ftp.vim.org/ftp/pub/ftp/os/Linux/distr/slitaz/sources/packages-cooking/r/rogue${version}-src.tar.gz"
+      "http://rogue.rogueforge.net/files/rogue${lib.versions.majorMinor version}/rogue${version}-src.tar.gz"
     ];
     sha256 = "18g81274d0f7sr04p7h7irz0d53j6kd9j1y3zbka1gcqq0gscdvx";
   };
@@ -17,7 +18,7 @@ stdenv.mkDerivation {
   # Fix build for recent ncurses versions
   NIX_CFLAGS_COMPILE = "-DNCURSES_INTERNALS=1";
 
-  meta = with stdenv.lib; {
+  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";
     platforms = platforms.all;
diff --git a/pkgs/games/rpg-cli/default.nix b/pkgs/games/rpg-cli/default.nix
new file mode 100644
index 00000000000..44e35c3787d
--- /dev/null
+++ b/pkgs/games/rpg-cli/default.nix
@@ -0,0 +1,25 @@
+{ rustPlatform, fetchFromGitHub, lib }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "rpg-cli";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "facundoolano";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-LRTHnYxjPraVISAERT6XJGKIA3YJIilgEwU6olq2CRc=";
+  };
+
+  cargoSha256 = "sha256-ZlQy/JiYKDKPCEWrAFvKV6WsAkk2zsPpfJADB+kPyuo=";
+
+  # tests assume the authors macbook, and thus fail
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Your filesystem as a dungeon";
+    homepage = "https://github.com/facundoolano/rpg-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ legendofmiracles ];
+  };
+}
diff --git a/pkgs/games/rrootage/default.nix b/pkgs/games/rrootage/default.nix
index 459ff238b4a..6cd5919c4e8 100644
--- a/pkgs/games/rrootage/default.nix
+++ b/pkgs/games/rrootage/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchpatch, fetchurl, SDL, SDL_mixer, bulletml }:
+{ lib, stdenv, fetchpatch, fetchurl, SDL, SDL_mixer, bulletml }:
 
 let
   version = "0.23a";
@@ -72,7 +72,7 @@ in stdenv.mkDerivation {
     install -m 644 readme_linux "$out"/share/doc/rrootage/README
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Abstract shooter created by Kenta Cho";
     homepage = "http://rrootage.sourceforge.net/";
     license = licenses.bsd2;
diff --git a/pkgs/games/runelite/default.nix b/pkgs/games/runelite/default.nix
index df8a5c3e8dc..9a2ce6314cd 100644
--- a/pkgs/games/runelite/default.nix
+++ b/pkgs/games/runelite/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, makeWrapper, jre, makeDesktopItem, lib }:
+{ pkgs, lib, stdenv, makeDesktopItem, fetchurl, unzip, makeWrapper, xorg, jre, }:
 
 stdenv.mkDerivation rec {
   pname = "runelite";
-  version = "2.0.0";
+  version = "2.1.5";
 
-  src = fetchurl {
+  jar = fetchurl {
     url = "https://github.com/runelite/launcher/releases/download/${version}/RuneLite.jar";
-    sha256 = "0q0x8g43ggkvp5fgnymgygx59xfhnyyrhpi6ha333gqg97rr0rvw";
+    sha256 = "4BX188QIjIFTxng2ktqlKn7AqQ9tdBcKWmgOj/5yd10=";
   };
 
   icon = fetchurl {
@@ -14,6 +14,17 @@ stdenv.mkDerivation rec {
     sha256 = "04fcjm7p546gr82g0jbh497j7rnh70lrvas0k171bff4v3knrjw1";
   };
 
+  # The `.so` files provided by these two jars aren't detected by RuneLite for some reason, so we have to provide them manually
+  jogl = fetchurl {
+    url = "https://repo.runelite.net/net/runelite/jogl/jogl-all/2.4.0-rc-20200429/jogl-all-2.4.0-rc-20200429-natives-linux-amd64.jar";
+    sha256 = "S60qxyWY9RfyhLFygn/OxZFWnc8qVRtTFdWMbdu+2U0=";
+  };
+  gluegen = fetchurl {
+    url = "https://repo.runelite.net/net/runelite/gluegen/gluegen-rt/2.4.0-rc-20200429/gluegen-rt-2.4.0-rc-20200429-natives-linux-amd64.jar";
+    sha256 = "eF8S5sQkJFDtW8rcVBKIyeyKm5Ze5rXK5r/yosZcHjU=";
+  };
+  dontUnpack = true;
+
   desktop = makeDesktopItem {
     name = "RuneLite";
     type = "Application";
@@ -24,23 +35,25 @@ stdenv.mkDerivation rec {
     desktopName = "RuneLite";
     genericName = "Oldschool Runescape";
     categories = "Game";
-    startupNotify = null;
   };
 
-  buildInputs = [ makeWrapper ];
-
-  # colon is bash form of no-op (do nothing)
-  dontUnpack = true;
-
+  nativeBuildInputs = [ makeWrapper unzip ];
   installPhase = ''
     mkdir -p $out/share/runelite
     mkdir -p $out/share/applications
+    mkdir -p $out/natives
+
+    unzip ${jogl}    'natives/*' -d $out
+    unzip ${gluegen} 'natives/*' -d $out
 
-    ln -s ${src} $out/share/runelite/RuneLite.jar
-    ln -s ${desktop}/share/applications/* $out/share/applications
+    ln -s ${jar} $out/share/runelite/RuneLite.jar
+    ln -s ${desktop}/share/applications/RuneLite.desktop $out/share/applications/RuneLite.desktop
 
+    # RuneLite looks for `.so` files in $PWD/natives, so ensure that we set the PWD to the right place
     makeWrapper ${jre}/bin/java $out/bin/runelite \
-    --add-flags "-jar $out/share/runelite/RuneLite.jar"
+      --run "cd $out" \
+      --prefix LD_LIBRARY_PATH : "${xorg.libXxf86vm}/lib" \
+      --add-flags "-jar $out/share/runelite/RuneLite.jar"
   '';
 
   meta = with lib; {
@@ -48,6 +61,6 @@ stdenv.mkDerivation rec {
     homepage = "https://runelite.net/";
     license = licenses.bsd2;
     maintainers = with maintainers; [ kmeakin ];
-    platforms = platforms.all;
+    platforms = [ "x86_64-linux" ];
   };
 }
diff --git a/pkgs/games/sauerbraten/default.nix b/pkgs/games/sauerbraten/default.nix
index c4119ee4363..1e43674d2a4 100644
--- a/pkgs/games/sauerbraten/default.nix
+++ b/pkgs/games/sauerbraten/default.nix
@@ -1,50 +1,44 @@
-{ stdenv, fetchsvn, SDL2, SDL2_image, SDL2_mixer
-, zlib, runtimeShell
+{ lib, stdenv, fetchzip, SDL2, SDL2_image, SDL2_mixer
+, zlib, makeWrapper
 }:
 
 stdenv.mkDerivation rec {
-  name = "sauerbraten-r${version}";
-  version = "5492";
+  pname = "sauerbraten";
+  version = "2020-12-27";
 
-  src = fetchsvn {
-    url = "https://svn.code.sf.net/p/sauerbraten/code";
-    sha256 = "0pin7ggy84fadjvran18db5v0l81qfv42faknpfaxx47xqz00l5s";
-    rev = version;
+  src = fetchzip {
+    url = "mirror://sourceforge/sauerbraten/sauerbraten_${builtins.replaceStrings [ "-" ] [ "_" ] version}_linux.tar.bz2";
+    sha256 = "0llknzj23vx6f3y452by9c7wlhzclyq4bqi22qd52m3l916z2mn5";
   };
 
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
   buildInputs = [
     SDL2 SDL2_mixer SDL2_image
     zlib
   ];
 
-  preBuild = ''
-    export NIX_LDFLAGS="$NIX_LDFLAGS -lX11"
-    pushd src
-  '';
+  sourceRoot = "source/src";
 
   installPhase = ''
-    popd
     mkdir -p $out/bin $out/share/sauerbraten $out/share/doc/sauerbraten
-    cp -rv "docs/"* $out/share/doc/sauerbraten/
-    cp -v src/sauer_client src/sauer_server $out/share/sauerbraten/
-    cp -rv packages $out/share/sauerbraten/
-    cp -rv data $out/share/sauerbraten/
-    cat > $out/bin/sauerbraten_server <<EOF
-    #!${runtimeShell}
-    cd $out/share/sauerbraten
-    ./sauer_server "\$@"
-    EOF
-    cat > $out/bin/sauerbraten_client <<EOF
-    #!${runtimeShell}
-    cd $out/share/sauerbraten
-    ./sauer_client "\$@"
-    EOF
-    chmod a+x $out/bin/sauerbraten_*
+    cp -rv "../docs/"* $out/share/doc/sauerbraten/
+    cp -v sauer_client sauer_server $out/share/sauerbraten/
+    cp -rv ../packages ../data $out/share/sauerbraten/
+
+    makeWrapper $out/share/sauerbraten/sauer_server $out/bin/sauerbraten_server \
+      --run "cd $out/share/sauerbraten"
+    makeWrapper $out/share/sauerbraten/sauer_client $out/bin/sauerbraten_client \
+      --run "cd $out/share/sauerbraten" \
+      --add-flags "-q\''${HOME}"
   '';
 
-  meta = with stdenv.lib; {
-    description = "";
-    maintainers = [ maintainers.raskin ];
+  meta = with lib; {
+    description = "A free multiplayer & singleplayer first person shooter, the successor of the Cube FPS";
+    maintainers = with maintainers; [ raskin ajs124 ];
+    mainProgram = "sauerbraten_client";
     hydraPlatforms =
       # raskin: tested amd64-linux;
       # not setting platforms because it is 0.5+ GiB of game data
diff --git a/pkgs/games/scid-vs-pc/default.nix b/pkgs/games/scid-vs-pc/default.nix
index 1ff0a0dc728..9d3cdeb02e9 100644
--- a/pkgs/games/scid-vs-pc/default.nix
+++ b/pkgs/games/scid-vs-pc/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl, tcl, tk, libX11, zlib, makeWrapper, makeDesktopItem }:
+{ lib, fetchurl, tcl, tk, libX11, zlib, makeWrapper, makeDesktopItem }:
 
-stdenv.mkDerivation rec {
+tcl.mkTclDerivation rec {
   pname = "scid-vs-pc";
   version = "4.21";
 
@@ -10,7 +10,7 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [ makeWrapper ];
-  buildInputs = [ tcl tk libX11 zlib ];
+  buildInputs = [ tk libX11 zlib ];
 
   prePatch = ''
     sed -i -e '/^ *set headerPath *{/a ${tcl}/include ${tk}/include' \
@@ -42,6 +42,7 @@ stdenv.mkDerivation rec {
 
   dontPatchShebangs = true;
 
+  # TODO: can this use tclWrapperArgs?
   postFixup = ''
     sed -i -e '1c#!'"$out"'/bin/tcscid' "$out/bin/scidpgn"
     sed -i -e '1c#!${tk}/bin/wish' "$out/bin/sc_remote"
@@ -49,7 +50,6 @@ stdenv.mkDerivation rec {
 
     for cmd in $out/bin/* ; do
       wrapProgram "$cmd" \
-        --set TCLLIBPATH "${tcl}/${tcl.libdir}" \
         --set TK_LIBRARY "${tk}/lib/${tk.libPrefix}"
     done
   '';
@@ -71,12 +71,11 @@ stdenv.mkDerivation rec {
     categories = "Game;BoardGame;";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Chess database with play and training functionality";
     homepage = "http://scidvspc.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
     maintainers = [ maintainers.paraseba ];
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
-
diff --git a/pkgs/games/scid/default.nix b/pkgs/games/scid/default.nix
index b3d22d4c0f9..a1955e9cced 100644
--- a/pkgs/games/scid/default.nix
+++ b/pkgs/games/scid/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl, tcl, tk, libX11, zlib, makeWrapper }:
+{ lib, fetchurl, tcl, tk, libX11, zlib, makeWrapper }:
 
-stdenv.mkDerivation {
+tcl.mkTclDerivation {
   pname = "scid";
   version = "4.3";
 
@@ -9,7 +9,8 @@ stdenv.mkDerivation {
     sha256 = "0zb5qp04x8w4gn2kvfdfq2p44kmzfcqn7v167dixz6nlyxg41hrw";
   };
 
-  buildInputs = [ tcl tk libX11 zlib makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ tk libX11 zlib ];
 
   prePatch = ''
     sed -i -e '/^ *set headerPath *{/a ${tcl}/include ${tk}/include' \
@@ -30,6 +31,7 @@ stdenv.mkDerivation {
 
   dontPatchShebangs = true;
 
+  # TODO: can this use tclWrapperArgs?
   postFixup = ''
     for cmd in sc_addmove sc_eco sc_epgn scidpgn \
                sc_import sc_spell sc_tree spliteco
@@ -44,14 +46,14 @@ stdenv.mkDerivation {
     for cmd in $out/bin/*
     do
       wrapProgram "$cmd" \
-        --set TCLLIBPATH "${tcl}/${tcl.libdir}" \
         --set TK_LIBRARY "${tk}/lib/${tk.libPrefix}"
     done
   '';
 
   meta = {
     description = "Chess database with play and training functionality";
+    maintainers = with lib.maintainers; [ agbrooks ];
     homepage = "http://scid.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
   };
 }
diff --git a/pkgs/games/scorched3d/default.nix b/pkgs/games/scorched3d/default.nix
index b7f448e119a..227ab720490 100644
--- a/pkgs/games/scorched3d/default.nix
+++ b/pkgs/games/scorched3d/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libGLU, libGL, glew, pkgconfig, openalSoft, freealut, wxGTK, libogg
+{ lib, stdenv, fetchurl, libGLU, libGL, glew, pkg-config, openalSoft, freealut, wxGTK, libogg
 , freetype, libvorbis, fftwSinglePrec, SDL, SDL_net, expat, libjpeg, libpng }:
 
 stdenv.mkDerivation rec {
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
       SDL SDL_net expat libjpeg libpng fftwSinglePrec
     ];
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
 
   patches = [
     ./file-existence.patch
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
 
   NIX_LDFLAGS = "-lopenal";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://scorched3d.co.uk/";
     description = "3D Clone of the classic Scorched Earth";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/scrolls/default.nix b/pkgs/games/scrolls/default.nix
index a435a240ede..cdeab7b10d3 100644
--- a/pkgs/games/scrolls/default.nix
+++ b/pkgs/games/scrolls/default.nix
@@ -1,8 +1,9 @@
-{ stdenv, fetchurl, gcc
+{ lib, stdenv, fetchurl, gcc
 , libGLU, libX11, libXext, libXcursor, libpulseaudio
 }:
 stdenv.mkDerivation {
-  name = "scrolls-2015-10-13";
+  pname = "scrolls";
+  version = "2015-10-13";
 
   meta = {
     description = "A strategy collectible card game";
@@ -11,7 +12,7 @@ stdenv.mkDerivation {
 
     platforms = [ "x86_64-linux" ];
 
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
   };
 
   src = fetchurl {
@@ -19,7 +20,7 @@ stdenv.mkDerivation {
     sha256 = "ead1fd14988aa07041fedfa7f845c756cd5077a5a402d85bfb749cb669ececec";
   };
 
-  libPath = stdenv.lib.makeLibraryPath [
+  libPath = lib.makeLibraryPath [
     gcc
     libGLU
     libX11
diff --git a/pkgs/games/scummvm/default.nix b/pkgs/games/scummvm/default.nix
index e6efbc6203c..b22d292f207 100644
--- a/pkgs/games/scummvm/default.nix
+++ b/pkgs/games/scummvm/default.nix
@@ -1,20 +1,25 @@
-{ stdenv, fetchurl, nasm
-, alsaLib, curl, flac, fluidsynth, freetype, libjpeg, libmad, libmpeg2, libogg, libvorbis, libGLU, libGL, SDL2, zlib
+{ lib, stdenv, fetchurl, nasm
+, alsa-lib, curl, flac, fluidsynth, freetype, libjpeg, libmad, libmpeg2, libogg, libvorbis, libGLU, libGL, SDL2, zlib
+, Cocoa, AudioToolbox, Carbon, CoreMIDI, AudioUnit, cctools
 }:
 
 stdenv.mkDerivation rec {
   pname = "scummvm";
-  version = "2.1.2";
+  version = "2.2.0";
 
   src = fetchurl {
     url = "http://scummvm.org/frs/scummvm/${version}/${pname}-${version}.tar.xz";
-    sha256 = "1c4fz1nfg0nqnqx9iipayhzcsiqdmfxm2i95nw9dbhshhsdnrhf4";
+    sha256 = "FGllflk72Ky8+sC4ObCG9kDr8SBjPpPxFsq2UrWyc4c=";
   };
 
   nativeBuildInputs = [ nasm ];
 
-  buildInputs = [
-    alsaLib curl freetype flac fluidsynth libjpeg libmad libmpeg2 libogg libvorbis libGLU libGL SDL2 zlib
+  buildInputs = lib.optionals stdenv.isLinux [
+    alsa-lib
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa AudioToolbox Carbon CoreMIDI AudioUnit
+  ] ++ [
+    curl freetype flac fluidsynth libjpeg libmad libmpeg2 libogg libvorbis libGLU libGL SDL2 zlib
   ];
 
   dontDisableStatic = true;
@@ -30,13 +35,15 @@ stdenv.mkDerivation rec {
   # They use 'install -s', that calls the native strip instead of the cross
   postConfigure = ''
     sed -i "s/-c -s/-c -s --strip-program=''${STRIP@Q}/" ports.mk
+  '' + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace config.mk --replace x86_64-apple-darwin-ranlib ${cctools}/bin/ranlib
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Program to run certain classic graphical point-and-click adventure games (such as Monkey Island)";
     homepage = "https://www.scummvm.org/";
     license = licenses.gpl2;
     maintainers = [ maintainers.peterhoeg ];
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/games/scummvm/games.nix b/pkgs/games/scummvm/games.nix
index 0165a797c3a..2ffd176ccf6 100644
--- a/pkgs/games/scummvm/games.nix
+++ b/pkgs/games/scummvm/games.nix
@@ -51,7 +51,7 @@ let
         runHook postInstall
       '';
 
-      meta = with stdenv.lib; {
+      meta = with lib; {
         homepage = "https://www.scummvm.org";
         license = licenses.free; # refer to the readme for exact wording
         maintainers = with maintainers; [ peterhoeg ];
diff --git a/pkgs/games/sdlpop/default.nix b/pkgs/games/sdlpop/default.nix
new file mode 100644
index 00000000000..cef321fdce4
--- /dev/null
+++ b/pkgs/games/sdlpop/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv
+, makeWrapper
+, makeDesktopItem, copyDesktopItems
+, fetchFromGitHub
+, pkg-config
+, SDL2, SDL2_image
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sdlpop";
+  version = "1.21";
+
+  src = fetchFromGitHub {
+    owner = "NagyD";
+    repo = "SDLPoP";
+    rev = "v${version}";
+    sha256 = "1q4mnyg8v4420f1bp24v8lgi335vijdv61yi3fan14jgfzl38l7w";
+  };
+
+  nativeBuildInputs = [ pkg-config makeWrapper copyDesktopItems ];
+  buildInputs = [ SDL2 SDL2_image ];
+
+  makeFlags = [ "-C" "src" ];
+
+  preBuild = ''
+    substituteInPlace src/Makefile --replace "CC = gcc" "CC = ${stdenv.cc.targetPrefix}gcc"
+  '';
+
+  # The prince binary expects two things of the working directory it is called from:
+  # (1) There is a subdirectory "data" containing the level data.
+  # (2) The working directory is writable, so save and quicksave files can be created.
+  # Our solution is to ensure that ~/.local/share/sdlpop is the working
+  # directory, symlinking the data files into it. This is the task of the
+  # prince.sh wrapper.
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 prince $out/bin/.prince-bin
+    substituteAll ${./prince.sh} $out/bin/prince
+    chmod +x $out/bin/prince
+
+    mkdir -p $out/share/sdlpop
+    cp -r data doc mods SDLPoP.ini $out/share/sdlpop
+
+    install -Dm755 data/icon.png $out/share/icons/hicolor/32x32/apps/sdlpop.png
+
+    runHook postInstall
+  '';
+
+  desktopItems = [ (makeDesktopItem {
+    name = "sdlpop";
+    icon = "sdlpop";
+    exec = "prince";
+    desktopName = "SDLPoP";
+    comment = "An open-source port of Prince of Persia";
+    categories = "Game;AdventureGame;";
+  }) ];
+
+  meta = with lib; {
+    description = "Open-source port of Prince of Persia";
+    homepage = "https://github.com/NagyD/SDLPoP";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ iblech ];
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/pkgs/games/sdlpop/prince.sh b/pkgs/games/sdlpop/prince.sh
new file mode 100644
index 00000000000..698c347272a
--- /dev/null
+++ b/pkgs/games/sdlpop/prince.sh
@@ -0,0 +1,16 @@
+#! @shell@
+
+set -euo pipefail
+
+mkdir -p ~/.local/share/sdlpop
+cd ~/.local/share/sdlpop
+
+for i in SDLPoP.ini mods; do
+  [ -e $i ] || cp -r @out@/share/sdlpop/$i .
+done
+
+# Create the data symlink or update it (in case it is a symlink, else the user
+# has probably tinkered with it and does not want it to be recreated).
+[ ! -e data -o -L data ] && ln -sf @out@/share/sdlpop/data .
+
+exec -a "prince" @out@/bin/.prince-bin "$@"
diff --git a/pkgs/games/sfrotz/default.nix b/pkgs/games/sfrotz/default.nix
index 6e4839703a1..e6b95937199 100644
--- a/pkgs/games/sfrotz/default.nix
+++ b/pkgs/games/sfrotz/default.nix
@@ -10,7 +10,7 @@
 , pkg-config
 , SDL2
 , SDL2_mixer
-, stdenv
+, lib, stdenv
 , zlib }:
 
 stdenv.mkDerivation rec {
@@ -43,7 +43,7 @@ stdenv.mkDerivation rec {
   buildPhase = "make sdl";
   installTargets = [ "install_sfrotz" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description =
       "Interpreter for Infocom and other Z-Machine games (SDL interface)";
     longDescription = ''
diff --git a/pkgs/games/sgt-puzzles/default.nix b/pkgs/games/sgt-puzzles/default.nix
index c17439b5e3e..1c0b7aeda49 100644
--- a/pkgs/games/sgt-puzzles/default.nix
+++ b/pkgs/games/sgt-puzzles/default.nix
@@ -1,15 +1,15 @@
-{ stdenv, fetchurl, desktop-file-utils
+{ lib, stdenv, fetchurl, desktop-file-utils
 , gtk3, libX11
-, makeWrapper, pkgconfig, perl, autoreconfHook, wrapGAppsHook
+, makeWrapper, pkg-config, perl, autoreconfHook, wrapGAppsHook
 }:
 
 stdenv.mkDerivation rec {
-  name = "sgt-puzzles-r${version}";
-  version = "20191114.1c0c49d";
+  pname = "sgt-puzzles";
+  version = "20200610.9aa7b7c";
 
   src = fetchurl {
     url = "http://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles-${version}.tar.gz";
-    sha256 = "01fi2f3w71bfbgcfr6gxdp5a9cxh4dshbflv83q2j5rxxs2ll870";
+    sha256 = "0rrd1c77ar91zqy4rr4xp1z7x3ywnshlac99cga4hnrgwb7vwl3f";
   };
 
   sgt-puzzles-menu = fetchurl {
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [ autoreconfHook desktop-file-utils makeWrapper
-    pkgconfig perl wrapGAppsHook ];
+    pkg-config perl wrapGAppsHook ];
 
   buildInputs = [ gtk3 libX11 ];
 
@@ -63,10 +63,10 @@ stdenv.mkDerivation rec {
     export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -Wno-error"
     cp Makefile.gtk Makefile
   '';
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Simon Tatham's portable puzzle collection";
     license = licenses.mit;
-    maintainers = [ maintainers.raskin maintainers.genesis ];
+    maintainers = [ maintainers.raskin ];
     platforms = platforms.linux;
     homepage = "https://www.chiark.greenend.org.uk/~sgtatham/puzzles/";
   };
diff --git a/pkgs/games/shattered-pixel-dungeon/default.nix b/pkgs/games/shattered-pixel-dungeon/default.nix
index 6626e4df8a2..ec18a26829f 100644
--- a/pkgs/games/shattered-pixel-dungeon/default.nix
+++ b/pkgs/games/shattered-pixel-dungeon/default.nix
@@ -1,8 +1,8 @@
-{ stdenv
+{ lib, stdenv
 , makeWrapper
 , fetchFromGitHub
 , nixosTests
-, gradle_5
+, gradle_6
 , perl
 , jre
 , libpulseaudio
@@ -10,13 +10,15 @@
 
 let
   pname = "shattered-pixel-dungeon";
-  version = "0.8.2b";
+  version = "0.9.3";
 
   src = fetchFromGitHub {
     owner = "00-Evan";
     repo = "shattered-pixel-dungeon";
-    rev = "v${version}";
-    sha256 = "02ksxm7iknxfc7l8dl2pr1kyhfmi7vkchz0lh46w3p5mqf82psfb";
+    # NOTE: always use the commit sha, not the tag. Tags _will_ disappear!
+    # https://github.com/00-Evan/shattered-pixel-dungeon/issues/596
+    rev = "785c869f2b61013a15fddbf5f0c65d67fe900e80";
+    sha256 = "sha256-d7Fc1IPOW/0RwLYe9vwaD3gFw6div2/J0DOFdWYDXWY=";
   };
 
   postPatch = ''
@@ -31,9 +33,11 @@ let
   deps = stdenv.mkDerivation {
     pname = "${pname}-deps";
     inherit version src postPatch;
-    nativeBuildInputs = [ gradle_5 perl ];
+    nativeBuildInputs = [ gradle_6 perl ];
     buildPhase = ''
       export GRADLE_USER_HOME=$(mktemp -d)
+      # https://github.com/gradle/gradle/issues/4426
+      ${lib.optionalString stdenv.isDarwin "export TERM=dumb"}
       gradle --no-daemon desktop:release
     '';
     # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar)
@@ -50,10 +54,12 @@ let
 in stdenv.mkDerivation rec {
   inherit pname version src postPatch;
 
-  nativeBuildInputs = [ gradle_5 perl makeWrapper ];
+  nativeBuildInputs = [ gradle_6 perl makeWrapper ];
 
   buildPhase = ''
     export GRADLE_USER_HOME=$(mktemp -d)
+    # https://github.com/gradle/gradle/issues/4426
+    ${lib.optionalString stdenv.isDarwin "export TERM=dumb"}
     # point to offline repo
     sed -ie "s#repositories {#repositories { maven { url '${deps}' };#g" build.gradle
     gradle --offline --no-daemon desktop:release
@@ -71,13 +77,14 @@ in stdenv.mkDerivation rec {
     shattered-pixel-dungeon-starts = nixosTests.shattered-pixel-dungeon;
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://shatteredpixel.com/";
     downloadPage = "https://github.com/00-Evan/shattered-pixel-dungeon/releases";
     description = "Traditional roguelike game with pixel-art graphics and simple interface";
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     maintainers = with maintainers; [ fgaz ];
     platforms = platforms.all;
+    # https://github.com/NixOS/nixpkgs/pull/99885#issuecomment-740065005
+    broken = stdenv.isDarwin;
   };
 }
-
diff --git a/pkgs/games/shticker-book-unwritten/cargo-lock.patch b/pkgs/games/shticker-book-unwritten/cargo-lock.patch
new file mode 100644
index 00000000000..90e802011e4
--- /dev/null
+++ b/pkgs/games/shticker-book-unwritten/cargo-lock.patch
@@ -0,0 +1,1248 @@
+diff --git a/Cargo.lock b/Cargo.lock
+new file mode 100644
+index 0000000..16f72a8
+--- /dev/null
++++ b/Cargo.lock
+@@ -0,0 +1,1242 @@
++# This file is automatically @generated by Cargo.
++# It is not intended for manual editing.
++[[package]]
++name = "autocfg"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
++
++[[package]]
++name = "base64"
++version = "0.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
++
++[[package]]
++name = "bitflags"
++version = "1.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
++
++[[package]]
++name = "block-buffer"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "bumpalo"
++version = "3.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"
++
++[[package]]
++name = "bytes"
++version = "0.5.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
++
++[[package]]
++name = "bytes"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
++
++[[package]]
++name = "bzip2"
++version = "0.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "abf8012c8a15d5df745fcf258d93e6149dcf102882c8d8702d9cff778eab43a8"
++dependencies = [
++ "bzip2-sys",
++ "libc",
++]
++
++[[package]]
++name = "bzip2-sys"
++version = "0.1.10+1.0.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "17fa3d1ac1ca21c5c4e36a97f3c3eb25084576f6fc47bf0139c1123434216c6c"
++dependencies = [
++ "cc",
++ "libc",
++ "pkg-config",
++]
++
++[[package]]
++name = "cc"
++version = "1.0.67"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
++
++[[package]]
++name = "cfg-if"
++version = "0.1.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
++
++[[package]]
++name = "cfg-if"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
++
++[[package]]
++name = "clap"
++version = "2.33.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
++dependencies = [
++ "bitflags",
++ "strsim",
++ "textwrap",
++ "unicode-width",
++ "vec_map",
++]
++
++[[package]]
++name = "core-foundation"
++version = "0.9.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
++dependencies = [
++ "core-foundation-sys",
++ "libc",
++]
++
++[[package]]
++name = "core-foundation-sys"
++version = "0.8.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
++
++[[package]]
++name = "cpuid-bool"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"
++
++[[package]]
++name = "digest"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "encoding_rs"
++version = "0.8.28"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "fnv"
++version = "1.0.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
++
++[[package]]
++name = "foreign-types"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
++dependencies = [
++ "foreign-types-shared",
++]
++
++[[package]]
++name = "foreign-types-shared"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
++
++[[package]]
++name = "form_urlencoded"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
++dependencies = [
++ "matches",
++ "percent-encoding",
++]
++
++[[package]]
++name = "fuchsia-zircon"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
++dependencies = [
++ "bitflags",
++ "fuchsia-zircon-sys",
++]
++
++[[package]]
++name = "fuchsia-zircon-sys"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
++
++[[package]]
++name = "futures-channel"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"
++dependencies = [
++ "futures-core",
++]
++
++[[package]]
++name = "futures-core"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"
++
++[[package]]
++name = "futures-io"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59"
++
++[[package]]
++name = "futures-sink"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3"
++
++[[package]]
++name = "futures-task"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"
++
++[[package]]
++name = "futures-util"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
++dependencies = [
++ "futures-core",
++ "futures-io",
++ "futures-task",
++ "memchr",
++ "pin-project-lite 0.2.6",
++ "pin-utils",
++ "slab",
++]
++
++[[package]]
++name = "generic-array"
++version = "0.14.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
++dependencies = [
++ "typenum",
++ "version_check",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi",
++]
++
++[[package]]
++name = "h2"
++version = "0.2.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535"
++dependencies = [
++ "bytes 0.5.6",
++ "fnv",
++ "futures-core",
++ "futures-sink",
++ "futures-util",
++ "http",
++ "indexmap",
++ "slab",
++ "tokio",
++ "tokio-util",
++ "tracing",
++ "tracing-futures",
++]
++
++[[package]]
++name = "hashbrown"
++version = "0.9.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
++
++[[package]]
++name = "hermit-abi"
++version = "0.1.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "http"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747"
++dependencies = [
++ "bytes 1.0.1",
++ "fnv",
++ "itoa",
++]
++
++[[package]]
++name = "http-body"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b"
++dependencies = [
++ "bytes 0.5.6",
++ "http",
++]
++
++[[package]]
++name = "httparse"
++version = "1.3.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691"
++
++[[package]]
++name = "httpdate"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
++
++[[package]]
++name = "hyper"
++version = "0.13.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb"
++dependencies = [
++ "bytes 0.5.6",
++ "futures-channel",
++ "futures-core",
++ "futures-util",
++ "h2",
++ "http",
++ "http-body",
++ "httparse",
++ "httpdate",
++ "itoa",
++ "pin-project",
++ "socket2",
++ "tokio",
++ "tower-service",
++ "tracing",
++ "want",
++]
++
++[[package]]
++name = "hyper-tls"
++version = "0.4.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed"
++dependencies = [
++ "bytes 0.5.6",
++ "hyper",
++ "native-tls",
++ "tokio",
++ "tokio-tls",
++]
++
++[[package]]
++name = "idna"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"
++dependencies = [
++ "matches",
++ "unicode-bidi",
++ "unicode-normalization",
++]
++
++[[package]]
++name = "indexmap"
++version = "1.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
++dependencies = [
++ "autocfg",
++ "hashbrown",
++]
++
++[[package]]
++name = "iovec"
++version = "0.1.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "ipnet"
++version = "2.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
++
++[[package]]
++name = "itoa"
++version = "0.4.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
++
++[[package]]
++name = "js-sys"
++version = "0.3.48"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dc9f84f9b115ce7843d60706df1422a916680bfdfcbdb0447c5614ff9d7e4d78"
++dependencies = [
++ "wasm-bindgen",
++]
++
++[[package]]
++name = "kernel32-sys"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
++dependencies = [
++ "winapi 0.2.8",
++ "winapi-build",
++]
++
++[[package]]
++name = "lazy_static"
++version = "1.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
++
++[[package]]
++name = "libc"
++version = "0.2.88"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a"
++
++[[package]]
++name = "log"
++version = "0.4.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "matches"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
++
++[[package]]
++name = "memchr"
++version = "2.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
++
++[[package]]
++name = "mime"
++version = "0.3.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
++
++[[package]]
++name = "mime_guess"
++version = "2.0.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212"
++dependencies = [
++ "mime",
++ "unicase",
++]
++
++[[package]]
++name = "mio"
++version = "0.6.23"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
++dependencies = [
++ "cfg-if 0.1.10",
++ "fuchsia-zircon",
++ "fuchsia-zircon-sys",
++ "iovec",
++ "kernel32-sys",
++ "libc",
++ "log",
++ "miow",
++ "net2",
++ "slab",
++ "winapi 0.2.8",
++]
++
++[[package]]
++name = "miow"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
++dependencies = [
++ "kernel32-sys",
++ "net2",
++ "winapi 0.2.8",
++ "ws2_32-sys",
++]
++
++[[package]]
++name = "native-tls"
++version = "0.2.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4"
++dependencies = [
++ "lazy_static",
++ "libc",
++ "log",
++ "openssl",
++ "openssl-probe",
++ "openssl-sys",
++ "schannel",
++ "security-framework",
++ "security-framework-sys",
++ "tempfile",
++]
++
++[[package]]
++name = "net2"
++version = "0.2.37"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae"
++dependencies = [
++ "cfg-if 0.1.10",
++ "libc",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "num_cpus"
++version = "1.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
++dependencies = [
++ "hermit-abi",
++ "libc",
++]
++
++[[package]]
++name = "opaque-debug"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
++
++[[package]]
++name = "openssl"
++version = "0.10.32"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70"
++dependencies = [
++ "bitflags",
++ "cfg-if 1.0.0",
++ "foreign-types",
++ "lazy_static",
++ "libc",
++ "openssl-sys",
++]
++
++[[package]]
++name = "openssl-probe"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
++
++[[package]]
++name = "openssl-sys"
++version = "0.9.60"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6"
++dependencies = [
++ "autocfg",
++ "cc",
++ "libc",
++ "pkg-config",
++ "vcpkg",
++]
++
++[[package]]
++name = "percent-encoding"
++version = "2.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
++
++[[package]]
++name = "pin-project"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63"
++dependencies = [
++ "pin-project-internal",
++]
++
++[[package]]
++name = "pin-project-internal"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "pin-project-lite"
++version = "0.1.12"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777"
++
++[[package]]
++name = "pin-project-lite"
++version = "0.2.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
++
++[[package]]
++name = "pin-utils"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
++
++[[package]]
++name = "pkg-config"
++version = "0.3.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
++
++[[package]]
++name = "ppv-lite86"
++version = "0.2.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
++
++[[package]]
++name = "proc-macro2"
++version = "1.0.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
++dependencies = [
++ "unicode-xid",
++]
++
++[[package]]
++name = "quote"
++version = "1.0.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
++dependencies = [
++ "proc-macro2",
++]
++
++[[package]]
++name = "rand"
++version = "0.8.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
++dependencies = [
++ "libc",
++ "rand_chacha",
++ "rand_core",
++ "rand_hc",
++]
++
++[[package]]
++name = "rand_chacha"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
++dependencies = [
++ "ppv-lite86",
++ "rand_core",
++]
++
++[[package]]
++name = "rand_core"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
++dependencies = [
++ "getrandom",
++]
++
++[[package]]
++name = "rand_hc"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
++dependencies = [
++ "rand_core",
++]
++
++[[package]]
++name = "redox_syscall"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
++dependencies = [
++ "bitflags",
++]
++
++[[package]]
++name = "remove_dir_all"
++version = "0.5.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
++dependencies = [
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "reqwest"
++version = "0.10.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c"
++dependencies = [
++ "base64",
++ "bytes 0.5.6",
++ "encoding_rs",
++ "futures-core",
++ "futures-util",
++ "http",
++ "http-body",
++ "hyper",
++ "hyper-tls",
++ "ipnet",
++ "js-sys",
++ "lazy_static",
++ "log",
++ "mime",
++ "mime_guess",
++ "native-tls",
++ "percent-encoding",
++ "pin-project-lite 0.2.6",
++ "serde",
++ "serde_urlencoded",
++ "tokio",
++ "tokio-tls",
++ "url",
++ "wasm-bindgen",
++ "wasm-bindgen-futures",
++ "web-sys",
++ "winreg",
++]
++
++[[package]]
++name = "rpassword"
++version = "4.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f"
++dependencies = [
++ "libc",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "ryu"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
++
++[[package]]
++name = "schannel"
++version = "0.1.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
++dependencies = [
++ "lazy_static",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "security-framework"
++version = "2.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2dfd318104249865096c8da1dfabf09ddbb6d0330ea176812a62ec75e40c4166"
++dependencies = [
++ "bitflags",
++ "core-foundation",
++ "core-foundation-sys",
++ "libc",
++ "security-framework-sys",
++]
++
++[[package]]
++name = "security-framework-sys"
++version = "2.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dee48cdde5ed250b0d3252818f646e174ab414036edb884dde62d80a3ac6082d"
++dependencies = [
++ "core-foundation-sys",
++ "libc",
++]
++
++[[package]]
++name = "serde"
++version = "1.0.123"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"
++dependencies = [
++ "serde_derive",
++]
++
++[[package]]
++name = "serde_derive"
++version = "1.0.123"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "serde_json"
++version = "1.0.64"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
++dependencies = [
++ "itoa",
++ "ryu",
++ "serde",
++]
++
++[[package]]
++name = "serde_urlencoded"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
++dependencies = [
++ "form_urlencoded",
++ "itoa",
++ "ryu",
++ "serde",
++]
++
++[[package]]
++name = "sha-1"
++version = "0.9.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dfebf75d25bd900fd1e7d11501efab59bc846dbc76196839663e6637bba9f25f"
++dependencies = [
++ "block-buffer",
++ "cfg-if 1.0.0",
++ "cpuid-bool",
++ "digest",
++ "opaque-debug",
++]
++
++[[package]]
++name = "shticker_book_unwritten"
++version = "1.0.3"
++dependencies = [
++ "bzip2",
++ "clap",
++ "reqwest",
++ "rpassword",
++ "serde",
++ "serde_json",
++ "sha-1",
++]
++
++[[package]]
++name = "slab"
++version = "0.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
++
++[[package]]
++name = "socket2"
++version = "0.3.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "strsim"
++version = "0.8.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
++
++[[package]]
++name = "syn"
++version = "1.0.61"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ed22b90a0e734a23a7610f4283ac9e5acfb96cbb30dfefa540d66f866f1c09c5"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "unicode-xid",
++]
++
++[[package]]
++name = "tempfile"
++version = "3.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "rand",
++ "redox_syscall",
++ "remove_dir_all",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "textwrap"
++version = "0.11.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
++dependencies = [
++ "unicode-width",
++]
++
++[[package]]
++name = "tinyvec"
++version = "1.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023"
++dependencies = [
++ "tinyvec_macros",
++]
++
++[[package]]
++name = "tinyvec_macros"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
++
++[[package]]
++name = "tokio"
++version = "0.2.25"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092"
++dependencies = [
++ "bytes 0.5.6",
++ "fnv",
++ "futures-core",
++ "iovec",
++ "lazy_static",
++ "memchr",
++ "mio",
++ "num_cpus",
++ "pin-project-lite 0.1.12",
++ "slab",
++]
++
++[[package]]
++name = "tokio-tls"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343"
++dependencies = [
++ "native-tls",
++ "tokio",
++]
++
++[[package]]
++name = "tokio-util"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499"
++dependencies = [
++ "bytes 0.5.6",
++ "futures-core",
++ "futures-sink",
++ "log",
++ "pin-project-lite 0.1.12",
++ "tokio",
++]
++
++[[package]]
++name = "tower-service"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
++
++[[package]]
++name = "tracing"
++version = "0.1.25"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f"
++dependencies = [
++ "cfg-if 1.0.0",
++ "log",
++ "pin-project-lite 0.2.6",
++ "tracing-core",
++]
++
++[[package]]
++name = "tracing-core"
++version = "0.1.17"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
++dependencies = [
++ "lazy_static",
++]
++
++[[package]]
++name = "tracing-futures"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
++dependencies = [
++ "pin-project",
++ "tracing",
++]
++
++[[package]]
++name = "try-lock"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
++
++[[package]]
++name = "typenum"
++version = "1.12.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
++
++[[package]]
++name = "unicase"
++version = "2.6.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
++dependencies = [
++ "version_check",
++]
++
++[[package]]
++name = "unicode-bidi"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
++dependencies = [
++ "matches",
++]
++
++[[package]]
++name = "unicode-normalization"
++version = "0.1.17"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"
++dependencies = [
++ "tinyvec",
++]
++
++[[package]]
++name = "unicode-width"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
++
++[[package]]
++name = "unicode-xid"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
++
++[[package]]
++name = "url"
++version = "2.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b"
++dependencies = [
++ "form_urlencoded",
++ "idna",
++ "matches",
++ "percent-encoding",
++]
++
++[[package]]
++name = "vcpkg"
++version = "0.2.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
++
++[[package]]
++name = "vec_map"
++version = "0.8.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
++
++[[package]]
++name = "version_check"
++version = "0.9.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
++
++[[package]]
++name = "want"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
++dependencies = [
++ "log",
++ "try-lock",
++]
++
++[[package]]
++name = "wasi"
++version = "0.10.2+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
++
++[[package]]
++name = "wasm-bindgen"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7ee1280240b7c461d6a0071313e08f34a60b0365f14260362e5a2b17d1d31aa7"
++dependencies = [
++ "cfg-if 1.0.0",
++ "serde",
++ "serde_json",
++ "wasm-bindgen-macro",
++]
++
++[[package]]
++name = "wasm-bindgen-backend"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5b7d8b6942b8bb3a9b0e73fc79b98095a27de6fa247615e59d096754a3bc2aa8"
++dependencies = [
++ "bumpalo",
++ "lazy_static",
++ "log",
++ "proc-macro2",
++ "quote",
++ "syn",
++ "wasm-bindgen-shared",
++]
++
++[[package]]
++name = "wasm-bindgen-futures"
++version = "0.4.21"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8e67a5806118af01f0d9045915676b22aaebecf4178ae7021bc171dab0b897ab"
++dependencies = [
++ "cfg-if 1.0.0",
++ "js-sys",
++ "wasm-bindgen",
++ "web-sys",
++]
++
++[[package]]
++name = "wasm-bindgen-macro"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e5ac38da8ef716661f0f36c0d8320b89028efe10c7c0afde65baffb496ce0d3b"
++dependencies = [
++ "quote",
++ "wasm-bindgen-macro-support",
++]
++
++[[package]]
++name = "wasm-bindgen-macro-support"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cc053ec74d454df287b9374ee8abb36ffd5acb95ba87da3ba5b7d3fe20eb401e"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++ "wasm-bindgen-backend",
++ "wasm-bindgen-shared",
++]
++
++[[package]]
++name = "wasm-bindgen-shared"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7d6f8ec44822dd71f5f221a5847fb34acd9060535c1211b70a05844c0f6383b1"
++
++[[package]]
++name = "web-sys"
++version = "0.3.48"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ec600b26223b2948cedfde2a0aa6756dcf1fef616f43d7b3097aaf53a6c4d92b"
++dependencies = [
++ "js-sys",
++ "wasm-bindgen",
++]
++
++[[package]]
++name = "winapi"
++version = "0.2.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
++
++[[package]]
++name = "winapi"
++version = "0.3.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
++dependencies = [
++ "winapi-i686-pc-windows-gnu",
++ "winapi-x86_64-pc-windows-gnu",
++]
++
++[[package]]
++name = "winapi-build"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
++
++[[package]]
++name = "winapi-i686-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
++
++[[package]]
++name = "winapi-x86_64-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
++
++[[package]]
++name = "winreg"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69"
++dependencies = [
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "ws2_32-sys"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
++dependencies = [
++ "winapi 0.2.8",
++ "winapi-build",
++]
diff --git a/pkgs/games/shticker-book-unwritten/default.nix b/pkgs/games/shticker-book-unwritten/default.nix
new file mode 100644
index 00000000000..7dbd5c257e8
--- /dev/null
+++ b/pkgs/games/shticker-book-unwritten/default.nix
@@ -0,0 +1,25 @@
+{ buildFHSUserEnv, callPackage, lib, stdenvNoCC }:
+let
+
+  shticker-book-unwritten-unwrapped = callPackage ./unwrapped.nix { };
+
+in buildFHSUserEnv {
+  name = "shticker_book_unwritten";
+  targetPkgs = pkgs: with pkgs; [
+      alsa-lib
+      xorg.libX11
+      xorg.libXcursor
+      xorg.libXext
+      libglvnd
+      shticker-book-unwritten-unwrapped
+  ];
+  runScript = "shticker_book_unwritten";
+
+  meta = with lib; {
+    description = "Minimal CLI launcher for the Toontown Rewritten MMORPG";
+    homepage = "https://github.com/JonathanHelianthicusDoe/shticker_book_unwritten";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.reedrw ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/shticker-book-unwritten/unwrapped.nix b/pkgs/games/shticker-book-unwritten/unwrapped.nix
new file mode 100644
index 00000000000..638a9ae792e
--- /dev/null
+++ b/pkgs/games/shticker-book-unwritten/unwrapped.nix
@@ -0,0 +1,20 @@
+{ fetchFromGitHub, lib, openssl, pkg-config, rustPlatform }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "shticker-book-unwritten";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "JonathanHelianthicusDoe";
+    repo = "shticker_book_unwritten";
+    rev = "v${version}";
+    sha256 = "08lyxica0b0vvivybsvzigy2j7saar78mbz723y3g5hqrilfb5np";
+  };
+
+  cargoPatches = [ ./cargo-lock.patch ];
+  cargoSha256 = "1d4mnfzkdbqnjmqk7fl4bsy27lr7wnq997nz0hflaybnx2d3nisn";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ openssl ];
+}
diff --git a/pkgs/games/shticker-book-unwritten/update-cargo-lock.sh b/pkgs/games/shticker-book-unwritten/update-cargo-lock.sh
new file mode 100755
index 00000000000..ab84bd0abe4
--- /dev/null
+++ b/pkgs/games/shticker-book-unwritten/update-cargo-lock.sh
@@ -0,0 +1,18 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p cargo coreutils git gnugrep jq
+
+set -eu -o verbose
+
+here=$PWD
+version=$(cat unwrapped.nix | grep '^  version = "' | cut -d '"' -f 2)
+checkout=$(mktemp -d)
+git clone -b "v$version" --depth=1 https://github.com/JonathanHelianthicusDoe/shticker_book_unwritten "$checkout"
+cd "$checkout"
+
+rm -f rust-toolchain
+cargo generate-lockfile
+git add -f Cargo.lock
+git diff HEAD -- Cargo.lock > "$here"/cargo-lock.patch
+
+cd "$here"
+rm -rf "$checkout"
diff --git a/pkgs/games/sienna/default.nix b/pkgs/games/sienna/default.nix
index bedd446e34c..24f5fc08876 100644
--- a/pkgs/games/sienna/default.nix
+++ b/pkgs/games/sienna/default.nix
@@ -1,8 +1,12 @@
-{ stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
 
-let
+stdenv.mkDerivation rec {
   pname = "sienna";
   version = "1.0c";
+  src = fetchurl {
+    url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-${version}.love";
+    sha256 = "1x15276fhqspgrrv8fzkp032i2qa8piywc0yy061x59mxhdndzj6";
+  };
 
   icon = fetchurl {
     url = "http://tangramgames.dk/img/thumb/sienna.png";
@@ -13,22 +17,12 @@ let
     name = "sienna";
     exec = pname;
     icon = icon;
-    comment = "Fast-paced one button platformer"; 
+    comment = "Fast-paced one button platformer";
     desktopName = "Sienna";
     genericName = "sienna";
     categories = "Game;";
   };
 
-in
-
-stdenv.mkDerivation {
-  name = "${pname}-${version}";
-
-  src = fetchurl {
-    url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-${version}.love";
-    sha256 = "1x15276fhqspgrrv8fzkp032i2qa8piywc0yy061x59mxhdndzj6";
-  };
-
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = [ lua love ];
 
@@ -48,7 +42,7 @@ stdenv.mkDerivation {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast-paced one button platformer";
     maintainers = with maintainers; [ leenaars ];
     platforms = platforms.linux;
diff --git a/pkgs/games/sil/default.nix b/pkgs/games/sil/default.nix
index 208a14dc1c5..5f589ede2bc 100644
--- a/pkgs/games/sil/default.nix
+++ b/pkgs/games/sil/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchzip, ncurses, libX11, libXaw, libXt, libXext, libXmu, makeWrapper, writeScript, ... }:
-let 
+{ lib, stdenv, fetchzip, ncurses, libX11, libXaw, libXt, libXext, libXmu, makeWrapper, writeScript, ... }:
+let
   setup = writeScript "setup" ''
     mkdir -p "$ANGBAND_PATH"
     # Copy all the data files into place
@@ -18,7 +18,8 @@ stdenv.mkDerivation rec {
     stripRoot=false;
   };
 
-  buildInputs = [ makeWrapper ncurses libX11 libXaw libXt libXext libXmu ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ ncurses libX11 libXaw libXt libXext libXmu ];
 
   sourceRoot = "source/Sil/src";
 
@@ -26,7 +27,7 @@ stdenv.mkDerivation rec {
 
   prePatch = ''
     # Allow usage of ANGBAND_PATH
-    substituteInPlace config.h --replace "#define FIXED_PATHS" "" 
+    substituteInPlace config.h --replace "#define FIXED_PATHS" ""
   '';
 
   preConfigure = ''
@@ -38,7 +39,7 @@ stdenv.mkDerivation rec {
     mkdir -p $out/bin
     cp sil $out/bin/sil
     # Wrap the program to set a user-local ANGBAND_PATH, and run the setup script to copy files into place
-    # We could just use the options for a user-local save and scores dir, but it tried to write to the 
+    # We could just use the options for a user-local save and scores dir, but it tried to write to the
     # lib directory anyway, so we might as well give everyone a copy
     wrapProgram $out/bin/sil \
       --run "set -u" \
@@ -49,15 +50,15 @@ stdenv.mkDerivation rec {
   meta = {
     description = "A rouge-like game set in the first age of Middle-earth";
     longDescription = ''
-      A game of adventure set in the first age of Middle-earth, when the world still 
+      A game of adventure set in the first age of Middle-earth, when the world still
       rang with elven song and gleamed with dwarven mail.
 
-      Walk the dark halls of Angband.  Slay creatures black and fell.  Wrest a shining 
+      Walk the dark halls of Angband.  Slay creatures black and fell.  Wrest a shining
       Silmaril from Morgoth’s iron crown.
     '';
     homepage = "http://www.amirrorclear.net/flowers/game/sil/index.html";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = [ stdenv.lib.maintainers.michaelpj ];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.michaelpj ];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/simutrans/default.nix b/pkgs/games/simutrans/default.nix
index b75b67e0528..60b2bc5faf7 100644
--- a/pkgs/games/simutrans/default.nix
+++ b/pkgs/games/simutrans/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, pkgconfig, unzip, zlib, libpng, bzip2, SDL, SDL_mixer
+{ lib, stdenv, fetchurl, pkg-config, unzip, zlib, libpng, bzip2, SDL, SDL_mixer
 , buildEnv, config, runtimeShell
 }:
 
@@ -6,33 +6,33 @@ let
   # Choose your "paksets" of objects, images, text, music, etc.
   paksets = config.simutrans.paksets or "pak64 pak64.japan pak128 pak128.britain pak128.german";
 
-  result = with stdenv.lib; withPaks (
+  result = with lib; withPaks (
     if paksets == "*" then attrValues pakSpec # taking all
       else map (name: pakSpec.${name}) (splitString " " paksets)
   );
 
-  ver1 = "120";
-  ver2 = "4";
-  ver3 = "1";
-  version =   "${ver1}.${ver2}.${ver3}";
-  ver_dash =  "${ver1}-${ver2}-${ver3}";
+  ver1 = "121";
+  ver2 = "0";
+  ver3 = "";
+  version  = "${ver1}.${ver2}${lib.optionalString (ver3 != "") ".${ver3}"}";
+  ver_dash = "${ver1}-${ver2}${lib.optionalString (ver3 != "") "-${ver3}"}";
 
   binary_src = fetchurl {
     url = "mirror://sourceforge/simutrans/simutrans/${ver_dash}/simutrans-src-${ver_dash}.zip";
-    sha256 = "0yw7vjvmczp022mgk35swwhpbiszpz91mwsgicxglwivgc30vvic";
+    sha256 = "1f463r6kr5ig0zd3mncc74k93xbjywsq3d06j5r17831jyc9bzb9";
   };
 
 
-  # As of 2015/03, many packsets still didn't have a release for version 120.
-  pakSpec = stdenv.lib.mapAttrs
+  # As of 2021/07, many of these paksets have not been updated for years, so are on old versions.
+  pakSpec = lib.mapAttrs
     (pakName: attrs: mkPak (attrs // {inherit pakName;}))
   {
     pak64 = {
-      srcPath = "121-0/simupak64-121-0";
+      srcPath = "${ver_dash}/simupak64-${ver_dash}";
       sha256 = "1k335kh8dhm1hdn5iwn3sdgnrlpk0rqxmmgqgqcwsi09cmw45m5c";
     };
     "pak64.japan" = {
-      # No release for 120.2 yet!
+      # No release for 121.0 yet!
       srcPath = "120-0/simupak64.japan-120-0-1";
       sha256 = "14swy3h4ij74bgaw7scyvmivfb5fmp21nixmhlpk3mav3wr3167i";
     };
@@ -52,7 +52,7 @@ let
     "pak128.german" = {
       url = "mirror://sourceforge/simutrans/PAK128.german/"
         + "pak128.german_1.2_for_ST_121.0/PAK128.german_1.2_for_ST_121-0.zip";
-      sha256 = "1jxjckz4b02yv1mv1zc3pmajpq740dfnlvhr0x762lbrybymvagi";
+      sha256 = "1cv1rzl1a3i5dvk476zq094wawk9hhdh2f0y4xrdny5gn17mb2xi";
     };
 
     /* This release contains accented filenames that prevent unzipping.
@@ -115,8 +115,8 @@ let
 
     sourceRoot = ".";
 
-    nativeBuildInputs = [ pkgconfig ];
-    buildInputs = [ zlib libpng bzip2 SDL SDL_mixer unzip ];
+    nativeBuildInputs = [ pkg-config unzip ];
+    buildInputs = [ zlib libpng bzip2 SDL SDL_mixer ];
 
     configurePhase = let
       # Configuration as per the readme.txt and config.template
@@ -152,7 +152,7 @@ let
       mv build/default/sim $out/bin/simutrans
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "A simulation game in which the player strives to run a successful transport system";
       longDescription = ''
         Simutrans is a cross-platform simulation game in which the
diff --git a/pkgs/games/sm64ex/default.nix b/pkgs/games/sm64ex/default.nix
index e5aeb84fbf1..9bf6b513843 100644
--- a/pkgs/games/sm64ex/default.nix
+++ b/pkgs/games/sm64ex/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , python3
 , pkg-config
@@ -26,20 +26,20 @@
 
 stdenv.mkDerivation rec {
   pname = "sm64ex";
-  version = "unstable-2020-06-19";
+  version = "unstable-2020-10-09";
 
   src = fetchFromGitHub {
     owner = "sm64pc";
     repo = "sm64ex";
-    rev = "f5005418348cf1a53bfa75ff415a513ef0b9b273";
-    sha256 = "0adyshkqk5c4lxhdxc3j6ax4svfka26486qpa5q2gl2nixwg9zxn";
+    rev = "57c203465b2b3eee03dcb796ed1fad07d8283a2c";
+    sha256 = "0k6a3r9f4spa7y2v1lyqs9lwa05lw8xgywllb7w828nal8y33cs6";
   };
 
   nativeBuildInputs = [ python3 pkg-config ];
   buildInputs = [ audiofile SDL2 hexdump ];
 
   makeFlags = [ "VERSION=${region}" ] ++ compileFlags
-    ++ stdenv.lib.optionals stdenv.isDarwin [ "OSX_BUILD=1" ];
+    ++ lib.optionals stdenv.isDarwin [ "OSX_BUILD=1" ];
 
   inherit baseRom;
 
@@ -53,7 +53,7 @@ stdenv.mkDerivation rec {
     cp build/${region}_pc/sm64.${region}.f3dex2e $out/bin/sm64ex
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/sm64pc/sm64ex";
     description = "Super Mario 64 port based off of decompilation";
     longDescription = ''
diff --git a/pkgs/games/snake4/default.nix b/pkgs/games/snake4/default.nix
index 4c4161d5049..aee8b9e0810 100644
--- a/pkgs/games/snake4/default.nix
+++ b/pkgs/games/snake4/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, shhmsg, shhopt, xorg }:
+{ lib, stdenv, fetchurl, shhmsg, shhopt, xorg }:
 
 stdenv.mkDerivation rec {
-  name = "snake4-1.0.14";
+  pname = "snake4";
+  version = "1.0.14";
 
   src = fetchurl {
-    url = "https://shh.thathost.com/pub-unix/files/${name}.tar.gz";
+    url = "https://shh.thathost.com/pub-unix/files/snake4-${version}.tar.gz";
     sha256 = "14cng9l857np42zixp440mbc8y5675frb6lhsds53j1cws9cncw9";
   };
 
@@ -15,12 +16,12 @@ stdenv.mkDerivation rec {
       --replace "-o \$(OWNER) -g \$(GROUP)" "" \
       --replace "4755" "755"
   '';
-  
+
   installFlags = [ "INSTLIBDIR=$(out)/lib"
                    "INSTBINDIR=$(out)/bin"
                    "INSTMANDIR=$(out)/man" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A game starring a fruit-eating snake";
     homepage = "https://shh.thathost.com/pub-unix/html/snake4.html";
     license = licenses.artistic1;
diff --git a/pkgs/games/snipes/default.nix b/pkgs/games/snipes/default.nix
index 37993e32a5d..01b24ee434c 100644
--- a/pkgs/games/snipes/default.nix
+++ b/pkgs/games/snipes/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchurl, SDL2, SDL2_ttf }:
+{ lib, stdenv, fetchFromGitHub, fetchurl, SDL2, SDL2_ttf }:
 
 let
   font = fetchurl {
@@ -13,13 +13,15 @@ in stdenv.mkDerivation {
   src = fetchFromGitHub {
     owner  = "Davidebyzero";
     repo   = "Snipes";
-    rev    = "343e14104b7848eb1f882401888e685b7918ef9f";
-    sha256 = "1rl70d5miak34warbwfv27z11vln4lvf7maqqc78z0gdc5zivdv2";
+    rev    = "594af45108e07aa4159c3babc9b5e53609c3fd6e";
+    sha256 = "0gmh38swm74jmljy0bq27ipqzb4h8y9rzwc1j6harbd9qqz5knac";
   };
 
   postPatch = ''
     substitute config-sample.h config.h \
       --replace SnipesConsole.ttf $out/share/snipes/SnipesConsole.ttf
+    substituteInPlace GNUmakefile \
+      --replace 'CFLAGS=-Werror -Wall' 'CFLAGS=-Wall'
   '';
 
   enableParallelBuilding = true;
@@ -36,7 +38,7 @@ in stdenv.mkDerivation {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Modern port of the classic 1982 text-mode game Snipes";
     homepage    = "https://www.vogons.org/viewtopic.php?f=7&t=49073";
     license     = licenses.free; # This reverse-engineered source code is released with the original authors' permission.
diff --git a/pkgs/games/soi/default.nix b/pkgs/games/soi/default.nix
index 0e4722cebb1..c9d35a08dc2 100644
--- a/pkgs/games/soi/default.nix
+++ b/pkgs/games/soi/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake
+{ lib, stdenv, fetchurl, cmake
 , boost, eigen2, lua, luabind, libGLU, libGL, SDL }:
 
 stdenv.mkDerivation rec {
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
     "-DEIGEN_INCLUDE_DIR=${eigen2}/include/eigen2"
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A physics-based puzzle game";
     maintainers = with maintainers; [ raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/solarus/default.nix b/pkgs/games/solarus/default.nix
index c0daa99c15a..c42464feaed 100644
--- a/pkgs/games/solarus/default.nix
+++ b/pkgs/games/solarus/default.nix
@@ -1,25 +1,31 @@
-{ lib, mkDerivation, fetchFromGitLab, cmake, luajit,
-  SDL2, SDL2_image, SDL2_ttf, physfs,
-  openal, libmodplug, libvorbis,
-  qtbase, qttools }:
+{ lib, mkDerivation, fetchFromGitLab, cmake, luajit
+,  SDL2, SDL2_image, SDL2_ttf, physfs, glm
+, openal, libmodplug, libvorbis
+, qtbase, qttools }:
 
 mkDerivation rec {
   pname = "solarus";
-  version = "1.6.2";
+  version = "1.6.4";
 
   src = fetchFromGitLab {
     owner = "solarus-games";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0d0xfjbmamz84aajxfc0fwrj8862xxbxz6n4xnc05r1m4g7gba77";
+    sha256 = "sbdlf+R9OskDQ5U5rqUX2gF8l/fj0sDJv6BL7H1I1Ng=";
   };
 
-  buildInputs = [ cmake luajit SDL2
+  outputs = [ "out" "lib" "dev" ];
+
+  nativeBuildInputs = [ cmake qttools ];
+  buildInputs = [ luajit SDL2
     SDL2_image SDL2_ttf physfs
     openal libmodplug libvorbis
-    qtbase qttools ];
+    qtbase glm ];
 
-  enableParallelBuilding = true;
+  preFixup = ''
+    mkdir $lib/
+    mv $out/lib $lib
+  '';
 
   meta = with lib; {
     description = "A Zelda-like ARPG game engine";
diff --git a/pkgs/games/soldat-unstable/default.nix b/pkgs/games/soldat-unstable/default.nix
new file mode 100644
index 00000000000..496d51e31c4
--- /dev/null
+++ b/pkgs/games/soldat-unstable/default.nix
@@ -0,0 +1,115 @@
+{ lib, stdenv, fetchFromGitHub, fpc, zip, makeWrapper
+, SDL2, freetype, physfs, openal, gamenetworkingsockets
+, xorg, autoPatchelfHook
+}:
+
+let
+  base = stdenv.mkDerivation rec {
+    pname = "soldat-base";
+    version = "unstable-2020-11-26";
+
+    src = fetchFromGitHub {
+      name = "base";
+      owner = "Soldat";
+      repo = "base";
+      rev = "e5f9c35ec12562595b248a7a921dd3458b36b605";
+      sha256 = "0qg0p2adb5v6di44iqczswldhypdqvn1nl96vxkfkxdg9i8x90w3";
+    };
+
+    nativeBuildInputs = [ zip ];
+
+    buildPhase = ''
+      sh create_smod.sh
+    '';
+
+    installPhase = ''
+      install -Dm644 soldat.smod -t $out/share/soldat
+      install -Dm644 client/play-regular.ttf -t $out/share/soldat
+    '';
+
+    meta = with lib; {
+      description = "Soldat's base game content";
+      license = licenses.cc-by-40;
+      platforms = platforms.all;
+      inherit (src.meta) homepage;
+    };
+  };
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "soldat";
+  version = "unstable-2021-04-27";
+
+  src = fetchFromGitHub {
+    name = "soldat";
+    owner = "Soldat";
+    repo = "soldat";
+    rev = "4d17667c316ff08934e97448b7f290a8dc434e81";
+    sha256 = "1pf557psmhfaagblfwdn36cw80j7bgs0lgjq8hmjbv58dysw3jdb";
+  };
+
+  nativeBuildInputs = [ fpc makeWrapper autoPatchelfHook ];
+
+  buildInputs = [ SDL2 freetype physfs openal gamenetworkingsockets ];
+  runtimeDependencies = [ xorg.libX11 ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    mkdir -p client/build server/build
+
+    # build .so from stb headers
+    pushd client/libs/stb
+    make
+    popd
+
+    # build client
+    pushd client
+    make mode=release
+    popd
+
+    # build server
+    pushd server
+    make mode=release
+    popd
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm644 client/libs/stb/libstb.so -t $out/lib
+    install -Dm755 client/build/soldat_* $out/bin/soldat
+    install -Dm755 server/build/soldatserver_* $out/bin/soldatserver
+
+    # make sure soldat{,server} find their game archive,
+    # let them write their state and configuration files
+    # to $XDG_CONFIG_HOME/soldat/soldat{,server} unless
+    # the user specifies otherwise.
+    for p in $out/bin/soldatserver $out/bin/soldat; do
+      configDir="\''${XDG_CONFIG_HOME:-\$HOME/.config}/soldat/$(basename "$p")"
+
+      wrapProgram "$p" \
+        --run "mkdir -p \"$configDir\"" \
+        --add-flags "-fs_portable 0" \
+        --add-flags "-fs_userpath \"$configDir\"" \
+        --add-flags "-fs_basepath \"${base}/share/soldat\""
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Soldat is a unique 2D (side-view) multiplayer action game";
+    license = [ licenses.mit base.meta.license ];
+    inherit (src.meta) homepage;
+    maintainers = [ maintainers.sternenseemann ];
+    platforms = platforms.x86_64 ++ platforms.i686;
+    # portability currently mainly limited by fpc
+    # in nixpkgs which doesn't work on darwin,
+    # aarch64 and arm support should be possible:
+    # https://github.com/Soldat/soldat/issues/45
+  };
+}
diff --git a/pkgs/games/space-orbit/default.nix b/pkgs/games/space-orbit/default.nix
index e9fe6257fb6..6794a340310 100644
--- a/pkgs/games/space-orbit/default.nix
+++ b/pkgs/games/space-orbit/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 , libGLU, libGL, libXi, libXt, libXext, libX11, libXmu, freeglut
 }:
 
@@ -37,7 +37,7 @@ EOF
     chmod a+x $out/bin/space-orbit
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A space combat simulator";
     license = licenses.gpl2;
     platforms = platforms.all;
diff --git a/pkgs/games/speed-dreams/default.nix b/pkgs/games/speed-dreams/default.nix
index 473409ffae9..c0bb7b67e04 100644
--- a/pkgs/games/speed-dreams/default.nix
+++ b/pkgs/games/speed-dreams/default.nix
@@ -1,6 +1,6 @@
-{ fetchurl, stdenv, libGLU, libGL, freeglut, libX11, plib, openal, freealut, libXrandr, xorgproto,
+{ fetchurl, lib, stdenv, libGLU, libGL, freeglut, libX11, plib, openal, freealut, libXrandr, xorgproto,
 libXext, libSM, libICE, libXi, libXt, libXrender, libXxf86vm, openscenegraph, expat,
-libpng, zlib, bash, SDL2, enet, libjpeg, cmake, pkgconfig, libvorbis, runtimeShell, curl }:
+libpng, zlib, bash, SDL2, enet, libjpeg, cmake, pkg-config, libvorbis, runtimeShell, curl }:
 
 let
   version = "2.2.2-r6553";
@@ -56,7 +56,7 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  nativeBuildInputs = [ pkgconfig cmake ];
+  nativeBuildInputs = [ pkg-config cmake ];
 
   buildInputs = [ libpng libGLU libGL freeglut libX11 plib openal freealut libXrandr xorgproto
     libXext libSM libICE libXi libXt libXrender libXxf86vm zlib bash expat
@@ -65,9 +65,9 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Car racing game - TORCS fork with more experimental approach";
     homepage = "http://speed-dreams.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [raskin];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [raskin];
+    platforms = lib.platforms.linux;
     hydraPlatforms = [];
   };
 }
diff --git a/pkgs/games/spring/default.nix b/pkgs/games/spring/default.nix
index b130a7b5f77..21aca573062 100644
--- a/pkgs/games/spring/default.nix
+++ b/pkgs/games/spring/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchFromGitHub, cmake, lzma, boost, libdevil, zlib, p7zip
+{ lib, stdenv, fetchFromGitHub, cmake, xz, boost, libdevil, zlib, p7zip
 , openal, libvorbis, glew, freetype, xorg, SDL2, libGLU, libGL
-, asciidoc, libxslt, docbook_xsl, docbook_xsl_ns, curl, makeWrapper
+, asciidoc, docbook_xsl, docbook_xsl_ns, curl, makeWrapper
 , jdk ? null, python ? null, systemd, libunwind, which, minizip
 , withAI ? true # support for AI Interfaces and Skirmish AIs
 }:
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
   # taken from https://github.com/spring/spring/commits/maintenance
   src = fetchFromGitHub {
     owner = "spring";
-    repo = "spring";
+    repo = pname;
     inherit rev;
     sha256 = "1nx68d894yfmqc6df72hmk75ph26fqdvlmmq58cca0vbwpz9hf5v";
     fetchSubmodules = true;
@@ -40,26 +40,27 @@ stdenv.mkDerivation rec {
                 "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON"
                 "-DPREFER_STATIC_LIBS:BOOL=OFF"];
 
-  buildInputs = [ cmake lzma boost libdevil zlib p7zip openal libvorbis freetype SDL2
-    xorg.libX11 xorg.libXcursor libGLU libGL glew asciidoc libxslt docbook_xsl curl makeWrapper
-    docbook_xsl_ns systemd libunwind which minizip ]
-    ++ stdenv.lib.optional withAI jdk
-    ++ stdenv.lib.optional withAI python;
-
-  enableParallelBuilding = true;
+  nativeBuildInputs = [ cmake makeWrapper docbook_xsl docbook_xsl_ns asciidoc ];
+  buildInputs = [ xz boost libdevil zlib p7zip openal libvorbis freetype SDL2
+    xorg.libX11 xorg.libXcursor libGLU libGL glew curl
+    systemd libunwind which minizip ]
+    ++ lib.optional withAI jdk
+    ++ lib.optional withAI python;
 
   NIX_CFLAGS_COMPILE = "-fpermissive"; # GL header minor incompatibility
 
   postInstall = ''
     wrapProgram "$out/bin/spring" \
-      --prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc systemd ]}"
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ stdenv.cc.cc systemd ]}"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://springrts.com/";
     description = "A powerful real-time strategy (RTS) game engine";
     license = licenses.gpl2;
-    maintainers = [ maintainers.phreedom maintainers.qknight maintainers.domenkozar maintainers.sorki ];
+    maintainers = with maintainers; [ phreedom qknight domenkozar sorki ];
     platforms = platforms.linux;
+    # error: 'snprintf' was not declared in this scope
+    broken = true;
   };
 }
diff --git a/pkgs/games/spring/springlobby.nix b/pkgs/games/spring/springlobby.nix
index 9912675ee67..009457a9dad 100644
--- a/pkgs/games/spring/springlobby.nix
+++ b/pkgs/games/spring/springlobby.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake, wxGTK30, openal, pkgconfig, curl, libtorrentRasterbar
+{ lib, stdenv, fetchurl, fetchpatch, cmake, wxGTK30, openal, pkg-config, curl, libtorrent-rasterbar
 , libpng, libX11, gettext, boost, libnotify, gtk2, doxygen, spring
 , makeWrapper, glib, minizip, alure, pcre, jsoncpp }:
 
@@ -11,15 +11,20 @@ stdenv.mkDerivation rec {
     sha256 = "1r1g2hw9ipsmsmzbhsi7bxqra1za6x7j1kw12qzl5psqyq8rqbgs";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config gettext doxygen makeWrapper ];
   buildInputs = [
-    cmake wxGTK30 openal curl gettext libtorrentRasterbar pcre jsoncpp
-    boost libpng libX11 libnotify gtk2 doxygen makeWrapper glib minizip alure
+    wxGTK30 openal curl libtorrent-rasterbar pcre jsoncpp
+    boost libpng libX11 libnotify gtk2 glib minizip alure
   ];
 
-  patches = [ ./revert_58b423e.patch ./fix-certs.patch ]; # Allows springLobby to continue using system installed spring until #707 is fixed
-
-  enableParallelBuilding = true;
+  patches = [
+    ./revert_58b423e.patch # Allows springLobby to continue using system installed spring until #707 is fixed
+    ./fix-certs.patch
+    (fetchpatch {
+      url = "https://github.com/springlobby/springlobby/commit/252c4cb156c1442ed9b4faec3f26265bc7c295ff.patch";
+      sha256 = "sha256-Nq1F5fRPnCkZwl9KgrfuUmpIMK3hUOyZQYIKElWpmzU=";
+    })
+  ];
 
   postInstall = ''
     wrapProgram $out/bin/springlobby \
@@ -27,7 +32,7 @@ stdenv.mkDerivation rec {
       --set SPRING_BUNDLE_DIR "${spring}/lib"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://springlobby.info/";
     repositories.git = "git://github.com/springlobby/springlobby.git";
     description = "Cross-platform lobby client for the Spring RTS project";
diff --git a/pkgs/games/stardust/default.nix b/pkgs/games/stardust/default.nix
index 1e2089b9c50..2555950506a 100644
--- a/pkgs/games/stardust/default.nix
+++ b/pkgs/games/stardust/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, zlib, libtiff, libxml2, SDL, xorgproto, libX11
+{ lib, stdenv, fetchurl, zlib, libtiff, libxml2, SDL, xorgproto, libX11
 , libXi, libXmu, libXext, libGLU, libGL }:
 
 stdenv.mkDerivation rec {
@@ -24,7 +24,7 @@ stdenv.mkDerivation rec {
       --replace '#define PACKAGE ""' '#define PACKAGE "stardust"'
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Space flight simulator";
     maintainers = [ maintainers.raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/steam-tui/default.nix b/pkgs/games/steam-tui/default.nix
new file mode 100644
index 00000000000..968f529421d
--- /dev/null
+++ b/pkgs/games/steam-tui/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, rustPlatform
+, steamcmd
+, fetchFromGitHub
+, steam-run-native
+, runtimeShell
+, withWine ? false
+, wine
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "steam-tui";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "dmadisetti";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-UTXYlPecv0MVonr9zZwfwopfC/Fdch/ZSCxqgUsem40=";
+  };
+
+  cargoSha256 = "sha256-VYBzwDLSV4N4qt2dNgIS399T2HIbPTdQ2rDIeheLlfo=";
+
+  buildInputs = [ steamcmd steam-run-native ]
+    ++ lib.optional withWine wine;
+
+  preFixup = ''
+    mv $out/bin/steam-tui $out/bin/.steam-tui-unwrapped
+    cat > $out/bin/steam-tui <<EOF
+    #!${runtimeShell}
+    export PATH=${steamcmd}/bin:\$PATH
+    exec ${steam-run-native}/bin/steam-run $out/bin/.steam-tui-unwrapped '\$@'
+    EOF
+    chmod +x $out/bin/steam-tui
+  '';
+
+  meta = with lib; {
+    description = "Rust TUI client for steamcmd";
+    homepage = "https://github.com/dmadisetti/steam-tui";
+    license = licenses.mit;
+    maintainers = with maintainers; [ legendofmiracles ];
+    # steam only supports that platform
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/games/steam/fhsenv.nix b/pkgs/games/steam/fhsenv.nix
index 2c7cde78c43..b2c303caa54 100644
--- a/pkgs/games/steam/fhsenv.nix
+++ b/pkgs/games/steam/fhsenv.nix
@@ -6,6 +6,7 @@
 , nativeOnly ? false
 , runtimeOnly ? false
 , runtimeShell
+, stdenv
 
 # DEPRECATED
 , withJava ? config.steam.java or false
@@ -28,35 +29,49 @@ let
       # Needed by gdialog, including in the steam-runtime
       perl
       # Open URLs
-      xdg_utils
+      xdg-utils
       iana-etc
       # Steam Play / Proton
       python3
       # Steam VR
       procps
       usbutils
-    ] ++ lib.optional withJava jdk
+
+      # electron based launchers need newer versions of these libraries than what runtime provides
+      mesa
+      sqlite
+    ] ++ lib.optional withJava jdk8 # TODO: upgrade https://github.com/NixOS/nixpkgs/pull/89731
       ++ lib.optional withPrimus primus
       ++ extraPkgs pkgs;
 
-  ldPath = map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs
-           ++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs);
+  ldPath = lib.optionals stdenv.is64bit [ "/lib64" ]
+  ++ [ "/lib32" ]
+  ++ map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs
+  ++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs);
 
   # Zachtronics and a few other studios expect STEAM_LD_LIBRARY_PATH to be present
   exportLDPath = ''
-    export LD_LIBRARY_PATH=/lib32:/lib64:${lib.concatStringsSep ":" ldPath}\''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
     export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
   '';
 
+  # bootstrap.tar.xz has 444 permissions, which means that simple deletes fail
+  # and steam will not be able to start
+  fixBootstrap = ''
+    if [ -r $HOME/.local/share/Steam/bootstrap.tar.xz ]; then
+      chmod +w $HOME/.local/share/Steam/bootstrap.tar.xz
+    fi
+  '';
+
   setupSh = writeScript "setup.sh" ''
     #!${runtimeShell}
   '';
 
   runSh = writeScript "run.sh" ''
     #!${runtimeShell}
-    runtime_paths="/lib32:/lib64:${lib.concatStringsSep ":" ldPath}"
+    runtime_paths="${lib.concatStringsSep ":" ldPath}"
     if [ "$1" == "--print-steam-runtime-library-paths" ]; then
-      echo "$runtime_paths"
+      echo "$runtime_paths''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
       exit 0
     fi
     export LD_LIBRARY_PATH="$runtime_paths''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
@@ -70,7 +85,7 @@ in buildFHSUserEnv rec {
   targetPkgs = pkgs: with pkgs; [
     steamPackages.steam
     # License agreement
-    gnome3.zenity
+    gnome.zenity
   ] ++ commonTargetPkgs pkgs;
 
   multiPkgs = pkgs: with pkgs; [
@@ -83,13 +98,17 @@ in buildFHSUserEnv rec {
     xorg.libXfixes
     libGL
     libva
+    pipewire.lib
 
     # Not formally in runtime but needed by some games
     at-spi2-atk
     at-spi2-core   # CrossCode
     gst_all_1.gstreamer
     gst_all_1.gst-plugins-ugly
+    gst_all_1.gst-plugins-base
+    json-glib # paradox launcher (Stellaris)
     libdrm
+    libxkbcommon # paradox launcher
     mono
     xorg.xkeyboardconfig
     xorg.libpciaccess
@@ -117,7 +136,29 @@ in buildFHSUserEnv rec {
     libGLU
     libuuid
     libbsd
-    alsaLib
+    alsa-lib
+
+    # Loop Hero
+    libidn2
+    libpsl
+    nghttp2.lib
+    openssl_1_1
+    rtmpdump
+
+    # needed by getcap for vr startup
+    libcap
+
+    # dependencies for mesa drivers, needed inside pressure-vessel
+    mesa.drivers
+    mesa.llvmPackages.llvm.lib
+    vulkan-loader
+    expat
+    wayland
+    xorg.libxcb
+    xorg.libXdamage
+    xorg.libxshmfence
+    xorg.libXxf86vm
+    libelf
   ] ++ (if (!nativeOnly) then [
     (steamPackages.steam-runtime-wrapped.override {
       inherit runtimeOnly;
@@ -155,7 +196,7 @@ in buildFHSUserEnv rec {
     SDL2
     libusb1
     dbus-glib
-    libav
+    ffmpeg
     atk
     # Only libraries are needed from those two
     libudev0-shim
@@ -170,12 +211,9 @@ in buildFHSUserEnv rec {
     SDL
     SDL2_image
     glew110
-    openssl
     libidn
     tbb
     wayland
-    mesa
-    libxkbcommon
 
     # Other things from runtime
     flac
@@ -193,8 +231,6 @@ in buildFHSUserEnv rec {
     SDL_mixer
     SDL2_ttf
     SDL2_mixer
-    gstreamer
-    gst-plugins-base
     libappindicator-gtk2
     libcaca
     libcanberra
@@ -205,7 +241,14 @@ in buildFHSUserEnv rec {
     libvdpau
   ] ++ steamPackages.steam-runtime-wrapped.overridePkgs) ++ extraLibraries pkgs;
 
-  extraBuildCommands = if (!nativeOnly) then ''
+  extraBuildCommands = ''
+    if [ -f $out/usr/share/vulkan/icd.d/nvidia_icd.json ]; then
+      cp $out/usr/share/vulkan/icd.d/nvidia_icd{,32}.json
+      nvidia32Lib=$(realpath $out/lib32/libGLX_nvidia.so.0 | cut -d'/' -f-4)
+      escapedNvidia32Lib="''${nvidia32Lib//\//\\\/}"
+      sed -i "s/\/nix\/store\/.*\/lib\/libGLX_nvidia\.so\.0/$escapedNvidia32Lib\/lib\/libGLX_nvidia\.so\.0/g" $out/usr/share/vulkan/icd.d/nvidia_icd32.json
+    fi
+  '' + (if (!nativeOnly) then ''
     mkdir -p steamrt
     ln -s ../lib/steam-runtime steamrt/${steam-runtime-wrapped.arch}
     ${lib.optionalString (steam-runtime-wrapped-i686 != null) ''
@@ -218,13 +261,13 @@ in buildFHSUserEnv rec {
     ${lib.optionalString (steam-runtime-wrapped-i686 != null) ''
       ln -s /usr/lib32/libbz2.so usr/lib32/libbz2.so.1.0
     ''}
-  '';
+  '');
 
   extraInstallCommands = ''
     mkdir -p $out/share/applications
     ln -s ${steam}/share/icons $out/share
     ln -s ${steam}/share/pixmaps $out/share
-    sed "s,/usr/bin/steam,$out/bin/steam,g" ${steam}/share/applications/steam.desktop > $out/share/applications/steam.desktop
+    ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop
   '';
 
   profile = ''
@@ -238,6 +281,8 @@ in buildFHSUserEnv rec {
     fi
 
     export STEAM_RUNTIME=${if nativeOnly then "0" else "/steamrt"}
+
+    export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/intel_icd.x86_64.json:/usr/share/vulkan/icd.d/intel_icd.i686.json:/usr/share/vulkan/icd.d/lvp_icd.x86_64.json:/usr/share/vulkan/icd.d/lvp_icd.i686.json:/usr/share/vulkan/icd.d/nvidia_icd.json:/usr/share/vulkan/icd.d/nvidia_icd32.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json:/usr/share/vulkan/icd.d/radeon_icd.i686.json
   '' + extraProfile;
 
   runScript = writeScript "steam-wrapper.sh" ''
@@ -259,6 +304,7 @@ in buildFHSUserEnv rec {
       fi
     fi
     ${lib.optionalString (!nativeOnly) exportLDPath}
+    ${fixBootstrap}
     exec steam "$@"
   '';
 
@@ -266,12 +312,23 @@ in buildFHSUserEnv rec {
     broken = nativeOnly;
   };
 
+  # allows for some gui applications to share IPC
+  # this fixes certain issues where they don't render correctly
+  unshareIpc = false;
+
+  # Some applications such as Natron need access to MIT-SHM or other
+  # shared memory mechanisms. Unsharing the pid namespace
+  # breaks the ability for application to reference shared memory.
+  unsharePid = false;
+
   passthru.run = buildFHSUserEnv {
     name = "steam-run";
 
     targetPkgs = commonTargetPkgs;
     inherit multiPkgs extraBuildCommands;
 
+    inherit unshareIpc unsharePid;
+
     runScript = writeScript "steam-run" ''
       #!${runtimeShell}
       run="$1"
@@ -281,6 +338,7 @@ in buildFHSUserEnv rec {
       fi
       shift
       ${lib.optionalString (!nativeOnly) exportLDPath}
+      ${fixBootstrap}
       exec -- "$run" "$@"
     '';
   };
diff --git a/pkgs/games/steam/fonts.nix b/pkgs/games/steam/fonts.nix
index 44dde01a8a8..65efd42a22a 100644
--- a/pkgs/games/steam/fonts.nix
+++ b/pkgs/games/steam/fonts.nix
@@ -1,14 +1,15 @@
 { stdenv, fetchurl, unzip }:
 
 stdenv.mkDerivation {
-  name = "steam-fonts-1";
+  pname = "steam-fonts";
+  version = "1";
 
   src = fetchurl {
     url = "https://support.steampowered.com/downloads/1974-YFKL-4947/SteamFonts.zip";
     sha256 = "1cgygmwich5f1jhhbmbkkpnzasjl8gy36xln76n6r2gjh6awqfx0";
   };
 
-  buildInputs = [ unzip ];
+  nativeBuildInputs = [ unzip ];
 
   sourceRoot = ".";
 
diff --git a/pkgs/games/steam/runtime-wrapped.nix b/pkgs/games/steam/runtime-wrapped.nix
index 8e4f5b866bb..765ecbed28f 100644
--- a/pkgs/games/steam/runtime-wrapped.nix
+++ b/pkgs/games/steam/runtime-wrapped.nix
@@ -6,7 +6,7 @@ let
   overridePkgs = lib.optionals (!runtimeOnly) (with pkgs; [
     libgpgerror
     libpulseaudio
-    alsaLib
+    alsa-lib
     openalSoft
     libva1
     libvdpau
diff --git a/pkgs/games/steam/runtime.nix b/pkgs/games/steam/runtime.nix
index 4f373b9be30..a986e1baa2c 100644
--- a/pkgs/games/steam/runtime.nix
+++ b/pkgs/games/steam/runtime.nix
@@ -1,14 +1,18 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl
+
+# for update script
+, writeShellScript, curl, nix-update
+}:
 
 stdenv.mkDerivation rec {
 
-  name = "steam-runtime";
+  pname = "steam-runtime";
   # from https://repo.steampowered.com/steamrt-images-scout/snapshots/
-  version = "0.20200720.0";
+  version = "0.20210630.0";
 
   src = fetchurl {
     url = "https://repo.steampowered.com/steamrt-images-scout/snapshots/${version}/steam-runtime.tar.xz";
-    sha256 = "03qdlr1xk84jb4c60ilis00vjhj70bxc0bbgk5g5b1883l2frljd";
+    sha256 = "sha256-vwSgk3hEaI/RO9uvehAx3+ZBynpqjwGDzuyeyGCnu18=";
     name = "scout-runtime-${version}.tar.gz";
   };
 
@@ -17,7 +21,14 @@ stdenv.mkDerivation rec {
     tar -C $out --strip=1 -x -f $src
   '';
 
-  meta = with stdenv.lib; {
+  passthru = {
+    updateScript = writeShellScript "update.sh" ''
+      version=$(${curl}/bin/curl https://repo.steampowered.com/steamrt-images-scout/snapshots/latest-steam-client-general-availability/VERSION.txt)
+      ${nix-update}/bin/nix-update --version "$version" steamPackages.steam-runtime
+    '';
+  };
+
+  meta = with lib; {
     description = "The official runtime used by Steam";
     homepage = "https://github.com/ValveSoftware/steam-runtime";
     license = licenses.unfreeRedistributable; # Includes NVIDIA CG toolkit
diff --git a/pkgs/games/steam/steam.nix b/pkgs/games/steam/steam.nix
index 830c97b2fb7..f9883633576 100644
--- a/pkgs/games/steam/steam.nix
+++ b/pkgs/games/steam/steam.nix
@@ -1,23 +1,23 @@
-{stdenv, fetchurl, runtimeShell, traceDeps ? false}:
+{ lib, stdenv, fetchurl, runtimeShell, traceDeps ? false, bash }:
 
 let
   traceLog = "/tmp/steam-trace-dependencies.log";
-  version = "1.0.0.61";
+  version = "1.0.0.70";
 
 in stdenv.mkDerivation {
   pname = "steam-original";
   inherit version;
 
   src = fetchurl {
-    url = "http://repo.steampowered.com/steam/pool/steam/s/steam/steam_${version}.tar.gz";
-    sha256 = "0c5xy57gwr14vp3wy3jpqi5dl6y7n01p2dy4jlgl9bf9x7616r6n";
+    url = "https://repo.steampowered.com/steam/archive/stable/steam_${version}.tar.gz";
+    sha256 = "sha256-n/iKV3jHsA77GPMk1M0MKC1fQ42tEgG8Ppgi4/9qLf8=";
   };
 
   makeFlags = [ "DESTDIR=$(out)" "PREFIX=" ];
 
   postInstall = ''
     rm $out/bin/steamdeps
-    ${stdenv.lib.optionalString traceDeps ''
+    ${lib.optionalString traceDeps ''
       cat > $out/bin/steamdeps <<EOF
       #!${runtimeShell}
       echo \$1 >> ${traceLog}
@@ -26,14 +26,22 @@ in stdenv.mkDerivation {
       EOF
       chmod +x $out/bin/steamdeps
     ''}
-    install -d $out/lib/udev/rules.d
-    install -m644 lib/udev/rules.d/*.rules $out/lib/udev/rules.d
+
+    # install udev rules
+    mkdir -p $out/etc/udev/rules.d/
+    cp ./subprojects/steam-devices/*.rules $out/etc/udev/rules.d/
+    substituteInPlace $out/etc/udev/rules.d/60-steam-input.rules \
+      --replace "/bin/sh" "${bash}/bin/bash"
+
+    # this just installs a link, "steam.desktop -> /lib/steam/steam.desktop"
+    rm $out/share/applications/steam.desktop
+    sed -e 's,/usr/bin/steam,steam,g' steam.desktop > $out/share/applications/steam.desktop
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A digital distribution platform";
     homepage = "http://store.steampowered.com/";
     license = licenses.unfreeRedistributable;
-    maintainers = with maintainers; [ jagajaga ];
+    maintainers = with maintainers; [ jagajaga jonringer ];
   };
 }
diff --git a/pkgs/games/steam/steamcmd.nix b/pkgs/games/steam/steamcmd.nix
index 223dff332a7..1c834f1c2ea 100644
--- a/pkgs/games/steam/steamcmd.nix
+++ b/pkgs/games/steam/steamcmd.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, steam-run, bash, coreutils
+{ lib, stdenv, fetchurl, steam-run, bash, coreutils
 , steamRoot ? "~/.local/share/Steam"
 }:
 
@@ -36,7 +36,7 @@ stdenv.mkDerivation {
     chmod 0755 $out/bin/steamcmd
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Steam command-line tools";
     homepage = "https://developer.valvesoftware.com/wiki/SteamCMD";
     platforms = platforms.linux;
diff --git a/pkgs/games/stepmania/default.nix b/pkgs/games/stepmania/default.nix
index f6cfb873709..70e1acb1f34 100644
--- a/pkgs/games/stepmania/default.nix
+++ b/pkgs/games/stepmania/default.nix
@@ -1,5 +1,5 @@
 { stdenv, lib, fetchFromGitHub, cmake, nasm
-, gtk2, glib, ffmpeg, alsaLib, libmad, libogg, libvorbis
+, gtk2, glib, ffmpeg, alsa-lib, libmad, libogg, libvorbis
 , glew, libpulseaudio, udev
 }:
 
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ cmake nasm ];
 
   buildInputs = [
-    gtk2 glib ffmpeg alsaLib libmad libogg libvorbis
+    gtk2 glib ffmpeg alsa-lib libmad libogg libvorbis
     glew libpulseaudio udev
   ];
 
@@ -32,8 +32,6 @@ stdenv.mkDerivation rec {
     ln -s $out/stepmania-5.1/stepmania $out/bin/stepmania
   '';
 
-  enableParallelBuilding = true;
-
   meta = with lib; {
     homepage = "https://www.stepmania.com/";
     description = "Free dance and rhythm game for Windows, Mac, and Linux";
diff --git a/pkgs/games/stockfish/default.nix b/pkgs/games/stockfish/default.nix
index 5e8429f0336..5aa2408afd1 100644
--- a/pkgs/games/stockfish/default.nix
+++ b/pkgs/games/stockfish/default.nix
@@ -1,37 +1,61 @@
-{ stdenv, fetchurl }:
-
-let arch = if stdenv.isx86_64 then "x86-64" else
+{ lib, stdenv, fetchurl, fetchFromGitHub }:
+
+let
+    # The x86-64-modern may need to be refined further in the future
+    # but stdenv.hostPlatform CPU flags do not currently work on Darwin
+    # https://discourse.nixos.org/t/darwin-system-and-stdenv-hostplatform-features/9745
+    archDarwin = if stdenv.isx86_64 then "x86-64-modern" else "x86-64";
+    arch = if stdenv.isDarwin then archDarwin else
+           if stdenv.isx86_64 then "x86-64" else
            if stdenv.isi686 then "x86-32" else
+           if stdenv.isAarch64 then "armv8" else
            "unknown";
 
-    version = "11";
+    nnueFile = "nn-3475407dc199.nnue";
+    nnue = fetchurl {
+      name = nnueFile;
+      url = "https://tests.stockfishchess.org/api/nn/${nnueFile}";
+      sha256 = "sha256-NHVAfcGZc+pERnZ4Y0zOAj1iDkGXcMERzIk3/maJ7Ic=";
+    };
 in
 
-stdenv.mkDerivation {
-
+stdenv.mkDerivation rec {
   pname = "stockfish";
-  inherit version;
+  version = "14";
 
-  src = fetchurl {
-    url = "https://github.com/official-stockfish/Stockfish/archive/sf_${version}.tar.gz";
-    sha256 = "16di83s79gf9kzdhcal5y0q9d59544gd5xqf1k8bwrqvc36628l0";
+  src = fetchFromGitHub {
+    owner = "official-stockfish";
+    repo = "Stockfish";
+    rev = "sf_${version}";
+    sha256 = "sha256-fX0Tr1yqjmNRSxmisFRKUY1E5//qF3zAfJ8innAeyxA=";
   };
 
-  postUnpack = "sourceRoot+=/src";
-  makeFlags = [ "PREFIX=$(out)" "ARCH=${arch}" ];
+  # This addresses a linker issue with Darwin
+  # https://github.com/NixOS/nixpkgs/issues/19098
+  preBuild = lib.optionalString stdenv.isDarwin ''
+    sed -i.orig '/^\#\#\# 3.*Link Time Optimization/,/^\#\#\# 3/d' Makefile
+  '';
+
+  postUnpack = ''
+    sourceRoot+=/src
+    echo ${nnue}
+    cp "${nnue}" "$sourceRoot/${nnueFile}"
+  '';
+
+  makeFlags = [ "PREFIX=$(out)" "ARCH=${arch}" "CXX=${stdenv.cc.targetPrefix}c++" ];
   buildFlags = [ "build" ];
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://stockfishchess.org/";
     description = "Strong open source chess engine";
     longDescription = ''
       Stockfish is one of the strongest chess engines in the world. It is also
       much stronger than the best human chess grandmasters.
       '';
-    maintainers = with maintainers; [ luispedro peti ];
-    platforms = ["x86_64-linux" "i686-linux"];
+    maintainers = with maintainers; [ luispedro peti siraben ];
+    platforms = ["x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux"];
     license = licenses.gpl2;
   };
 
diff --git a/pkgs/games/stuntrally/default.nix b/pkgs/games/stuntrally/default.nix
index 98a3ca88317..bf9e034d7b4 100644
--- a/pkgs/games/stuntrally/default.nix
+++ b/pkgs/games/stuntrally/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv, cmake, boost, ogre, mygui, ois, SDL2, libvorbis, pkgconfig
+{ lib, fetchurl, stdenv, cmake, boost, ogre, mygui, ois, SDL2, libvorbis, pkg-config
 , makeWrapper, enet, libXcursor, bullet, openal }:
 
 stdenv.mkDerivation rec {
@@ -26,14 +26,12 @@ stdenv.mkDerivation rec {
     popd
   '';
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ cmake boost ogre mygui ois SDL2 libvorbis 
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ boost ogre mygui ois SDL2 libvorbis
     makeWrapper enet libXcursor bullet openal
   ];
 
-  enableParallelBuilding = true;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Stunt Rally game with Track Editor, based on VDrift and OGRE";
     homepage = "http://stuntrally.tuxfamily.org/";
     license = licenses.gpl3Plus;
diff --git a/pkgs/games/super-tux-kart/default.nix b/pkgs/games/super-tux-kart/default.nix
index b3a7966071a..3589e10e7a5 100644
--- a/pkgs/games/super-tux-kart/default.nix
+++ b/pkgs/games/super-tux-kart/default.nix
@@ -1,15 +1,35 @@
-{ lib, stdenv, fetchFromGitHub, fetchsvn, cmake, pkgconfig, makeWrapper
-, openal, freealut, libGLU, libGL, libvorbis, libogg, gettext, curl, freetype, glew
-, fribidi, libtool, bluez, libjpeg, libpng, zlib, libX11, libXrandr, harfbuzz
-, mcpp, wiiuse, angelscript
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, fetchsvn
+, cmake
+, pkg-config
+, makeWrapper
+, SDL2
+, glew
+, openal
+, OpenAL
+, libvorbis
+, libogg
+, curl
+, freetype
+, libjpeg
+, libpng
+, harfbuzz
+, mcpp
+, wiiuse
+, angelscript
+, Cocoa
+, IOKit
 }:
 let
   dir = "stk-code";
   assets = fetchsvn {
-    url    = "https://svn.code.sf.net/p/supertuxkart/code/stk-assets";
-    rev    = "18212";
-    sha256 = "1dyj8r5rfifhnhayga8w8irkpa99vw57xjmy74cp8xz8g7zvdzqf";
-    name   = "stk-assets";
+    url = "https://svn.code.sf.net/p/supertuxkart/code/stk-assets";
+    rev = "18218";
+    sha256 = "11iv3cqzvbjg33zz5i5gkl2syn6mlw9wqv0jc7h36vjnjqjv17xw";
+    name = "stk-assets";
   };
 
   # List of bundled libraries in stk-code/lib to keep
@@ -33,50 +53,88 @@ let
     "libraqm"
     # Not packaged to this date
     "libsquish"
-  ];
-in stdenv.mkDerivation rec {
+    # Not packaged to this date
+    "sheenbidi"
+  ]
+  # Our system angelscript causes linking error on ARM
+  # ld: libangelscript.so: undefined reference to
+  # `CallSystemFunctionNative(asCContext*, asCScriptFunction*, void*, unsigned int*, void*, unsigned long&, void*)'
+  # Bundled angelscript compiles fine
+  ++ lib.optional stdenv.hostPlatform.isAarch64 "angelscript";
+in
+stdenv.mkDerivation rec {
 
   pname = "supertuxkart";
-  version = "1.1";
+  version = "1.2";
 
   src = fetchFromGitHub {
-    owner  = "supertuxkart";
-    repo   = "stk-code";
-    rev    = version;
-    sha256 = "01vxxl94583ixswzmi4caz8dk64r56pn3zxh7v63zml60yfvxbvp";
-    name   = dir;
+    owner = "supertuxkart";
+    repo = "stk-code";
+    rev = version;
+    sha256 = "1f98whk0v45jgwcsbdsb1qfambvrnbbgwq0w28kjz4278hinwzq6";
+    name = dir;
   };
 
-  # Deletes all bundled libs in stk-code/lib except those
-  # That couldn't be replaced with system packages
+  patches = [
+    (fetchpatch {
+      # Fix build with SDL 2.0.14
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/games-action/supertuxkart/files/supertuxkart-1.2-new-sdl.patch?id=288360dc7ce2f968a2f12099edeace3f3ed1a705";
+      sha256 = "1jgab9393qan8qbqf5bf8cgw4mynlr5a6pggqhybzsmaczgnns3n";
+    })
+  ];
+
   postPatch = ''
+    # Deletes all bundled libs in stk-code/lib except those
+    # That couldn't be replaced with system packages
     find lib -maxdepth 1 -type d | egrep -v "^lib$|${(lib.concatStringsSep "|" bundledLibraries)}" | xargs -n1 -L1 -r -I{} rm -rf {}
+
+    # Allow building with system-installed wiiuse on Darwin
+    substituteInPlace CMakeLists.txt \
+      --replace 'NOT (APPLE OR HAIKU)) AND USE_SYSTEM_WIIUSE' 'NOT (HAIKU)) AND USE_SYSTEM_WIIUSE'
   '';
 
-  nativeBuildInputs = [ cmake gettext libtool pkgconfig makeWrapper ];
+  nativeBuildInputs = [ cmake pkg-config makeWrapper ];
 
   buildInputs = [
-    libX11 libXrandr
-    openal freealut libGLU libGL libvorbis libogg zlib freetype glew
-    curl fribidi bluez libjpeg libpng harfbuzz
-    mcpp wiiuse angelscript
-  ];
+    SDL2
+    glew
+    libvorbis
+    libogg
+    freetype
+    curl
+    libjpeg
+    libpng
+    harfbuzz
+    mcpp
+    wiiuse
+  ]
+  ++ lib.optional (!stdenv.hostPlatform.isAarch64) angelscript
+  ++ lib.optional stdenv.hostPlatform.isLinux openal
+  ++ lib.optionals stdenv.hostPlatform.isDarwin [ OpenAL IOKit Cocoa ];
 
   cmakeFlags = [
-    "-DBUILD_RECORDER=OFF"         # libopenglrecorder is not in nixpkgs
-    "-DUSE_SYSTEM_ANGELSCRIPT=OFF" # doesn't work with 2.31.2 or 2.32.0
+    "-DBUILD_RECORDER=OFF" # libopenglrecorder is not in nixpkgs
+    # doesn't work with our 2.35.0 on aarch64-linux
+    "-DUSE_SYSTEM_ANGELSCRIPT=${if !stdenv.hostPlatform.isAarch64 then "ON" else "OFF"}"
     "-DCHECK_ASSETS=OFF"
     "-DUSE_SYSTEM_WIIUSE=ON"
-    "-DUSE_SYSTEM_ANGELSCRIPT=ON"
+    "-DOpenGL_GL_PREFERENCE=GLVND"
   ];
 
+  # Extract binary from built app bundle
+  postInstall = lib.optionalString stdenv.hostPlatform.isDarwin ''
+    mkdir $out/bin
+    mv $out/{supertuxkart.app/Contents/MacOS,bin}/supertuxkart
+    rm -rf $out/supertuxkart.app
+  '';
+
   # Obtain the assets directly from the fetched store path, to avoid duplicating assets across multiple engine builds
   preFixup = ''
-    wrapProgram $out/bin/supertuxkart --set-default SUPERTUXKART_ASSETS_DIR "${assets}"
+    wrapProgram $out/bin/supertuxkart \
+      --set-default SUPERTUXKART_ASSETS_DIR "${assets}" \
+      --set-default SUPERTUXKART_DATADIR "$out/share/supertuxkart" \
   '';
 
-  enableParallelBuilding = true;
-
   meta = with lib; {
     description = "A Free 3D kart racing game";
     longDescription = ''
@@ -87,6 +145,7 @@ in stdenv.mkDerivation rec {
     homepage = "https://supertuxkart.net/";
     license = licenses.gpl2Plus;
     maintainers = with maintainers; [ pyrolagus peterhoeg ];
-    platforms = with platforms; linux;
+    platforms = with platforms; unix;
+    changelog = "https://github.com/supertuxkart/stk-code/blob/${version}/CHANGELOG.md";
   };
 }
diff --git a/pkgs/games/supertux/default.nix b/pkgs/games/supertux/default.nix
index 68b49fd5517..31b36efc490 100644
--- a/pkgs/games/supertux/default.nix
+++ b/pkgs/games/supertux/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake, pkgconfig, SDL2, SDL2_image , curl
+{ lib, stdenv, fetchurl, cmake, pkg-config, SDL2, SDL2_image , curl
 , libogg, libvorbis, libGLU, libGL, openal, boost, glew
 , libpng, freetype
 }:
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
     sha256 = "167m3z4m8n76dvbv42m1fnvabpbpsxvr28zk9641916jl9pfba96";
   };
 
-  nativeBuildInputs = [ pkgconfig cmake ];
+  nativeBuildInputs = [ pkg-config cmake ];
 
   buildInputs = [ SDL2 SDL2_image curl libogg libvorbis libGLU libGL openal boost glew
     libpng freetype
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
     ln -s $out/games/supertux2 $out/bin
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Classic 2D jump'n run sidescroller game";
     homepage = "http://supertux.github.io/";
     license = licenses.gpl2;
diff --git a/pkgs/games/system-syzygy/default.nix b/pkgs/games/system-syzygy/default.nix
index 4343a27fb49..f01f93572ba 100644
--- a/pkgs/games/system-syzygy/default.nix
+++ b/pkgs/games/system-syzygy/default.nix
@@ -23,7 +23,7 @@ rustPlatform.buildRustPackage rec {
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = [ SDL2 ];
 
-  cargoSha256 = "001cwdq8zxji56yahwfsydi7s0j7c5zsip60lxk3qmn078wcipdp";
+  cargoSha256 = "1jp9wnavq92w52ksj2q9fi3y58wq7ybfkx2kfbx2i2xv8d7y88ax";
 
   postInstall = ''
     mkdir -p $out/share/syzygy/
diff --git a/pkgs/games/t4kcommon/default.nix b/pkgs/games/t4kcommon/default.nix
index f2e226cb570..74757c236c5 100644
--- a/pkgs/games/t4kcommon/default.nix
+++ b/pkgs/games/t4kcommon/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchurl, cmake, pkgconfig, SDL, SDL_image, SDL_mixer, SDL_net, SDL_ttf, libpng, librsvg, libxml2 }:
+{ lib, stdenv, fetchFromGitHub, fetchurl, cmake, pkg-config, SDL, SDL_image, SDL_mixer, SDL_net, SDL_ttf, libpng, librsvg, libxml2 }:
 
 stdenv.mkDerivation rec {
   version = "0.1.1";
@@ -19,11 +19,11 @@ stdenv.mkDerivation rec {
     })
   ];
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
   buildInputs = [ SDL SDL_image SDL_mixer SDL_net SDL_ttf libpng librsvg libxml2 ];
 
-  meta = with stdenv.lib; {
-    description = "A library of code shared between tuxmath and tuxtype.";
+  meta = with lib; {
+    description = "A library of code shared between tuxmath and tuxtype";
     homepage = "https://github.com/tux4kids/t4kcommon";
     license = licenses.gpl3Plus;
     maintainers = [ maintainers.aanderse ];
diff --git a/pkgs/games/taisei/default.nix b/pkgs/games/taisei/default.nix
index 3c4d0df2b03..4bc04a336f8 100644
--- a/pkgs/games/taisei/default.nix
+++ b/pkgs/games/taisei/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 # Build depends
-, docutils, meson, ninja, pkgconfig, python3
+, docutils, meson, ninja, pkg-config, python3
 # Runtime depends
 , glfw, SDL2, SDL2_mixer
 , freetype, libpng, libwebp, libzip, zlib
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [
-    docutils meson ninja pkgconfig python3
+    docutils meson ninja pkg-config python3
   ];
 
   buildInputs = [
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
     patchShebangs .
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free and open-source Touhou Project clone and fangame";
     longDescription = ''
       Taisei is an open clone of the Tōhō Project series. Tōhō is a one-man
diff --git a/pkgs/games/tcl2048/default.nix b/pkgs/games/tcl2048/default.nix
index 765c50149ac..b2796225a6c 100644
--- a/pkgs/games/tcl2048/default.nix
+++ b/pkgs/games/tcl2048/default.nix
@@ -1,34 +1,27 @@
-{ stdenv, fetchurl, tcl, tcllib, runtimeShell }:
+{ lib, stdenv, fetchurl, tcl, tcllib, runtimeShell }:
 
-stdenv.mkDerivation {
-  name = "tcl2048-0.4.0";
+tcl.mkTclDerivation rec {
+  pname = "tcl2048";
+  version = "0.4.0";
 
   src = fetchurl {
-    url = "https://raw.githubusercontent.com/dbohdan/2048.tcl/v0.4.0/2048.tcl";
+    url = "https://raw.githubusercontent.com/dbohdan/2048.tcl/v${version}/2048.tcl";
     sha256 = "53f5503efd7f029b2614b0f9b1e3aac6c0342735a3c9b811d74a5135fee3e89e";
   };
 
-  phases = "installPhase";
+  buildInputs = [ tcllib ];
+  dontUnpack = true;
 
   installPhase = ''
     mkdir -pv $out/bin
-    cp $src $out/2048.tcl
-    cat > $out/bin/2048 << EOF
-    #!${runtimeShell}
-
-    # wrapper for tcl2048
-    export TCLLIBPATH="${tcllib}/lib/tcllib${tcllib.version}"
-    ${tcl}/bin/tclsh $out/2048.tcl
-    EOF
-
-    chmod +x $out/bin/2048
+    install -m 755 $src $out/bin/2048
   '';
 
   meta = {
     homepage = "https://github.com/dbohdan/2048.tcl";
     description = "The game of 2048 implemented in Tcl";
-    license = stdenv.lib.licenses.mit;
-    platforms = stdenv.lib.platforms.all;
-    maintainers = with stdenv.lib.maintainers; [ dbohdan ];
+    license = lib.licenses.mit;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ dbohdan ];
   };
 }
diff --git a/pkgs/games/tdm/default.nix b/pkgs/games/tdm/default.nix
deleted file mode 100644
index d0133df59dd..00000000000
--- a/pkgs/games/tdm/default.nix
+++ /dev/null
@@ -1,102 +0,0 @@
-{ stdenv, fetchurl, binutils-unwrapped, sconsPackages, gnum4, p7zip, glibc_multi, mesa
-, xorg, libGLU, libGL, openal
-, lib, makeWrapper, makeDesktopItem }:
-
-let
-  pname = "tdm";
-  version = "2.07";
-
-  desktop = makeDesktopItem {
-    desktopName = pname;
-    name = pname;
-    exec = "@out@/bin/${pname}";
-    icon = pname;
-    terminal = "false";
-    comment = "The Dark Mod - stealth FPS inspired by the Thief series";
-    type = "Application";
-    categories = "Game;";
-    genericName = pname;
-  };
-in stdenv.mkDerivation {
-  name = "${pname}-${version}";
-  src = fetchurl {
-    url = "https://www.thedarkmod.com/sources/thedarkmod.${version}.src.7z";
-    sha256 = "17wdpip8zvm2njz0xrf7xcxl73hnsc6i83zj18kn8rnjkpy50dd6";
-  };
-  nativeBuildInputs = [
-    p7zip sconsPackages.scons_3_1_2 gnum4 makeWrapper
-  ];
-  buildInputs = [
-    glibc_multi mesa.dev xorg.libX11.dev openal
-    xorg.libXext.dev xorg.libXxf86vm.dev
-    libGL libGLU
-  ];
-  unpackPhase = ''
-    7z x $src
-  '';
-
-  # I'm pretty sure there's a better way to build 2 targets than a random hook
-  preBuild = ''
-    pushd tdm_update
-    scons BUILD=release TARGET_ARCH=x64
-    install -Dm755 tdm_update.linux $out/share/libexec/tdm_update.linux
-    popd
-  '';
-
-  # why oh why can it find ld but not strip?
-  postPatch = ''
-    sed -i 's!strip \$!${binutils-unwrapped}/bin/strip $!' SConstruct
-  '';
-
-  installPhase = ''
-    runHook preInstall
-
-    install -Dm644 ${desktop}/share/applications/${pname}.desktop $out/share/applications/${pname}.desktop
-    substituteInPlace $out/share/applications/${pname}.desktop --subst-var out
-    install -Dm755 thedarkmod.x64 $out/share/libexec/tdm
-
-    # The package doesn't install assets, these get installed by running tdm_update.linux
-    # Provide a script that runs tdm_update.linux on first launch
-    install -Dm755 <(cat <<'EOF'
-#!/bin/sh
-set -e
-DIR="$HOME/.local/share/tdm"
-mkdir -p "$DIR"
-cd "$DIR"
-exec "PKGDIR/share/libexec/tdm_update.linux" --noselfupdate
-EOF
-    ) $out/bin/tdm_update
-
-    install -Dm755 <(cat <<'EOF'
-#!/bin/sh
-set -e
-DIR="$HOME/.local/share/tdm"
-if [ ! -d "$DIR" ]; then
-  echo "Please run tdm_update to (re)download game data"
-else
-  cd "$DIR"
-  exec "PKGDIR/share/libexec/tdm"
-fi
-EOF
-    ) $out/bin/tdm
-    sed -i "s!PKGDIR!$out!g" $out/bin/tdm_update
-    sed -i "s!PKGDIR!$out!g" $out/bin/tdm
-
-    runHook postInstall
-  '';
-
-  postInstall = ''
-    wrapProgram $out/bin/tdm --suffix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ libGL libGLU ]}
-  '';
-
-  enableParallelBuilding = true;
-  sconsFlags = [ "BUILD=release" "TARGET_ARCH=x64" ];
-  NIX_CFLAGS_COMPILE = "-Wno-error=format-security";
-  meta = with stdenv.lib; {
-    description = "The Dark Mod - stealth FPS inspired by the Thief series";
-    homepage = "http://www.thedarkmod.com";
-    license = licenses.gpl3;
-    maintainers = with maintainers; [ cizra ];
-    platforms = with platforms; [ "x86_64-linux" ];  # tdm also supports x86, but I don't have a x86 install at hand to test.
-  };
-}
diff --git a/pkgs/games/tecnoballz/default.nix b/pkgs/games/tecnoballz/default.nix
new file mode 100644
index 00000000000..d13468b78e0
--- /dev/null
+++ b/pkgs/games/tecnoballz/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchurl
+, autoconf
+, automake
+, SDL
+, SDL_mixer
+, SDL_image
+, libmikmod
+, tinyxml
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tecnoballz";
+  version = "0.93.1";
+
+  src = fetchurl {
+    url = "https://linux.tlk.fr/games/TecnoballZ/download/tecnoballz-${version}.tgz";
+    sha256 = "sha256-WRW76e+/eXE/KwuyOjzTPFQnKwNznbIrUrz14fnvgug=";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    automake
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    SDL_image
+    libmikmod
+    tinyxml
+  ];
+
+  # Newer compilers introduced warnings
+  postPatch = ''
+    substituteInPlace configure.ac \
+      --replace "-Werror" ""
+  '';
+
+  preConfigure = ''
+    ./bootstrap
+  '';
+
+  installFlags = [
+    # Default is $(out)/games
+    "gamesdir=$(out)/bin"
+    # We set the scoredir to $TMPDIR at install time.
+    # Otherwise it will try to write in /var/games at install time
+    "scoredir=$(TMPDIR)"
+  ];
+
+  meta = with lib; {
+    homepage = "https://linux.tlk.fr/games/TecnoballZ/";
+    downloadPage = "https://linux.tlk.fr/games/TecnoballZ/download/";
+    description = "A brick breaker game with a sophisticated system of weapons and bonuses";
+    longDescription = ''
+      A exciting Brick Breaker with 50 levels of game and 11 special levels,
+      distributed on the 2 modes of game to give the player a sophisticated
+      system of attack weapons with an enormous power of fire that can be build
+      by gaining bonuses. Numerous decors, musics and sounds complete this great
+      game. This game was ported from the Commodore Amiga.
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/teetertorture/default.nix b/pkgs/games/teetertorture/default.nix
index a568fd79085..6e18dbae07b 100644
--- a/pkgs/games/teetertorture/default.nix
+++ b/pkgs/games/teetertorture/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, SDL, SDL_image, SDL_mixer}:
+{ lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer }:
 
-stdenv.mkDerivation {
-  name = "teeter-torture-20051018";
+stdenv.mkDerivation rec {
+  pname = "teeter-torture";
+  version = "2005-10-18";
   src = fetchurl {
-    url = "ftp://ftp.tuxpaint.org/unix/x/teetertorture/source/teetertorture-2005-10-18.tar.gz";
+    url = "ftp://ftp.tuxpaint.org/unix/x/teetertorture/source/teetertorture-${version}.tar.gz";
     sha256 = "175gdbkx3m82icyzvwpyzs4v2fd69c695k5n8ca0lnjv81wnw2hr";
   };
 
@@ -26,7 +27,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.newbreedsoftware.com/teetertorture/";
     description = "Simple shooting game with your cannon is sitting atop a teeter totter";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/teeworlds/default.nix b/pkgs/games/teeworlds/default.nix
index 9ff50d533be..b0a49cc77d1 100644
--- a/pkgs/games/teeworlds/default.nix
+++ b/pkgs/games/teeworlds/default.nix
@@ -1,4 +1,4 @@
-{ fetchFromGitHub, stdenv, cmake, pkgconfig, python3, alsaLib
+{ fetchFromGitHub, lib, stdenv, cmake, pkg-config, python3, alsa-lib
 , libX11, libGLU, SDL2, lua5_3, zlib, freetype, wavpack, icoutils
 , nixosTests
 }:
@@ -22,10 +22,10 @@ stdenv.mkDerivation rec {
                 '#define DATA_DIR "${placeholder "out"}/share/teeworlds/data"'
   '';
 
-  nativeBuildInputs = [ cmake pkgconfig icoutils ];
+  nativeBuildInputs = [ cmake pkg-config icoutils ];
 
   buildInputs = [
-    python3 alsaLib libX11 libGLU SDL2 lua5_3 zlib freetype wavpack
+    python3 alsa-lib libX11 libGLU SDL2 lua5_3 zlib freetype wavpack
   ];
 
   postInstall = ''
@@ -51,7 +51,7 @@ stdenv.mkDerivation rec {
 
     homepage = "https://teeworlds.com/";
     license = "BSD-style, see `license.txt'";
-    maintainers = with stdenv.lib.maintainers; [ astsmtl ];
-    platforms = stdenv.lib.platforms.linux;
+    maintainers = with lib.maintainers; [ astsmtl ];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/tennix/default.nix b/pkgs/games/tennix/default.nix
index 56ac0a2faf4..f81ddb7edf9 100644
--- a/pkgs/games/tennix/default.nix
+++ b/pkgs/games/tennix/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_net, python } :
+{lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_net, python } :
 
 stdenv.mkDerivation rec {
-  name = "tennix-1.1";
+  pname = "tennix";
+  version = "1.1";
   src = fetchurl {
-    url = "https://icculus.org/tennix/downloads/${name}.tar.gz";
+    url = "https://icculus.org/tennix/downloads/tennix-${version}.tar.gz";
     sha256 = "0np5kw1y7i0z0dsqx4r2nvmq86qj8hv3mmgavm3hxraqnds5z8cm";
   };
 
@@ -16,7 +17,7 @@ stdenv.mkDerivation rec {
     installFlags="PREFIX=$out install"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://icculus.org/tennix/";
     description = "Classic Championship Tour 2011";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/terraria-server/default.nix b/pkgs/games/terraria-server/default.nix
index e16a771d272..b5a8c7e486b 100644
--- a/pkgs/games/terraria-server/default.nix
+++ b/pkgs/games/terraria-server/default.nix
@@ -2,16 +2,16 @@
 
 stdenv.mkDerivation rec {
   pname = "terraria-server";
-  version = "1.4.0.5";
+  version = "1.4.2.3";
   urlVersion = lib.replaceChars [ "." ] [ "" ] version;
 
   src = fetchurl {
-    url = "https://terraria.org/system/dedicated_servers/archives/000/000/039/original/terraria-server-${urlVersion}.zip";
-    sha256 = "1bvcafpjxp7ddrbhm3z0xamgi71ymbi41dlx990daz0b5kbdir8y";
+    url = "https://terraria.org/system/dedicated_servers/archives/000/000/046/original/terraria-server-${urlVersion}.zip";
+    sha256 = "0qm4pbm1d9gax47fk4zhw9rcxvajxs36w7dghirli89i994r7g8j";
   };
 
-  buildInputs = [ file unzip ];
-  nativeBuildInputs = [ autoPatchelfHook ];
+  buildInputs = [ file ];
+  nativeBuildInputs = [ autoPatchelfHook unzip ];
 
   installPhase = ''
     mkdir -p $out/bin
diff --git a/pkgs/games/tes3cmd/default.nix b/pkgs/games/tes3cmd/default.nix
new file mode 100644
index 00000000000..3778aadda9c
--- /dev/null
+++ b/pkgs/games/tes3cmd/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, perlPackages, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "tes3cmd";
+  version = "0.40-pre-release-2";
+
+  src = fetchFromGitHub {
+    owner = "john-moonsugar";
+    repo = pname;
+    rev = "f72e9ed9dd18e8545dd0dc2a4056c250cf505790";
+    sha256 = "01zqplp8yb0xnl54963n0zkz66rf3hn2x3i255jlhdhx1c43jba7";
+  };
+
+  buildInputs = [ perlPackages.perl ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp tes3cmd $out/bin/tes3cmd
+  '';
+
+  meta = with lib; {
+    description = "A command line tool for examining and modifying plugins for the Elder Scrolls game Morrowind by Bethesda Softworks";
+    homepage = "https://github.com/john-moonsugar/tes3cmd";
+    license = licenses.mit;
+    maintainers = [ maintainers.marius851000 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/the-butterfly-effect/default.nix b/pkgs/games/the-butterfly-effect/default.nix
index 14d51ee87bd..f5330485edd 100644
--- a/pkgs/games/the-butterfly-effect/default.nix
+++ b/pkgs/games/the-butterfly-effect/default.nix
@@ -1,11 +1,12 @@
-{ stdenv, mkDerivation, fetchgit, qt5, box2d, which, cmake, gettext }:
+{ lib, mkDerivation, fetchFromGitHub, qt5, box2d, which, cmake, gettext }:
 
 mkDerivation rec {
   pname = "tbe";
   version = "0.9.3.1";
 
-  src = fetchgit {
-    url = "https://github.com/kaa-ching/tbe";
+  src = fetchFromGitHub {
+    owner = "kaa-ching";
+    repo = pname;
     rev = "refs/tags/v${version}";
     sha256 = "1ag2cp346f9bz9qy6za6q54id44d2ypvkyhvnjha14qzzapwaysj";
   };
@@ -16,7 +17,6 @@ mkDerivation rec {
     qt5.qtbase qt5.qtsvg qt5.qttranslations box2d which cmake
     gettext
   ];
-  enableParallelBuilding = true;
 
   installPhase = ''
     make DESTDIR=.. install
@@ -25,7 +25,7 @@ mkDerivation rec {
     cp -r ../usr/share $out/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A physics-based game vaguely similar to Incredible Machine";
     homepage = "http://the-butterfly-effect.org/";
     maintainers = [ maintainers.raskin ];
diff --git a/pkgs/games/the-powder-toy/default.nix b/pkgs/games/the-powder-toy/default.nix
index af392eca8d8..ba232097af6 100644
--- a/pkgs/games/the-powder-toy/default.nix
+++ b/pkgs/games/the-powder-toy/default.nix
@@ -1,36 +1,35 @@
-
-{ stdenv, fetchFromGitHub, scons, pkgconfig, SDL2, lua, fftwFloat,
-  zlib, bzip2, curl, darwin }:
+{ lib, stdenv, fetchFromGitHub, meson, luajit, ninja, pkg-config
+, python3, SDL2, lua, fftwFloat, zlib, bzip2, curl, darwin }:
 
 stdenv.mkDerivation rec {
   pname = "the-powder-toy";
-  version = "95.0";
+  version = "96.1.349";
 
   src = fetchFromGitHub {
     owner = "The-Powder-Toy";
     repo = "The-Powder-Toy";
     rev = "v${version}";
-    sha256 = "18rp2g1mj0gklra06wm9dm57h73hmm301npndh0y8ap192i5s8sa";
+    sha256 = "sha256-MSN81kPaH8cWZO+QEOlMUQQghs1kn8CpsKA5SUC/RX8=";
   };
 
-  nativeBuildInputs = [ scons pkgconfig ];
-
-  propagatedBuildInputs = stdenv.lib.optionals stdenv.isDarwin
-    [ darwin.apple_sdk.frameworks.Cocoa ];
+  nativeBuildInputs = [ meson ninja pkg-config python3 ];
 
-  buildInputs = [ SDL2 lua fftwFloat zlib bzip2 curl ];
+  buildInputs = [ luajit SDL2 lua fftwFloat zlib bzip2 curl ];
 
   installPhase = ''
-    install -Dm 755 build/powder* "$out/bin/powder"
+    install -Dm 755 powder $out/bin/powder
   '';
 
+  propagatedBuildInputs = lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ];
+
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free 2D physics sandbox game";
     homepage = "http://powdertoy.co.uk/";
     platforms = [ "i686-linux" "x86_64-linux" "x86_64-darwin" ];
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     maintainers = with maintainers; [ abbradar siraben ];
+    mainProgram = "powder";
   };
 }
diff --git a/pkgs/games/tibia/default.nix b/pkgs/games/tibia/default.nix
index b8c2c3f3cf4..0fee9ce6c6c 100644
--- a/pkgs/games/tibia/default.nix
+++ b/pkgs/games/tibia/default.nix
@@ -1,11 +1,11 @@
-{ stdenv, fetchurl, glibc, libX11, runtimeShell, libGLU, libGL }:
+{ lib, stdenv, fetchurl, glibc, libX11, runtimeShell, libGLU, libGL }:
 
-with stdenv.lib;
-stdenv.mkDerivation {
-  name = "tibia-10.90";
+stdenv.mkDerivation rec {
+  pname = "tibia";
+  version = "10.90";
 
   src = fetchurl {
-    url = "http://static.tibia.com/download/tibia1090.tgz";
+    url = "http://static.tibia.com/download/tibia${lib.replaceStrings ["."] [""] version}.tgz";
     sha256 = "11mkh2dynmbpay51yfaxm5dmcys3rnpk579s9ypfkhblsrchbkhx";
   };
 
@@ -24,7 +24,7 @@ stdenv.mkDerivation {
     cp -r * $out/res
 
     patchelf --set-interpreter ${glibc.out}/lib/ld-linux.so.2 \
-             --set-rpath ${stdenv.lib.makeLibraryPath [ stdenv.cc.cc libX11 libGLU libGL ]} \
+             --set-rpath ${lib.makeLibraryPath [ stdenv.cc.cc libX11 libGLU libGL ]} \
              "$out/res/Tibia"
 
     # We've patchelf'd the files. The main ‘Tibia’ binary is a bit
@@ -50,8 +50,8 @@ stdenv.mkDerivation {
   meta = {
     description = "Top-down MMORPG set in a fantasy world";
     homepage = "http://tibia.com";
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
     platforms = ["i686-linux"];
-    maintainers = with stdenv.lib.maintainers; [ ];
+    maintainers = with lib.maintainers; [ ];
   };
 }
diff --git a/pkgs/games/tintin/default.nix b/pkgs/games/tintin/default.nix
index cd58fcf24fd..73070db244f 100644
--- a/pkgs/games/tintin/default.nix
+++ b/pkgs/games/tintin/default.nix
@@ -6,11 +6,12 @@
 assert tlsSupport -> gnutls != null;
 
 stdenv.mkDerivation rec {
-  name = "tintin-2.02.03";
+  pname = "tintin";
+  version = "2.02.05";
 
   src = fetchurl {
-    url    = "mirror://sourceforge/tintin/${name}.tar.gz";
-    sha256 = "0ybgy8j8i36d7f892x539vl6fl5zvvfyy5ffc98550vjr6qqhk74";
+    url    = "mirror://sourceforge/tintin/tintin-${version}.tar.gz";
+    sha256 = "sha256-Y6cAUhItJNade8ASOVdF8aBBLf/UVqjoqrhXBNRL1aE=";
   };
 
   nativeBuildInputs = lib.optional tlsSupport gnutls.dev;
@@ -20,7 +21,7 @@ stdenv.mkDerivation rec {
     cd src
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free MUD client for macOS, Linux and Windows";
     homepage    = "http://tintin.sourceforge.net";
     license     = licenses.gpl2;
diff --git a/pkgs/games/tinyfugue/default.nix b/pkgs/games/tinyfugue/default.nix
index fb706d38e18..763241f2909 100644
--- a/pkgs/games/tinyfugue/default.nix
+++ b/pkgs/games/tinyfugue/default.nix
@@ -1,9 +1,9 @@
-{ stdenv, fetchurl, ncurses, zlib
+{ lib, stdenv, fetchurl, ncurses, zlib
 , openssl ? null
 , sslSupport ? true
 }:
 
-with stdenv.lib;
+with lib;
 
 assert sslSupport -> openssl != null;
 
diff --git a/pkgs/games/tome2/default.nix b/pkgs/games/tome2/default.nix
index fa73697ab42..d40717c9a38 100644
--- a/pkgs/games/tome2/default.nix
+++ b/pkgs/games/tome2/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, makeDesktopItem, ncurses, libX11, boost, cmake }:
+{ lib, stdenv, fetchFromGitHub, makeDesktopItem, ncurses, libX11, boost, cmake }:
 
 let
   pname = "tome2";
@@ -14,6 +14,7 @@ let
     type = "Application";
     categories = "Game;RolePlaying;";
     genericName = pname;
+    fileValidation = false;
   };
 
 in stdenv.mkDerivation {
@@ -40,7 +41,7 @@ in stdenv.mkDerivation {
     cp ${desktopItem}/share/applications/*.desktop $out/share/applications
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     inherit description;
     license = licenses.unfree;
     maintainers = with maintainers; [ cizra ];
diff --git a/pkgs/games/tome4/default.nix b/pkgs/games/tome4/default.nix
index 59dced9ac67..ace9b384663 100644
--- a/pkgs/games/tome4/default.nix
+++ b/pkgs/games/tome4/default.nix
@@ -1,8 +1,14 @@
-{ stdenv, fetchurl, makeDesktopItem, makeWrapper, premake4, unzip
+{ lib, stdenv, fetchurl, makeDesktopItem, makeWrapper, premake4, unzip
 , openal, libpng, libvorbis, libGLU, SDL2, SDL2_image, SDL2_ttf }:
 
-let
+stdenv.mkDerivation rec {
   pname = "tome4";
+  version = "1.6.7";
+
+  src = fetchurl {
+    url = "https://te4.org/dl/t-engine/t-engine4-src-${version}.tar.bz2";
+    sha256 = "0283hvms5hr29zr0grd6gq059k0hg8hcz3fsmwjmysiih8790i68";
+  };
 
   desktop = makeDesktopItem {
     desktopName = pname;
@@ -16,15 +22,6 @@ let
     genericName = pname;
   };
 
-in stdenv.mkDerivation rec {
-  name = "${pname}-${version}";
-  version = "1.6.7";
-
-  src = fetchurl {
-    url = "https://te4.org/dl/t-engine/t-engine4-src-${version}.tar.bz2";
-    sha256 = "0283hvms5hr29zr0grd6gq059k0hg8hcz3fsmwjmysiih8790i68";
-  };
-
   prePatch = ''
     # http://forums.te4.org/viewtopic.php?f=42&t=49478&view=next#p234354
     sed -i 's|#include <GL/glext.h>||' src/tgl.h
@@ -70,7 +67,7 @@ in stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tales of Maj'eyal (rogue-like game)";
     homepage = "https://te4.org/";
     license = licenses.gpl3;
diff --git a/pkgs/games/toppler/default.nix b/pkgs/games/toppler/default.nix
index cf037a0f436..ffe807410bb 100644
--- a/pkgs/games/toppler/default.nix
+++ b/pkgs/games/toppler/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
 , SDL
 , SDL_mixer
@@ -20,7 +20,10 @@ stdenv.mkDerivation rec {
     zlib
   ];
 
-  meta = with stdenv.lib; {
+  # The conftest hangs on Hydra runners, because they are not logged in.
+  configureFlags = lib.optional stdenv.isDarwin "--disable-sdltest";
+
+  meta = with lib; {
     description = "Jump and run game, reimplementation of Tower Toppler/Nebulus";
     homepage = "http://toppler.sourceforge.net/";
     license = licenses.gpl2;
diff --git a/pkgs/games/torcs/default.nix b/pkgs/games/torcs/default.nix
index 136578924a0..e3ec82b549a 100644
--- a/pkgs/games/torcs/default.nix
+++ b/pkgs/games/torcs/default.nix
@@ -1,12 +1,13 @@
-{ fetchpatch, fetchurl, stdenv, libGLU, freeglut, libX11, plib, openal, freealut, libXrandr, xorgproto,
+{ fetchpatch, fetchurl, lib, stdenv, libGLU, freeglut, libX11, plib, openal, freealut, libXrandr, xorgproto,
 libXext, libSM, libICE, libXi, libXt, libXrender, libXxf86vm, libvorbis,
 libpng, zlib, makeWrapper }:
 
 stdenv.mkDerivation rec {
-  name = "torcs-1.3.7";
+  pname = "torcs";
+  version = "1.3.7";
 
   src = fetchurl {
-    url = "mirror://sourceforge/torcs/${name}.tar.bz2";
+    url = "mirror://sourceforge/torcs/torcs-${version}.tar.bz2";
     sha256 = "0kdq0sc7dsfzlr0ggbxggcbkivc6yp30nqwjwcaxg9295s3b06wa";
   };
 
@@ -42,9 +43,9 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Car racing game";
     homepage = "http://torcs.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = lib.platforms.linux;
     hydraPlatforms = [];
   };
 }
diff --git a/pkgs/games/torus-trooper/default.nix b/pkgs/games/torus-trooper/default.nix
new file mode 100644
index 00000000000..645abc76c80
--- /dev/null
+++ b/pkgs/games/torus-trooper/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, fetchpatch
+, fetchurl
+, unzip
+, gdc
+, SDL
+, SDL_mixer
+, bulletml
+}:
+
+let
+debianPatch = patchname: hash: fetchpatch {
+  name = "${patchname}.patch";
+  url = "https://sources.debian.org/data/main/t/torus-trooper/0.22.dfsg1-12/debian/patches/${patchname}.patch";
+  sha256 = hash;
+};
+
+in stdenv.mkDerivation rec {
+  pname = "torus-trooper";
+  version = "0.22";
+
+  src = fetchurl {
+    url = "http://abagames.sakura.ne.jp/windows/tt${lib.replaceStrings ["."] ["_"] version}.zip";
+    sha256 = "1yhki1fdp3fi4y2iq12vca69f6k38dqjaw9z4lwcxky5kbgb7jvg";
+  };
+
+  patches = [
+    (debianPatch
+      "imports"
+      "0mifw0mj66zljpq6iqnh0rhkgs2sky8rz0p32k98vxfnsb39ibsf")
+    (debianPatch
+      "fixes"
+      "05f93zq2v14lymq748c9g646ckbh9mqpr5rrahb63s90x8hlcqil")
+    (debianPatch
+      "directories"
+      "0y5xvf26v9fk0rx6ncrxx4czckhjbi891hp3pixlmv568pg9cihd")
+    (debianPatch
+      "windowed"
+      "1d8ghj4shvpb0s8l16kscz4l7rz1fxmfdpddy1ikz3678pw1sc8p")
+    (debianPatch
+      "dotfile"
+      "17yirmnjhbd1clzhmdd2mfdhbxkyinaahd6v3yz5kzbcylvjz2r2")
+    (debianPatch
+      "window-resizing"
+      "1n64gbhabl6vis7s294wxlj2k8s3ypxljpdg71icwz1m9jjx59df")
+    (debianPatch
+      "save-score-444372"
+      "1skny6s3hjxkh8w4fq86vp51j7z40fvn80b8myl4i1zzlwag3x17")
+    (debianPatch
+      "level-select-444948"
+      "008248s55188plggg2kg01nimjgc7w0sqd3c22sl6lzd1fjsflv8")
+    (debianPatch
+      "avoid-segfault-when-sdl-fails"
+      "1yp758gi4i15gqk6wiqp815rqcmlyqx62ir1sw20hn6zb3j97bmc")
+    (debianPatch
+      "dlang_v2"
+      "1lxsbckhvl8a8j43pw2dyl5nlavvdbgxb5zlb2450a0vml55nswd")
+    (debianPatch
+      "lowest-level-position-602808"
+      "19r48wirc9zssjmv57drn2fd0f56dcgyqqaz3j49cvv6yd74qf20")
+    (debianPatch
+      "libbulletml0v5-segfault"
+      "0pad2daz60hswkhkdpssxaqc9p9ca0sw1nraqzr453x0zdwwq0hn")
+    (debianPatch
+      "std.math.fabs"
+      "18xnnqlj20bxv2h9fa8dn4rmxwi3k6y3g50kwvh8i8p3b4hgag3r")
+    (debianPatch
+      "gdc-8"
+      "10z702y75c48hjcnvv8m7f3ka52cj3r3jqafdbby85nb0p2lbssx")
+  ];
+
+  postPatch = ''
+    for f in src/abagames/tt/barrage.d src/abagames/util/sdl/sound.d src/abagames/util/sdl/texture.d; do
+      substituteInPlace $f \
+        --replace "/usr/" "$out/"
+    done
+  '';
+
+  nativeBuildInputs = [
+    unzip
+    gdc
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    bulletml
+  ];
+
+  installPhase = ''
+    install -Dm755 torus-trooper $out/bin/torus-trooper
+    mkdir -p $out/share/games/torus-trooper
+    cp -r barrage sounds images $out/share/games/torus-trooper/
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.asahi-net.or.jp/~cs8k-cyu/windows/tt_e.html";
+    description = "Fast-paced abstract scrolling shooter game";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/tr-patcher/default.nix b/pkgs/games/tr-patcher/default.nix
new file mode 100644
index 00000000000..68e3eb60895
--- /dev/null
+++ b/pkgs/games/tr-patcher/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, lib, fetchurl, fetchzip, jre, makeWrapper }:
+
+let
+translation-file = fetchurl {
+  url = "https://gitlab.com/bmwinger/tr-patcher/-/raw/master/lib/Translation.txt?inline=false";
+  sha256 = "136zd2s73b4n1w2n34wxi656bm448748nn3y7a64fd89ysg9n7n8";
+};
+in
+stdenv.mkDerivation rec {
+  pname = "tr-patcher";
+  version = "1.0.5";
+
+  # use the pre compiled source, as compilation is a bit complex
+  src = fetchzip {
+    url = "https://gitlab.com/bmwinger/tr-patcher/uploads/b57899980b2351c136393f02977c4fab/tr-patcher-shadow.zip";
+    sha256 = "0va7nbmlgf3p2nc0z2b9n1285y4q5rpyjr4w93rdnx38wrhinxnw";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    install -Dm644 lib/tr-patcher-all.jar $out/lib/tr-patcher.jar
+    install -Dm644 ${translation-file} $out/lib/Translation.txt
+    mkdir -p $out/bin
+    makeWrapper ${jre}/bin/java $out/bin/tr-patcher \
+    --add-flags "-jar $out/lib/tr-patcher.jar"
+  '';
+
+  meta = with lib; {
+    description = "Allow to update dependancies of the Tamriel-Data mod for morrowind";
+    homepage = "https://gitlab.com/bmwinger/tr-patcher";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.marius851000 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/trackballs/default.nix b/pkgs/games/trackballs/default.nix
index ec607758bd6..8ebeab4b260 100644
--- a/pkgs/games/trackballs/default.nix
+++ b/pkgs/games/trackballs/default.nix
@@ -1,24 +1,24 @@
-{ stdenv, fetchFromGitHub, cmake, SDL2, SDL2_ttf, gettext, zlib, SDL2_mixer, SDL2_image, guile, libGLU, libGL }:
-
-with stdenv.lib;
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_ttf, gettext, zlib, SDL2_mixer, SDL2_image, guile, libGLU, libGL }:
 
 stdenv.mkDerivation rec {
   pname = "trackballs";
-  version = "1.3.1";
+  version = "1.3.2";
 
   src = fetchFromGitHub {
     owner = "trackballs";
-    repo = "trackballs";
+    repo = pname;
     rev = "v${version}";
-    sha256 = "1yjzz50r57aahy7wcbsmhrd40abzyriq40j49225ya7m9g28vmgl";
+    sha256 = "G+KfQgqk+iI+Beb/ZRul2ArCBcvwYQ/ftEWzdrtwb18=";
   };
 
-  buildInputs = [ cmake zlib SDL2 SDL2_ttf SDL2_mixer SDL2_image guile gettext libGLU libGL ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ zlib SDL2 SDL2_ttf SDL2_mixer SDL2_image guile gettext libGLU libGL ];
 
-  meta = {
+  meta = with lib; {
     homepage = "https://trackballs.github.io/";
     description = "3D Marble Madness clone";
-    platforms = stdenv.lib.platforms.linux;
-    license = stdenv.lib.licenses.gpl2;
+    platforms = platforms.linux;
+    # Music is licensed under Ethymonics Free Music License.
+    license = licenses.gpl2Plus;
   };
 }
diff --git a/pkgs/games/tremulous/default.nix b/pkgs/games/tremulous/default.nix
index cab77b23ee9..e07697f7c0e 100644
--- a/pkgs/games/tremulous/default.nix
+++ b/pkgs/games/tremulous/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, unzip, libGLU, libGL, libX11, SDL, openal, runtimeShell }:
+{ lib, stdenv, fetchurl, unzip, libGLU, libGL, libX11, SDL, openal, runtimeShell }:
 stdenv.mkDerivation rec {
   pname = "tremulous";
   version = "1.1.0";
@@ -15,7 +15,8 @@ stdenv.mkDerivation rec {
     url = "http://releases.mercenariesguild.net/tremded/mg_tremded_source_1.01.tar.gz";
     sha256 = "1njrqlhzjvy9myddzkagszwdcf3m4h08wip888w2rmbshs6kz6ql";
   };
-  buildInputs = [ unzip libGLU libGL libX11 SDL openal ];
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [ libGLU libGL libX11 SDL openal ];
   unpackPhase = ''
     unzip $src1
     cd tremulous
@@ -57,7 +58,7 @@ stdenv.mkDerivation rec {
     done
   '';
   dontPatchELF = true;
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A game that blends a team based FPS with elements of an RTS";
     longDescription = ''
       Tremulous is a free, open source game that blends a team based FPS with
diff --git a/pkgs/games/trigger/default.nix b/pkgs/games/trigger/default.nix
index c6f31922bb6..cb3227f24e3 100644
--- a/pkgs/games/trigger/default.nix
+++ b/pkgs/games/trigger/default.nix
@@ -1,20 +1,34 @@
-{ fetchurl, stdenv, runtimeShell
-, SDL2, freealut, SDL2_image, openal, physfs, zlib, libGLU, libGL, glew }:
+{ lib, fetchurl, stdenv, runtimeShell, SDL2, freealut, SDL2_image, openal, physfs
+, zlib, libGLU, libGL, glew, tinyxml-2 }:
 
 stdenv.mkDerivation rec {
-  name = "trigger-rally-0.6.6";
+  pname = "trigger-rally";
+  version = "0.6.6.1";
 
   src = fetchurl {
-    url = "mirror://sourceforge/trigger-rally/${name}.tar.gz";
-    sha256 = "08qa2f2s8zyn42ff6jb1gsi64d916020ixkzvl16kbb88rabqra8";
+    url = "mirror://sourceforge/trigger-rally/${pname}-${version}.tar.gz";
+    sha256 = "016bc2hczqscfmngacim870hjcsmwl8r3aq8x03vpf22s49nw23z";
   };
 
-  buildInputs = [ SDL2 freealut SDL2_image openal physfs zlib libGLU libGL glew ];
+  buildInputs = [
+    SDL2
+    freealut
+    SDL2_image
+    openal
+    physfs
+    zlib
+    libGLU
+    libGL
+    glew
+    tinyxml-2
+  ];
 
   preConfigure = ''
     sed s,/usr/local,$out, -i bin/*defs
 
     cd src
+
+    sed s,lSDL2main,lSDL2, -i GNUmakefile
     export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I${SDL2.dev}/include/SDL2"
     export makeFlags="$makeFlags prefix=$out"
   '';
@@ -31,10 +45,10 @@ stdenv.mkDerivation rec {
   '';
 
   meta = {
-    description = "Rally";
+    description = "A fast-paced single-player racing game";
     homepage = "http://trigger-rally.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/tumiki-fighters/default.nix b/pkgs/games/tumiki-fighters/default.nix
new file mode 100644
index 00000000000..b4becea6575
--- /dev/null
+++ b/pkgs/games/tumiki-fighters/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, fetchpatch
+, fetchurl
+, unzip
+, gdc
+, SDL
+, SDL_mixer
+, bulletml
+}:
+
+let
+debianPatch = patchname: hash: fetchpatch {
+  name = "${patchname}.patch";
+  url = "https://sources.debian.org/data/main/t/tumiki-fighters/0.2.dfsg1-9/debian/patches/${patchname}.patch";
+  sha256 = hash;
+};
+
+in stdenv.mkDerivation rec {
+  pname = "tumiki-fighters";
+  version = "0.21";
+
+  src = fetchurl {
+    url = "http://abagames.sakura.ne.jp/windows/tf${lib.replaceStrings ["."] ["_"] version}.zip";
+    sha256 = "0djykfc1r8ysapklm621h89ana1c4qzc1m5nr9bqw4iccnmvwk3p";
+  };
+
+  patches = [
+    (debianPatch
+      "imports"
+      "1l3kc67b43gdi139cpz5cka1nkn0pjp9mrgrrxlmr0liwx2aryhn")
+    (debianPatch
+      "fixes"
+      "1iy1a5vii6yz9zdlk2bcj6gkj4y25hn9y2fczz15jpqd9r2zm603")
+    (debianPatch
+      "directories"
+      "0kmv0s7jgr693fzrkjsmz4dnicc4w7njanxm2la3cf4vmgdyipmm")
+    (debianPatch
+      "windowed"
+      "1wp74l0bi8wq85pcxnmkwrlfmlf09im95n27pxgz082lhwf2ksy1")
+    (debianPatch
+      "dotfile"
+      "0d8x519bclh41j992qn6ijzfcrgacb79px6zjd1awypkwyc0j2p6")
+    (debianPatch
+      "makefile"
+      "11xf2b31kjyps53jfryv82dv0g6q0smc9xgp8imrbr93mzi51vf0")
+    (debianPatch
+      "window-resizing"
+      "1dm79d0yisa8zs5fr89y3wq2kzd3khcaxs0la8lhncvkqbd4smx8")
+    (debianPatch
+      "dlang_v2"
+      "1isnvbl3bjnpyphji8k3fl0yd1z4869h0lai143vpwgj6518lpg4")
+    (debianPatch
+      "gdc-8"
+      "1md0zwmv50jnak5g9d93bglv9v4z41blinjii6kv3vmgjnajapzj")
+  ];
+
+  postPatch = ''
+    for f in \
+      src/abagames/tf/barragemanager.d \
+      src/abagames/util/sdl/sound.d \
+      src/abagames/util/sdl/texture.d \
+      src/abagames/tf/enemyspec.d \
+      src/abagames/tf/field.d \
+      src/abagames/tf/stagemanager.d \
+      src/abagames/tf/tumikiset.d
+    do
+      substituteInPlace $f \
+        --replace "/usr/" "$out/"
+    done
+  '';
+
+  nativeBuildInputs = [
+    unzip
+    gdc
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    bulletml
+  ];
+
+  installPhase = ''
+    install -Dm755 tumiki-fighters $out/bin/tumiki-fighters
+    mkdir -p $out/share/games/tumiki-fighters
+    cp -r barrage sounds enemy field stage tumiki $out/share/games/tumiki-fighters/
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.asahi-net.or.jp/~cs8k-cyu/windows/tf_e.html";
+    description = "Sticky 2D shooter";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/tuxpaint/default.nix b/pkgs/games/tuxpaint/default.nix
index ea37ded6b6c..289b4e386be 100644
--- a/pkgs/games/tuxpaint/default.nix
+++ b/pkgs/games/tuxpaint/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchurl, SDL, SDL_image, SDL_ttf, SDL_mixer, libpng,
-  cairo, librsvg, gettext, libpaper, fribidi, pkgconfig, gperf, imagemagick }:
+{ lib, stdenv, fetchurl, SDL, SDL_image, SDL_ttf, SDL_mixer, libpng,
+  cairo, librsvg, gettext, libpaper, fribidi, pkg-config, gperf, imagemagick }:
 
 stdenv.mkDerivation rec {
   version = "0.9.24";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [ SDL SDL_image SDL_ttf SDL_mixer libpng cairo
-    librsvg gettext libpaper fribidi pkgconfig gperf imagemagick ];
+    librsvg gettext libpaper fribidi pkg-config gperf imagemagick ];
   hardeningDisable = [ "format" ];
   makeFlags = [ "GPERF=${gperf}/bin/gperf"
                 "PREFIX=$$out"
@@ -30,6 +30,12 @@ stdenv.mkDerivation rec {
   };
 
   postInstall = ''
+    # Install desktop file
+    mkdir -p $out/share/applications
+    cp hildon/tuxpaint.xpm $out/share/pixmaps
+    sed -e "s+Exec=tuxpaint+Exec=$out/bin/tuxpaint+" < src/tuxpaint.desktop > $out/share/applications/tuxpaint.desktop
+
+    # Install stamps
     tar xzf $stamps
     cd tuxpaint-stamps-2014.08.23
     make install-all PREFIX=$out
@@ -39,8 +45,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Open Source Drawing Software for Children";
     homepage = "http://www.tuxpaint.org/";
-    license = stdenv.lib.licenses.gpl3;
-    maintainers = with stdenv.lib.maintainers; [ woffs ];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ woffs ];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/tuxtype/default.nix b/pkgs/games/tuxtype/default.nix
index 9d04440a167..0e32ebfbab9 100644
--- a/pkgs/games/tuxtype/default.nix
+++ b/pkgs/games/tuxtype/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, librsvg, libxml2, SDL, SDL_image, SDL_mixer, SDL_net, SDL_ttf, t4kcommon }:
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, librsvg, libxml2, SDL, SDL_image, SDL_mixer, SDL_net, SDL_ttf, t4kcommon }:
 
 stdenv.mkDerivation rec {
   version = "1.8.3";
@@ -28,12 +28,12 @@ stdenv.mkDerivation rec {
       --replace 'PKG_CHECK_MODULES([SDL_ttf],' 'PKG_CHECK_MODULES([SDL_TTF],'
   '';
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
   buildInputs = [ librsvg libxml2 SDL SDL_image SDL_mixer SDL_net SDL_ttf t4kcommon ];
 
   configureFlags = [ "--without-sdlpango" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An Educational Typing Tutor Game Starring Tux, the Linux Penguin";
     homepage = "https://github.com/tux4kids/tuxtype";
     license = licenses.gpl3Plus;
diff --git a/pkgs/games/typespeed/default.nix b/pkgs/games/typespeed/default.nix
index 9da67cbd1ea..1581ab13894 100644
--- a/pkgs/games/typespeed/default.nix
+++ b/pkgs/games/typespeed/default.nix
@@ -1,10 +1,11 @@
-{ stdenv, fetchurl, ncurses }:
+{ lib, stdenv, fetchurl, ncurses }:
 
-stdenv.mkDerivation {
-  name = "typespeed-0.6.5";
+stdenv.mkDerivation rec {
+  pname = "typespeed";
+  version = "0.6.5";
   buildInputs = [ ncurses ];
   src = fetchurl {
-    url = "http://typespeed.sourceforge.net/typespeed-0.6.5.tar.gz";
+    url = "http://typespeed.sourceforge.net/typespeed-${version}.tar.gz";
     sha256 = "5c860385ceed8a60f13217cc0192c4c2b4705c3e80f9866f7d72ff306eb72961";
   };
 
@@ -13,7 +14,7 @@ stdenv.mkDerivation {
   configureFlags = [ "--datadir=\${out}/share/" ];
   makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A curses based typing game";
     homepage = "http://typespeed.sourceforge.net/";
     license = licenses.gpl2;
diff --git a/pkgs/games/uchess/default.nix b/pkgs/games/uchess/default.nix
new file mode 100644
index 00000000000..cafd7cf5769
--- /dev/null
+++ b/pkgs/games/uchess/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildGoModule, fetchFromGitHub, makeWrapper, stockfish }:
+
+buildGoModule rec {
+  pname = "uchess";
+  version = "0.2.1";
+
+  subPackages = [ "cmd/uchess" ];
+
+  src = fetchFromGitHub {
+    owner = "tmountain";
+    repo = "uchess";
+    rev = "v${version}";
+    sha256 = "1njl3f41gshdpj431zkvpv2b7zmh4m2m5q6xsijb0c0058dk46mz";
+  };
+
+  vendorSha256 = "0dkq240ch1z3gihn8yc5d723nnvfxirk2nhw12r1c2hj1ga088g3";
+
+  # package does not contain any tests as of v0.2.1
+  doCheck = false;
+
+  nativeBuildInputs = [ makeWrapper ];
+  postInstall = ''
+    wrapProgram $out/bin/uchess --suffix PATH : ${stockfish}/bin
+  '';
+
+  meta = with lib; {
+    description = "Play chess against UCI engines in your terminal.";
+    homepage = "https://tmountain.github.io/uchess/";
+    maintainers = with maintainers; [ tmountain ];
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/games/ue4/default.nix b/pkgs/games/ue4/default.nix
index 643779cf5fd..95f0d64f197 100644
--- a/pkgs/games/ue4/default.nix
+++ b/pkgs/games/ue4/default.nix
@@ -1,8 +1,7 @@
-{ stdenv, writeScript, fetchurl, requireFile, unzip, clang, mono, which,
+{ lib, stdenv, writeScript, fetchurl, requireFile, unzip, clang, mono, which,
   xorg, xdg-user-dirs }:
 
 let
-  inherit (stdenv) lib;
   deps = import ./cdn-deps.nix { inherit fetchurl; };
   linkDeps = writeScript "link-deps.sh" (lib.concatMapStringsSep "\n" (hash:
     let prefix = lib.concatStrings (lib.take 2 (lib.stringToCharacters hash));
@@ -11,7 +10,7 @@ let
       ln -s ${lib.getAttr hash deps} .git/ue4-gitdeps/${prefix}/${hash}
     ''
   ) (lib.attrNames deps));
-  libPath = stdenv.lib.makeLibraryPath [
+  libPath = lib.makeLibraryPath [
     xorg.libX11 xorg.libXScrnSaver xorg.libXau xorg.libXcursor xorg.libXext
     xorg.libXfixes xorg.libXi xorg.libXrandr xorg.libXrender xorg.libXxf86vm
     xorg.libxcb
@@ -75,9 +74,9 @@ stdenv.mkDerivation rec {
   meta = {
     description = "A suite of integrated tools for game developers to design and build games, simulations, and visualizations";
     homepage = "https://www.unrealengine.com/what-is-unreal-engine-4";
-    license = stdenv.lib.licenses.unfree;
-    platforms = stdenv.lib.platforms.linux;
-    maintainers = [ stdenv.lib.maintainers.puffnfresh ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    maintainers = [ lib.maintainers.puffnfresh ];
     broken = true;
   };
 }
diff --git a/pkgs/games/ue4demos/default.nix b/pkgs/games/ue4demos/default.nix
index 24c98f7d774..a2d114f5113 100644
--- a/pkgs/games/ue4demos/default.nix
+++ b/pkgs/games/ue4demos/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, unzip, patchelf, xorg, openal }:
+{ lib, stdenv, fetchurl, unzip, patchelf, xorg, openal }:
 
 let
   urls = file:
@@ -14,9 +14,9 @@ let
 
       nativeBuildInputs = [ unzip patchelf ];
 
-      rtdeps = stdenv.lib.makeLibraryPath
+      rtdeps = lib.makeLibraryPath
         [ xorg.libXxf86vm xorg.libXext openal ]
-        + ":" + stdenv.lib.makeSearchPathOutput "lib" "lib64" [ stdenv.cc.cc ];
+        + ":" + lib.makeSearchPathOutput "lib" "lib64" [ stdenv.cc.cc ];
 
       buildCommand =
       ''
@@ -52,7 +52,7 @@ let
         description = "Unreal Engine 4 Linux demos";
         homepage = "https://wiki.unrealengine.com/Linux_Demos";
         platforms = [ "x86_64-linux" ];
-        license = stdenv.lib.licenses.unfree;
+        license = lib.licenses.unfree;
       };
     };
 
diff --git a/pkgs/games/ufoai/default.nix b/pkgs/games/ufoai/default.nix
index 94a12774a43..89f8f5ec91b 100644
--- a/pkgs/games/ufoai/default.nix
+++ b/pkgs/games/ufoai/default.nix
@@ -1,22 +1,23 @@
-{ stdenv, fetchurl, libtheora, xvidcore, libGLU, libGL, SDL, SDL_ttf, SDL_mixer
+{ lib, stdenv, fetchurl, libtheora, xvidcore, libGLU, libGL, SDL, SDL_ttf, SDL_mixer
 , curl, libjpeg, libpng, gettext, cunit, enableEditor?false }:
 
 stdenv.mkDerivation rec {
-  name = "ufoai-2.4";
+  pname = "ufoai";
+  version = "2.4";
   src = fetchurl {
-    url = "mirror://sourceforge/ufoai/${name}-source.tar.bz2";
+    url = "mirror://sourceforge/ufoai/ufoai-${version}-source.tar.bz2";
     sha256 = "0kxrbcjrharcwz319s90m789i4my9285ihp5ax6kfhgif2vn2ji5";
   };
 
   srcData = fetchurl {
-    url = "mirror://sourceforge/ufoai/${name}-data.tar";
+    url = "mirror://sourceforge/ufoai/ufoai-${version}-data.tar";
     sha256 = "1drhh08cqqkwv1yz3z4ngkplr23pqqrdx6cp8c3isy320gy25cvb";
   };
 
   preConfigure = ''tar xvf "${srcData}"'';
 
   configureFlags = [ "--enable-release" "--enable-sse" ]
-    ++ stdenv.lib.optional enableEditor "--enable-uforadiant";
+    ++ lib.optional enableEditor "--enable-uforadiant";
 
   buildInputs = [
     libtheora xvidcore libGLU libGL SDL SDL_ttf SDL_mixer
@@ -28,9 +29,9 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://ufoai.org";
     description = "A squad-based tactical strategy game in the tradition of X-Com";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = lib.platforms.linux;
     hydraPlatforms = [];
   };
 }
diff --git a/pkgs/games/uhexen2/default.nix b/pkgs/games/uhexen2/default.nix
new file mode 100644
index 00000000000..78c38753f79
--- /dev/null
+++ b/pkgs/games/uhexen2/default.nix
@@ -0,0 +1,66 @@
+{ lib, fetchgit, SDL, stdenv, libogg, libvorbis, libmad, xdelta }:
+
+stdenv.mkDerivation rec {
+  pname = "uhexen2";
+  version = "1.5.9";
+
+  src = fetchgit {
+    url = "https://git.code.sf.net/p/uhexen2/uhexen2";
+    sha256 = "0crdihbnb92awkikn15mzdpkj1x9s34xixf1r7fxxf762m60niks";
+    rev = "4ef664bc41e3998b0d2a55ff1166dadf34c936be";
+  };
+
+  buildInputs = [ SDL libogg libvorbis libmad xdelta ];
+
+  preBuild = ''
+    makeFiles=(
+        "engine/hexen2 glh2"
+        "engine/hexen2 clean"
+        "engine/hexen2 h2"
+        "engine/hexen2/server"
+        "engine/hexenworld/client glhw"
+        "engine/hexenworld/client clean"
+        "engine/hexenworld/client hw"
+        "engine/hexenworld/server"
+        "h2patch"
+    )
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    for makefile in "''${makeFiles[@]}"; do
+          local flagsArray=(
+            -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES
+            SHELL=$SHELL
+            $makeFlags "''${makeFlagsArray[@]}"
+            $buildFlags "''${buildFlagsArray[@]}"
+          )
+          echoCmd 'build flags' ""''${flagsArray[@]}""
+          make  -C $makefile ""''${flagsArray[@]}""
+          unset flagsArray
+    done
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm755 engine/hexen2/{glhexen2,hexen2,server/h2ded} -t $out/bin
+    install -Dm755 engine/hexenworld/{client/glhwcl,client/hwcl,server/hwsv} -t $out/bin
+    install -Dm755 h2patch/h2patch -t $out/bin
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A cross-platform port of Hexen II game";
+    longDescription = ''
+      Hammer of Thyrion (uHexen2) is a cross-platform port of Raven Software's Hexen II source.
+      It is based on an older linux port, Anvil of Thyrion.
+      HoT includes countless bug fixes, improved music, sound and video modes, opengl improvements,
+      support for many operating systems and architectures, and documentation among many others.
+    '';
+    homepage = "http://uhexen2.sourceforge.net/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ xdhampus ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/games/ultimatestunts/default.nix b/pkgs/games/ultimatestunts/default.nix
index 6eb4725897f..2e3d5445918 100644
--- a/pkgs/games/ultimatestunts/default.nix
+++ b/pkgs/games/ultimatestunts/default.nix
@@ -1,14 +1,15 @@
-{stdenv, fetchurl, SDL, libGLU, libGL, SDL_image, freealut, openal, libvorbis,
-pkgconfig}:
+{lib, stdenv, fetchurl, SDL, libGLU, libGL, SDL_image, freealut, openal, libvorbis,
+pkg-config}:
 
-stdenv.mkDerivation {
-  name = "ultimate-stunts-0.7.6.1";
+stdenv.mkDerivation rec {
+  pname = "ultimate-stunts";
+  version = "0.7.6.1";
   src = fetchurl {
-    url = "mirror://sourceforge/ultimatestunts/ultimatestunts-srcdata-0761.tar.gz";
+    url = "mirror://sourceforge/ultimatestunts/ultimatestunts-srcdata-${lib.replaceStrings ["."] [""] version}.tar.gz";
     sha256 = "0rd565ml6l927gyq158klhni7myw8mgllhv0xl1fg9m8hlzssgrv";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ SDL libGLU libGL SDL_image freealut openal libvorbis ];
 
   postPatch = ''
@@ -18,8 +19,8 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.ultimatestunts.nl/";
     description = "Remake of the popular racing DOS-game Stunts";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/games/ultrastardx/default.nix b/pkgs/games/ultrastardx/default.nix
index b2d601df349..1d6f199480d 100644
--- a/pkgs/games/ultrastardx/default.nix
+++ b/pkgs/games/ultrastardx/default.nix
@@ -1,7 +1,26 @@
-{ stdenv, autoreconfHook, fetchFromGitHub, pkgconfig
-, lua, fpc, pcre, portaudio, freetype, libpng
-, SDL2, SDL2_image, SDL2_gfx, SDL2_mixer, SDL2_net, SDL2_ttf
-, ffmpeg, sqlite, zlib, libX11, libGLU, libGL }:
+{ lib, stdenv
+, autoreconfHook
+, fetchFromGitHub
+, fetchpatch
+, pkg-config
+, lua
+, fpc
+, pcre
+, portaudio
+, freetype
+, libpng
+, SDL2
+, SDL2_image
+, SDL2_gfx
+, SDL2_mixer
+, SDL2_net, SDL2_ttf
+, ffmpeg
+, sqlite
+, zlib
+, libX11
+, libGLU
+, libGL
+}:
 
 let
   sharedLibs = [
@@ -12,23 +31,44 @@ let
 
 in stdenv.mkDerivation rec {
   pname = "ultrastardx";
-  version = "unstable-2019-01-07";
+  version = "2021-04-03";
   src = fetchFromGitHub {
     owner = "UltraStar-Deluxe";
     repo = "USDX";
-    rev = "3df142590f29db1505cc58746af9f8cf7cb4a6a5";
-    sha256 = "0853rg7vppkmw37wm9xm0m0wab3r09ws6w04xs2wgwj1mwl0d70j";
+    rev = "d49e916705092f3d765d85d276b283b9e7e232a6";
+    sha256 = "0sdcz2vc8i2z50nj7zbkdpxx2mvx0m0927lfsj7d7qr0p8vkm0wa";
   };
 
-  nativeBuildInputs = [ pkgconfig autoreconfHook ];
+  nativeBuildInputs = [ pkg-config autoreconfHook ];
   buildInputs = [ fpc libpng ] ++ sharedLibs;
 
   postPatch = ''
     substituteInPlace src/config.inc.in \
       --subst-var-by libpcre_LIBNAME libpcre.so.1
+
+    # ultrastardx binds to libffmpeg (and sublibs), specifying a very restrictive
+    # upper bounds on the minor versions of .so files.
+    # We can assume ffmpeg won’t break any major ABI compatibility, since their
+    # patch version seems to always stay at 100,
+    # and their minor version changes quite frequently.
+    sed \
+      -e 's/^  LIBAVCODEC_MAX_VERSION_MINOR.*$/  LIBAVCODEC_MAX_VERSION_MINOR = 1000;/' \
+      -i src/lib/ffmpeg-4.0/avcodec.pas
+    sed \
+      -e 's/^  LIBAVFORMAT_MAX_VERSION_MINOR.*$/  LIBAVFORMAT_MAX_VERSION_MINOR = 1000;/' \
+      -i src/lib/ffmpeg-4.0/avformat.pas
+    sed \
+      -e 's/^  LIBAVUTIL_MAX_VERSION_MINOR.*$/  LIBAVUTIL_MAX_VERSION_MINOR = 1000;/' \
+      -i src/lib/ffmpeg-4.0/avutil.pas
+    sed \
+      -e 's/^  LIBSWRESAMPLE_MAX_VERSION_MINOR.*$/  LIBSWRESAMPLE_MAX_VERSION_MINOR = 1000;/' \
+      -i src/lib/ffmpeg-4.0/swresample.pas
+    sed \
+      -e 's/^  LIBSWSCALE_MAX_VERSION_MINOR.*$/  LIBSWSCALE_MAX_VERSION_MINOR = 1000;/' \
+      -i src/lib/ffmpeg-4.0/swscale.pas
   '';
 
-  preBuild = with stdenv.lib;
+  preBuild = with lib;
     let items = concatMapStringsSep " " (x: "-rpath ${getLib x}/lib") sharedLibs;
     in ''
       export NIX_LDFLAGS="$NIX_LDFLAGS ${items}"
@@ -37,7 +77,7 @@ in stdenv.mkDerivation rec {
   # dlopened libgcc requires the rpath not to be shrinked
   dontPatchELF = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://ultrastardx.sourceforge.net/";
     description = "Free and open source karaoke game";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/unciv/default.nix b/pkgs/games/unciv/default.nix
new file mode 100644
index 00000000000..307138c03aa
--- /dev/null
+++ b/pkgs/games/unciv/default.nix
@@ -0,0 +1,59 @@
+{ stdenv
+, lib
+, fetchurl
+, copyDesktopItems
+, makeDesktopItem
+, makeWrapper
+, jre
+, libpulseaudio
+, libXxf86vm
+}:
+let
+  desktopItem = makeDesktopItem {
+    name = "unciv";
+    exec = "unciv";
+    comment = "An open-source Android/Desktop remake of Civ V";
+    desktopName = "Unciv";
+    categories = "Game;";
+  };
+
+  envLibPath = lib.makeLibraryPath [
+    libpulseaudio
+    libXxf86vm
+  ];
+
+in
+stdenv.mkDerivation rec {
+  pname = "unciv";
+  version = "3.15.9";
+
+  src = fetchurl {
+    url = "https://github.com/yairm210/Unciv/releases/download/${version}/Unciv.jar";
+    sha256 = "sha256-ONp7M6nMlVjxNnsIveDpqV7/WahydphP16DFDrcjY4E=";
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+
+    makeWrapper ${jre}/bin/java $out/bin/unciv \
+      --prefix LD_LIBRARY_PATH : ${envLibPath} \
+      --prefix PATH : ${lib.makeBinPath [ jre ]} \
+      --add-flags "-jar ${src}"
+
+    runHook postInstall
+  '';
+
+  desktopItems = [ desktopItem ];
+
+  meta = with lib; {
+    description = "An open-source Android/Desktop remake of Civ V";
+    homepage = "https://github.com/yairm210/Unciv";
+    maintainers = with maintainers; [ tex ];
+    license = licenses.mpl20;
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/games/unnethack/default.nix b/pkgs/games/unnethack/default.nix
index 1ac87c1d41b..03928ff48f4 100644
--- a/pkgs/games/unnethack/default.nix
+++ b/pkgs/games/unnethack/default.nix
@@ -1,18 +1,20 @@
-{ stdenv, fetchgit, utillinux, ncurses, flex, bison }:
+{ lib, stdenv, fetchFromGitHub, fetchpatch, util-linux, ncurses, flex, bison }:
 
 stdenv.mkDerivation rec {
   pname = "unnethack";
-  version = "5.2.0";
+  version = "5.3.2";
 
-  src = fetchgit {
-    url = "https://github.com/UnNetHack/UnNetHack";
-    rev = "refs/tags/${version}";
-    sha256 = "088gd2c7v95f2pm9ky38i28sz73mnsksr2p2hhhflkchxncd21f1";
+  src = fetchFromGitHub {
+    name = "UnNetHack";
+    owner = "UnNetHack";
+    repo = "UnNetHack";
+    rev = version;
+    sha256 = "1rg0mqyplgn3dfh3wz09a600qxk7aidqw4d84kyiincljvhyb7ps";
   };
 
   buildInputs = [ ncurses ];
 
-  nativeBuildInputs = [ utillinux flex bison ];
+  nativeBuildInputs = [ util-linux flex bison ];
 
   configureFlags = [ "--enable-curses-graphics"
                      "--disable-tty-graphics"
@@ -22,6 +24,14 @@ stdenv.mkDerivation rec {
                    ];
 
   makeFlags = [ "GAMEPERM=744" ];
+  patches = [
+    # fix regression with bison, merged in master
+    (fetchpatch {
+      name = "fix-bison.patch";
+      url = "https://github.com/UnNetHack/UnNetHack/commit/04f0a3a850a94eb8837ddcef31303968240d1c31.patch";
+      sha256 = "1zblbwqqz9nx16k6n31wi2hdvz775lvzmkjblmrx18nbm4ylj0n9";
+    })
+  ];
 
   enableParallelBuilding = true;
 
@@ -48,11 +58,11 @@ stdenv.mkDerivation rec {
     chmod +x $out/bin/unnethack
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fork of NetHack";
     homepage = "https://unnethack.wordpress.com/";
     license = "nethack";
     platforms = platforms.all;
     maintainers = with maintainers; [ abbradar ];
-  }; 
+  };
 }
diff --git a/pkgs/games/unvanquished/default.nix b/pkgs/games/unvanquished/default.nix
new file mode 100644
index 00000000000..f3f8c1413db
--- /dev/null
+++ b/pkgs/games/unvanquished/default.nix
@@ -0,0 +1,192 @@
+{ lib, stdenv, fetchzip, fetchFromGitHub, buildFHSUserEnv, makeDesktopItem
+, copyDesktopItems, gcc, cmake, gmp , libGL, zlib, ncurses, geoip, lua5
+, nettle, curl, SDL2, freetype, glew , openal, libopus, opusfile, libogg
+, libvorbis, libjpeg, libwebp, libpng
+, cacert, aria2 # to download assets
+}:
+
+let
+  version = "0.52.1";
+  binary-deps-version = "5";
+
+  src = fetchFromGitHub {
+    owner = "Unvanquished";
+    repo = "Unvanquished";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "1fiqn9f6nsh4cfjy7gfsv950hphwi9ca0ddgsjvn77g7yc0arp6c";
+  };
+
+  unvanquished-binary-deps = stdenv.mkDerivation rec {
+    # DISCLAIMER: this is selected binary crap from the NaCl SDK
+    name = "unvanquished-binary-deps";
+    version = binary-deps-version;
+    src = fetchzip {
+      url = "https://dl.unvanquished.net/deps/linux64-${version}.tar.bz2";
+      sha256 = "08bpyavbh5lmyprvqqi59gnm8s1fjmlk9f1785wlv7f52d9f9z1p";
+    };
+    dontPatchELF = true;
+    preFixup = ''
+      # We are not using the autoPatchelfHook, because it would make
+      # nacl_bootstrap_helper unable to load nacl_loader:
+      # "nacl_loader: ELF file has unreasonable e_phnum=13"
+      interpreter="$(< "$NIX_CC/nix-support/dynamic-linker")"
+      for f in pnacl/bin/*; do
+        if [ -f "$f" && -x "$f" ]; then
+          echo "Patching $f"
+          patchelf --set-interpreter "$interpreter" "$f"
+        fi
+      done
+    '';
+    preCheck = "pnacl/bin/clang -v"; # check it links correctly
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out
+      cp -R ./* $out/
+
+      runHook postInstall
+    '';
+  };
+
+  libstdcpp-preload-for-unvanquished-nacl = stdenv.mkDerivation {
+    name = "libstdcpp-preload-for-unvanquished-nacl";
+    buildCommand = ''
+      mkdir $out/etc -p
+      echo ${gcc.cc.lib}/lib/libstdc++.so.6 > $out/etc/ld-nix.so.preload
+    '';
+    propagatedBuildInputs = [ gcc.cc.lib ];
+  };
+
+  fhsEnv = buildFHSUserEnv {
+    name = "unvanquished-fhs-wrapper";
+    targetPkgs = pkgs: [ libstdcpp-preload-for-unvanquished-nacl ];
+  };
+
+  wrapBinary = binary: wrappername: ''
+    cat > $out/lib/${binary}-wrapper <<-EOT
+    #!/bin/sh
+    exec $out/lib/${binary} -pakpath ${unvanquished-assets} "\$@"
+    EOT
+    chmod +x $out/lib/${binary}-wrapper
+
+    cat > $out/bin/${wrappername} <<-EOT
+    #!/bin/sh
+    exec ${fhsEnv}/bin/unvanquished-fhs-wrapper $out/lib/${binary}-wrapper "\$@"
+    EOT
+    chmod +x $out/bin/${wrappername}
+  '';
+
+  unvanquished-assets = stdenv.mkDerivation {
+    pname = "unvanquished-assets";
+    inherit version src;
+
+    outputHash = "sha256:084jdisb48xyk9agjifn0nlnsdnjgg32si8zd1khsywd0kffplzx";
+    outputHashMode = "recursive";
+    nativeBuildInputs = [ aria2 cacert ];
+    buildCommand = "bash $src/download-paks --cache=$(pwd) --version=${version} $out";
+  };
+
+# this really is the daemon game engine, the game itself is in the assets
+in stdenv.mkDerivation rec {
+  pname = "unvanquished";
+  inherit version src binary-deps-version;
+
+  preConfigure = ''
+    mkdir daemon/external_deps/linux64-${binary-deps-version}/
+    cp -r ${unvanquished-binary-deps}/* daemon/external_deps/linux64-${binary-deps-version}/
+    chmod +w -R daemon/external_deps/linux64-${binary-deps-version}/
+  '';
+
+  nativeBuildInputs = [ cmake unvanquished-binary-deps copyDesktopItems ];
+  buildInputs = [
+    gmp
+    libGL
+    zlib
+    ncurses
+    geoip
+    lua5
+    nettle
+    curl
+    SDL2
+    freetype
+    glew
+    openal
+    libopus
+    opusfile
+    libogg
+    libvorbis
+    libjpeg
+    libwebp
+    libpng
+  ];
+
+  cmakeFlags = [
+    "-DBUILD_CGAME=NO"
+    "-DBUILD_SGAME=NO"
+    "-DUSE_HARDENING=TRUE"
+    "-DUSE_LTO=TRUE"
+    "-DOpenGL_GL_PREFERENCE=LEGACY" # https://github.com/DaemonEngine/Daemon/issues/474
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "net.unvanquished.Unvanquished.desktop";
+      desktopName = "Unvanquished";
+      comment = "FPS/RTS Game - Aliens vs. Humans";
+      icon = "unvanquished";
+      terminal = false;
+      exec = "unvanquished";
+      categories = "Game;ActionGame;StrategyGame;";
+      # May or may not work
+      prefersNonDefaultGPU = true;
+      fileValidation = false; # it doesn't like PrefersNonDefaultGPU
+      # yes, PrefersNonDefaultGPU is standard:
+      # https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
+    })
+    (makeDesktopItem {
+      name = "net.unvanquished.UnvanquishedProtocolHandler.desktop";
+      desktopName = "Unvanquished (protocol handler)";
+      noDisplay = true;
+      terminal = false;
+      exec = "unvanquished -connect %u";
+      mimeType = "x-scheme-handler/unv";
+      # May or may not work
+      prefersNonDefaultGPU = true;
+      fileValidation = false; # it doesn't like PrefersNonDefaultGPU
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    for f in daemon daemon-tty daemonded nacl_loader nacl_helper_bootstrap; do
+      install -Dm0755 -t $out/lib/ $f
+    done
+    install -Dm0644 -t $out/lib/ irt_core-x86_64.nexe
+
+    mkdir $out/bin/
+    ${wrapBinary "daemon"     "unvanquished"}
+    ${wrapBinary "daemon-tty" "unvanquished-tty"}
+    ${wrapBinary "daemonded"  "unvanquished-server"}
+
+    for d in ${src}/dist/icons/*; do
+      install -Dm0644 -t $out/share/icons/hicolor/$(basename $d)/apps/ $d/unvanquished.png
+    done
+
+    runHook postInstall
+  '';
+  meta = {
+    platforms = [ "x86_64-linux" ];
+    homepage = "https://unvanquished.net/";
+    downloadPage = "https://unvanquished.net/download/";
+    description = "A fast paced, first person strategy game";
+    maintainers = with lib.maintainers; [ afontain ];
+    # don't replace the following lib.licenses.zlib with just "zlib",
+    # or you would end up with the package instead
+    license = with lib.licenses; [
+      mit gpl3Plus lib.licenses.zlib bsd3 # engine
+      cc-by-sa-25 cc-by-sa-30 cc-by-30 cc-by-sa-40 cc0 # assets
+    ];
+  };
+}
diff --git a/pkgs/games/uqm/3dovideo.nix b/pkgs/games/uqm/3dovideo.nix
index 8d1bf2b6887..4ebbc9c4992 100644
--- a/pkgs/games/uqm/3dovideo.nix
+++ b/pkgs/games/uqm/3dovideo.nix
@@ -1,10 +1,8 @@
-{ stdenv, requireFile, writeText, fetchurl, haskellPackages }:
-
-with stdenv.lib;
+{ stdenv, lib, requireFile, writeText, fetchurl, haskellPackages }:
 
 let
   makeSpin = num: let
-    padded = (optionalString (lessThan num 10) "0") + toString num;
+    padded = (lib.optionalString (lib.lessThan num 10) "0") + toString num;
   in "slides.spins.${padded} = 3DOVID:" +
      "addons/3dovideo/spins/ship${padded}.duk:" +
      "addons/3dovideo/spins/spin.aif:" +
@@ -13,7 +11,7 @@ let
   videoRMP = writeText "3dovideo.rmp" (''
     slides.ending = 3DOVID:addons/3dovideo/ending/victory.duk
     slides.intro = 3DOVID:addons/3dovideo/intro/intro.duk
-  '' + concatMapStrings makeSpin (range 0 24));
+  '' + lib.concatMapStrings makeSpin (lib.range 0 24));
 
   helper = with haskellPackages; mkDerivation {
     pname = "uqm3donix";
@@ -30,7 +28,7 @@ let
     buildDepends = [ base binary bytestring filepath tar ];
 
     description = "Extract video files from a Star Control II 3DO image";
-    license = stdenv.lib.licenses.bsd3;
+    license = lib.licenses.bsd3;
   };
 
 in stdenv.mkDerivation {
diff --git a/pkgs/games/uqm/default.nix b/pkgs/games/uqm/default.nix
index 523ae354b76..a06c1b3b665 100644
--- a/pkgs/games/uqm/default.nix
+++ b/pkgs/games/uqm/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchurl, pkgconfig, libGLU, libGL
+{ stdenv, lib, fetchurl, pkg-config, libGLU, libGL
 , SDL, SDL_image, libpng, libvorbis, libogg, libmikmod
 
 , use3DOVideos ? false, requireFile ? null, writeText ? null
@@ -12,7 +12,7 @@ assert use3DOVideos -> requireFile != null && writeText != null
 
 let
   videos = import ./3dovideo.nix {
-    inherit stdenv requireFile writeText fetchurl haskellPackages;
+    inherit stdenv lib requireFile writeText fetchurl haskellPackages;
   };
 
   remixPacks = lib.imap1 (num: sha256: fetchurl rec {
@@ -50,7 +50,7 @@ in stdenv.mkDerivation rec {
     sha256 = "10nbvcrr0lc0mxivxfkcbxnibwk3vwmamabrlvwdsjxd9pk8aw65";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ SDL SDL_image libpng libvorbis libogg libmikmod libGLU libGL ];
 
   postUnpack = ''
@@ -65,9 +65,11 @@ in stdenv.mkDerivation rec {
     ln -s "${videos}" "uqm-${version}/content/addons/3dovideo"
   '';
 
-  # Using _STRINGS_H as include guard conflicts with glibc.
   postPatch = ''
+    # Using _STRINGS_H as include guard conflicts with glibc.
     sed -i -e '/^#/s/_STRINGS_H/_UQM_STRINGS_H/g' src/uqm/comm/*/strings.h
+    # See https://github.com/NixOS/nixpkgs/pull/93560
+    sed -i -e 's,/tmp/,$TMPDIR/,' build/unix/config_functions
   '';
 
   # uqm has a 'unique' build system with a root script incidentally called
@@ -100,7 +102,7 @@ in stdenv.mkDerivation rec {
           spin-offs, thereby making zillions more people happy!
     '';
     homepage = "http://sc2.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
     maintainers = with lib.maintainers; [ jcumming aszlig ];
     platforms = with lib.platforms; linux;
   };
diff --git a/pkgs/games/urbanterror/default.nix b/pkgs/games/urbanterror/default.nix
index ccc20281302..dfbad29fa9e 100644
--- a/pkgs/games/urbanterror/default.nix
+++ b/pkgs/games/urbanterror/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, unzip, SDL, libGLU, libGL, openal, curl, libXxf86vm }:
+{ lib, stdenv, fetchurl, unzip, SDL, libGLU, libGL, openal, curl, libXxf86vm }:
 
 stdenv.mkDerivation rec {
   pname = "urbanterror";
@@ -15,7 +15,8 @@ stdenv.mkDerivation rec {
        })
     ];
 
-  buildInputs = [ unzip SDL libGL libGLU openal curl libXxf86vm ];
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [ SDL libGL libGLU openal curl libXxf86vm ];
   sourceRoot = "ioq3-for-UrbanTerror-4-release-${version}";
 
   configurePhase = ''
@@ -56,7 +57,7 @@ stdenv.mkDerivation rec {
 
   hardeningDisable = [ "format" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A multiplayer tactical FPS on top of Quake 3 engine";
     longDescription = ''
       Urban Terror is a free multiplayer first person shooter developed by
diff --git a/pkgs/games/ut2004/demo.nix b/pkgs/games/ut2004/demo.nix
index cb7c0208f10..5203453cc60 100644
--- a/pkgs/games/ut2004/demo.nix
+++ b/pkgs/games/ut2004/demo.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 let
   arch =
@@ -11,7 +11,7 @@ in stdenv.mkDerivation rec {
   version = "3334";
 
   src = fetchurl {
-    url = "http://vlaai.snt.utwente.nl/pub/games/UT2004/demo/UT2004-LNX-Demo${version}.run.gz";
+    url = "http://ftp.snt.utwente.nl/pub/games/UT2004/demo/UT2004-LNX-Demo${version}.run.gz";
     sha256 = "0d5f84qz8l1rg16yzx2k4ikr46n9iwj68na1bqi87wrww7ck6jh7";
   };
 
@@ -30,7 +30,7 @@ in stdenv.mkDerivation rec {
   dontStrip = true;
   dontPatchELF = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A first-person shooter video game developed by Epic Games and Digital Extreme -- demo version";
     homepage = "http://www.unrealtournament2004.com";
     license = licenses.unfree;
diff --git a/pkgs/games/vapor/default.nix b/pkgs/games/vapor/default.nix
index a8d345151d6..71028065263 100644
--- a/pkgs/games/vapor/default.nix
+++ b/pkgs/games/vapor/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
 
 let
   pname = "vapor";
@@ -14,13 +14,13 @@ let
     name = "Vapor";
     exec = pname;
     icon = icon;
-    comment = "LÖVE Distribution Client"; 
+    comment = "LÖVE Distribution Client";
     desktopName = "Vapor";
     genericName = "vapor";
     categories = "Game;";
   };
 
-in 
+in
 
 stdenv.mkDerivation {
   name = "${pname}-${version}";
@@ -50,7 +50,7 @@ stdenv.mkDerivation {
     ln -s ${desktopItem}/share/applications/* $out/share/applications/
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "LÖVE Distribution Client allowing access to many games";
     platforms = platforms.linux;
     license = licenses.zlib;
diff --git a/pkgs/games/vassal/default.nix b/pkgs/games/vassal/default.nix
index 55848d91fab..e1fc19fa05b 100644
--- a/pkgs/games/vassal/default.nix
+++ b/pkgs/games/vassal/default.nix
@@ -1,19 +1,20 @@
-{ stdenv, fetchurl, jre, makeWrapper }:
+{ lib, stdenv, fetchzip, jre, makeWrapper }:
 
 stdenv.mkDerivation rec {
-  name = "VASSAL-3.2.17";
+  pname = "VASSAL";
+  version = "3.5.3";
 
-  src = fetchurl {
-    url = "mirror://sourceforge/vassalengine/${name}-linux.tar.bz2";
-    sha256 = "0nxskr46janxnb31c03zv61kr46vy98l7cwxha3vll81l4ij1sjb";
+  src = fetchzip {
+    url = "https://github.com/vassalengine/vassal/releases/download/${version}/${pname}-${version}-linux.tar.bz2";
+    sha256 = "sha256-r48k4Un623uYsYcdF5UAH6w/uIdgWz8WQ75BiwrApkA=";
   };
 
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
 
   installPhase = ''
     mkdir -p $out/bin $out/share/vassal $out/doc
 
-    cp CHANGES LICENSE README $out
+    cp CHANGES LICENSE README.md $out
     cp -R lib/* $out/share/vassal
     cp -R doc/* $out/doc
 
@@ -25,11 +26,11 @@ stdenv.mkDerivation rec {
   # Don't move doc to share/, VASSAL expects it to be in the root
   forceShare = [ "man" "info" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
       description = "A free, open-source boardgame engine";
       homepage = "http://www.vassalengine.org/";
-      license = licenses.lgpl21;
+      license = licenses.lgpl21Only;
       maintainers = with maintainers; [ tvestelind ];
-      platforms = platforms.linux;
+      platforms = platforms.unix;
   };
 }
diff --git a/pkgs/games/vdrift/default.nix b/pkgs/games/vdrift/default.nix
index ea8b3941f8b..407603687ba 100644
--- a/pkgs/games/vdrift/default.nix
+++ b/pkgs/games/vdrift/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchsvn, pkgconfig, sconsPackages, libGLU, libGL, SDL2, SDL2_image
+{ lib, stdenv, fetchFromGitHub, fetchsvn, pkg-config, sconsPackages, libGLU, libGL, SDL2, SDL2_image
 , libvorbis, bullet, curl, gettext, writeTextFile
 
 , data ? fetchsvn {
@@ -20,7 +20,7 @@ let
       sha256 = "001wq3c4n9wzxqfpq40b1jcl16sxbqv2zbkpy9rq2wf9h417q6hg";
     };
 
-    nativeBuildInputs = [ pkgconfig sconsPackages.scons_3_1_2 ];
+    nativeBuildInputs = [ pkg-config sconsPackages.scons_3_1_2 ];
     buildInputs = [ libGLU libGL SDL2 SDL2_image libvorbis bullet curl gettext ];
 
     patches = [ ./0001-Ignore-missing-data-for-installation.patch ];
@@ -35,9 +35,9 @@ let
     meta = {
       description = "Car racing game";
       homepage = "http://vdrift.net/";
-      license = stdenv.lib.licenses.gpl2Plus;
-      maintainers = with stdenv.lib.maintainers; [viric];
-      platforms = stdenv.lib.platforms.linux;
+      license = lib.licenses.gpl2Plus;
+      maintainers = with lib.maintainers; [viric];
+      platforms = lib.platforms.linux;
     };
   };
   wrappedName = "vdrift-${version}-with-data-${toString data.rev}";
diff --git a/pkgs/games/vectoroids/default.nix b/pkgs/games/vectoroids/default.nix
index 01e787b8d91..765f2146580 100644
--- a/pkgs/games/vectoroids/default.nix
+++ b/pkgs/games/vectoroids/default.nix
@@ -1,9 +1,10 @@
-{stdenv, fetchurl, SDL, SDL_image, SDL_mixer}:
+{lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer}:
 
-stdenv.mkDerivation {
-  name = "vectoroids-1.1.0";
+stdenv.mkDerivation rec {
+  pname = "vectoroids";
+  version = "1.1.0";
   src = fetchurl {
-    url = "ftp://ftp.tuxpaint.org/unix/x/vectoroids/src/vectoroids-1.1.0.tar.gz";
+    url = "ftp://ftp.tuxpaint.org/unix/x/vectoroids/src/vectoroids-${version}.tar.gz";
     sha256 = "0bkvd4a1v496w0vlvqyi1a6p25ssgpkchxxxi8899sb72wlds54d";
   };
 
@@ -17,7 +18,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.newbreedsoftware.com/vectoroids/";
     description = "Clone of the classic arcade game Asteroids by Atari";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/vessel/default.nix b/pkgs/games/vessel/default.nix
index 4e0337fa1b4..7c535cb323e 100644
--- a/pkgs/games/vessel/default.nix
+++ b/pkgs/games/vessel/default.nix
@@ -1,27 +1,28 @@
-{ stdenv, requireFile, SDL, libpulseaudio, alsaLib, runtimeShell }:
+{ lib, stdenv, requireFile, SDL, libpulseaudio, alsa-lib, runtimeShell }:
 
 stdenv.mkDerivation rec {
-  name = "vessel-12082012";
+  pname = "vessel";
+  version = "12082012";
 
   goBuyItNow = ''
     We cannot download the full 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/${name}-bin" in the
+    You can do this by using "nix-prefetch-url file://\$PWD/vessel-${version}-bin" in the
     directory where you saved it.
   '';
 
   src = if (stdenv.isi686) then
     requireFile {
       message = goBuyItNow;
-      name = "${name}-bin";
+      name = "vessel-${version}-bin";
       sha256 = "1vpwcrjiln2mx43h7ib3jnccyr3chk7a5x2bw9kb4lw8ycygvg96";
     } else throw "unsupported platform ${stdenv.hostPlatform.system} only i686-linux supported for now.";
 
   phases = "installPhase";
   ld_preload = ./isatty.c;
 
-  libPath = stdenv.lib.makeLibraryPath [ stdenv.cc.cc stdenv.cc.libc ]
-    + ":" + stdenv.lib.makeLibraryPath [ SDL libpulseaudio alsaLib ] ;
+  libPath = lib.makeLibraryPath [ stdenv.cc.cc stdenv.cc.libc ]
+    + ":" + lib.makeLibraryPath [ SDL libpulseaudio alsa-lib ] ;
 
   installPhase = ''
     mkdir -p $out/libexec/strangeloop/vessel/
@@ -67,7 +68,7 @@ stdenv.mkDerivation rec {
     chmod +x $out/bin/Vessel
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A fluid physics based puzzle game";
     longDescription = ''
       Living liquid machines have overrun this world of unstoppable progress,
diff --git a/pkgs/games/vitetris/default.nix b/pkgs/games/vitetris/default.nix
index 2b9c77cd467..99996ca5c32 100644
--- a/pkgs/games/vitetris/default.nix
+++ b/pkgs/games/vitetris/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   pname = "vitetris";
-  version = "0.58.0";
+  version = "0.59.1";
 
   src = fetchFromGitHub {
     owner = "vicgeralds";
     repo = "vitetris";
     rev = "v${version}";
-    sha256 = "1fvw9yqg1q25x6dlfi4bl3hrrcdgl6wwq29j89aycxwdfxrxs09w";
+    sha256 = "sha256-Rbfa2hD67RGmInfWwYD4SthL8lm5bGSBi3oudV5hAao=";
   };
 
   hardeningDisable = [ "format" ];
diff --git a/pkgs/games/vms-empire/default.nix b/pkgs/games/vms-empire/default.nix
index eb9108c32c9..b3e89617ef3 100644
--- a/pkgs/games/vms-empire/default.nix
+++ b/pkgs/games/vms-empire/default.nix
@@ -1,28 +1,50 @@
-{ stdenv, fetchurl, ncurses, xmlto }:
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+, xmlto
+, docbook_xml_dtd_44
+, docbook_xsl
+, installShellFiles
+}:
 
-with stdenv.lib;
 stdenv.mkDerivation rec {
-
   pname = "vms-empire";
-  version = "1.15";
+  version = "1.16";
 
   src = fetchurl{
-    url = "http://www.catb.org/~esr/vms-empire/${pname}-${version}.tar.gz";
-    sha256 = "1vcpglkimcljb8s1dp6lzr5a0vbfxmh6xf37cmb8rf9wc3pghgn3";
+    url = "http://www.catb.org/~esr/${pname}/${pname}-${version}.tar.gz";
+    hash = "sha256-XETIbt/qVU+TpamPc2WQynqqUuZqkTUnItBprjg+gPk=";
   };
 
-  buildInputs =
-  [ ncurses xmlto ];
+  nativeBuildInputs = [ installShellFiles ];
+  buildInputs = [
+    ncurses
+    xmlto
+    docbook_xml_dtd_44
+    docbook_xsl
+  ];
+
+  postBuild = ''
+    xmlto man vms-empire.xml
+    xmlto html-nochunks vms-empire.xml
+  '';
 
-  patchPhase = ''
-    sed -i -e 's|^install: empire\.6 uninstall|install: empire.6|' -e 's|usr/||g' Makefile
+  installPhase = ''
+    runHook preInstall
+    install -D vms-empire -t ${placeholder "out"}/bin/
+    install -D vms-empire.html -t ${placeholder "out"}/share/doc/${pname}/
+    install -D vms-empire.desktop -t ${placeholder "out"}/share/applications/
+    install -D vms-empire.png -t ${placeholder "out"}/share/icons/hicolor/48x48/apps/
+    install -D vms-empire.xml -t ${placeholder "out"}/share/appdata/
+    installManPage empire.6
+    runHook postInstall
   '';
 
   hardeningDisable = [ "format" ];
 
-  makeFlags = [ "DESTDIR=$(out)" ];
-
-  meta = {
+  meta = with lib; {
+    homepage = "http://catb.org/~esr/vms-empire/";
     description = "The ancestor of all expand/explore/exploit/exterminate games";
     longDescription = ''
       Empire is a simulation of a full-scale war between two emperors, the
@@ -32,11 +54,8 @@ stdenv.mkDerivation rec {
       expand/explore/exploit/exterminate games, including Civilization and
       Master of Orion.
     '';
-    homepage = "http://catb.org/~esr/vms-empire/";
-    license = licenses.gpl2;
+    license = licenses.gpl2Only;
     maintainers = [ maintainers.AndersonTorres ];
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
-
-
diff --git a/pkgs/games/voxelands/default.nix b/pkgs/games/voxelands/default.nix
index 93f7e9bffa6..0d28a93e401 100644
--- a/pkgs/games/voxelands/default.nix
+++ b/pkgs/games/voxelands/default.nix
@@ -1,13 +1,30 @@
-{ stdenv, fetchurl, cmake, irrlicht, libpng, bzip2, sqlite
-, libjpeg, libXxf86vm, libGLU, libGL, openal, libvorbis, xlibsWrapper, pkgconfig }:
+{ lib, stdenv
+, fetchFromGitLab
+, bzip2
+, cmake
+, expat
+, irrlicht
+, libGL
+, libGLU
+, libXxf86vm
+, libjpeg
+, libpng
+, libvorbis
+, openal
+, pkg-config
+, sqlite
+, xlibsWrapper
+}:
 
 stdenv.mkDerivation rec {
   pname = "voxelands";
-  version = "1512.00";
+  version = "1704.00";
 
-  src = fetchurl {
-    url = "http://voxelands.com/downloads/${pname}-${version}-src.tar.bz2";
-    sha256 = "0bims0y0nyviv2f2nxfj37s3258cjbfp9xd97najz0yylnk3qdfw";
+  src = fetchFromGitLab {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0yj9z9nygpn0z63y739v72l3kg81wd71xgix5k045vfzhqsam5m0";
   };
 
   cmakeFlags = [
@@ -16,16 +33,32 @@ stdenv.mkDerivation rec {
     "-DCMAKE_CXX_FLAGS_RELEASE=-DNDEBUG"
   ];
 
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
   buildInputs = [
-    cmake irrlicht libpng bzip2 libjpeg sqlite
-    libXxf86vm libGLU libGL openal libvorbis xlibsWrapper pkgconfig
+    bzip2
+    expat
+    irrlicht
+    libGL
+    libGLU
+    libXxf86vm
+    libjpeg
+    libpng
+    libvorbis
+    openal
+    sqlite
+    xlibsWrapper
   ];
 
-  meta = with stdenv.lib; {
-    homepage = "http://voxelands.com/";
+  meta = with lib; {
+    homepage = "https://voxelands.net/";
     description = "Infinite-world block sandbox game based on Minetest";
     license = licenses.gpl3Plus;
     platforms = platforms.linux;
     maintainers = with maintainers; [ ];
+    broken = stdenv.isAarch64;  # build fails with "libIrrlicht.so: undefined reference to `png_init_filter_functions_neon'"
   };
 }
diff --git a/pkgs/games/wargus/default.nix b/pkgs/games/wargus/default.nix
new file mode 100644
index 00000000000..fda4f792c7b
--- /dev/null
+++ b/pkgs/games/wargus/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, lib, callPackage, fetchFromGitHub
+, cmake, pkg-config, makeWrapper
+, zlib, bzip2, libpng
+, dialog, python3, cdparanoia
+}:
+
+let
+  stratagus = callPackage ./stratagus.nix {};
+in
+stdenv.mkDerivation rec {
+  pname = "wargus";
+  inherit (stratagus) version;
+
+  src = fetchFromGitHub {
+    owner = "wargus";
+    repo = "wargus";
+    rev = "v${version}";
+    sha256 = "0dibm68jxaqzgzcyblfj2bmwyz9v5ax0njnnbvak7xjk1zlh11sx";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper ];
+  buildInputs = [ zlib bzip2 libpng ];
+  cmakeFlags = [
+    "-DSTRATAGUS=${stratagus}/games/stratagus"
+    "-DSTRATAGUS_INCLUDE_DIR=${stratagus.src}/gameheaders"
+  ];
+  postInstall = ''
+    makeWrapper $out/games/wargus $out/bin/wargus \
+      --prefix PATH : ${lib.makeBinPath [ "$out" cdparanoia python3 ]}
+  '';
+
+  meta = with lib; {
+    description = "Importer and scripts for Warcraft II: Tides of Darkness, the expansion Beyond the Dark Portal, and Aleonas Tales";
+    homepage = "https://wargus.github.io/";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.astro ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/wargus/stratagus.nix b/pkgs/games/wargus/stratagus.nix
new file mode 100644
index 00000000000..f029e284f33
--- /dev/null
+++ b/pkgs/games/wargus/stratagus.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub
+, cmake, pkg-config, makeWrapper
+, zlib, bzip2, libpng, lua5_1, toluapp
+, SDL, SDL_mixer, SDL_image, libGL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "stratagus";
+  version = "2.4.3";
+
+  src = fetchFromGitHub {
+    owner = "wargus";
+    repo = "stratagus";
+    rev = "v${version}";
+    sha256 = "128m5n9axq007xi8a002ig7d4dyw8j060542x220ld66ibfprhcn";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [
+    zlib bzip2 libpng
+    lua5_1 toluapp
+    SDL.dev SDL_image SDL_mixer libGL
+  ];
+  cmakeFlags = [
+    "-DCMAKE_CXX_FLAGS=-Wno-error=format-overflow"
+  ];
+
+  meta = with lib; {
+    description = "strategy game engine";
+    homepage = "https://wargus.github.io/stratagus.html";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.astro ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/warmux/default.nix b/pkgs/games/warmux/default.nix
index dc8b53d09ad..6b52194ffca 100644
--- a/pkgs/games/warmux/default.nix
+++ b/pkgs/games/warmux/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchFromGitHub, autoconf, automake
+{ lib, stdenv, fetchFromGitHub, autoconf, automake
 , zlib, curl, gnutls, fribidi, libpng, SDL, SDL_gfx, SDL_image, SDL_mixer
-, SDL_net, SDL_ttf, libunwind, libX11, xorgproto, libxml2, pkgconfig
+, SDL_net, SDL_ttf, libunwind, libX11, xorgproto, libxml2, pkg-config
 , gettext, intltool, libtool, perl
 }:
 
@@ -19,7 +19,7 @@ stdenv.mkDerivation {
   configureFlagsArray = ("CFLAGS=-include ${zlib.dev}/include/zlib.h");
 
   nativeBuildInputs = [
-    autoconf automake gettext intltool libtool pkgconfig
+    autoconf automake gettext intltool libtool pkg-config
   ];
   buildInputs = [
     zlib curl gnutls fribidi libpng SDL SDL_gfx SDL_image SDL_mixer
@@ -27,7 +27,7 @@ stdenv.mkDerivation {
   ];
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Ballistics turn-based battle game between teams - unofficial copy";
     maintainers = with maintainers; [ raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/warsow/default.nix b/pkgs/games/warsow/default.nix
index 4c2cd1b5a28..81c467dd9db 100644
--- a/pkgs/games/warsow/default.nix
+++ b/pkgs/games/warsow/default.nix
@@ -1,11 +1,11 @@
-{ stdenv, fetchurl, warsow-engine, makeWrapper }:
+{ lib, stdenv, fetchurl, warsow-engine, makeWrapper }:
 
 stdenv.mkDerivation rec {
   pname = "warsow";
   version = "2.1.2";
 
   src = fetchurl {
-    url = "http://slice.sh/warsow/${pname}-${version}.tar.gz";
+    url = "http://warsow.net/${pname}-${version}.tar.gz";
     sha256 = "07y2airw5qg3s1bf1c63a6snjj22riz0mqhk62jmfm9nrarhavrc";
   };
 
@@ -22,7 +22,7 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Multiplayer FPS game designed for competitive gaming";
     longDescription = ''
       Set in a futuristic cartoon-like world where rocketlauncher-wielding
diff --git a/pkgs/games/warsow/engine.nix b/pkgs/games/warsow/engine.nix
index 19c368671e6..e796c589290 100644
--- a/pkgs/games/warsow/engine.nix
+++ b/pkgs/games/warsow/engine.nix
@@ -1,15 +1,9 @@
-{ stdenv, lib, fetchurl, cmake, libogg, libvorbis, libtheora, curl, freetype
+{ stdenv, lib, substituteAll, fetchurl, cmake, libogg, libvorbis, libtheora, curl, freetype
 , libjpeg, libpng, SDL2, libGL, openal, zlib
 }:
 
-let
-  # The game loads all those via dlopen().
-  libs = lib.mapAttrs (name: x: lib.getLib x) {
-    inherit zlib curl libpng libjpeg libogg libvorbis libtheora freetype;
-  };
-
-in stdenv.mkDerivation (libs // rec {
-  name = "warsow-engine-${version}";
+stdenv.mkDerivation rec {
+  pname = "warsow-engine";
   version = "2.1.0";
 
   src = fetchurl {
@@ -17,6 +11,13 @@ in stdenv.mkDerivation (libs // rec {
     sha256 = "0fj5k7qpf6far8i1xhqxlpfjch10zj26xpilhp95aq2yiz08pj4r";
   };
 
+  patches = [
+    (substituteAll {
+      src = ./libpath.patch;
+      inherit zlib curl libpng libjpeg libogg libvorbis libtheora freetype;
+    })
+  ];
+
   nativeBuildInputs = [ cmake ];
 
   buildInputs = [
@@ -24,30 +25,30 @@ in stdenv.mkDerivation (libs // rec {
     libpng
   ];
 
-  patches = [ ./libpath.patch ];
-  postPatch = ''
-    cd source/source
-    substituteAllInPlace gameshared/q_arch.h
-  '';
-
   cmakeFlags = [ "-DQFUSION_GAME=Warsow" ];
 
-  enableParallelBuilding = true;
+  preConfigure = ''
+    cd source/source
+  '';
 
   installPhase = ''
+    runHook preInstall
+
     mkdir -p $out/lib
     cp -r libs $out/lib/warsow
     for i in warsow.* wsw_server.* wswtv_server.*; do
       install -Dm755 "$i" "$out/bin/''${i%.*}"
     done
+
+    runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Multiplayer FPS game designed for competitive gaming (engine only)";
     homepage = "http://www.warsow.net";
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     maintainers = with maintainers; [ astsmtl abbradar ];
     platforms = platforms.linux;
     broken = stdenv.isAarch64;
   };
-})
+}
diff --git a/pkgs/games/warzone2100/default.nix b/pkgs/games/warzone2100/default.nix
index 3d7be936f1b..6f31dcf9be9 100644
--- a/pkgs/games/warzone2100/default.nix
+++ b/pkgs/games/warzone2100/default.nix
@@ -1,6 +1,31 @@
-{ stdenv, mkDerivation, fetchurl, autoconf, automake
-, perl, unzip, zip, which, pkgconfig, qtbase, qtscript
-, SDL2, libtheora, openal, glew, physfs, fribidi, libXrandr
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, ninja
+, p7zip
+, pkg-config
+, asciidoctor
+, gettext
+
+, SDL2
+, libtheora
+, libvorbis
+, openal
+, openalSoft
+, physfs
+, miniupnpc
+, libsodium
+, curl
+, libpng
+, freetype
+, harfbuzz
+, sqlite
+, which
+, vulkan-headers
+, vulkan-loader
+, shaderc
+
 , withVideos ? false
 }:
 
@@ -12,42 +37,69 @@ let
   };
 in
 
-mkDerivation rec {
+stdenv.mkDerivation rec {
   inherit pname;
-  version  = "3.3.0";
+  version  = "4.1.1";
 
   src = fetchurl {
-    url = "mirror://sourceforge/${pname}/releases/${version}/${pname}-${version}_src.tar.xz";
-    sha256 = "1s0n67rh32g0bgq72p4qzkcqjlw58gc70r4r6gl9k90pil9chj6c";
+    url = "mirror://sourceforge/${pname}/releases/${version}/${pname}_src.tar.xz";
+    sha256 = "sha256-CnMt3FytpTDAtibU3V24i6EvWRc9UkAuvC9ingphCM8=";
   };
 
   buildInputs = [
-    qtbase qtscript SDL2 libtheora openal
-    glew physfs fribidi libXrandr
+    SDL2
+    libtheora
+    libvorbis
+    openal
+    openalSoft
+    physfs
+    miniupnpc
+    libsodium
+    curl
+    libpng
+    freetype
+    harfbuzz
+    sqlite
+    vulkan-headers
+    vulkan-loader
   ];
+
   nativeBuildInputs = [
-    perl zip unzip pkgconfig autoconf automake
+    pkg-config
+    cmake
+    ninja
+    p7zip
+    asciidoctor
+    gettext
+    shaderc
   ];
 
-  preConfigure = "./autogen.sh";
-
   postPatch = ''
     substituteInPlace lib/exceptionhandler/dumpinfo.cpp \
-                      --replace "which %s" "${which}/bin/which %s"
+                      --replace '"which "' '"${which}/bin/which "'
     substituteInPlace lib/exceptionhandler/exceptionhandler.cpp \
                       --replace "which %s" "${which}/bin/which %s"
   '';
 
-  configureFlags = [ "--with-distributor=NixOS" ];
-
-  hardeningDisable = [ "format" ];
-
-  enableParallelBuilding = true;
+  cmakeFlags = [
+    "-DWZ_DISTRIBUTOR=NixOS"
+    # The cmake builder automatically sets CMAKE_INSTALL_BINDIR to an absolute
+    # path, but this results in an error:
+    #
+    # > An absolute CMAKE_INSTALL_BINDIR path cannot be used if the following
+    # > are not also absolute paths: WZ_DATADIR
+    #
+    # WZ_DATADIR is based on CMAKE_INSTALL_DATAROOTDIR, so we set that.
+    #
+    # Alternatively, we could have set CMAKE_INSTALL_BINDIR to "bin".
+    "-DCMAKE_INSTALL_DATAROOTDIR=${placeholder "out"}/share"
+  ];
 
-  postInstall = stdenv.lib.optionalString withVideos
-    "cp ${sequences_src} $out/share/warzone2100/sequences.wz";
+  postInstall = lib.optionalString withVideos ''
+    cp ${sequences_src} $out/share/warzone2100/sequences.wz
+  '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A free RTS game, originally developed by Pumpkin Studios";
     longDescription = ''
         Warzone 2100 is an open source real-time strategy and real-time tactics
@@ -62,7 +114,7 @@ mkDerivation rec {
     '';
     homepage = "http://wz2100.net";
     license = licenses.gpl2Plus;
-    maintainers = [ maintainers.astsmtl ];
+    maintainers = with maintainers; [ astsmtl fgaz ];
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/games/wesnoth/default.nix b/pkgs/games/wesnoth/default.nix
index ce375392041..6eedc446f53 100644
--- a/pkgs/games/wesnoth/default.nix
+++ b/pkgs/games/wesnoth/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, pkgconfig, SDL2, SDL2_image, SDL2_mixer, SDL2_net, SDL2_ttf
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, SDL2, SDL2_image, SDL2_mixer, SDL2_net, SDL2_ttf
 , pango, gettext, boost, libvorbis, fribidi, dbus, libpng, pcre, openssl, icu
 , Cocoa, Foundation
 , enableTools ? false
@@ -6,26 +6,24 @@
 
 stdenv.mkDerivation rec {
   pname = "wesnoth";
-  version = "1.14.13";
+  version = "1.14.16";
 
   src = fetchFromGitHub {
     rev = version;
     owner = "wesnoth";
     repo = "wesnoth";
-    sha256 = "1ka07h4sgmbc24qbaz0pbryx0yk339l4jzg32hy01qdvl2n40w3h";
+    sha256 = "sha256-QMz7atxol18r//UNb6+H6xAAEQdR4hAN8UW0KeGSH1g=";
   };
 
-  nativeBuildInputs = [ cmake pkgconfig ];
+  nativeBuildInputs = [ cmake pkg-config ];
 
   buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf pango gettext boost
                   libvorbis fribidi dbus libpng pcre openssl icu ]
-                ++ stdenv.lib.optionals stdenv.isDarwin [ Cocoa Foundation];
+                ++ lib.optionals stdenv.isDarwin [ Cocoa Foundation];
 
   cmakeFlags = [ "-DENABLE_TOOLS=${if enableTools then "ON" else "OFF"}" ];
 
-  enableParallelBuilding = true;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "The Battle for Wesnoth, a free, turn-based strategy game with a fantasy theme";
     longDescription = ''
       The Battle for Wesnoth is a Free, turn-based tactical strategy
diff --git a/pkgs/games/widelands/default.nix b/pkgs/games/widelands/default.nix
index e499f4ad1fc..f094c7cd596 100644
--- a/pkgs/games/widelands/default.nix
+++ b/pkgs/games/widelands/default.nix
@@ -1,58 +1,90 @@
-{ stdenv, fetchurl, cmake, python, gettext
-, boost, libpng, zlib, glew, lua, doxygen, icu
-, SDL2, SDL2_image, SDL2_mixer, SDL2_net, SDL2_ttf
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_net
+, SDL2_ttf
+, boost
+, cmake
+, curl
+, doxygen
+, gettext
+, glew
+, graphviz
+, icu
+, installShellFiles
+, libpng
+, lua
+, python3
+, zlib
 }:
 
 stdenv.mkDerivation rec {
   pname = "widelands";
-  version = "20";
+  version = "1.0";
 
-  meta = with stdenv.lib; {
-    description = "RTS with multiple-goods economy";
-    homepage    = "http://widelands.org/";
-    longDescription = ''
-      Widelands is a real time strategy game based on "The Settlers" and "The
-      Settlers II". It has a single player campaign mode, as well as a networked
-      multiplayer mode.
-    '';
-    license        = licenses.gpl2Plus;
-    platforms      = platforms.linux;
-    maintainers    = with maintainers; [ raskin jcumming ];
-    hydraPlatforms = [];
+  src = fetchFromGitHub {
+    owner = "widelands";
+    repo = "widelands";
+    rev = "v${version}";
+    sha256 = "sha256-gNumYoeKePaxiAzrqEPKibMxFwv9vyBrCSoua+MKhcM=";
   };
 
-  patches = [
-    ./bincmake.patch
-  ];
-
-  src = fetchurl {
-    url = "https://launchpad.net/widelands/build${version}/build${version}/+download/widelands-build${version}.tar.bz2";
-    sha256 = "1cmwfwk7j6yi2pwmm4rm57s23sdzasqf53nx6567sdagqyc4sn9q";
-  };
+  patches = [ ./bincmake.patch ];
 
-  preConfigure = ''
-    cmakeFlags="
-      -DWL_INSTALL_BASEDIR=$out
-      -DWL_INSTALL_DATADIR=$out/share/widelands
-      -DWL_INSTALL_BINARY=$out/bin
-    "
+  postPatch = ''
+    substituteInPlace xdg/org.widelands.Widelands.desktop \
+      --replace 'Exec=widelands' "Exec=$out/bin/widelands"
   '';
 
-  nativeBuildInputs = [ cmake python gettext ];
+  cmakeFlags = [
+    "-Wno-dev" # dev warnings are only needed for upstream development
+    "-DWL_INSTALL_BASEDIR=${placeholder "out"}"
+    "-DWL_INSTALL_DATADIR=${placeholder "out"}/share/widelands"
+    "-DWL_INSTALL_BINARY=${placeholder "out"}/bin"
+  ];
+
+  nativeBuildInputs = [ cmake doxygen gettext graphviz installShellFiles ];
 
   buildInputs = [
-    boost libpng zlib glew lua doxygen icu
-    SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_net
+    SDL2_ttf
+    boost
+    curl
+    glew
+    icu
+    libpng
+    lua
+    python3
+    zlib
   ];
 
-  prePatch = ''
-    substituteInPlace ./debian/org.widelands.widelands.desktop --replace "/usr/share/games/widelands/data/" "$out/share/widelands/"
-  '';
-
   postInstall = ''
-    mkdir -p "$out/share/applications/"
-    cp -v "../debian/org.widelands.widelands.desktop" "$out/share/applications/"
+    install -Dm444 -t $out/share/applications ../xdg/org.widelands.Widelands.desktop
+
+    for s in 16 32 48 64 128; do
+      install -Dm444 ../data/images/logos/wl-ico-''${s}.png $out/share/icons/hicolor/''${s}x''${s}/org.widelands.Widelands.png
+    done
+
+    installManPage ../xdg/widelands.6
   '';
 
-  enableParallelBuilding = true;
+  meta = with lib; {
+    description = "RTS with multiple-goods economy";
+    homepage = "https://widelands.org/";
+    longDescription = ''
+      Widelands is a real time strategy game based on "The Settlers" and "The
+      Settlers II". It has a single player campaign mode, as well as a networked
+      multiplayer mode.
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ raskin jcumming ];
+    platforms = platforms.linux;
+    hydraPlatforms = [ ];
+  };
 }
diff --git a/pkgs/games/worldofgoo/default.nix b/pkgs/games/worldofgoo/default.nix
index 81540fa4d96..a9938cfcbc0 100644
--- a/pkgs/games/worldofgoo/default.nix
+++ b/pkgs/games/worldofgoo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, requireFile, unzip, makeDesktopItem, SDL2, SDL2_mixer, libogg, libvorbis }:
+{ lib, stdenv, requireFile, unzip, makeDesktopItem, SDL2, SDL2_mixer, libogg, libvorbis }:
 
 let
   arch = if stdenv.system == "x86_64-linux"
@@ -34,15 +34,15 @@ stdenv.mkDerivation rec {
     sha256 = "175e4b0499a765f1564942da4bd65029f8aae1de8231749c56bec672187d53ee";
   };
 
-  buildInputs = [ unzip ];
+  nativeBuildInputs = [ unzip ];
   sourceRoot = pname;
   phases = [ "unpackPhase installPhase" ];
 
-  libPath = stdenv.lib.makeLibraryPath [ stdenv.cc.cc.lib stdenv.cc.libc SDL2 SDL2_mixer
+  libPath = lib.makeLibraryPath [ stdenv.cc.cc.lib stdenv.cc.libc SDL2 SDL2_mixer
     libogg libvorbis ];
 
   unpackPhase = ''
-    # The game is distributed as a shell script, with a tar of mojosetup, and a 
+    # The game is distributed as a shell script, with a tar of mojosetup, and a
     # zip archive attached to the end. Therefore a simple unzip does the job.
     # However, to avoid unzip errors, we need to strip those out first.
     tail -c +421887 ${src} > ${src}.zip
@@ -61,7 +61,7 @@ stdenv.mkDerivation rec {
     patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" --set-rpath $libPath $out/bin/WorldOfGoo.bin.${arch}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A physics based puzzle game";
     longDescription = ''
       World of Goo is a physics based puzzle / construction game. The millions of Goo
diff --git a/pkgs/games/wyvern/cargo-lock.patch b/pkgs/games/wyvern/cargo-lock.patch
new file mode 100644
index 00000000000..89b2517e26d
--- /dev/null
+++ b/pkgs/games/wyvern/cargo-lock.patch
@@ -0,0 +1,2514 @@
+diff --git a/Cargo.lock b/Cargo.lock
+new file mode 100644
+index 0000000..8be5b39
+--- /dev/null
++++ b/Cargo.lock
+@@ -0,0 +1,2508 @@
++# This file is automatically @generated by Cargo.
++# It is not intended for manual editing.
++[[package]]
++name = "adler32"
++version = "1.0.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "aho-corasick"
++version = "0.6.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "aho-corasick"
++version = "0.7.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "ansi_term"
++version = "0.11.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "argon2rs"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "arrayvec"
++version = "0.4.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "atty"
++version = "0.2.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "autocfg"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "backtrace"
++version = "0.3.34"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "backtrace-sys"
++version = "0.1.31"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "base64"
++version = "0.10.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "bit-set"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "bit-vec"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "bitflags"
++version = "1.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "blake2-rfc"
++version = "0.2.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "build_const"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "butlerd"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "byteorder"
++version = "1.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "bytes"
++version = "0.4.12"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "bzip2"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "bzip2-sys"
++version = "0.1.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "c2-chacha"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "cc"
++version = "1.0.38"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "cfg-if"
++version = "0.1.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "clap"
++version = "2.33.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "clap-verbosity-flag"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "clicolors-control"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "cloudabi"
++version = "0.0.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "confy"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "console"
++version = "0.7.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "constant_time_eq"
++version = "0.1.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "cookie"
++version = "0.11.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "cookie"
++version = "0.12.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "cookie_store"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "cookie_store"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "core-foundation"
++version = "0.6.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "core-foundation-sys"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "crc"
++version = "1.8.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crc32fast"
++version = "1.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crossbeam-deque"
++version = "0.6.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crossbeam-deque"
++version = "0.7.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crossbeam-epoch"
++version = "0.7.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crossbeam-queue"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "crossbeam-utils"
++version = "0.6.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "curl"
++version = "0.4.22"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "curl-sys 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
++ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)",
++ "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "socket2 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "curl-sys"
++version = "0.4.20"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)",
++ "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "dialoguer"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "directories"
++version = "0.10.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "dirs"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "dtoa"
++version = "0.4.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "eidolon"
++version = "1.4.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "butlerd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "human-panic 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "either"
++version = "1.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "encode_unicode"
++version = "0.3.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "encoding_rs"
++version = "0.8.17"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "env_logger"
++version = "0.5.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "error-chain"
++version = "0.12.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)",
++ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "failure"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "failure_derive"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "flate2"
++version = "1.0.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "fnv"
++version = "1.0.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "foreign-types"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "foreign-types-shared"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "fuchsia-cprng"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "fuchsia-zircon"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "fuchsia-zircon-sys"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "futf"
++version = "0.1.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "futures"
++version = "0.1.28"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "futures-cpupool"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.1.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "gog"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "curl 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)",
++ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "select 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "user_agent 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "h2"
++version = "0.1.26"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "http 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "heck"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "html5ever"
++version = "0.23.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "markup5ever 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "http"
++version = "0.1.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "http-body"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "http 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "httparse"
++version = "1.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "human-panic"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "os_type 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "humantime"
++version = "1.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "hyper"
++version = "0.12.33"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
++ "http 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "hyper-tls"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "idna"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "indexmap"
++version = "1.0.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "indicatif"
++version = "0.10.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "inflate"
++version = "0.4.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "iovec"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "itoa"
++version = "0.4.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "kernel32-sys"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "lazy_static"
++version = "1.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "libc"
++version = "0.2.60"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "libflate"
++version = "0.1.25"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rle-decode-fast 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "libz-sys"
++version = "1.0.25"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "lock_api"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "lock_api"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "log"
++version = "0.4.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "mac"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "markup5ever"
++version = "0.8.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "matches"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "memchr"
++version = "2.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "memoffset"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "mime"
++version = "0.3.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "mime_guess"
++version = "2.0.0-alpha.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "miniz_oxide"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "miniz_oxide_c_api"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "mio"
++version = "0.6.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "miow"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "native-tls"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)",
++ "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "net2"
++version = "0.2.33"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "new_debug_unreachable"
++version = "1.0.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "nodrop"
++version = "0.1.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "num-traits"
++version = "0.2.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "num_cpus"
++version = "1.10.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "number_prefix"
++version = "0.2.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "openssl"
++version = "0.10.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "openssl-probe"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "openssl-sys"
++version = "0.9.48"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "os_type"
++version = "2.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "owning_ref"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "parking_lot"
++version = "0.7.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "parking_lot"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "parking_lot_core"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "parking_lot_core"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "percent-encoding"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "phf"
++version = "0.7.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "phf_codegen"
++version = "0.7.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "phf_generator"
++version = "0.7.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "phf_shared"
++version = "0.7.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "pkg-config"
++version = "0.3.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "podio"
++version = "0.1.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "ppv-lite86"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "precomputed-hash"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "proc-macro2"
++version = "0.4.30"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "publicsuffix"
++version = "1.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "quick-error"
++version = "1.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "quote"
++version = "0.6.13"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand"
++version = "0.3.23"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand"
++version = "0.4.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand"
++version = "0.5.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand"
++version = "0.6.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "getrandom 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_chacha"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_chacha"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_core"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_core"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "rand_core"
++version = "0.5.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "getrandom 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_hc"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_hc"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_isaac"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_jitter"
++version = "0.1.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_os"
++version = "0.1.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_pcg"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rand_xorshift"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rayon"
++version = "1.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rayon-core"
++version = "1.5.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rdrand"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "redox_syscall"
++version = "0.1.56"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "redox_users"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "regex"
++version = "0.2.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "regex"
++version = "1.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex-syntax 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "regex-syntax"
++version = "0.5.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "regex-syntax"
++version = "0.6.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "remove_dir_all"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "reqwest"
++version = "0.9.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
++ "flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "http 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "rle-decode-fast"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "rustc-demangle"
++version = "0.1.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "rustc_version"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "ryu"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "same-file"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "schannel"
++version = "0.1.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "scoped_threadpool"
++version = "0.1.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "scopeguard"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "scopeguard"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "security-framework"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "security-framework-sys"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "select"
++version = "0.4.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "html5ever 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "semver"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "semver-parser"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "serde"
++version = "1.0.98"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "serde_derive"
++version = "1.0.98"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "serde_json"
++version = "1.0.40"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "serde_urlencoded"
++version = "0.5.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "siphasher"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "slab"
++version = "0.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "smallvec"
++version = "0.6.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "socket2"
++version = "0.3.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "stable_deref_trait"
++version = "1.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "string"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "string_cache"
++version = "0.7.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "string_cache_codegen"
++version = "0.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "string_cache_shared"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "strsim"
++version = "0.8.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "structopt"
++version = "0.2.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "structopt-derive"
++version = "0.2.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "syn"
++version = "0.15.42"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "synstructure"
++version = "0.10.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "take_mut"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "tempdir"
++version = "0.3.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tempfile"
++version = "2.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tempfile"
++version = "3.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++ "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tendril"
++version = "0.4.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "termcolor"
++version = "0.3.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "termcolor"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "termios"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "textwrap"
++version = "0.11.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "thread_local"
++version = "0.3.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "time"
++version = "0.1.42"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
++ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio"
++version = "0.1.22"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-buf"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-current-thread"
++version = "0.1.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-executor"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-io"
++version = "0.1.12"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-reactor"
++version = "0.1.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-sync"
++version = "0.1.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-tcp"
++version = "0.1.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-threadpool"
++version = "0.1.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "tokio-timer"
++version = "0.2.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "toml"
++version = "0.4.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "try-lock"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "try_from"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "ucd-util"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "unicase"
++version = "1.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "unicase"
++version = "2.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "unicode-bidi"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "unicode-normalization"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "unicode-segmentation"
++version = "1.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "unicode-width"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "unicode-xid"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "url"
++version = "1.7.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "user_agent"
++version = "0.6.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cookie_store 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "utf-8"
++version = "0.7.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "utf8-ranges"
++version = "1.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "uuid"
++version = "0.6.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "uuid"
++version = "0.7.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "vcpkg"
++version = "0.2.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "vec_map"
++version = "0.8.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "version_check"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "walkdir"
++version = "2.2.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "want"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "winapi"
++version = "0.2.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "winapi"
++version = "0.3.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "winapi-build"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "winapi-i686-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "winapi-util"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "winapi-x86_64-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
++name = "wincolor"
++version = "0.1.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "wincolor"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "winreg"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "ws2_32-sys"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "wyvern"
++version = "1.4.1"
++dependencies = [
++ "clap-verbosity-flag 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "confy 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "curl 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)",
++ "dialoguer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "eidolon 1.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "gog 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "human-panic 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
++ "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
++ "zip 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[[package]]
++name = "zip"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++dependencies = [
++ "bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libflate 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)",
++ "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
++]
++
++[metadata]
++"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
++"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5"
++"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
++"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
++"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
++"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba"
++"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
++"checksum autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "22130e92352b948e7e82a49cdb0aa94f2211761117f29e052dd397c1ac33542b"
++"checksum backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)" = "b5164d292487f037ece34ec0de2fcede2faa162f085dd96d2385ab81b12765ba"
++"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
++"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
++"checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80"
++"checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb"
++"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
++"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
++"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
++"checksum butlerd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "095899eb6b69e0a1c98215e51a44c67b8e3c902ebb9440afaafe2eb45e650a09"
++"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
++"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
++"checksum bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b"
++"checksum bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6584aa36f5ad4c9247f5323b0a42f37802b37a836f0ad87084d7a33961abe25f"
++"checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101"
++"checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46"
++"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
++"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
++"checksum clap-verbosity-flag 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bda14f5323b2b747f52908c5b7b8af7790784088bc7c2957a11695e39ad476dc"
++"checksum clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9"
++"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
++"checksum confy 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4b1400cd0dae7f27d2c7ced9492e1398d2e2df614570092a4936c73b416dedea"
++"checksum console 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628"
++"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
++"checksum cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "99be24cfcf40d56ed37fd11c2123be833959bbc5bddecb46e1c2e442e15fa3e0"
++"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
++"checksum cookie_store 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b0d2f2ecb21dce00e2453268370312978af9b8024020c7a37ae2cc6dbbe64685"
++"checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c"
++"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d"
++"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
++"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
++"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
++"checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13"
++"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71"
++"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9"
++"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
++"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
++"checksum curl 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)" = "f8ed9a22aa8c4e49ac0c896279ef532a43a7df2f54fcd19fa36960de029f965f"
++"checksum curl-sys 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5e90ae10f635645cba9cad1023535f54915a95c58c44751c6ed70dbaeb17a408"
++"checksum dialoguer 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "116f66c4e7b19af0d52857aa4ff710cc3b4781d9c16616e31540bc55ec57ba8c"
++"checksum directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc2561db021b6f1321d0f16b67ed28ce843ef4610dfaa432e3ffa2e8a3050ebf"
++"checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
++"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
++"checksum eidolon 1.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8a501eef266fdb28e1414b6104ca799a216bce6dc4ae1217ad0f40d591351671"
++"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
++"checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd"
++"checksum encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4155785c79f2f6701f185eb2e6b4caf0555ec03477cb4c70db67b465311620ed"
++"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38"
++"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
++"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
++"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
++"checksum flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "550934ad4808d5d39365e5d61727309bf18b3b02c6c56b729cb92e7dd84bc3d8"
++"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
++"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
++"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
++"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
++"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
++"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
++"checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b"
++"checksum futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "45dc39533a6cae6da2b56da48edae506bb767ec07370f86f70fc062e9d435869"
++"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
++"checksum getrandom 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8e190892c840661957ba9f32dacfb3eb405e657f9f9f60485605f0bb37d6f8"
++"checksum gog 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "19bfb6c45ea1fba86f5880b4f239ef8034230387d90a0dfea70e094caeabf0be"
++"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
++"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
++"checksum html5ever 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce65ac8028cf5a287a7dbf6c4e0a6cf2dcf022ed5b167a81bae66ebf599a8b7"
++"checksum http 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "372bcb56f939e449117fb0869c2e8fd8753a8223d92a172c6e808cf123a5b6e4"
++"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
++"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
++"checksum human-panic 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "21638c5955a6daf3ecc42cae702335fc37a72a4abcc6959ce457b31a7d43bbdd"
++"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
++"checksum hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)" = "7cb44cbce9d8ee4fb36e4c0ad7b794ac44ebaad924b9c8291a63215bb44c2c8f"
++"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
++"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
++"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d"
++"checksum indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe"
++"checksum inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
++"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
++"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
++"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
++"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
++"checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb"
++"checksum libflate 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "90c6f86f4b0caa347206f916f8b687b51d77c6ef8ff18d52dd007491fd580529"
++"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
++"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
++"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc"
++"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
++"checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
++"checksum markup5ever 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f1af46a727284117e09780d05038b1ce6fc9c76cc6df183c3dae5a8955a25e21"
++"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
++"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
++"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
++"checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425"
++"checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed"
++"checksum miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c061edee74a88eb35d876ce88b94d77a0448a201de111c244b70d047f5820516"
++"checksum miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6c675792957b0d19933816c4e1d56663c341dd9bfa31cb2140ff2267c1d8ecf4"
++"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23"
++"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
++"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e"
++"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
++"checksum new_debug_unreachable 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f40f005c60db6e03bae699e414c58bf9aa7ea02a2d0b9bfbcf19286cc4c82b30"
++"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
++"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
++"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273"
++"checksum number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee"
++"checksum openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)" = "8152bb5a9b5b721538462336e3bef9a539f892715e5037fda0f984577311af15"
++"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
++"checksum openssl-sys 0.9.48 (registry+https://github.com/rust-lang/crates.io-index)" = "b5ba300217253bcc5dc68bed23d782affa45000193866e025329aa8a7a9f05b8"
++"checksum os_type 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7edc011af0ae98b7f88cf7e4a83b70a54a75d2b8cb013d6efd02e5956207e9eb"
++"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13"
++"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337"
++"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
++"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9"
++"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
++"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
++"checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18"
++"checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e"
++"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662"
++"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0"
++"checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af"
++"checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd"
++"checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b"
++"checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
++"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
++"checksum publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5afecba86dcf1e4fd610246f89899d1924fe12e1e89f555eb7c7f710f3c5ad1d"
++"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
++"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
++"checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
++"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
++"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9"
++"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
++"checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c"
++"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
++"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
++"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
++"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
++"checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca"
++"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
++"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
++"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
++"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
++"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
++"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
++"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
++"checksum rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4b0186e22767d5b9738a05eab7c6ac90b15db17e5b5f9bd87976dd7d89a10a4"
++"checksum rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbe0df8435ac0c397d467b6cad6d25543d06e8a019ef3f6af3c384597515bd2"
++"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
++"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
++"checksum redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe5204c3a17e97dde73f285d49be585df59ed84b50a872baf416e73b62c3828"
++"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
++"checksum regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88c3d9193984285d544df4a30c23a4e62ead42edf70a4452ceb76dac1ce05c26"
++"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
++"checksum regex-syntax 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b143cceb2ca5e56d5671988ef8b15615733e7ee16cd348e064333b251b89343f"
++"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
++"checksum reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0777154c2c3eb54f5c480db01de845652d941e47191277cc673634c3853939"
++"checksum rle-decode-fast 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac"
++"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af"
++"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
++"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
++"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
++"checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339"
++"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
++"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
++"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
++"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2"
++"checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56"
++"checksum select 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ac645958c62108d11f90f8d34e4dc2799c838fc995ed4c2075867a2a8d5be76b"
++"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
++"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
++"checksum serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5626ac617da2f2d9c48af5515a21d5a480dbd151e01bb1c355e26a3e68113"
++"checksum serde_derive 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)" = "01e69e1b8a631f245467ee275b8c757b818653c6d704cdbcaeb56b56767b529c"
++"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
++"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a"
++"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
++"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
++"checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7"
++"checksum socket2 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df028e0e632c2a1823d920ad74895e7f9128e6438cbc4bc6fd1f180e644767b9"
++"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
++"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
++"checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423"
++"checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da"
++"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
++"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
++"checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7"
++"checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107"
++"checksum syn 0.15.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eadc09306ca51a40555dd6fc2b415538e9e18bc9f870e47b1a524a79fe2dcf5e"
++"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
++"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60"
++"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
++"checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0"
++"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
++"checksum tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b"
++"checksum termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83"
++"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
++"checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625"
++"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
++"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
++"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
++"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
++"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
++"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443"
++"checksum tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f27ee0e6db01c5f0b2973824547ce7e637b2ed79b891a9677b0de9bd532b6ac"
++"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926"
++"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce"
++"checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7"
++"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119"
++"checksum tokio-threadpool 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "90ca01319dea1e376a001e8dc192d42ebde6dd532532a5bad988ac37db365b19"
++"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e"
++"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
++"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
++"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
++"checksum ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa9b3b49edd3468c0e6565d85783f51af95212b6fa3986a5500954f00b460874"
++"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
++"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6"
++"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
++"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426"
++"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9"
++"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
++"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
++"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
++"checksum user_agent 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "970a778e2284bd68e55ca4e93b858da333cd85c3d5d8b4eab2c6e729cd6f47c4"
++"checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
++"checksum utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba"
++"checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363"
++"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
++"checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95"
++"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
++"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
++"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
++"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
++"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
++"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
++"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
++"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
++"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
++"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
++"checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767"
++"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
++"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
++"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
++"checksum zip 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c18fc320faf909036e46ac785ea827f72e485304877faf1a3a39538d3714dbc3"
diff --git a/pkgs/games/wyvern/default.nix b/pkgs/games/wyvern/default.nix
new file mode 100644
index 00000000000..f99faa282fd
--- /dev/null
+++ b/pkgs/games/wyvern/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchgit
+, rustPlatform
+, unzip
+, rsync
+, innoextract
+, curl
+, cmake
+, pkg-config
+, openssl
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "wyvern";
+  version = "1.4.1";
+
+  src = fetchgit {
+    url = "https://git.sr.ht/~nicohman/wyvern";
+    rev = version;
+    sha256 = "1sl3yhash1527amc8rs4374fd7jbgnkyy7qpw94ms2gs80sdv3s5";
+  };
+  cargoPatches = [ ./cargo-lock.patch ];
+
+  cargoSha256 = "sha256:1nd5qla3p1jrssg5fqal8m3jcbxax0wsfc8cp97jdrpqlcgqfmrx";
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ openssl ];
+
+  meta = with lib; {
+    description = "A simple CLI client for installing and maintaining linux GOG games";
+    homepage = "https://git.sr.ht/~nicohman/wyvern";
+    license = licenses.gpl3;
+    maintainers = with maintainers;[ _0x4A6F ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/games/xbill/default.nix b/pkgs/games/xbill/default.nix
index 8a6d4cf14cd..a20b52e7854 100644
--- a/pkgs/games/xbill/default.nix
+++ b/pkgs/games/xbill/default.nix
@@ -1,9 +1,10 @@
-{ stdenv, lib, fetchurl, libX11, libXpm, libXt, motif, ... }:
+{ stdenv, lib, makeDesktopItem, copyDesktopItems, fetchurl, libX11, libXpm, libXt, motif, ... }:
 
 stdenv.mkDerivation rec {
   pname = "xbill";
   version = "2.1";
 
+  nativeBuildInputs = [ copyDesktopItems ];
   buildInputs = [ libX11 libXpm libXt motif ];
 
   NIX_CFLAGS_LINK = "-lXpm";
@@ -18,8 +19,21 @@ stdenv.mkDerivation rec {
     sha256 = "13b08lli2gvppmvyhy0xs8cbjbkvrn4b87302mx0pxrdrvqzzz8f";
   };
 
+  desktopItems = [ (makeDesktopItem {
+    name = "xbill";
+    exec = "xbill";
+    icon = "xbill";
+    desktopName = "XBill";
+    comment     = "Get rid of those Wingdows viruses!";
+    categories  = "Game;ArcadeGame;";
+  }) ];
+
+  postInstall = ''
+    install -Dm644 pixmaps/icon.xpm $out/share/pixmaps/xbill.xpm
+  '';
+
   meta = with stdenv; {
-    description = "Protect a computer network from getting infected.";
+    description = "Protect a computer network from getting infected";
     homepage = "http://www.xbill.org/";
     license = lib.licenses.gpl1;
     maintainers = with lib.maintainers; [ aw ];
diff --git a/pkgs/games/xboard/default.nix b/pkgs/games/xboard/default.nix
index 9f3303578da..90c0f3707cd 100644
--- a/pkgs/games/xboard/default.nix
+++ b/pkgs/games/xboard/default.nix
@@ -1,5 +1,5 @@
-{stdenv, fetchurl, libX11, xorgproto, libXt, libXaw, libSM, libICE, libXmu
-, libXext, gnuchess, texinfo, libXpm, pkgconfig, librsvg, cairo, pango
+{lib, stdenv, fetchurl, libX11, xorgproto, libXt, libXaw, libSM, libICE, libXmu
+, libXext, gnuchess, texinfo, libXpm, pkg-config, librsvg, cairo, pango
 , gtk2
 }:
 let
@@ -14,7 +14,7 @@ let
   };
   buildInputs = [
     libX11 xorgproto libXt libXaw libSM libICE libXmu
-    libXext gnuchess texinfo libXpm pkgconfig librsvg
+    libXext gnuchess texinfo libXpm pkg-config librsvg
     cairo pango gtk2
   ];
 in
@@ -26,10 +26,10 @@ stdenv.mkDerivation {
   };
   meta = {
     inherit (s) version;
-    description = ''GUI for chess engines'';
+    description = "GUI for chess engines";
     homepage = "https://www.gnu.org/software/xboard/";
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.unix;
-    license = stdenv.lib.licenses.gpl3Plus;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl3Plus;
   };
 }
diff --git a/pkgs/games/xbomb/default.nix b/pkgs/games/xbomb/default.nix
index 0754905ce50..093f822a7e3 100644
--- a/pkgs/games/xbomb/default.nix
+++ b/pkgs/games/xbomb/default.nix
@@ -1,19 +1,20 @@
-{ stdenv, fetchurl, libX11, libXaw }:
+{ lib, stdenv, fetchurl, libX11, libXaw }:
 
 stdenv.mkDerivation rec {
-  name = "xbomb-2.2b";
+  pname = "xbomb";
+  version = "2.2b";
   src = fetchurl {
-    url    = "https://www.gedanken.org.uk/software/xbomb/download/${name}.tgz";
+    url    = "https://www.gedanken.org.uk/software/xbomb/download/xbomb-${version}.tgz";
     sha256 = "0692gjw28qvh8wj9l58scjw6kxj7jdyb3yzgcgs9wcznq11q839m";
   };
 
   buildInputs = [ libX11 libXaw ];
 
   makeFlags = [
-    "INSTDIR=${placeholder ''out''}"
+    "INSTDIR=${placeholder "out"}"
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://www.gedanken.org.uk/software/xbomb/";
     description = "Minesweeper for X11 with various grid sizes and shapes";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/xconq/default.nix b/pkgs/games/xconq/default.nix
index 6e852639979..8f4366fbcb8 100644
--- a/pkgs/games/xconq/default.nix
+++ b/pkgs/games/xconq/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cpio, xorgproto, libX11, libXmu, libXaw, libXt, tcl, tk
+{ lib, stdenv, fetchurl, cpio, xorgproto, libX11, libXmu, libXaw, libXt, tcl, tk
 , libXext, fontconfig, makeWrapper }:
 
 stdenv.mkDerivation rec {
@@ -45,7 +45,7 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A programmable turn-based strategy game";
     maintainers = with maintainers; [ raskin ];
     platforms = platforms.linux;
diff --git a/pkgs/games/xcowsay/default.nix b/pkgs/games/xcowsay/default.nix
new file mode 100644
index 00000000000..89ca50b3a33
--- /dev/null
+++ b/pkgs/games/xcowsay/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchurl, makeWrapper, pkg-config
+, dbus, dbus-glib, gtk3, gdk-pixbuf, librsvg
+, fortune
+}:
+
+stdenv.mkDerivation rec {
+  pname = "xcowsay";
+  version = "1.5.1";
+
+  src = fetchurl {
+    url = "http://www.nickg.me.uk/files/xcowsay-${version}.tar.gz";
+    sha256 = "sha256-wypsfAp634wbaAI+fxzmr3J5AmvQzChVi/wp/BPxiA0=";
+  };
+
+  buildInputs = [
+    dbus
+    dbus-glib
+    gtk3
+    gdk-pixbuf # loading cow images
+    librsvg # dreaming SVG images
+  ];
+  nativeBuildInputs = [ makeWrapper pkg-config ];
+
+  configureFlags = [ "--enable-dbus" ];
+
+  postInstall = ''
+    for tool in xcowdream xcowsay xcowthink xcowfortune; do
+      wrapProgram $out/bin/$tool \
+        --prefix PATH : $out/bin:${fortune}/bin
+    done
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.doof.me.uk/xcowsay";
+    description = "Tool to display a cute cow and messages";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ das_j ];
+  };
+}
diff --git a/pkgs/games/xjump/default.nix b/pkgs/games/xjump/default.nix
index afac2de9fce..3c13fc1a9b7 100644
--- a/pkgs/games/xjump/default.nix
+++ b/pkgs/games/xjump/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, autoconf, automake, libX11, libXt, libXpm, libXaw, localStateDir?null }:
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libX11, libXt, libXpm, libXaw, localStateDir?null }:
 
 stdenv.mkDerivation {
   pname = "xjump";
@@ -19,7 +19,7 @@ stdenv.mkDerivation {
     else
       [];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "The falling tower game";
     license = licenses.gpl2;
     maintainers = with maintainers; [ pmeunier ];
diff --git a/pkgs/games/xmage/default.nix b/pkgs/games/xmage/default.nix
index e8b8eb8a941..7552ce700f3 100644
--- a/pkgs/games/xmage/default.nix
+++ b/pkgs/games/xmage/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
 , jdk8
 , unzip
@@ -30,7 +30,7 @@ EOS
     chmod +x $out/bin/xmage
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Magic Another Game Engine";
     license = licenses.mit;
     maintainers = with maintainers; [ matthiasbeyer ];
diff --git a/pkgs/games/xmoto/default.nix b/pkgs/games/xmoto/default.nix
index d49998a68d7..246e1afc744 100644
--- a/pkgs/games/xmoto/default.nix
+++ b/pkgs/games/xmoto/default.nix
@@ -1,34 +1,65 @@
-{ stdenv, fetchurl, chipmunk, sqlite, curl, zlib, bzip2, libjpeg
-, libpng, freeglut, libGLU, libGL, SDL, SDL_mixer, SDL_image, SDL_net
-, SDL_ttf, lua5, ode, libxdg_basedir, libxml2 }:
+{ lib, stdenv, fetchFromGitHub, fetchpatch, cmake, gettext, makeWrapper, bzip2
+, curl, libjpeg, libxml2, xz, lua, ode, libGL, libpng, SDL, SDL_mixer, SDL_net
+, SDL_ttf, sqlite, libxdg_basedir, zlib }:
 
 stdenv.mkDerivation rec {
   pname = "xmoto";
-  version = "0.5.11";
+  version = "0.6.1";
 
-  src = fetchurl {
-    url = "https://download.tuxfamily.org/xmoto/xmoto/${version}/xmoto-${version}-src.tar.gz";
-    sha256 = "1ci6r8zd0l7z28cy92ddf9dmqbdqwinz2y1cny34c61b57wsd155";
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "00f5ha79lfa2iiaz66wl0hl5dapa1l15qdr7m7knzi0ll7j6z66n";
   };
 
-  buildInputs = [
-    chipmunk sqlite curl zlib bzip2 libjpeg libpng
-    freeglut libGLU libGL SDL SDL_mixer SDL_image SDL_net SDL_ttf
-    lua5 ode libxdg_basedir libxml2
+  patches = [
+    # Fix build with Nix
+    (fetchpatch {
+      url = "https://github.com/xmoto/xmoto/commit/536dcc7ec77a4c4c454b86220e85b1cb3cd1c7f7.patch";
+      sha256 = "0h9lld668jrbmrqva89zqwp63jiagjj86prkxzx6372p3kk9y7g7";
+    })
   ];
 
-  CXXFLAGS = [
-    "-fpermissive"
-    # Build using the old C++ ABI to fix issue with missing text; the issue
-    # should be fixed in the next stable release (if that ever does happen)
-    "-D_GLIBCXX_USE_CXX11_ABI=0"
+  nativeBuildInputs = [
+    cmake
+    gettext
+    makeWrapper
   ];
 
-  meta = with stdenv.lib; {
-    description = "Obstacled race game";
+  buildInputs = [
+    bzip2
+    curl
+    libjpeg
+    libxml2
+    xz
+    lua
+    ode
+    libGL
+    libpng
+    SDL
+    SDL_mixer
+    SDL_net
+    SDL_ttf
+    sqlite
+    libxdg_basedir
+    zlib
+  ];
+
+  preFixup = ''
+    wrapProgram "$out/bin/xmoto" \
+      --prefix XDG_DATA_DIRS : "$out/share/"
+  '';
+
+  meta = with lib; {
+    description = "A challenging 2D motocross platform game, where physics play an important role";
+    longDescription = ''
+      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";
     maintainers = with maintainers; [ raskin pSub ];
-    platforms = platforms.linux;
-    license = licenses.gpl2;
+    platforms = platforms.all;
+    license = licenses.gpl2Plus;
   };
 }
diff --git a/pkgs/games/xonotic/default.nix b/pkgs/games/xonotic/default.nix
index ab6ac022b6c..b15e111970e 100644
--- a/pkgs/games/xonotic/default.nix
+++ b/pkgs/games/xonotic/default.nix
@@ -1,9 +1,9 @@
 { lib, stdenv, fetchurl, fetchzip, makeWrapper, runCommandNoCC, makeDesktopItem
-, xonotic-data
+, xonotic-data, copyDesktopItems
 , # required for both
   unzip, libjpeg, zlib, libvorbis, curl
 , # glx
-  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, alsaLib
+  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, alsa-lib
 , # sdl
   SDL2
 
@@ -38,14 +38,14 @@ let
       aims to become the best possible open-source FPS of its kind.
     '';
     homepage = "https://www.xonotic.org/";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [ astsmtl zalakain petabyteboy ];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ astsmtl zalakain petabyteboy ];
+    platforms = lib.platforms.linux;
   };
 
   desktopItem = makeDesktopItem {
     name = "xonotic";
-    exec = "$out/bin/xonotic";
+    exec = "xonotic";
     comment = meta.description;
     desktopName = "Xonotic";
     categories = "Game;Shooter;";
@@ -58,12 +58,13 @@ let
     inherit version;
 
     src = fetchurl {
-      url = "https://dl.xonotic.org/${name}-source.zip";
+      url = "https://dl.xonotic.org/xonotic-${version}-source.zip";
       sha256 = "0axxw04fyz6jlfqd0kp7hdrqa0li31sx1pbipf2j5qp9wvqicsay";
     };
 
-    buildInputs = [ unzip libjpeg zlib libvorbis curl ]
-      ++ lib.optional withGLX [ libX11.dev libGLU.dev libGL.dev libXpm.dev libXext.dev libXxf86vm.dev alsaLib.dev ]
+    nativeBuildInputs = [ unzip ];
+    buildInputs = [ libjpeg zlib libvorbis curl ]
+      ++ lib.optional withGLX [ libX11.dev libGLU.dev libGL.dev libXpm.dev libXext.dev libXxf86vm.dev alsa-lib.dev ]
       ++ lib.optional withSDL [ SDL2.dev ];
 
     sourceRoot = "Xonotic/source/darkplaces";
@@ -118,8 +119,8 @@ let
 
 in rec {
   xonotic-data = fetchzip {
-    name = "xonotic-data-${version}";
-    url = "https://dl.xonotic.org/${name}.zip";
+    name = "xonotic-data";
+    url = "https://dl.xonotic.org/xonotic-${version}.zip";
     sha256 = "1ygkh0v68y4sd1w5vpk8dgb65h5jm599hwszdfgjp3ax4d3ml81x";
     extraPostFetch = ''
       cd $out
@@ -131,7 +132,8 @@ in rec {
 
   xonotic = runCommandNoCC "xonotic${variant}-${version}" {
     inherit xonotic-unwrapped;
-    buildInputs = [ makeWrapper ];
+    nativeBuildInputs = [ makeWrapper copyDesktopItems ];
+    desktopItems = [ desktopItem ];
     passthru = {
       inherit version;
       meta = meta // {
@@ -151,7 +153,7 @@ in rec {
   '' + lib.optionalString (withSDL || withGLX) ''
     mkdir -p $out/share
     ln -s ${xonotic-unwrapped}/share/icons $out/share/icons
-    ${desktopItem.buildCommand}
+    copyDesktopItems
   '' + ''
     for binary in $out/bin/xonotic-*; do
       wrapProgram $binary --add-flags "-basedir ${xonotic-data}"
diff --git a/pkgs/games/xpilot/bloodspilot-client.nix b/pkgs/games/xpilot/bloodspilot-client.nix
index 4de27b1f18d..8e603ef53f7 100644
--- a/pkgs/games/xpilot/bloodspilot-client.nix
+++ b/pkgs/games/xpilot/bloodspilot-client.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libX11, SDL, libGLU, libGL, expat, zlib, SDL_ttf, SDL_image }:
+{ lib, stdenv, fetchurl, libX11, SDL, libGLU, libGL, expat, zlib, SDL_ttf, SDL_image }:
 
 stdenv.mkDerivation rec {
   version = "1.5.0";
@@ -16,10 +16,10 @@ stdenv.mkDerivation rec {
   NIX_LDFLAGS = "-lX11";
 
   meta = {
-    description = ''A multiplayer space combat game (client part)'';
+    description = "A multiplayer space combat game (client part)";
     homepage = "http://bloodspilot.sf.net/";
-    license = stdenv.lib.licenses.gpl2Plus ;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2Plus ;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/games/xpilot/bloodspilot-server.nix b/pkgs/games/xpilot/bloodspilot-server.nix
index 6b0a0603af5..a860c4e1d5f 100644
--- a/pkgs/games/xpilot/bloodspilot-server.nix
+++ b/pkgs/games/xpilot/bloodspilot-server.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, expat }:
+{ lib, stdenv, fetchurl, expat }:
 
 stdenv.mkDerivation rec {
   pname = "bloodspilot-xpilot-fxi-server";
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
     ./server-gcc5.patch
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A multiplayer X11 space combat game (server part)";
     homepage = "http://bloodspilot.sf.net/";
     license = licenses.gpl2Plus ;
diff --git a/pkgs/games/xpilot/default.nix b/pkgs/games/xpilot/default.nix
index 8803806547b..bd86538d99e 100644
--- a/pkgs/games/xpilot/default.nix
+++ b/pkgs/games/xpilot/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libX11, libSM, SDL, libGLU, libGL, expat, SDL_ttf
+{ lib, stdenv, fetchurl, libX11, libSM, SDL, libGLU, libGL, expat, SDL_ttf
 , SDL_image, zlib, libXxf86misc }:
 stdenv.mkDerivation rec {
   pname = "xpilot-ng";
@@ -10,7 +10,7 @@ stdenv.mkDerivation rec {
   buildInputs = [
     libX11 libSM SDL SDL_ttf SDL_image libGLU libGL expat zlib libXxf86misc
   ];
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A multiplayer X11 space combat game";
     homepage = "http://xpilot.sf.net/";
     license = licenses.gpl2Plus;
diff --git a/pkgs/games/xskat/default.nix b/pkgs/games/xskat/default.nix
index 5fa91a0395c..74c2be586ce 100644
--- a/pkgs/games/xskat/default.nix
+++ b/pkgs/games/xskat/default.nix
@@ -1,38 +1,30 @@
-{stdenv, fetchurl, libX11, imake, gccmakedep}:
+{lib, stdenv, fetchurl, libX11, imake, gccmakedep}:
 
+stdenv.mkDerivation rec {
+  pname = "xskat";
+  version = "4.0";
 
-let
-  s = # Generated upstream information
-  rec {
-    baseName="xskat";
-    version="4.0";
-    name="${baseName}-${version}";
+  nativeBuildInputs = [ gccmakedep ];
+  buildInputs = [ libX11 imake ];
 
-    url="http://www.xskat.de/xskat-4.0.tar.gz";
-    hash="8ba52797ccbd131dce69b96288f525b0d55dee5de4008733f7a5a51deb831c10";
-    sha256="8ba52797ccbd131dce69b96288f525b0d55dee5de4008733f7a5a51deb831c10";
-  };
-   buildInputs = [ libX11 imake gccmakedep ];
-in
-
-stdenv.mkDerivation {
-  inherit (s) name version;
-  inherit buildInputs;
   src = fetchurl {
-    inherit (s) url sha256;
+    url = "http://www.xskat.de/xskat-${version }.tar.gz";
+    sha256 = "8ba52797ccbd131dce69b96288f525b0d55dee5de4008733f7a5a51deb831c10";
   };
+
   preInstall = ''
     sed -i Makefile \
       -e "s|.* BINDIR .*|   BINDIR = $out/bin|" \
       -e "s|.* MANPATH .*|  MANPATH = $out/man|"
   '';
+
   installTargets = [ "install" "install.man" ];
-  meta = {
-    inherit (s) version;
-    description = ''Famous german card game'';
-    platforms = stdenv.lib.platforms.unix;
-    license = stdenv.lib.licenses.free;
-    longDescription = ''Play the german card game Skat against the AI or over IRC.'';
+
+  meta = with lib; {
+    description = "Famous german card game";
+    platforms = platforms.unix;
+    license = licenses.free;
+    longDescription = "Play the german card game Skat against the AI or over IRC.";
     homepage = "http://www.xskat.de/";
   };
 }
diff --git a/pkgs/games/xsnow/default.nix b/pkgs/games/xsnow/default.nix
index c64d8bf568f..ba0fcf784f4 100644
--- a/pkgs/games/xsnow/default.nix
+++ b/pkgs/games/xsnow/default.nix
@@ -1,26 +1,26 @@
-{ stdenv, fetchurl, libXt, libXpm, libXext, imake, gccmakedep }:
+{ lib, stdenv, fetchurl, pkg-config, libxml2, gtk3-x11, libXt, libXpm }:
 
 stdenv.mkDerivation rec {
-
-  version = "1.42";
   pname = "xsnow";
+  version = "3.3.0";
 
   src = fetchurl {
-    url = "https://janswaal.home.xs4all.nl/Xsnow/${pname}-${version}.tar.gz";
-    sha256 = "06jnbp88wc9i9dbmy7kggplw4hzlx2bhghxijmlhkjlizgqwimyh";
+    url = "https://ratrabbit.nl/downloads/xsnow/xsnow-${version}.tar.gz";
+    sha256 = "1xnpqbamhglv7xsxzlrlpvsz6bbzlrvdpn5x2n9baww9kcrkbwjg";
   };
 
-  nativeBuildInputs = [ imake gccmakedep ];
-  buildInputs = [
-    libXt libXpm libXext
-  ];
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gtk3-x11 libxml2 libXt libXpm ];
+
+  makeFlags = [ "gamesdir=$(out)/bin" ];
 
-  makeFlags = [ "BINDIR=$(out)/bin" "MANPATH=$(out)/share/man" ];
+  enableParallelBuilding = true;
 
-  meta = {
+  meta = with lib; {
     description = "An X-windows application that will let it snow on the root, in between and on windows";
-    homepage = "http://janswaal.home.xs4all.nl/Xsnow/";
-    license = stdenv.lib.licenses.unfree;
-    maintainers = [ stdenv.lib.maintainers.robberer ];
+    homepage = "https://ratrabbit.nl/ratrabbit/xsnow/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ robberer ];
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/games/xsok/default.nix b/pkgs/games/xsok/default.nix
index 30579e399b8..bb749b57d01 100644
--- a/pkgs/games/xsok/default.nix
+++ b/pkgs/games/xsok/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, libX11, imake, libXt, libXaw, libXpm, libXext
+{lib, stdenv, fetchurl, libX11, imake, libXt, libXaw, libXpm, libXext
 , withNethackLevels ? true
 }:
 stdenv.mkDerivation rec {
@@ -31,17 +31,16 @@ stdenv.mkDerivation rec {
 
   makeFlags = ["BINDIR=$(out)/bin"];
 
-  postInstall = stdenv.lib.optionalString withNethackLevels ''
+  postInstall = lib.optionalString withNethackLevels ''
     gzip < ${nethackLevels} > "$out/share/games/lib/xsok/Nethack.def.gz"
     echo Nethack > "$out/share/games/lib/xsok/gametypes"
   '';
 
   meta = {
-    inherit version;
     description = "A generic Sokoban game for X11";
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.gpl2Plus;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.unix;
     homepage = "https://tracker.debian.org/pkg/xsok";
   };
 }
diff --git a/pkgs/games/xsokoban/default.nix b/pkgs/games/xsokoban/default.nix
index 3f6062c4f68..68b47e6225a 100644
--- a/pkgs/games/xsokoban/default.nix
+++ b/pkgs/games/xsokoban/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libX11, xorgproto, libXpm, libXt }:
+{ lib, stdenv, fetchurl, libX11, xorgproto, libXpm, libXt }:
 
 stdenv.mkDerivation rec {
   pname = "xsokoban";
@@ -45,7 +45,7 @@ stdenv.mkDerivation rec {
     mkdir -p $out/bin $out/share $out/man/man1 $out/lib
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "X sokoban";
     license = licenses.publicDomain;
     maintainers = [ maintainers.raskin ];
diff --git a/pkgs/games/xtris/default.nix b/pkgs/games/xtris/default.nix
index c9421b23a82..e6da0c6f17c 100644
--- a/pkgs/games/xtris/default.nix
+++ b/pkgs/games/xtris/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchzip, xorg }:
+{ lib, stdenv, fetchzip, xorg }:
 stdenv.mkDerivation rec {
   pname = "xtris";
   version = "1.15";
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
   '';
   buildInputs = [ xorg.libX11 ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A multi-player version of the classical game of Tetris, for the X Window system";
     homepage = "https://web.archive.org/web/20120315061213/http://www.iagora.com/~espel/xtris/xtris.html";
     license = licenses.gpl2;
diff --git a/pkgs/games/zandronum/default.nix b/pkgs/games/zandronum/default.nix
index e7200ff22e9..58aa6daeece 100644
--- a/pkgs/games/zandronum/default.nix
+++ b/pkgs/games/zandronum/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchhg, cmake, pkgconfig, makeWrapper, callPackage
+{ stdenv, lib, fetchhg, cmake, pkg-config, makeWrapper, callPackage
 , soundfont-fluid, SDL, libGL, glew, bzip2, zlib, libjpeg, fluidsynth, openssl, gtk2, python3, libgme
 , serverOnly ? false
 }:
@@ -14,7 +14,7 @@ in stdenv.mkDerivation rec {
   version = "3.0.1";
 
   src = fetchhg {
-    url = "https://bitbucket.org/Torr_Samaho/zandronum-stable";
+    url = "https://hg.osdn.net/view/zandronum/zandronum-stable";
     rev = "ZA_${version}";
     sha256 = "16v5b6wfrmabs3ky6isbfhlrqdjrr1pvfxlxwk0im02kcpxxw9qw";
   };
@@ -32,7 +32,7 @@ in stdenv.mkDerivation rec {
   buildInputs = [ openssl bzip2 zlib SDL libjpeg sqlite libgme ]
              ++ lib.optionals (!serverOnly) [ libGL glew fmod fluidsynth gtk2 ];
 
-  nativeBuildInputs = [ cmake pkgconfig makeWrapper python3 ];
+  nativeBuildInputs = [ cmake pkg-config makeWrapper python3 ];
 
   preConfigure = ''
     ln -s ${sqlite}/* sqlite/
@@ -51,8 +51,6 @@ in stdenv.mkDerivation rec {
     then [ "-DSERVERONLY=ON" ]
     else [ "-DFMOD_LIBRARY=${fmod}/lib/libfmodex.so" ]);
 
-  enableParallelBuilding = true;
-
   hardeningDisable = [ "format" ];
 
   installPhase = ''
@@ -74,7 +72,7 @@ in stdenv.mkDerivation rec {
     inherit fmod sqlite;
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://zandronum.com/";
     description = "Multiplayer oriented port, based off Skulltag, for Doom and Doom II by id Software";
     maintainers = with maintainers; [ lassulus MP2E ];
diff --git a/pkgs/games/zandronum/fmod.nix b/pkgs/games/zandronum/fmod.nix
index 5eebcd4a38e..59075d69c75 100644
--- a/pkgs/games/zandronum/fmod.nix
+++ b/pkgs/games/zandronum/fmod.nix
@@ -1,8 +1,8 @@
-{ stdenv, lib, fetchurl, alsaLib, libpulseaudio, undmg }:
+{ stdenv, lib, fetchurl, alsa-lib, libpulseaudio, undmg }:
 
 let
-  bits = stdenv.lib.optionalString (stdenv.hostPlatform.system == "x86_64-linux") "64";
-  libPath = lib.makeLibraryPath [ stdenv.cc.cc alsaLib libpulseaudio ];
+  bits = lib.optionalString (stdenv.hostPlatform.system == "x86_64-linux") "64";
+  libPath = lib.makeLibraryPath [ stdenv.cc.cc alsa-lib libpulseaudio ];
 
 in
 stdenv.mkDerivation rec {
@@ -35,7 +35,7 @@ stdenv.mkDerivation rec {
     cp -r api/inc $out/include
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Programming library and toolkit for the creation and playback of interactive audio";
     homepage    = "http://www.fmod.org/";
     license     = licenses.unfreeRedistributable;
diff --git a/pkgs/games/zandronum/sqlite.nix b/pkgs/games/zandronum/sqlite.nix
index 7f4556c8751..e38dedbb7f7 100644
--- a/pkgs/games/zandronum/sqlite.nix
+++ b/pkgs/games/zandronum/sqlite.nix
@@ -1,15 +1,14 @@
 { lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation {
-  name = "sqlite-zandronum-3.0";
+  pname = "sqlite-zandronum";
+  version = "3.0";
 
   src = fetchurl {
     url = "https://www.sqlite.org/2017/sqlite-autoconf-3180000.tar.gz";
     sha256 = "0p5cx7nbjxk7glcm277ypi5w4gv144qazw79ql47svlpccj62mrp";
   };
 
-  phases = [ "unpackPhase" "buildPhase" ];
-
   buildPhase = ''
     mkdir -p $out
     cp sqlite3.c $out/
@@ -20,7 +19,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.sqlite.org/";
     description = "A single C code file, named sqlite3.c, that contains all C code for the core SQLite library and the FTS3 and RTREE extensions";
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
     maintainers = [ lib.maintainers.lassulus ];
   };
 }
diff --git a/pkgs/games/zangband/default.nix b/pkgs/games/zangband/default.nix
index 0722e4bbbf9..e8daa9a2025 100644
--- a/pkgs/games/zangband/default.nix
+++ b/pkgs/games/zangband/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, ncurses, flex, bison, autoconf, automake, m4, coreutils }:
+{ lib, stdenv, fetchurl, ncurses, flex, bison, autoconf, automake, m4, coreutils }:
 
 stdenv.mkDerivation rec {
   pname = "zangband";
@@ -52,7 +52,7 @@ stdenv.mkDerivation rec {
 
   meta = {
     description = "Rogue-like game";
-    license = stdenv.lib.licenses.unfree;
+    license = lib.licenses.unfree;
     broken = true; # broken in runtime, will not get pass character generation
   };
 }
diff --git a/pkgs/games/zaz/default.nix b/pkgs/games/zaz/default.nix
index 9d42cfd6896..1925d641717 100644
--- a/pkgs/games/zaz/default.nix
+++ b/pkgs/games/zaz/default.nix
@@ -1,6 +1,6 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
-, pkgconfig
+, pkg-config
 , SDL
 , SDL_image
 , mesa
@@ -13,15 +13,15 @@
 
 stdenv.mkDerivation rec {
   pname = "zaz";
-  version = "1.0.0";
+  version = "1.0.1";
 
   src = fetchurl {
-    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.bz2";
-    sha256 = "15q3kxzl71m50byw37dshfsx5wp240ywah19ccmqmqarcldcqcp3";
+    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "1r3bmwny05zzmdalxm5ah2rray0nnsg1w00r30p47q6x2lpwj8ml";
   };
 
   nativeBuildInputs = [
-    pkgconfig
+    pkg-config
   ];
   buildInputs = [
     SDL.dev
@@ -47,7 +47,7 @@ stdenv.mkDerivation rec {
     "ZAZ_LIBS+=-lvorbisfile"
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A puzzle game about arranging balls in triplets, like Luxor, Zuma, or Puzzle Bobble";
     homepage = "http://zaz.sourceforge.net/";
     license = licenses.gpl3;
diff --git a/pkgs/games/zdoom/bcc-git.nix b/pkgs/games/zdoom/bcc-git.nix
index ae7a4ae6f42..aa3fdeca183 100644
--- a/pkgs/games/zdoom/bcc-git.nix
+++ b/pkgs/games/zdoom/bcc-git.nix
@@ -1,7 +1,8 @@
-{ stdenv, fetchFromGitHub }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation {
-  name = "doom-bcc-git-0.8.0.2018.01.04";
+  pname = "doom-bcc";
+  version = "unstable-2018-01-04";
 
   src = fetchFromGitHub {
     owner = "wormt";
@@ -11,7 +12,7 @@ stdenv.mkDerivation {
   };
 
   enableParallelBuilding = true;
-  makeFlags = ["CC=cc"];
+  makeFlags = ["CC=${stdenv.cc.targetPrefix}cc"];
 
   patches = [ ./bcc-warning-fix.patch ];
 
@@ -22,7 +23,7 @@ stdenv.mkDerivation {
     cp -av lib $out/lib/bcc
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Compiler for Doom/Hexen scripts (ACS, BCS)";
     homepage = "https://github.com/wormt/bcc";
     license = licenses.mit;
diff --git a/pkgs/games/zdoom/default.nix b/pkgs/games/zdoom/default.nix
index 646021eb2fc..3a31f8fdfb5 100644
--- a/pkgs/games/zdoom/default.nix
+++ b/pkgs/games/zdoom/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, p7zip, cmake
+{ lib, stdenv, fetchurl, p7zip, cmake
 , SDL2, openal, fluidsynth, soundfont-fluid, bzip2, zlib, libjpeg, game-music-emu
 , libsndfile, mpg123 }:
 
@@ -25,8 +25,6 @@ stdenv.mkDerivation rec {
 
   sourceRoot = ".";
 
-  enableParallelBuilding = true;
-
   NIX_CFLAGS_LINK = [ "-lopenal" "-lfluidsynth" ];
 
   preConfigure = ''
@@ -45,7 +43,7 @@ stdenv.mkDerivation rec {
     ln -s $out/lib/zdoom/zdoom $out/bin/zdoom
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://zdoom.org/";
     description = "Enhanced port of the official DOOM source code";
     # Doom source license, MAME license
diff --git a/pkgs/games/zdoom/zdbsp.nix b/pkgs/games/zdoom/zdbsp.nix
index e86ebd6dbc2..e688b908e12 100644
--- a/pkgs/games/zdoom/zdbsp.nix
+++ b/pkgs/games/zdoom/zdbsp.nix
@@ -1,27 +1,32 @@
-{ stdenv, fetchurl, cmake, unzip, zlib }:
+{ lib, stdenv, fetchzip, cmake, zlib }:
 
 stdenv.mkDerivation rec {
   pname = "zdbsp";
   version = "1.19";
 
-  src = fetchurl {
+  src = fetchzip {
     url = "https://zdoom.org/files/utils/zdbsp/zdbsp-${version}-src.zip";
-    sha256 = "0j82q7g7hgvnahk6gdyhmn9880mqii3b4agqc98f5xaj3kxmd2dr";
+    sha256 = "1j6k0appgjjj3ffbll9hy9nnbqr17szd1s66q08zrbkfqf6g8f0d";
+    stripRoot = false;
   };
 
-  nativeBuildInputs = [cmake unzip];
-  buildInputs = [zlib];
-  sourceRoot = ".";
-  enableParallelBuilding = true;
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
   installPhase = ''
     install -Dm755 zdbsp $out/bin/zdbsp
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "ZDoom's internal node builder for DOOM maps";
     homepage = "https://zdoom.org/wiki/ZDBSP";
     license = licenses.gpl2Plus;
-    maintainers = with maintainers; [ertes];
-    platforms = platforms.linux;
+    maintainers = with maintainers; [ lassulus siraben ];
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/games/zod/0002-add-scaling-factor-to-source.patch b/pkgs/games/zod/0002-add-scaling-factor-to-source.patch
new file mode 100644
index 00000000000..bdcaddaabbb
--- /dev/null
+++ b/pkgs/games/zod/0002-add-scaling-factor-to-source.patch
@@ -0,0 +1,161 @@
+Date: Mon, 17 May 2021 18:28:54 +0200
+Subject: [PATCH 2/2] add scaling factor to source
+
+---
+ zod_launcher_src/zod_launcherFrm.cpp | 84 ++++++++++++++--------------
+ 1 file changed, 42 insertions(+), 42 deletions(-)
+
+diff --git a/zod_launcher_src/zod_launcherFrm.cpp b/zod_launcher_src/zod_launcherFrm.cpp
+index 54bb9aa..de268f2 100644
+--- a/zod_launcher_src/zod_launcherFrm.cpp
++++ b/zod_launcher_src/zod_launcherFrm.cpp
+@@ -83,15 +83,15 @@ void zod_launcherFrm::CreateGUIControls()
+ 	//Add the custom code before or after the blocks

+ 	////GUI Items Creation Start

+ 

+-	WxButton4 = new wxButton(this, ID_WXBUTTON4, wxT("Previous Settings"), wxPoint(280, 16), wxSize(249, 25), 0, wxDefaultValidator, wxT("WxButton4"));

++	WxButton4 = new wxButton(this, ID_WXBUTTON4, wxT("Previous Settings"), wxPoint(@scalingFactor@*280,@scalingFactor@*16), wxSize(@scalingFactor@*249,@scalingFactor@*25), 0, wxDefaultValidator, wxT("WxButton4"));

+ 

+-	WxStaticText11 = new wxStaticText(this, ID_WXSTATICTEXT11, wxT("Login Password::"), wxPoint(280, 120), wxDefaultSize, 0, wxT("WxStaticText11"));

++	WxStaticText11 = new wxStaticText(this, ID_WXSTATICTEXT11, wxT("Login Password::"), wxPoint(@scalingFactor@*280,@scalingFactor@*120), wxDefaultSize, 0, wxT("WxStaticText11"));

+ 

+-	WxStaticText10 = new wxStaticText(this, ID_WXSTATICTEXT10, wxT("Login Name::"), wxPoint(280, 96), wxDefaultSize, 0, wxT("WxStaticText10"));

++	WxStaticText10 = new wxStaticText(this, ID_WXSTATICTEXT10, wxT("Login Name::"), wxPoint(@scalingFactor@*280,@scalingFactor@*96), wxDefaultSize, 0, wxT("WxStaticText10"));

+ 

+-	WxEdit9 = new wxTextCtrl(this, ID_WXEDIT9, wxT(""), wxPoint(384, 120), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit9"));

++	WxEdit9 = new wxTextCtrl(this, ID_WXEDIT9, wxT(""), wxPoint(@scalingFactor@*384,@scalingFactor@*120), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit9"));

+ 

+-	WxEdit8 = new wxTextCtrl(this, ID_WXEDIT8, wxT(""), wxPoint(384, 96), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit8"));

++	WxEdit8 = new wxTextCtrl(this, ID_WXEDIT8, wxT(""), wxPoint(@scalingFactor@*384,@scalingFactor@*96), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit8"));

+ 

+ 	WxMenuBar1 = new wxMenuBar();

+ 	wxMenu *ID_MNU_FILE_1001_Mnu_Obj = new wxMenu(0);

+@@ -103,45 +103,45 @@ void zod_launcherFrm::CreateGUIControls()
+ 	WxMenuBar1->Append(ID_MNU_ABOUT_1003_Mnu_Obj, wxT("About"));

+ 	SetMenuBar(WxMenuBar1);

+ 

+-	WxCheckBox11 = new wxCheckBox(this, ID_WXCHECKBOX11, wxT("yellow"), wxPoint(152, 208), wxSize(49, 17), 0, wxDefaultValidator, wxT("WxCheckBox11"));

++	WxCheckBox11 = new wxCheckBox(this, ID_WXCHECKBOX11, wxT("yellow"), wxPoint(@scalingFactor@*152,@scalingFactor@*208), wxSize(@scalingFactor@*49,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox11"));

+ 

+-	WxCheckBox10 = new wxCheckBox(this, ID_WXCHECKBOX10, wxT("green"), wxPoint(104, 208), wxSize(49, 17), 0, wxDefaultValidator, wxT("WxCheckBox10"));

++	WxCheckBox10 = new wxCheckBox(this, ID_WXCHECKBOX10, wxT("green"), wxPoint(@scalingFactor@*104,@scalingFactor@*208), wxSize(@scalingFactor@*49,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox10"));

+ 

+-	WxCheckBox9 = new wxCheckBox(this, ID_WXCHECKBOX9, wxT("blue"), wxPoint(56, 208), wxSize(41, 17), 0, wxDefaultValidator, wxT("WxCheckBox9"));

++	WxCheckBox9 = new wxCheckBox(this, ID_WXCHECKBOX9, wxT("blue"), wxPoint(@scalingFactor@*56,@scalingFactor@*208), wxSize(@scalingFactor@*41,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox9"));

+ 

+-	WxCheckBox8 = new wxCheckBox(this, ID_WXCHECKBOX8, wxT("red"), wxPoint(8, 208), wxSize(41, 17), 0, wxDefaultValidator, wxT("WxCheckBox8"));

++	WxCheckBox8 = new wxCheckBox(this, ID_WXCHECKBOX8, wxT("red"), wxPoint(@scalingFactor@*8,@scalingFactor@*208), wxSize(@scalingFactor@*41,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox8"));

+ 

+-	WxStaticBox5 = new wxStaticBox(this, ID_WXSTATICBOX5, wxT("AI Players"), wxPoint(0, 192), wxSize(265, 49));

++	WxStaticBox5 = new wxStaticBox(this, ID_WXSTATICBOX5, wxT("AI Players"), wxPoint(@scalingFactor@*0,@scalingFactor@*192), wxSize(@scalingFactor@*265,@scalingFactor@*49));

+ 

+-	WxCheckBox7 = new wxCheckBox(this, ID_WXCHECKBOX7, wxT("No Music"), wxPoint(376, 192), wxSize(65, 17), 0, wxDefaultValidator, wxT("WxCheckBox7"));

++	WxCheckBox7 = new wxCheckBox(this, ID_WXCHECKBOX7, wxT("No Music"), wxPoint(@scalingFactor@*376,@scalingFactor@*192), wxSize(@scalingFactor@*65,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox7"));

+ 

+-	WxCheckBox6 = new wxCheckBox(this, ID_WXCHECKBOX6, wxT("No OpenGL"), wxPoint(280, 208), wxSize(81, 17), 0, wxDefaultValidator, wxT("WxCheckBox6"));

++	WxCheckBox6 = new wxCheckBox(this, ID_WXCHECKBOX6, wxT("No OpenGL"), wxPoint(@scalingFactor@*280,@scalingFactor@*208), wxSize(@scalingFactor@*81,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox6"));

+ 

+-	WxEdit7 = new wxTextCtrl(this, ID_WXEDIT7, wxT(""), wxPoint(112, 160), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit7"));

++	WxEdit7 = new wxTextCtrl(this, ID_WXEDIT7, wxT(""), wxPoint(@scalingFactor@*112,@scalingFactor@*160), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit7"));

+ 

+-	WxStaticText9 = new wxStaticText(this, ID_WXSTATICTEXT9, wxT("Settings Filename::"), wxPoint(8, 160), wxDefaultSize, 0, wxT("WxStaticText9"));

++	WxStaticText9 = new wxStaticText(this, ID_WXSTATICTEXT9, wxT("Settings Filename::"), wxPoint(@scalingFactor@*8,@scalingFactor@*160), wxDefaultSize, 0, wxT("WxStaticText9"));

+ 

+-	WxButton3 = new wxButton(this, ID_WXBUTTON3, wxT("Launch Zod Engine"), wxPoint(208, 304), wxSize(121, 17), 0, wxDefaultValidator, wxT("WxButton3"));

++	WxButton3 = new wxButton(this, ID_WXBUTTON3, wxT("Launch Zod Engine"), wxPoint(@scalingFactor@*208,@scalingFactor@*304), wxSize(@scalingFactor@*121,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxButton3"));

+ 

+-	WxStaticText8 = new wxStaticText(this, ID_WXSTATICTEXT8, wxT("--- Command Arguments ---"), wxPoint(8, 264), wxSize(520, 17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText8"));

++	WxStaticText8 = new wxStaticText(this, ID_WXSTATICTEXT8, wxT("--- Command Arguments ---"), wxPoint(@scalingFactor@*8,@scalingFactor@*264), wxSize(@scalingFactor@*520,@scalingFactor@*17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText8"));

+ 

+-	WxEdit6 = new wxTextCtrl(this, ID_WXEDIT6, wxT(""), wxPoint(8, 280), wxSize(521, 17), 0, wxDefaultValidator, wxT("WxEdit6"));

++	WxEdit6 = new wxTextCtrl(this, ID_WXEDIT6, wxT(""), wxPoint(@scalingFactor@*8,@scalingFactor@*280), wxSize(@scalingFactor@*521,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit6"));

+ 

+-	WxStaticBox4 = new wxStaticBox(this, ID_WXSTATICBOX4, wxT("Launch Game"), wxPoint(0, 248), wxSize(537, 81));

++	WxStaticBox4 = new wxStaticBox(this, ID_WXSTATICBOX4, wxT("Launch Game"), wxPoint(@scalingFactor@*0,@scalingFactor@*248), wxSize(@scalingFactor@*537,@scalingFactor@*81));

+ 

+-	WxCheckBox5 = new wxCheckBox(this, ID_WXCHECKBOX5, wxT("Bland Cursor"), wxPoint(448, 208), wxSize(81, 17), 0, wxDefaultValidator, wxT("WxCheckBox5"));

++	WxCheckBox5 = new wxCheckBox(this, ID_WXCHECKBOX5, wxT("Bland Cursor"), wxPoint(@scalingFactor@*448,@scalingFactor@*208), wxSize(@scalingFactor@*81,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox5"));

+ 

+-	WxCheckBox4 = new wxCheckBox(this, ID_WXCHECKBOX4, wxT("No Sound"), wxPoint(448, 192), wxSize(73, 17), 0, wxDefaultValidator, wxT("WxCheckBox4"));

++	WxCheckBox4 = new wxCheckBox(this, ID_WXCHECKBOX4, wxT("No Sound"), wxPoint(@scalingFactor@*448,@scalingFactor@*192), wxSize(@scalingFactor@*73,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox4"));

+ 

+-	WxCheckBox3 = new wxCheckBox(this, ID_WXCHECKBOX3, wxT("Is Windowed"), wxPoint(280, 192), wxSize(89, 17), 0, wxDefaultValidator, wxT("WxCheckBox3"));

++	WxCheckBox3 = new wxCheckBox(this, ID_WXCHECKBOX3, wxT("Is Windowed"), wxPoint(@scalingFactor@*280,@scalingFactor@*192), wxSize(@scalingFactor@*89,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox3"));

+ 

+-	WxStaticText7 = new wxStaticText(this, ID_WXSTATICTEXT7, wxT("x"), wxPoint(448, 168), wxSize(18, 17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText7"));

++	WxStaticText7 = new wxStaticText(this, ID_WXSTATICTEXT7, wxT("x"), wxPoint(@scalingFactor@*448,@scalingFactor@*168), wxSize(@scalingFactor@*18,@scalingFactor@*17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText7"));

+ 

+-	WxEdit5 = new wxTextCtrl(this, ID_WXEDIT5, wxT("484"), wxPoint(472, 168), wxSize(57, 17), 0, wxDefaultValidator, wxT("WxEdit5"));

++	WxEdit5 = new wxTextCtrl(this, ID_WXEDIT5, wxT("484"), wxPoint(@scalingFactor@*472,@scalingFactor@*168), wxSize(@scalingFactor@*57,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit5"));

+ 

+-	WxEdit4 = new wxTextCtrl(this, ID_WXEDIT4, wxT("800"), wxPoint(384, 168), wxSize(57, 17), 0, wxDefaultValidator, wxT("WxEdit4"));

++	WxEdit4 = new wxTextCtrl(this, ID_WXEDIT4, wxT("800"), wxPoint(@scalingFactor@*384,@scalingFactor@*168), wxSize(@scalingFactor@*57,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit4"));

+ 

+-	WxStaticText6 = new wxStaticText(this, ID_WXSTATICTEXT6, wxT("Resolution::"), wxPoint(280, 168), wxDefaultSize, 0, wxT("WxStaticText6"));

++	WxStaticText6 = new wxStaticText(this, ID_WXSTATICTEXT6, wxT("Resolution::"), wxPoint(@scalingFactor@*280,@scalingFactor@*168), wxDefaultSize, 0, wxT("WxStaticText6"));

+ 

+ 	wxArrayString arrayStringFor_WxChoice1;

+ 	arrayStringFor_WxChoice1.Add(wxT("null"));

+@@ -149,42 +149,42 @@ void zod_launcherFrm::CreateGUIControls()
+ 	arrayStringFor_WxChoice1.Add(wxT("blue"));

+ 	arrayStringFor_WxChoice1.Add(wxT("green"));

+ 	arrayStringFor_WxChoice1.Add(wxT("yellow"));

+-	WxChoice1 = new wxChoice(this, ID_WXCHOICE1, wxPoint(384, 144), wxSize(145, 21), arrayStringFor_WxChoice1, 0, wxDefaultValidator, wxT("WxChoice1"));

++	WxChoice1 = new wxChoice(this, ID_WXCHOICE1, wxPoint(@scalingFactor@*384,@scalingFactor@*144), wxSize(@scalingFactor@*145,@scalingFactor@*21), arrayStringFor_WxChoice1, 0, wxDefaultValidator, wxT("WxChoice1"));

+ 	WxChoice1->SetSelection(1);

+ 

+-	WxStaticText5 = new wxStaticText(this, ID_WXSTATICTEXT5, wxT("Player Team::"), wxPoint(280, 144), wxDefaultSize, 0, wxT("WxStaticText5"));

++	WxStaticText5 = new wxStaticText(this, ID_WXSTATICTEXT5, wxT("Player Team::"), wxPoint(@scalingFactor@*280,@scalingFactor@*144), wxDefaultSize, 0, wxT("WxStaticText5"));

+ 

+-	WxEdit3 = new wxTextCtrl(this, ID_WXEDIT3, wxT(""), wxPoint(384, 72), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit3"));

++	WxEdit3 = new wxTextCtrl(this, ID_WXEDIT3, wxT(""), wxPoint(@scalingFactor@*384,@scalingFactor@*72), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit3"));

+ 

+-	WxStaticText4 = new wxStaticText(this, ID_WXSTATICTEXT4, wxT("Player Name::"), wxPoint(280, 72), wxDefaultSize, 0, wxT("WxStaticText4"));

++	WxStaticText4 = new wxStaticText(this, ID_WXSTATICTEXT4, wxT("Player Name::"), wxPoint(@scalingFactor@*280,@scalingFactor@*72), wxDefaultSize, 0, wxT("WxStaticText4"));

+ 

+-	WxStaticBox3 = new wxStaticBox(this, ID_WXSTATICBOX3, wxT("Engine Settings"), wxPoint(272, 56), wxSize(265, 185));

++	WxStaticBox3 = new wxStaticBox(this, ID_WXSTATICBOX3, wxT("Engine Settings"), wxPoint(@scalingFactor@*272,@scalingFactor@*56), wxSize(@scalingFactor@*265,@scalingFactor@*185));

+ 

+-	WxEdit2 = new wxTextCtrl(this, ID_WXEDIT2, wxT(""), wxPoint(112, 136), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit2"));

++	WxEdit2 = new wxTextCtrl(this, ID_WXEDIT2, wxT(""), wxPoint(@scalingFactor@*112,@scalingFactor@*136), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit2"));

+ 

+-	WxStaticText3 = new wxStaticText(this, ID_WXSTATICTEXT3, wxT("Map Filename::"), wxPoint(8, 136), wxDefaultSize, 0, wxT("WxStaticText3"));

++	WxStaticText3 = new wxStaticText(this, ID_WXSTATICTEXT3, wxT("Map Filename::"), wxPoint(@scalingFactor@*8,@scalingFactor@*136), wxDefaultSize, 0, wxT("WxStaticText3"));

+ 

+-	WxCheckBox2 = new wxCheckBox(this, ID_WXCHECKBOX2, wxT("Filename is a Maplist"), wxPoint(96, 112), wxSize(121, 17), 0, wxDefaultValidator, wxT("WxCheckBox2"));

++	WxCheckBox2 = new wxCheckBox(this, ID_WXCHECKBOX2, wxT("Filename is a Maplist"), wxPoint(@scalingFactor@*96,@scalingFactor@*112), wxSize(@scalingFactor@*121,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox2"));

+ 

+-	WxCheckBox1 = new wxCheckBox(this, ID_WXCHECKBOX1, wxT("Is Dedicated"), wxPoint(8, 112), wxSize(89, 17), 0, wxDefaultValidator, wxT("WxCheckBox1"));

++	WxCheckBox1 = new wxCheckBox(this, ID_WXCHECKBOX1, wxT("Is Dedicated"), wxPoint(@scalingFactor@*8,@scalingFactor@*112), wxSize(@scalingFactor@*89,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxCheckBox1"));

+ 

+-	WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("----- OR -----"), wxPoint(8, 96), wxSize(249, 17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText2"));

++	WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("----- OR -----"), wxPoint(@scalingFactor@*8,@scalingFactor@*96), wxSize(@scalingFactor@*249,@scalingFactor@*17), wxALIGN_CENTRE | wxST_NO_AUTORESIZE, wxT("WxStaticText2"));

+ 

+-	WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("Connect Address::"), wxPoint(8, 72), wxDefaultSize, 0, wxT("WxStaticText1"));

++	WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("Connect Address::"), wxPoint(@scalingFactor@*8,@scalingFactor@*72), wxDefaultSize, 0, wxT("WxStaticText1"));

+ 

+-	WxEdit1 = new wxTextCtrl(this, ID_WXEDIT1, wxT(""), wxPoint(112, 72), wxSize(145, 17), 0, wxDefaultValidator, wxT("WxEdit1"));

++	WxEdit1 = new wxTextCtrl(this, ID_WXEDIT1, wxT(""), wxPoint(@scalingFactor@*112,@scalingFactor@*72), wxSize(@scalingFactor@*145,@scalingFactor@*17), 0, wxDefaultValidator, wxT("WxEdit1"));

+ 

+-	WxButton2 = new wxButton(this, ID_WXBUTTON2, wxT("Nighsoft Server"), wxPoint(136, 16), wxSize(121, 25), 0, wxDefaultValidator, wxT("WxButton2"));

++	WxButton2 = new wxButton(this, ID_WXBUTTON2, wxT("Nighsoft Server"), wxPoint(@scalingFactor@*136,@scalingFactor@*16), wxSize(@scalingFactor@*121,@scalingFactor@*25), 0, wxDefaultValidator, wxT("WxButton2"));

+ 

+-	WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("Local Game"), wxPoint(8, 16), wxSize(121, 25), 0, wxDefaultValidator, wxT("WxButton1"));

++	WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("Local Game"), wxPoint(@scalingFactor@*8,@scalingFactor@*16), wxSize(@scalingFactor@*121,@scalingFactor@*25), 0, wxDefaultValidator, wxT("WxButton1"));

+ 

+-	WxStaticBox2 = new wxStaticBox(this, ID_WXSTATICBOX2, wxT("Connection Settings"), wxPoint(0, 56), wxSize(265, 129));

++	WxStaticBox2 = new wxStaticBox(this, ID_WXSTATICBOX2, wxT("Connection Settings"), wxPoint(@scalingFactor@*0,@scalingFactor@*56), wxSize(@scalingFactor@*265,@scalingFactor@*129));

+ 

+-	WxStaticBox1 = new wxStaticBox(this, ID_WXSTATICBOX1, wxT("Preset Settings"), wxPoint(0, 0), wxSize(537, 49));

++	WxStaticBox1 = new wxStaticBox(this, ID_WXSTATICBOX1, wxT("Preset Settings"), wxPoint(@scalingFactor@*0,@scalingFactor@*0), wxSize(@scalingFactor@*537,@scalingFactor@*49));

+ 

+ 	SetTitle(wxT("The Zod Launcher"));

+ 	SetIcon(wxNullIcon);

+-	SetSize(8,8,545,376);

++	SetSize(8,8,@scalingFactor@*545,@scalingFactor@*376);

+ 	Center();

+ 	

+ 	////GUI Items Creation End

+-- 
+2.29.3
+
diff --git a/pkgs/games/zod/default.nix b/pkgs/games/zod/default.nix
index d50218af241..6bf24ed6cb9 100644
--- a/pkgs/games/zod/default.nix
+++ b/pkgs/games/zod/default.nix
@@ -1,45 +1,110 @@
-{ fetchurl, stdenv, unrar, unzip, SDL, SDL_image, SDL_ttf, SDL_mixer
-, libmysqlclient, makeWrapper }:
-
-stdenv.mkDerivation {
-  name = "zod-engine-2011-03-18";
-
-  src = fetchurl {
-    url = "mirror://sourceforge/zod/zod_src-2011-03-18.zip";
-    sha256 = "00ny7a1yfn9zgl7q1ys27qafwc92dzxv07wjxl8nxa4f98al2g4n";
+{ lib
+, config
+, fetchzip
+, stdenv
+, SDL
+, SDL_image
+, SDL_ttf
+, SDL_mixer
+, libmysqlclient
+, wxGTK
+, symlinkJoin
+, runCommandLocal
+, makeWrapper
+, coreutils
+, scalingFactor ? 2 # this is to resize the fixed-size zod_launcher window
+, substituteAll
+}:
+let
+  name = "zod-engine";
+  version = "2011-09-06";
+  src = fetchzip {
+    url = "mirror://sourceforge/zod/linux_releases/zod_linux-${version}.tar.gz";
+    sha256 = "017v96aflrv07g8j8zk9mq8f8rqxl5228rjff5blq8dxpsv1sx7h";
   };
-
-  srcAssets = fetchurl {
-    url = "mirror://sourceforge/zod/zod_assets-2011-03-12.rar";
-    sha256 = "0gmg4ppr4y6ck04mandlp2fmdcyssmck999m012jx5v1rm57g2hn";
-  };
-
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+  buildInputs = [
+    SDL
+    SDL_image
+    SDL_ttf
+    SDL_mixer
+    libmysqlclient
+    wxGTK
+    coreutils
+  ];
   hardeningDisable = [ "format" ];
-
-  unpackPhase = ''
-    mkdir src
-    pushd src
-    unzip $src
-    popd
-    sourceRoot=`pwd`/src
-  '';
-
-  buildInputs = [ unrar unzip SDL SDL_image SDL_ttf SDL_mixer libmysqlclient makeWrapper ];
-
   NIX_LDFLAGS = "-L${libmysqlclient}/lib/mysql";
-
-  installPhase = ''
-    mkdir -p $out/bin $out/share/zod
-    pushd $out/share/zod
-    unrar x $srcAssets
-    popd
-    cp zod $out/bin
-    wrapProgram $out/bin/zod --run "cd $out/share/zod"
-  '';
-
-  meta = {
-    description = "Multiplayer remake of ZED";
-    homepage = "http://zod.sourceforge.net/";
-    license = stdenv.lib.licenses.gpl3Plus; /* Says the web */
+  zod_engine = stdenv.mkDerivation {
+    inherit version src nativeBuildInputs buildInputs hardeningDisable NIX_LDFLAGS;
+    pname = "${name}-engine";
+    enableParallelBuilding = true;
+    preBuild = "cd zod_src";
+    installPhase = ''
+      mkdir -p $out/bin
+      install -m755 zod $out/bin/
+      wrapProgram $out/bin/zod --run "cd ${zod_assets}/usr/lib/commander-zod"
+    '';
   };
-}
+  zod_map_editor = stdenv.mkDerivation {
+    inherit version src nativeBuildInputs buildInputs hardeningDisable NIX_LDFLAGS;
+    pname = "${name}-map_editor";
+    enableParallelBuilding = true;
+    preBuild = "cd zod_src";
+    makeFlags = [ "map_editor" ];
+    installPhase = ''
+      mkdir -p $out/bin
+      install -m755 zod_map_editor $out/bin
+      wrapProgram $out/bin/zod_map_editor --run "cd ${zod_assets}/usr/lib/commander-zod"
+    '';
+  };
+  zod_launcher = stdenv.mkDerivation {
+      inherit version src nativeBuildInputs buildInputs zod_engine zod_map_editor;
+      pname = "${name}-launcher";
+      # This is necessary because the zod_launcher has terrible fixed-width window
+      # the Idea is to apply the scalingFactor to all positions and sizes and I tested 1,2,3 and 4
+      # 2,3,4 look acceptable on my 4k monitor and 1 is unreadable.
+      # also the ./ in the run command is removed to have easier time starting the game
+      patches = [
+        (substituteAll {
+          inherit scalingFactor;
+          src=./0002-add-scaling-factor-to-source.patch;
+        })
+      ];
+      postPatch = ''
+        substituteInPlace zod_launcher_src/zod_launcherFrm.cpp \
+          --replace 'message = wxT("./zod");' 'message = wxT("zod");'
+      '';
+      preBuild = "cd zod_launcher_src";
+      installPhase = ''
+        mkdir -p $out/bin
+        install -m755 zod_launcher $out/bin
+      '';
+  };
+  zod_assets = runCommandLocal "${name}-assets" {} ''
+    mkdir -p $out/usr/lib/commander-zod{,blank_maps}
+    cp -r ${src}/assets $out/usr/lib/commander-zod/assets
+    for i in ${src}/*.map ${src}/*.txt; do
+      install -m644 $i $out/usr/lib/commander-zod
+    done
+    for map in ${src}/blank_maps/*; do
+      install -m644 $map $out/usr/lib/commander-zod/blank_maps
+    done
+  '';
+in
+  symlinkJoin {
+    inherit name;
+    paths = [
+      zod_engine
+      zod_launcher
+      zod_map_editor
+      zod_assets
+    ];
+    meta = with lib; {
+      description = "Multiplayer remake of ZED";
+      homepage = "http://zod.sourceforge.net/";
+      maintainers = with maintainers; [ zeri ];
+      license = licenses.gpl3Plus; /* Says the website */
+    };
+  }
diff --git a/pkgs/games/zoom/default.nix b/pkgs/games/zoom/default.nix
index 827fb351f1d..02cfc28ebee 100644
--- a/pkgs/games/zoom/default.nix
+++ b/pkgs/games/zoom/default.nix
@@ -1,12 +1,13 @@
-{ stdenv, fetchurl, perl, expat, xlibsWrapper, freetype }:
+{ lib, stdenv, fetchurl, perl, expat, xlibsWrapper, freetype }:
 
 # !!! assert freetype == xorg.freetype
 
 stdenv.mkDerivation rec {
-  name = "zoom-1.1.5";
+  pname = "zoom";
+  version = "1.1.5";
 
   src = fetchurl {
-    url = "https://www.logicalshift.co.uk/unix/zoom/${name}.tar.gz";
+    url = "https://www.logicalshift.co.uk/unix/zoom/zoom-${version}.tar.gz";
     sha256 = "1g6van7f7sg3zfcz80mncnnbccyg2hnm0hq4x558vpsm0lf7z5pj";
   };
 
@@ -14,7 +15,7 @@ stdenv.mkDerivation rec {
 
   NIX_CFLAGS_COMPILE = "-I${freetype}/include/freetype2 -fgnu89-inline";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Player for Z-Code, TADS and HUGO stories or games";
     longDescription = ''
       Zoom is a player for Z-Code, TADS and HUGO stories or games. These are